Compare commits
169 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fa07809189 | ||
|
|
7e2ef01039 | ||
|
|
2c50787aa9 | ||
|
|
b600d7b09d | ||
|
|
579177fc70 | ||
|
|
f5658af484 | ||
|
|
c54fb9a96b | ||
|
|
140d5553e7 | ||
|
|
80df44b316 | ||
|
|
897ff436b1 | ||
|
|
90b25300df | ||
|
|
263a7ca6be | ||
|
|
f84331abde | ||
|
|
d839136fee | ||
|
|
82aa38fce3 | ||
|
|
df427b6822 | ||
|
|
9d8a95f836 | ||
|
|
87c0410914 | ||
|
|
696a6df6ba | ||
|
|
90f2c18353 | ||
|
|
712023112d | ||
|
|
67dc7d7d88 | ||
|
|
34e1147de3 | ||
|
|
9d5f201ddf | ||
|
|
9a81451586 | ||
|
|
d8f8e6b94a | ||
|
|
7a3eda02ce | ||
|
|
57466233cb | ||
|
|
2df5f281c4 | ||
|
|
867bf5457f | ||
|
|
b4649a6b27 | ||
|
|
c27852537d | ||
|
|
f61d5f0f85 | ||
|
|
7afa16fbe7 | ||
|
|
019bff0851 | ||
|
|
df487cbc07 | ||
|
|
61d8ec8dae | ||
|
|
194bed72f5 | ||
|
|
9359f6b55f | ||
|
|
ae2990582d | ||
|
|
d8d48c5386 | ||
|
|
c5ca2a779c | ||
|
|
8d039c572f | ||
|
|
26c47e59dd | ||
|
|
cb12babc46 | ||
|
|
d9001ff848 | ||
|
|
1d213d53c8 | ||
|
|
808618602c | ||
|
|
fc88f59f61 | ||
|
|
54c285001d | ||
|
|
6c18b71010 | ||
|
|
a5c2ad1b2f | ||
|
|
d4069f824a | ||
|
|
ee5456cf8c | ||
|
|
8330f40d51 | ||
|
|
d062acc149 | ||
|
|
8406d7d288 | ||
|
|
d633e45a06 | ||
|
|
4d55f51fee | ||
|
|
2151563757 | ||
|
|
f3b41efff3 | ||
|
|
fb476b0117 | ||
|
|
84b5708e71 | ||
|
|
143a86a28a | ||
|
|
e528522ad5 | ||
|
|
f91cbea9d5 | ||
|
|
8575042c23 | ||
|
|
56f4daeb68 | ||
|
|
eb075198c2 | ||
|
|
cc2d953c9d | ||
|
|
5c385521c4 | ||
|
|
207e0236f7 | ||
|
|
1a88a63415 | ||
|
|
be93dc3482 | ||
|
|
6faf2ce931 | ||
|
|
5c814b29e1 | ||
|
|
76be272787 | ||
|
|
327030789d | ||
|
|
e27cbdf81b | ||
|
|
8ec7c37715 | ||
|
|
0d7c01d50f | ||
|
|
dd37c9651a | ||
|
|
dcc575402b | ||
|
|
5e9c21b0a7 | ||
|
|
26f69e7126 | ||
|
|
f2591e1d8a | ||
|
|
106a7a6017 | ||
|
|
67956597be | ||
|
|
b519c3a83f | ||
|
|
91c2712366 | ||
|
|
bd6431bc29 | ||
|
|
02d30388e5 | ||
|
|
bfd1f3b650 | ||
|
|
56b0dba148 | ||
|
|
ac156b9612 | ||
|
|
ce7f1e231b | ||
|
|
447080b422 | ||
|
|
080e1dd74e | ||
|
|
b5f95fefc8 | ||
|
|
b3bca39de4 | ||
|
|
0b8cba7384 | ||
|
|
e9dea459dd | ||
|
|
3f7e2f7241 | ||
|
|
e7e946faa6 | ||
|
|
b01af453cc | ||
|
|
8daca1a55a | ||
|
|
07ebcc2bf3 | ||
|
|
1b1338fed6 | ||
|
|
3166607540 | ||
|
|
1947f1232e | ||
|
|
af7b9523b5 | ||
|
|
7812ee1861 | ||
|
|
a3020275a2 | ||
|
|
2bc2b342eb | ||
|
|
e5a1026de1 | ||
|
|
749dc30064 | ||
|
|
0ffe53405d | ||
|
|
d31e997041 | ||
|
|
254cab3a23 | ||
|
|
6563886b49 | ||
|
|
a6d7511806 | ||
|
|
e398117d25 | ||
|
|
2c6e3d0e91 | ||
|
|
9b0096dd9d | ||
|
|
7ef2a66011 | ||
|
|
e2f9e29817 | ||
|
|
b046da5db3 | ||
|
|
5773df6f6c | ||
|
|
387ac00edf | ||
|
|
8e30c69e4a | ||
|
|
eb6c4eb132 | ||
|
|
d154502b31 | ||
|
|
47631105c7 | ||
|
|
108cf73a30 | ||
|
|
c23c323b1a | ||
|
|
2d4a73bbcf | ||
|
|
b91753e746 | ||
|
|
7ac5760509 | ||
|
|
e667ec1b60 | ||
|
|
392535ce3a | ||
|
|
fb8d23f51b | ||
|
|
86df748209 | ||
|
|
ba04b38a5f | ||
|
|
600781bb80 | ||
|
|
318ed0dafb | ||
|
|
3b9d758510 | ||
|
|
0ef8e5cdae | ||
|
|
b3ddae7f85 | ||
|
|
995373c74b | ||
|
|
87bcb67f8f | ||
|
|
688a5d84c8 | ||
|
|
0cd25cf598 | ||
|
|
84b11ff7a5 | ||
|
|
1792fd3e0f | ||
|
|
d309a7e33c | ||
|
|
e28fdd37cd | ||
|
|
358a36b138 | ||
|
|
d4789c5d93 | ||
|
|
8d2a9ce923 | ||
|
|
29998a8959 | ||
|
|
4386e8ddde | ||
|
|
94d86eee10 | ||
|
|
d0eb5695df | ||
|
|
4808b33c01 | ||
|
|
b4220722a0 | ||
|
|
5556e34e7e | ||
|
|
1800c65836 | ||
|
|
d8f37093ae | ||
|
|
4aaa006c41 |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1,6 +1,6 @@
|
||||
.DS_Store
|
||||
/.vscode
|
||||
/.idea
|
||||
.idea
|
||||
/AdGuardHome
|
||||
/AdGuardHome.exe
|
||||
/AdGuardHome.yaml
|
||||
|
||||
@@ -7,29 +7,29 @@
|
||||
"da": "Dansk",
|
||||
"de": "Deutsch",
|
||||
"nl": "Dutch",
|
||||
"no": "Norsk",
|
||||
"en": "English",
|
||||
"es": "Español",
|
||||
"fr": "Français",
|
||||
"hr": "Hrvatski",
|
||||
"id": "Indonesian",
|
||||
"it": "Italiano",
|
||||
"no": "Norsk",
|
||||
"pl": "Polski",
|
||||
"pt-br": "Portuguese (BR)",
|
||||
"pt-pt": "Portuguese (PT)",
|
||||
"sk": "Slovenčina",
|
||||
"sl": "Slovenščina",
|
||||
"sr-cs": "Srpski",
|
||||
"sv": "Svenska",
|
||||
"vi": "Tiếng Việt",
|
||||
"tr": "Türkçe",
|
||||
"cs": "Český",
|
||||
"bg": "Български",
|
||||
"ru": "Русский",
|
||||
"fa": "فارسی",
|
||||
"ja": "日本語",
|
||||
"zh-tw": "正體中文",
|
||||
"zh-cn": "简体中文",
|
||||
"sr-cs": "Srpski",
|
||||
"hr": "Hrvatski",
|
||||
"fa": "فارسی",
|
||||
"ko": "한국어"
|
||||
}
|
||||
}
|
||||
|
||||
203
AGHTechDoc.md
203
AGHTechDoc.md
@@ -55,7 +55,11 @@ Contents:
|
||||
* Filters update mechanism
|
||||
* API: Get filtering parameters
|
||||
* API: Set filtering parameters
|
||||
* API: Refresh filters
|
||||
* API: Add Filter
|
||||
* API: Set URL parameters
|
||||
* API: Delete URL
|
||||
* API: Domain Check
|
||||
* Log-in page
|
||||
* API: Log in
|
||||
* API: Log out
|
||||
@@ -137,10 +141,13 @@ Request:
|
||||
{
|
||||
"web":{"port":80,"ip":"192.168.11.33"},
|
||||
"dns":{"port":53,"ip":"127.0.0.1","autofix":false},
|
||||
"set_static_ip": true | false
|
||||
}
|
||||
|
||||
Server should check whether a port is available only in case it itself isn't already listening on that port.
|
||||
|
||||
If `set_static_ip` is `true`, Server attempts to set a static IP for the network interface chosen by `dns.ip` setting. If the operation is successful, `static_ip.static` setting will be `yes`. If it fails, `static_ip.static` setting will be set to `error` and `static_ip.error` will contain the error message.
|
||||
|
||||
Server replies on success:
|
||||
|
||||
200 OK
|
||||
@@ -148,7 +155,14 @@ Server replies on success:
|
||||
{
|
||||
"web":{"status":""},
|
||||
"dns":{"status":""},
|
||||
"static_ip": {
|
||||
"static": "yes|no|error",
|
||||
"ip": "<Current dynamic IP address>", // set if static=no
|
||||
"error": "..." // set if static=error
|
||||
}
|
||||
}
|
||||
|
||||
If `static_ip.static` is `no`, Server has detected that the system uses a dynamic address and it can automatically set a static address if `set_static_ip` in request is `true`. See section `Static IP check/set` for detailed process.
|
||||
|
||||
Server replies on error:
|
||||
|
||||
@@ -171,7 +185,11 @@ Request:
|
||||
POST /control/install/check_config
|
||||
|
||||
{
|
||||
"dns":{"port":53,"ip":"127.0.0.1","autofix":false}
|
||||
"dns":{
|
||||
"port":53,
|
||||
"ip":"127.0.0.1",
|
||||
"autofix":false
|
||||
}
|
||||
}
|
||||
|
||||
Check if DNSStubListener is enabled:
|
||||
@@ -202,9 +220,21 @@ If user clicks on "Fix" button, UI sends request to perform an automatic fix
|
||||
"dns":{"port":53,"ip":"127.0.0.1","autofix":true},
|
||||
}
|
||||
|
||||
Deactivate (save backup as `resolved.conf.orig`) and stop DNSStubListener:
|
||||
Deactivate DNSStubListener and update DNS server address. Create a new file: `/etc/systemd/resolved.conf.d/adguardhome.conf` (create a `/etc/systemd/resolved.conf.d` directory if necessary):
|
||||
|
||||
[Resolve]
|
||||
DNS=127.0.0.1
|
||||
DNSStubListener=no
|
||||
|
||||
Specifying "127.0.0.1" as DNS server address is necessry because otherwise the nameserver will be "127.0.0.53" which doesn't work without DNSStubListener.
|
||||
|
||||
Activate another resolv.conf file:
|
||||
|
||||
mv /etc/resolv.conf /etc/resolv.conf.backup
|
||||
ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
|
||||
|
||||
Stop DNSStubListener:
|
||||
|
||||
sed -r -i.orig 's/#?DNSStubListener=yes/DNSStubListener=no/g' /etc/systemd/resolved.conf
|
||||
systemctl reload-or-restart systemd-resolved
|
||||
|
||||
Server replies:
|
||||
@@ -486,13 +516,7 @@ which will print:
|
||||
default via 192.168.0.1 proto dhcp metric 100
|
||||
|
||||
|
||||
#### Phase 2
|
||||
|
||||
This method only works on Raspbian.
|
||||
|
||||
On Ubuntu DHCP for a network interface can't be disabled via `dhcpcd.conf`. This must be configured in `/etc/netplan/01-netcfg.yaml`.
|
||||
|
||||
Fedora doesn't use `dhcpcd.conf` configuration at all.
|
||||
#### Phase 2 (Raspbian)
|
||||
|
||||
Step 1.
|
||||
|
||||
@@ -513,6 +537,44 @@ If we would set a different IP address, we'd need to replace the IP address for
|
||||
ip addr replace dev eth0 192.168.0.1/24
|
||||
|
||||
|
||||
#### Phase 2 (Ubuntu)
|
||||
|
||||
`/etc/netplan/01-netcfg.yaml` or `/etc/netplan/01-network-manager-all.yaml`
|
||||
|
||||
This configuration example has a static IP set for `enp0s3` interface:
|
||||
|
||||
network:
|
||||
version: 2
|
||||
renderer: networkd
|
||||
ethernets:
|
||||
enp0s3:
|
||||
dhcp4: no
|
||||
addresses: [192.168.0.2/24]
|
||||
gateway: 192.168.0.1
|
||||
nameservers:
|
||||
addresses: [192.168.0.1,8.8.8.8]
|
||||
|
||||
For dynamic configuration `dhcp4: yes` is set.
|
||||
|
||||
Make a backup copy to `/etc/netplan/01-netcfg.yaml.backup`.
|
||||
|
||||
Apply:
|
||||
|
||||
netplan apply
|
||||
|
||||
Restart network:
|
||||
|
||||
systemctl restart networking
|
||||
|
||||
or:
|
||||
|
||||
systemctl restart network-manager
|
||||
|
||||
or:
|
||||
|
||||
systemctl restart system-networkd
|
||||
|
||||
|
||||
### Add a static lease
|
||||
|
||||
Request:
|
||||
@@ -661,6 +723,7 @@ Response:
|
||||
{
|
||||
name: "client1"
|
||||
ids: ["...", ...] // IP, CIDR or MAC
|
||||
tags: ["...", ...]
|
||||
use_global_settings: true
|
||||
filtering_enabled: false
|
||||
parental_enabled: false
|
||||
@@ -686,6 +749,7 @@ Response:
|
||||
}
|
||||
}
|
||||
]
|
||||
supported_tags: ["...", ...]
|
||||
}
|
||||
|
||||
Supported keys for `whois_info`: orgname, country, city.
|
||||
@@ -700,6 +764,7 @@ Request:
|
||||
{
|
||||
name: "client1"
|
||||
ids: ["...", ...] // IP, CIDR or MAC
|
||||
tags: ["...", ...]
|
||||
use_global_settings: true
|
||||
filtering_enabled: false
|
||||
parental_enabled: false
|
||||
@@ -730,6 +795,7 @@ Request:
|
||||
data: {
|
||||
name: "client1"
|
||||
ids: ["...", ...] // IP, CIDR or MAC
|
||||
tags: ["...", ...]
|
||||
use_global_settings: true
|
||||
filtering_enabled: false
|
||||
parental_enabled: false
|
||||
@@ -819,10 +885,11 @@ Response:
|
||||
{
|
||||
"protection_enabled": true | false,
|
||||
"ratelimit": 1234,
|
||||
"blocking_mode": "nxdomain" | "null_ip" | "custom_ip",
|
||||
"blocking_mode": "default" | "nxdomain" | "null_ip" | "custom_ip",
|
||||
"blocking_ipv4": "1.2.3.4",
|
||||
"blocking_ipv6": "1:2:3::4",
|
||||
"edns_cs_enabled": true | false,
|
||||
"disable_ipv6": true | false,
|
||||
}
|
||||
|
||||
|
||||
@@ -835,16 +902,23 @@ Request:
|
||||
{
|
||||
"protection_enabled": true | false,
|
||||
"ratelimit": 1234,
|
||||
"blocking_mode": "nxdomain" | "null_ip" | "custom_ip",
|
||||
"blocking_mode": "default" | "nxdomain" | "null_ip" | "custom_ip",
|
||||
"blocking_ipv4": "1.2.3.4",
|
||||
"blocking_ipv6": "1:2:3::4",
|
||||
"edns_cs_enabled": true | false,
|
||||
"disable_ipv6": true | false,
|
||||
}
|
||||
|
||||
Response:
|
||||
|
||||
200 OK
|
||||
|
||||
`blocking_mode`:
|
||||
* default: Respond with NXDOMAIN when blocked by Adblock-style rule; respond with the IP address specified in the rule when blocked by /etc/hosts-style rule
|
||||
* NXDOMAIN: Respond with NXDOMAIN code
|
||||
* Null IP: Respond with zero IP address (0.0.0.0 for A; :: for AAAA)
|
||||
* Custom IP: Respond with a manually set IP address
|
||||
|
||||
`blocking_ipv4` and `blocking_ipv6` values are active when `blocking_mode` is set to `custom_ip`.
|
||||
|
||||
|
||||
@@ -1291,9 +1365,23 @@ Response:
|
||||
}
|
||||
...
|
||||
],
|
||||
"whitelist_filters":[
|
||||
{
|
||||
"id":1
|
||||
"enabled":true,
|
||||
"url":"https://...",
|
||||
"name":"...",
|
||||
"rules_count":1234,
|
||||
"last_updated":"2019-09-04T18:29:30+00:00",
|
||||
}
|
||||
...
|
||||
],
|
||||
"user_rules":["...", ...]
|
||||
}
|
||||
|
||||
For both arrays `filters` and `whitelist_filters` there are unique values: id, url.
|
||||
ID for each filter is assigned by Server - it's used for file names.
|
||||
|
||||
|
||||
### API: Set filtering parameters
|
||||
|
||||
@@ -1311,15 +1399,35 @@ Response:
|
||||
200 OK
|
||||
|
||||
|
||||
### API: Set URL parameters
|
||||
### API: Refresh filters
|
||||
|
||||
Request:
|
||||
|
||||
POST /control/filtering/set_url
|
||||
POST /control/filtering/refresh
|
||||
|
||||
{
|
||||
"whitelist": true
|
||||
}
|
||||
|
||||
Response:
|
||||
|
||||
200 OK
|
||||
|
||||
{
|
||||
"updated": 123 // number of filters updated
|
||||
}
|
||||
|
||||
|
||||
### API: Add Filter
|
||||
|
||||
Request:
|
||||
|
||||
POST /control/filtering/add_url
|
||||
|
||||
{
|
||||
"name": "..."
|
||||
"url": "..."
|
||||
"enabled": true | false
|
||||
"whitelist": true
|
||||
}
|
||||
|
||||
Response:
|
||||
@@ -1327,9 +1435,72 @@ Response:
|
||||
200 OK
|
||||
|
||||
|
||||
### API: Set URL parameters
|
||||
|
||||
Request:
|
||||
|
||||
POST /control/filtering/set_url
|
||||
|
||||
{
|
||||
"url": "..."
|
||||
"whitelist": true
|
||||
"data": {
|
||||
"name": "..."
|
||||
"url": "..."
|
||||
"enabled": true | false
|
||||
}
|
||||
}
|
||||
|
||||
Response:
|
||||
|
||||
200 OK
|
||||
|
||||
|
||||
### API: Delete URL
|
||||
|
||||
Request:
|
||||
|
||||
POST /control/filtering/remove_url
|
||||
|
||||
{
|
||||
"url": "..."
|
||||
"whitelist": true
|
||||
}
|
||||
|
||||
Response:
|
||||
|
||||
200 OK
|
||||
|
||||
|
||||
### API: Domain Check
|
||||
|
||||
Check if host name is filtered.
|
||||
|
||||
Request:
|
||||
|
||||
GET /control/filtering/check_host?name=hostname
|
||||
|
||||
Response:
|
||||
|
||||
200 OK
|
||||
|
||||
{
|
||||
"reason":"FilteredBlackList",
|
||||
"filter_id":1,
|
||||
"rule":"||doubleclick.net^",
|
||||
"service_name": "...", // set if reason=FilteredBlockedService
|
||||
|
||||
// if reason=ReasonRewrite:
|
||||
"cname": "...",
|
||||
"ip_addrs": ["1.2.3.4", ...],
|
||||
}
|
||||
|
||||
|
||||
## 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.
|
||||
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.
|
||||
|
||||
Requests to / or /index.html without a proper Cookie get redirected to Log-In page with prompt for name and password. The server responds with 403 to all other requests (including all API methods) without a proper Cookie.
|
||||
|
||||
YAML configuration:
|
||||
|
||||
|
||||
2
Makefile
2
Makefile
@@ -23,7 +23,7 @@ $(STATIC): $(JSFILES) client/node_modules
|
||||
$(TARGET): $(STATIC) *.go home/*.go dhcpd/*.go dnsfilter/*.go dnsforward/*.go
|
||||
GOOS=$(NATIVE_GOOS) GOARCH=$(NATIVE_GOARCH) GO111MODULE=off go get -v github.com/gobuffalo/packr/...
|
||||
PATH=$(GOPATH)/bin:$(PATH) packr -z
|
||||
CGO_ENABLED=0 go build -ldflags="-s -w -X main.version=$(GIT_VERSION) -X main.channel=$(CHANNEL)" -asmflags="-trimpath=$(PWD)" -gcflags="-trimpath=$(PWD)"
|
||||
CGO_ENABLED=0 go build -ldflags="-s -w -X main.version=$(GIT_VERSION) -X main.channel=$(CHANNEL) -X main.goarm=$(GOARM)" -asmflags="-trimpath=$(PWD)" -gcflags="-trimpath=$(PWD)"
|
||||
PATH=$(GOPATH)/bin:$(PATH) packr clean
|
||||
|
||||
clean:
|
||||
|
||||
19
README.md
19
README.md
@@ -53,6 +53,7 @@ It operates as a DNS server that re-routes tracking domains to a "black hole," t
|
||||
* [Test unstable versions](#test-unstable-versions)
|
||||
* [Reporting issues](#reporting-issues)
|
||||
* [Help with translations](#translate)
|
||||
* [Projects that use AdGuardHome](#uses)
|
||||
* [Acknowledgments](#acknowledgments)
|
||||
|
||||
<a id="getting-started"></a>
|
||||
@@ -118,7 +119,7 @@ AdGuard Home provides a lot of features out-of-the-box with no need to install a
|
||||
|
||||
It depends.
|
||||
|
||||
"DNS sinkholing" is capable of blocking a big percentage of ads, but it lacks flexibility and power of traditional ad blockers. You can get a good impression about the difference between these methods by reading [this article](https://adguard.com/en/blog/adguard-vs-adaway-dns66/). It compares AdGuard for Android (a traditional ad blocker) to hosts-level ad blockers (which are almost identical to DNS-based blockers in their capabilities). However, this level of protection is enough for some users.
|
||||
"DNS sinkholing" is capable of blocking a big percentage of ads, but it lacks flexibility and power of traditional ad blockers. You can get a good impression about the difference between these methods by reading [this article](https://adguard.com/en/blog/adguard-vs-adaway-dns66/). It compares AdGuard for Android (a traditional ad blocker) to hosts-level ad blockers (which are almost identical to DNS-based blockers in their capabilities). However, this level of protection is enough for some users. Additionally, using a DNS-based blocker can help to block ads, tracking and analytics requests on other types of devices, such as SmartTVs, smart speakers or other kinds of IoT devices (on which you can't install tradtional ad blockers).
|
||||
|
||||
<a id="how-to-build"></a>
|
||||
## How to build from source
|
||||
@@ -130,7 +131,7 @@ You will need:
|
||||
* [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:
|
||||
You can either install them via the provided links or use [brew.sh](https://brew.sh/) if you're on Mac:
|
||||
|
||||
```bash
|
||||
brew install go node
|
||||
@@ -170,14 +171,15 @@ or you can use the Docker image from the `edge` tag, which is synced with the re
|
||||
|
||||
* [Docker Hub](https://hub.docker.com/r/adguard/adguardhome)
|
||||
* Beta builds
|
||||
* [Rapsberry Pi (32-bit ARM)](https://static.adguard.com/adguardhome/beta/AdGuardHome_linux_arm.tar.gz)
|
||||
* [Raspberry Pi (32-bit ARMv6)](https://static.adguard.com/adguardhome/beta/AdGuardHome_linux_arm.tar.gz)
|
||||
* [MacOS](https://static.adguard.com/adguardhome/beta/AdGuardHome_MacOS.zip)
|
||||
* [Windows 64-bit](https://static.adguard.com/adguardhome/beta/AdGuardHome_Windows_amd64.zip)
|
||||
* [Windows 32-bit](https://static.adguard.com/adguardhome/beta/AdGuardHome_Windows_386.zip)
|
||||
* [Linux 64-bit](https://static.adguard.com/adguardhome/beta/AdGuardHome_linux_amd64.tar.gz)
|
||||
* [Linux 32-bit](https://static.adguard.com/adguardhome/beta/AdGuardHome_linux_386.tar.gz)
|
||||
* [FreeBSD 64-bit](https://static.adguard.com/adguardhome/beta/AdGuardHome_freebsd_amd64.tar.gz)
|
||||
* [64-bit ARM](https://static.adguard.com/adguardhome/beta/AdGuardHome_linux_arm64.tar.gz)
|
||||
* [Linux 64-bit ARM](https://static.adguard.com/adguardhome/beta/AdGuardHome_linux_arm64.tar.gz)
|
||||
* [Linux 32-bit ARMv5](https://static.adguard.com/adguardhome/beta/AdGuardHome_linux_armv5.tar.gz)
|
||||
* [MIPS](https://static.adguard.com/adguardhome/beta/AdGuardHome_linux_mips.tar.gz)
|
||||
* [MIPSLE](https://static.adguard.com/adguardhome/beta/AdGuardHome_linux_mipsle.tar.gz)
|
||||
|
||||
@@ -193,6 +195,15 @@ If you want to help with AdGuard Home translations, please learn more about tran
|
||||
|
||||
Here is a link to AdGuard Home project: https://crowdin.com/project/adguard-applications/en#/adguard-home
|
||||
|
||||
|
||||
<a id="uses"></a>
|
||||
## Projects that use AdGuardHome
|
||||
|
||||
* Python library (https://github.com/frenck/python-adguardhome)
|
||||
* Hass.io add-on (https://github.com/hassio-addons/addon-adguard-home)
|
||||
* OpenWrt LUCI app (https://github.com/rufengsuixing/luci-app-adguardhome)
|
||||
|
||||
|
||||
<a id="acknowledgments"></a>
|
||||
## Acknowledgments
|
||||
|
||||
|
||||
8
client/.eslintrc
vendored
8
client/.eslintrc
vendored
@@ -17,6 +17,11 @@
|
||||
"react": {
|
||||
"pragma": "React",
|
||||
"version": "16.4"
|
||||
},
|
||||
"import/resolver": {
|
||||
"webpack": {
|
||||
"config": "webpack.common.js"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -48,6 +53,7 @@
|
||||
"camelcase": "off",
|
||||
"no-console": ["warn", { "allow": ["warn", "error"] }],
|
||||
"import/no-extraneous-dependencies": ["error", { "devDependencies": true }],
|
||||
"import/prefer-default-export": "off"
|
||||
"import/prefer-default-export": "off",
|
||||
"no-alert": "off"
|
||||
}
|
||||
}
|
||||
|
||||
521
client/package-lock.json
generated
vendored
521
client/package-lock.json
generated
vendored
@@ -239,6 +239,31 @@
|
||||
"@babel/types": "7.0.0-beta.44"
|
||||
}
|
||||
},
|
||||
"@babel/helper-module-imports": {
|
||||
"version": "7.8.3",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz",
|
||||
"integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==",
|
||||
"requires": {
|
||||
"@babel/types": "^7.8.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/types": {
|
||||
"version": "7.8.3",
|
||||
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz",
|
||||
"integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==",
|
||||
"requires": {
|
||||
"esutils": "^2.0.2",
|
||||
"lodash": "^4.17.13",
|
||||
"to-fast-properties": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"to-fast-properties": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
|
||||
"integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
|
||||
}
|
||||
}
|
||||
},
|
||||
"@babel/helper-split-export-declaration": {
|
||||
"version": "7.0.0-beta.44",
|
||||
"resolved": "http://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz",
|
||||
@@ -518,6 +543,102 @@
|
||||
"integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==",
|
||||
"dev": true
|
||||
},
|
||||
"@emotion/cache": {
|
||||
"version": "10.0.27",
|
||||
"resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-10.0.27.tgz",
|
||||
"integrity": "sha512-Zp8BEpbMunFsTcqAK4D7YTm3MvCp1SekflSLJH8lze2fCcSZ/yMkXHo8kb3t1/1Tdd3hAqf3Fb7z9VZ+FMiC9w==",
|
||||
"requires": {
|
||||
"@emotion/sheet": "0.9.4",
|
||||
"@emotion/stylis": "0.8.5",
|
||||
"@emotion/utils": "0.11.3",
|
||||
"@emotion/weak-memoize": "0.2.5"
|
||||
}
|
||||
},
|
||||
"@emotion/core": {
|
||||
"version": "10.0.27",
|
||||
"resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.0.27.tgz",
|
||||
"integrity": "sha512-XbD5R36pVbohQMnKfajHv43g8EbN4NHdF6Zh9zg/C0nr0jqwOw3gYnC07Xj3yG43OYSRyrGsoQ5qPwc8ycvLZw==",
|
||||
"requires": {
|
||||
"@babel/runtime": "^7.5.5",
|
||||
"@emotion/cache": "^10.0.27",
|
||||
"@emotion/css": "^10.0.27",
|
||||
"@emotion/serialize": "^0.11.15",
|
||||
"@emotion/sheet": "0.9.4",
|
||||
"@emotion/utils": "0.11.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/runtime": {
|
||||
"version": "7.8.3",
|
||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz",
|
||||
"integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==",
|
||||
"requires": {
|
||||
"regenerator-runtime": "^0.13.2"
|
||||
}
|
||||
},
|
||||
"regenerator-runtime": {
|
||||
"version": "0.13.3",
|
||||
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz",
|
||||
"integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"@emotion/css": {
|
||||
"version": "10.0.27",
|
||||
"resolved": "https://registry.npmjs.org/@emotion/css/-/css-10.0.27.tgz",
|
||||
"integrity": "sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw==",
|
||||
"requires": {
|
||||
"@emotion/serialize": "^0.11.15",
|
||||
"@emotion/utils": "0.11.3",
|
||||
"babel-plugin-emotion": "^10.0.27"
|
||||
}
|
||||
},
|
||||
"@emotion/hash": {
|
||||
"version": "0.7.4",
|
||||
"resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.7.4.tgz",
|
||||
"integrity": "sha512-fxfMSBMX3tlIbKUdtGKxqB1fyrH6gVrX39Gsv3y8lRYKUqlgDt3UMqQyGnR1bQMa2B8aGnhLZokZgg8vT0Le+A=="
|
||||
},
|
||||
"@emotion/memoize": {
|
||||
"version": "0.7.4",
|
||||
"resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz",
|
||||
"integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw=="
|
||||
},
|
||||
"@emotion/serialize": {
|
||||
"version": "0.11.15",
|
||||
"resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.15.tgz",
|
||||
"integrity": "sha512-YE+qnrmGwyR+XB5j7Bi+0GT1JWsdcjM/d4POu+TXkcnrRs4RFCCsi3d/Ebf+wSStHqAlTT2+dfd+b9N9EO2KBg==",
|
||||
"requires": {
|
||||
"@emotion/hash": "0.7.4",
|
||||
"@emotion/memoize": "0.7.4",
|
||||
"@emotion/unitless": "0.7.5",
|
||||
"@emotion/utils": "0.11.3",
|
||||
"csstype": "^2.5.7"
|
||||
}
|
||||
},
|
||||
"@emotion/sheet": {
|
||||
"version": "0.9.4",
|
||||
"resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-0.9.4.tgz",
|
||||
"integrity": "sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA=="
|
||||
},
|
||||
"@emotion/stylis": {
|
||||
"version": "0.8.5",
|
||||
"resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz",
|
||||
"integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ=="
|
||||
},
|
||||
"@emotion/unitless": {
|
||||
"version": "0.7.5",
|
||||
"resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz",
|
||||
"integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg=="
|
||||
},
|
||||
"@emotion/utils": {
|
||||
"version": "0.11.3",
|
||||
"resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.11.3.tgz",
|
||||
"integrity": "sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw=="
|
||||
},
|
||||
"@emotion/weak-memoize": {
|
||||
"version": "0.2.5",
|
||||
"resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz",
|
||||
"integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA=="
|
||||
},
|
||||
"@mrmlnc/readdir-enhanced": {
|
||||
"version": "2.2.1",
|
||||
"resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
|
||||
@@ -608,6 +729,11 @@
|
||||
"integrity": "sha512-Zl8dGvAcEmadgs1tmSPcvwzO1YRsz38bVJQvH1RvRqSR9/5n61Q1ktcDL0ht3FXWR+ZpVmXVwN1LuH4Ax23NsA==",
|
||||
"dev": true
|
||||
},
|
||||
"@types/parse-json": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
|
||||
"integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
|
||||
},
|
||||
"@types/q": {
|
||||
"version": "1.5.2",
|
||||
"resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz",
|
||||
@@ -695,6 +821,7 @@
|
||||
"version": "6.5.3",
|
||||
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.3.tgz",
|
||||
"integrity": "sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"fast-deep-equal": "^2.0.1",
|
||||
"fast-json-stable-stringify": "^2.0.0",
|
||||
@@ -711,7 +838,8 @@
|
||||
"ajv-keywords": {
|
||||
"version": "3.2.0",
|
||||
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz",
|
||||
"integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo="
|
||||
"integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=",
|
||||
"dev": true
|
||||
},
|
||||
"align-text": {
|
||||
"version": "0.1.4",
|
||||
@@ -752,7 +880,6 @@
|
||||
"version": "3.2.1",
|
||||
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
|
||||
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"color-convert": "^1.9.0"
|
||||
}
|
||||
@@ -800,6 +927,12 @@
|
||||
"integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
|
||||
"dev": true
|
||||
},
|
||||
"array-find": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/array-find/-/array-find-1.0.0.tgz",
|
||||
"integrity": "sha1-bI4obRHtdoMn+OYuzuhzU8o+eLg=",
|
||||
"dev": true
|
||||
},
|
||||
"array-find-index": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
|
||||
@@ -1311,6 +1444,123 @@
|
||||
"babel-runtime": "^6.22.0"
|
||||
}
|
||||
},
|
||||
"babel-plugin-emotion": {
|
||||
"version": "10.0.27",
|
||||
"resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.0.27.tgz",
|
||||
"integrity": "sha512-SUNYcT4FqhOqvwv0z1oeYhqgheU8qrceLojuHyX17ngo7WtWqN5I9l3IGHzf21Xraj465CVzF4IvOlAF+3ed0A==",
|
||||
"requires": {
|
||||
"@babel/helper-module-imports": "^7.0.0",
|
||||
"@emotion/hash": "0.7.4",
|
||||
"@emotion/memoize": "0.7.4",
|
||||
"@emotion/serialize": "^0.11.15",
|
||||
"babel-plugin-macros": "^2.0.0",
|
||||
"babel-plugin-syntax-jsx": "^6.18.0",
|
||||
"convert-source-map": "^1.5.0",
|
||||
"escape-string-regexp": "^1.0.5",
|
||||
"find-root": "^1.1.0",
|
||||
"source-map": "^0.5.7"
|
||||
},
|
||||
"dependencies": {
|
||||
"source-map": {
|
||||
"version": "0.5.7",
|
||||
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
|
||||
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
|
||||
}
|
||||
}
|
||||
},
|
||||
"babel-plugin-macros": {
|
||||
"version": "2.8.0",
|
||||
"resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz",
|
||||
"integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==",
|
||||
"requires": {
|
||||
"@babel/runtime": "^7.7.2",
|
||||
"cosmiconfig": "^6.0.0",
|
||||
"resolve": "^1.12.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/code-frame": {
|
||||
"version": "7.8.3",
|
||||
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
|
||||
"integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
|
||||
"requires": {
|
||||
"@babel/highlight": "^7.8.3"
|
||||
}
|
||||
},
|
||||
"@babel/highlight": {
|
||||
"version": "7.8.3",
|
||||
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
|
||||
"integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
|
||||
"requires": {
|
||||
"chalk": "^2.0.0",
|
||||
"esutils": "^2.0.2",
|
||||
"js-tokens": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"@babel/runtime": {
|
||||
"version": "7.8.3",
|
||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz",
|
||||
"integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==",
|
||||
"requires": {
|
||||
"regenerator-runtime": "^0.13.2"
|
||||
}
|
||||
},
|
||||
"cosmiconfig": {
|
||||
"version": "6.0.0",
|
||||
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
|
||||
"integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
|
||||
"requires": {
|
||||
"@types/parse-json": "^4.0.0",
|
||||
"import-fresh": "^3.1.0",
|
||||
"parse-json": "^5.0.0",
|
||||
"path-type": "^4.0.0",
|
||||
"yaml": "^1.7.2"
|
||||
}
|
||||
},
|
||||
"import-fresh": {
|
||||
"version": "3.2.1",
|
||||
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
|
||||
"integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
|
||||
"requires": {
|
||||
"parent-module": "^1.0.0",
|
||||
"resolve-from": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"parse-json": {
|
||||
"version": "5.0.0",
|
||||
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz",
|
||||
"integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==",
|
||||
"requires": {
|
||||
"@babel/code-frame": "^7.0.0",
|
||||
"error-ex": "^1.3.1",
|
||||
"json-parse-better-errors": "^1.0.1",
|
||||
"lines-and-columns": "^1.1.6"
|
||||
}
|
||||
},
|
||||
"path-type": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
|
||||
"integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
|
||||
},
|
||||
"regenerator-runtime": {
|
||||
"version": "0.13.3",
|
||||
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz",
|
||||
"integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw=="
|
||||
},
|
||||
"resolve": {
|
||||
"version": "1.15.0",
|
||||
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz",
|
||||
"integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==",
|
||||
"requires": {
|
||||
"path-parse": "^1.0.6"
|
||||
}
|
||||
},
|
||||
"resolve-from": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
|
||||
"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"babel-plugin-syntax-async-functions": {
|
||||
"version": "6.13.0",
|
||||
"resolved": "http://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz",
|
||||
@@ -1356,8 +1606,7 @@
|
||||
"babel-plugin-syntax-jsx": {
|
||||
"version": "6.18.0",
|
||||
"resolved": "http://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz",
|
||||
"integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=",
|
||||
"dev": true
|
||||
"integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY="
|
||||
},
|
||||
"babel-plugin-syntax-object-rest-spread": {
|
||||
"version": "6.13.0",
|
||||
@@ -2031,7 +2280,8 @@
|
||||
"big.js": {
|
||||
"version": "3.2.0",
|
||||
"resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz",
|
||||
"integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q=="
|
||||
"integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==",
|
||||
"dev": true
|
||||
},
|
||||
"binary-extensions": {
|
||||
"version": "1.11.0",
|
||||
@@ -2441,7 +2691,6 @@
|
||||
"version": "2.4.1",
|
||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
|
||||
"integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ansi-styles": "^3.2.1",
|
||||
"escape-string-regexp": "^1.0.5",
|
||||
@@ -2985,7 +3234,6 @@
|
||||
"version": "1.9.3",
|
||||
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
|
||||
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"color-name": "1.1.3"
|
||||
}
|
||||
@@ -2993,8 +3241,7 @@
|
||||
"color-name": {
|
||||
"version": "1.1.3",
|
||||
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
|
||||
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
|
||||
"dev": true
|
||||
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
|
||||
},
|
||||
"commander": {
|
||||
"version": "2.17.1",
|
||||
@@ -3122,8 +3369,7 @@
|
||||
"convert-source-map": {
|
||||
"version": "1.5.1",
|
||||
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz",
|
||||
"integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=",
|
||||
"dev": true
|
||||
"integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU="
|
||||
},
|
||||
"cookie": {
|
||||
"version": "0.3.1",
|
||||
@@ -3454,6 +3700,11 @@
|
||||
"integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
|
||||
"dev": true
|
||||
},
|
||||
"csstype": {
|
||||
"version": "2.6.8",
|
||||
"resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.8.tgz",
|
||||
"integrity": "sha512-msVS9qTuMT5zwAGCVm4mxfrZ18BNc6Csd0oJAtiFMZ1FAx1CCvy2+5MDmYoix63LM/6NDbNtodCiGYGmFgO0dA=="
|
||||
},
|
||||
"currently-unhandled": {
|
||||
"version": "0.4.1",
|
||||
"resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
|
||||
@@ -3970,7 +4221,8 @@
|
||||
"emojis-list": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
|
||||
"integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k="
|
||||
"integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
|
||||
"dev": true
|
||||
},
|
||||
"encodeurl": {
|
||||
"version": "1.0.2",
|
||||
@@ -4034,7 +4286,6 @@
|
||||
"version": "1.3.2",
|
||||
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
|
||||
"integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"is-arrayish": "^0.2.1"
|
||||
}
|
||||
@@ -4148,8 +4399,7 @@
|
||||
"escape-string-regexp": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
|
||||
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
|
||||
"dev": true
|
||||
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
|
||||
},
|
||||
"escope": {
|
||||
"version": "3.6.0",
|
||||
@@ -4308,6 +4558,79 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"eslint-import-resolver-webpack": {
|
||||
"version": "0.12.1",
|
||||
"resolved": "https://registry.npmjs.org/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.12.1.tgz",
|
||||
"integrity": "sha512-O/sUAXk6GWrICiN8JUkkjdt9uZpqZHP+FVnTxtEILL6EZMaPSrnP4lGPSFwcKsv7O211maqq4Nz60+dh236hVg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"array-find": "^1.0.0",
|
||||
"debug": "^2.6.9",
|
||||
"enhanced-resolve": "^0.9.1",
|
||||
"find-root": "^1.1.0",
|
||||
"has": "^1.0.3",
|
||||
"interpret": "^1.2.0",
|
||||
"lodash": "^4.17.15",
|
||||
"node-libs-browser": "^1.0.0 || ^2.0.0",
|
||||
"resolve": "^1.13.1",
|
||||
"semver": "^5.7.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
"version": "2.6.9",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
||||
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ms": "2.0.0"
|
||||
}
|
||||
},
|
||||
"enhanced-resolve": {
|
||||
"version": "0.9.1",
|
||||
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz",
|
||||
"integrity": "sha1-TW5omzcl+GCQknzMhs2fFjW4ni4=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"graceful-fs": "^4.1.2",
|
||||
"memory-fs": "^0.2.0",
|
||||
"tapable": "^0.1.8"
|
||||
}
|
||||
},
|
||||
"interpret": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz",
|
||||
"integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==",
|
||||
"dev": true
|
||||
},
|
||||
"memory-fs": {
|
||||
"version": "0.2.0",
|
||||
"resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz",
|
||||
"integrity": "sha1-8rslNovBIeORwlIN6Slpyu4KApA=",
|
||||
"dev": true
|
||||
},
|
||||
"resolve": {
|
||||
"version": "1.15.0",
|
||||
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz",
|
||||
"integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"path-parse": "^1.0.6"
|
||||
}
|
||||
},
|
||||
"semver": {
|
||||
"version": "5.7.1",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
|
||||
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
|
||||
"dev": true
|
||||
},
|
||||
"tapable": {
|
||||
"version": "0.1.10",
|
||||
"resolved": "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz",
|
||||
"integrity": "sha1-KcNXB8K3DlDQdIK10gLo7URtr9Q=",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"eslint-loader": {
|
||||
"version": "1.9.0",
|
||||
"resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-1.9.0.tgz",
|
||||
@@ -4570,8 +4893,7 @@
|
||||
"esutils": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
|
||||
"integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
|
||||
"dev": true
|
||||
"integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
|
||||
},
|
||||
"etag": {
|
||||
"version": "1.8.1",
|
||||
@@ -4913,7 +5235,8 @@
|
||||
"fast-deep-equal": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
|
||||
"integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk="
|
||||
"integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
|
||||
"dev": true
|
||||
},
|
||||
"fast-glob": {
|
||||
"version": "2.2.6",
|
||||
@@ -4932,7 +5255,8 @@
|
||||
"fast-json-stable-stringify": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
|
||||
"integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
|
||||
"integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
|
||||
"dev": true
|
||||
},
|
||||
"fast-levenshtein": {
|
||||
"version": "2.0.6",
|
||||
@@ -5087,6 +5411,11 @@
|
||||
"pkg-dir": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"find-root": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
|
||||
"integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="
|
||||
},
|
||||
"find-up": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
|
||||
@@ -5214,7 +5543,8 @@
|
||||
"ansi-regex": {
|
||||
"version": "2.1.1",
|
||||
"bundled": true,
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"aproba": {
|
||||
"version": "1.2.0",
|
||||
@@ -5235,12 +5565,14 @@
|
||||
"balanced-match": {
|
||||
"version": "1.0.0",
|
||||
"bundled": true,
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"brace-expansion": {
|
||||
"version": "1.1.11",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"balanced-match": "^1.0.0",
|
||||
"concat-map": "0.0.1"
|
||||
@@ -5255,17 +5587,20 @@
|
||||
"code-point-at": {
|
||||
"version": "1.1.0",
|
||||
"bundled": true,
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"concat-map": {
|
||||
"version": "0.0.1",
|
||||
"bundled": true,
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"console-control-strings": {
|
||||
"version": "1.1.0",
|
||||
"bundled": true,
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"core-util-is": {
|
||||
"version": "1.0.2",
|
||||
@@ -5382,7 +5717,8 @@
|
||||
"inherits": {
|
||||
"version": "2.0.3",
|
||||
"bundled": true,
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"ini": {
|
||||
"version": "1.3.5",
|
||||
@@ -5394,6 +5730,7 @@
|
||||
"version": "1.0.0",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"number-is-nan": "^1.0.0"
|
||||
}
|
||||
@@ -5408,6 +5745,7 @@
|
||||
"version": "3.0.4",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"brace-expansion": "^1.1.7"
|
||||
}
|
||||
@@ -5415,12 +5753,14 @@
|
||||
"minimist": {
|
||||
"version": "0.0.8",
|
||||
"bundled": true,
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"minipass": {
|
||||
"version": "2.3.5",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"safe-buffer": "^5.1.2",
|
||||
"yallist": "^3.0.0"
|
||||
@@ -5439,6 +5779,7 @@
|
||||
"version": "0.5.1",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"minimist": "0.0.8"
|
||||
}
|
||||
@@ -5519,7 +5860,8 @@
|
||||
"number-is-nan": {
|
||||
"version": "1.0.1",
|
||||
"bundled": true,
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"object-assign": {
|
||||
"version": "4.1.1",
|
||||
@@ -5531,6 +5873,7 @@
|
||||
"version": "1.4.0",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"wrappy": "1"
|
||||
}
|
||||
@@ -5616,7 +5959,8 @@
|
||||
"safe-buffer": {
|
||||
"version": "5.1.2",
|
||||
"bundled": true,
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"safer-buffer": {
|
||||
"version": "2.1.2",
|
||||
@@ -5652,6 +5996,7 @@
|
||||
"version": "1.0.2",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"code-point-at": "^1.0.0",
|
||||
"is-fullwidth-code-point": "^1.0.0",
|
||||
@@ -5671,6 +6016,7 @@
|
||||
"version": "3.0.1",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"ansi-regex": "^2.0.0"
|
||||
}
|
||||
@@ -5714,12 +6060,14 @@
|
||||
"wrappy": {
|
||||
"version": "1.0.2",
|
||||
"bundled": true,
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"yallist": {
|
||||
"version": "3.0.3",
|
||||
"bundled": true,
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -5922,8 +6270,7 @@
|
||||
"has-flag": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
|
||||
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
|
||||
"dev": true
|
||||
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
|
||||
},
|
||||
"has-value": {
|
||||
"version": "1.0.0",
|
||||
@@ -6910,8 +7257,7 @@
|
||||
"is-arrayish": {
|
||||
"version": "0.2.1",
|
||||
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
|
||||
"integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
|
||||
"dev": true
|
||||
"integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
|
||||
},
|
||||
"is-binary-path": {
|
||||
"version": "1.0.1",
|
||||
@@ -7206,13 +7552,13 @@
|
||||
"json-parse-better-errors": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
|
||||
"integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
|
||||
"dev": true
|
||||
"integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="
|
||||
},
|
||||
"json-schema-traverse": {
|
||||
"version": "0.4.1",
|
||||
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
|
||||
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
|
||||
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
|
||||
"dev": true
|
||||
},
|
||||
"json-stable-stringify-without-jsonify": {
|
||||
"version": "1.0.1",
|
||||
@@ -7229,7 +7575,8 @@
|
||||
"json5": {
|
||||
"version": "0.5.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
|
||||
"integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE="
|
||||
"integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
|
||||
"dev": true
|
||||
},
|
||||
"jsx-ast-utils": {
|
||||
"version": "1.4.1",
|
||||
@@ -7289,6 +7636,11 @@
|
||||
"type-check": "~0.3.2"
|
||||
}
|
||||
},
|
||||
"lines-and-columns": {
|
||||
"version": "1.1.6",
|
||||
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
|
||||
"integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA="
|
||||
},
|
||||
"load-json-file": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
|
||||
@@ -7362,6 +7714,7 @@
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz",
|
||||
"integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"big.js": "^3.1.3",
|
||||
"emojis-list": "^2.0.0",
|
||||
@@ -7593,6 +7946,11 @@
|
||||
"mimic-fn": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"memoize-one": {
|
||||
"version": "5.1.1",
|
||||
"resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.1.1.tgz",
|
||||
"integrity": "sha512-HKeeBpWvqiVJD57ZUAsJNm71eHTykffzcLZVYWiVfQeI1rJtuEaS7hQiEpWfVVk18donPwJEcFKIkCmPJNOhHA=="
|
||||
},
|
||||
"memory-fs": {
|
||||
"version": "0.4.1",
|
||||
"resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
|
||||
@@ -8292,6 +8650,21 @@
|
||||
"no-case": "^2.2.0"
|
||||
}
|
||||
},
|
||||
"parent-module": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
|
||||
"integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
|
||||
"requires": {
|
||||
"callsites": "^3.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"callsites": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
|
||||
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"parse-asn1": {
|
||||
"version": "5.1.1",
|
||||
"resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz",
|
||||
@@ -8380,8 +8753,7 @@
|
||||
"path-parse": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
|
||||
"integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
|
||||
"dev": true
|
||||
"integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw=="
|
||||
},
|
||||
"path-to-regexp": {
|
||||
"version": "1.7.0",
|
||||
@@ -9924,7 +10296,8 @@
|
||||
"punycode": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
|
||||
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
|
||||
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
|
||||
"dev": true
|
||||
},
|
||||
"q": {
|
||||
"version": "1.5.1",
|
||||
@@ -10082,6 +10455,14 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"react-input-autosize": {
|
||||
"version": "2.2.2",
|
||||
"resolved": "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-2.2.2.tgz",
|
||||
"integrity": "sha512-jQJgYCA3S0j+cuOwzuCd1OjmBmnZLdqQdiLKRYrsMMzbjUrVDS5RvJUDwJqA7sKuksDuzFtm6hZGKFu7Mjk5aw==",
|
||||
"requires": {
|
||||
"prop-types": "^15.5.8"
|
||||
}
|
||||
},
|
||||
"react-is": {
|
||||
"version": "16.6.3",
|
||||
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.6.3.tgz",
|
||||
@@ -10200,6 +10581,36 @@
|
||||
"prop-types": "^15.6.0"
|
||||
}
|
||||
},
|
||||
"react-select": {
|
||||
"version": "3.0.8",
|
||||
"resolved": "https://registry.npmjs.org/react-select/-/react-select-3.0.8.tgz",
|
||||
"integrity": "sha512-v9LpOhckLlRmXN5A6/mGGEft4FMrfaBFTGAnuPHcUgVId7Je42kTq9y0Z+Ye5z8/j0XDT3zUqza8gaRaI1PZIg==",
|
||||
"requires": {
|
||||
"@babel/runtime": "^7.4.4",
|
||||
"@emotion/cache": "^10.0.9",
|
||||
"@emotion/core": "^10.0.9",
|
||||
"@emotion/css": "^10.0.9",
|
||||
"memoize-one": "^5.0.0",
|
||||
"prop-types": "^15.6.0",
|
||||
"react-input-autosize": "^2.2.2",
|
||||
"react-transition-group": "^2.2.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/runtime": {
|
||||
"version": "7.8.3",
|
||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz",
|
||||
"integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==",
|
||||
"requires": {
|
||||
"regenerator-runtime": "^0.13.2"
|
||||
}
|
||||
},
|
||||
"regenerator-runtime": {
|
||||
"version": "0.13.3",
|
||||
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz",
|
||||
"integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"react-table": {
|
||||
"version": "6.10.3",
|
||||
"resolved": "https://registry.npmjs.org/react-table/-/react-table-6.10.3.tgz",
|
||||
@@ -10736,6 +11147,7 @@
|
||||
"version": "0.4.7",
|
||||
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz",
|
||||
"integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ajv": "^6.1.0",
|
||||
"ajv-keywords": "^3.1.0"
|
||||
@@ -12149,7 +12561,6 @@
|
||||
"version": "5.5.0",
|
||||
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
|
||||
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"has-flag": "^3.0.0"
|
||||
}
|
||||
@@ -12164,6 +12575,7 @@
|
||||
"version": "2.3.2",
|
||||
"resolved": "https://registry.npmjs.org/svg-url-loader/-/svg-url-loader-2.3.2.tgz",
|
||||
"integrity": "sha1-3YaybBn+O5FPBOoQ7zlZTq3gRGQ=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"file-loader": "1.1.11",
|
||||
"loader-utils": "1.1.0"
|
||||
@@ -12173,6 +12585,7 @@
|
||||
"version": "1.1.11",
|
||||
"resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz",
|
||||
"integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"loader-utils": "^1.0.2",
|
||||
"schema-utils": "^0.4.5"
|
||||
@@ -12644,6 +13057,7 @@
|
||||
"version": "4.2.2",
|
||||
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
|
||||
"integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"punycode": "^2.1.0"
|
||||
}
|
||||
@@ -13617,6 +14031,29 @@
|
||||
"integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
|
||||
"dev": true
|
||||
},
|
||||
"yaml": {
|
||||
"version": "1.7.2",
|
||||
"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.7.2.tgz",
|
||||
"integrity": "sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw==",
|
||||
"requires": {
|
||||
"@babel/runtime": "^7.6.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/runtime": {
|
||||
"version": "7.8.3",
|
||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz",
|
||||
"integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==",
|
||||
"requires": {
|
||||
"regenerator-runtime": "^0.13.2"
|
||||
}
|
||||
},
|
||||
"regenerator-runtime": {
|
||||
"version": "0.13.3",
|
||||
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz",
|
||||
"integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"yargs-parser": {
|
||||
"version": "10.1.0",
|
||||
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz",
|
||||
|
||||
6
client/package.json
vendored
6
client/package.json
vendored
@@ -27,13 +27,13 @@
|
||||
"react-redux-loading-bar": "^4.0.7",
|
||||
"react-router-dom": "^4.2.2",
|
||||
"react-router-hash-link": "^1.2.2",
|
||||
"react-select": "^3.0.8",
|
||||
"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",
|
||||
"url-polyfill": "^1.1.7"
|
||||
},
|
||||
"devDependencies": {
|
||||
@@ -53,6 +53,7 @@
|
||||
"eslint": "^4.19.1",
|
||||
"eslint-config-airbnb-base": "^12.1.0",
|
||||
"eslint-config-react-app": "^2.1.0",
|
||||
"eslint-import-resolver-webpack": "^0.12.1",
|
||||
"eslint-loader": "1.9.0",
|
||||
"eslint-plugin-import": "^2.12.0",
|
||||
"eslint-plugin-jsx-a11y": "5.1.1",
|
||||
@@ -73,6 +74,7 @@
|
||||
"url-loader": "^1.0.1",
|
||||
"webpack": "3.8.1",
|
||||
"webpack-dev-server": "^3.1.14",
|
||||
"webpack-merge": "^4.1.3"
|
||||
"webpack-merge": "^4.1.3",
|
||||
"svg-url-loader": "^2.3.2"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -90,21 +90,14 @@
|
||||
"enabled_save_search_toast": "Разреши Безопасно Търсене",
|
||||
"enabled_table_header": "Разреши",
|
||||
"name_table_header": "Име",
|
||||
"filter_url_table_header": "URL филтър",
|
||||
"rules_count_table_header": "Правила общо",
|
||||
"last_time_updated_table_header": "Последно обновен",
|
||||
"actions_table_header": "Действия",
|
||||
"delete_table_action": "Изтрий",
|
||||
"filters_and_hosts": "Черни списъци с общи и местни филтри",
|
||||
"filters_and_hosts_hint": "AdGuard Home разбира adblock и host синтаксис.",
|
||||
"no_filters_added": "Няма добавени филтри",
|
||||
"add_filter_btn": "Добави филтър",
|
||||
"cancel_btn": "Откажи",
|
||||
"enter_name_hint": "Въведи име",
|
||||
"enter_url_hint": "Въведи URL",
|
||||
"check_updates_btn": "Провери за актуализация",
|
||||
"new_filter_btn": "Въведи нов филтър",
|
||||
"enter_valid_filter_url": "Моля въведете валиден URL за филтъра или проверете host правописа.",
|
||||
"custom_filter_rules": "Местни правила за филтриране",
|
||||
"custom_filter_rules_hint": "Въвеждайте всяко правило на нов ред. Може да използвате adblock или hosts файлов синтаксис.",
|
||||
"examples_title": "Примери",
|
||||
@@ -119,7 +112,6 @@
|
||||
"example_upstream_doh": "криптиран <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-върху-HTTPS</a>",
|
||||
"example_upstream_sdns": "може да ползвате <a href='https://dnscrypt.info/stamps/' target='_blank'>DNS Подписване</a> за <a href='https://dnscrypt.info/' target='_blank'>DNSCrypt</a> или <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-върху-HTTPS</a> сървъри",
|
||||
"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}}\": не работи, моля проверете дали е въведен коректно",
|
||||
@@ -139,7 +131,6 @@
|
||||
"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": "Премахнато от местни правила за филтриране",
|
||||
@@ -148,7 +139,6 @@
|
||||
"found_in_known_domain_db": "Намерен в списъците с домейни.",
|
||||
"category_label": "Категория",
|
||||
"rule_label": "Правило",
|
||||
"filter_label": "Филтър",
|
||||
"unknown_filter": "Непознат филтър {{filterId}}",
|
||||
"install_welcome_title": "Добре дошли в AdGuard Home!",
|
||||
"install_welcome_desc": "AdGuard Home e мрежово решение за блокиране на реклами и тракери на DNS ниво. Създадено е за да ви даде пълен контрол над мрежата и всичките ви устройства, без да е необходимо допълнително инсталиране на друг софтуер.",
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
"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_client_id_format": "Neplatný formát ID klienta",
|
||||
"form_error_positive": "Musí být větší než 0",
|
||||
"form_error_negative": "Musí být rovno 0 nebo vyšší",
|
||||
"dhcp_form_gateway_input": "IP brána",
|
||||
@@ -75,7 +76,7 @@
|
||||
"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": "za posledních {{count}} dní",
|
||||
"for_last_days_plural": "za posledních {{count}} dní",
|
||||
"no_domains_found": "Nenalezeny žádné domény",
|
||||
"requests_count": "Počet požadavků",
|
||||
@@ -83,7 +84,7 @@
|
||||
"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": "Počet DNS dotazů zpracovaných za posledních {{count}} 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ů",
|
||||
@@ -104,6 +105,11 @@
|
||||
"no_servers_specified": "Nebyly specifikovány žádné servery",
|
||||
"general_settings": "Obecná nastavení",
|
||||
"dns_settings": "Nastavení DNS",
|
||||
"dns_blocklists": "DNS seznam blokovaných",
|
||||
"dns_allowlists": "DNS seznam povolených",
|
||||
"dns_blocklists_desc": "AdGuard Home bude blokovat domény na seznamu blokovaných.",
|
||||
"dns_allowlists_desc": "Domény z DNS seznamu povolených budou povoleny, i když se nacházejí v některém ze seznamů blokovaných.",
|
||||
"custom_filtering_rules": "Vlastní pravidla filtrování",
|
||||
"encryption_settings": "Nastavení šifrování",
|
||||
"dhcp_settings": "Nastavení DHCP",
|
||||
"upstream_dns": "Upstream DNS servery",
|
||||
@@ -121,22 +127,28 @@
|
||||
"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",
|
||||
"list_url_table_header": "Seznam URL",
|
||||
"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",
|
||||
"no_blocklist_added": "Nebyl přidán žádný seznam blokovaných",
|
||||
"no_whitelist_added": "Nebyl přidán žádný seznam povolených",
|
||||
"add_blocklist": "Přidat seznam blokovaných",
|
||||
"add_allowlist": "Přidat seznam povolených",
|
||||
"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.",
|
||||
"new_blocklist": "Nový seznam blokovaných",
|
||||
"new_allowlist": "Nový seznam povolených",
|
||||
"edit_blocklist": "Upravit seznam blokovaných",
|
||||
"edit_allowlist": "Upravit seznam povolených",
|
||||
"enter_valid_blocklist": "Zadejte platnou adresu URL na seznam blokovaných.",
|
||||
"enter_valid_allowlist": "Zadejte platnou adresu URL na seznam povolených.",
|
||||
"form_error_url_format": "Neplatný formát URL",
|
||||
"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",
|
||||
@@ -152,7 +164,7 @@
|
||||
"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í",
|
||||
"all_lists_up_to_date_toast": "Všechny seznamy 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",
|
||||
@@ -172,7 +184,6 @@
|
||||
"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í",
|
||||
@@ -190,6 +201,7 @@
|
||||
"query_log_retention_confirm": "Opravdu chcete změnit uchovávání protokolu dotazů? Pokud snížíte hodnotu intervalu, některá data budou ztracena",
|
||||
"dns_config": "Konfigurace serveru DNS",
|
||||
"blocking_mode": "Režim blokování",
|
||||
"default": "Výchozí",
|
||||
"nxdomain": "NXDOMAIN",
|
||||
"null_ip": "Nulová IP",
|
||||
"custom_ip": "Vlastní IP",
|
||||
@@ -202,13 +214,16 @@
|
||||
"rate_limit_desc": "Počet požadavků za sekundu, které smí jeden klient provádět (0: neomezeno)",
|
||||
"blocking_ipv4_desc": "IP adresa, která se má vrátit v případě blokovaného požadavku A",
|
||||
"blocking_ipv6_desc": "IP adresa, která se má vrátit v případě blokovaného požadavku AAAA",
|
||||
"blocking_mode_desc": "<0>NXDOMAIN – Odpověď s kódem NXDOMAIN;</0> <0>Nulová IP – Odpověď s nulovou IP adresou (0,0.0,0 pro A; :: pro AAAA);</0> <0>Vlastní IP adresa – Odpověď s ručně nastavenou IP adresou.</0>",
|
||||
"blocking_mode_default": "Výchozí: Odezva pomocí NXDOMAIN, pokud je blokováno pravidlem ve stylu Adblock; odezva pomocí IP adresy uvedené v pravidle, pokud je blokováno pravidlem /etc/hosts-style",
|
||||
"blocking_mode_nxdomain": "NXDOMAIN: Odezva s kódem NXDOMAIN",
|
||||
"blocking_mode_null_ip": "Nulová IP: Odezva s nulovou IP adresou (0.0.0.0 pro A; :: pro AAAA)",
|
||||
"blocking_mode_custom_ip": "Vlastní IP. odezva s ručně nastavenou IP adresou",
|
||||
"upstream_dns_client_desc": "Pokud toto pole ponecháte prázdné, AdGuard Home použije servery nakonfigurované v<0>nastavení DNS</0>.",
|
||||
"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",
|
||||
"list_label": "Seznam",
|
||||
"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.",
|
||||
@@ -320,7 +335,7 @@
|
||||
"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>",
|
||||
"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",
|
||||
@@ -332,7 +347,7 @@
|
||||
"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?",
|
||||
"list_confirm_delete": "Opravdu chcete smazat tento seznam?",
|
||||
"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",
|
||||
@@ -371,6 +386,7 @@
|
||||
"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",
|
||||
@@ -397,7 +413,8 @@
|
||||
"interval_days_plural": "Dny: {{count}}",
|
||||
"domain": "Doména",
|
||||
"answer": "Odpověď",
|
||||
"filter_added_successfully": "Filtr byl úspěšně přidán",
|
||||
"filter_added_successfully": "Seznam byl úspěšně přidán",
|
||||
"filter_updated": "Seznam byl úspěšně aktualizován",
|
||||
"statistics_configuration": "Konfigurace statistik",
|
||||
"statistics_retention": "Uchovávání statistik",
|
||||
"statistics_retention_desc": "Pokud hodnotu intervalu snížíte, některá data budou ztracena",
|
||||
@@ -426,5 +443,41 @@
|
||||
"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",
|
||||
"try_again": "Zkusit znovu"
|
||||
"try_again": "Zkusit znovu",
|
||||
"domain_desc": "Zadejte název domény nebo zástupný znak, který chcete přepsat.",
|
||||
"example_rewrite_domain": "přepsat odezvy pouze pro tento název domény.",
|
||||
"example_rewrite_wildcard": "přepsat odezvy pro všechny subdomény <0>example.org</0>.",
|
||||
"disable_ipv6": "Zakázat IPv6",
|
||||
"disable_ipv6_desc": "Pokud je tato funkce povolena, budou všechny dotazy DNS pro adresy IPv6 (typ AAAA) zrušeny.",
|
||||
"autofix_warning_text": "Pokud kliknete na „Opravit“, AdGuard Home nakonfiguruje váš systém tak, aby používal DNS server AdGuard Home.",
|
||||
"autofix_warning_list": "Jsou prováděny následující úlohy: <0>Deaktivace systému DNSStubListener</0> <0>Nastavení adresy serveru DNS na 127.0.0.1</0> <0>Nahrazení cíle symbolického odkazu z /etc/resolv.conf do /run/systemd/resolve/resolv.conf</0> <0>Zastavení služby DNSStubListener (znovu načtení služby systemd-resolved)</0>",
|
||||
"autofix_warning_result": "Výsledkem je, že všechny požadavky DNS z vašeho systému jsou ve výchozím nastavení zpracovány službou AdGuard Home.",
|
||||
"tags_title": "Značky",
|
||||
"tags_desc": "Můžete vybrat značky, které jsou přiřazeny klientovi. Značky mohou být zahrnuty do pravidel filtrování a umožňují Vám je přesněji použít. <0>Dozvědět se více</0>",
|
||||
"form_select_tags": "Vyberte značky klienta",
|
||||
"check_title": "Zkontrolovat filtrování",
|
||||
"check_desc": "Zkontrolujte, zda je název hostitele filtrován",
|
||||
"check": "Zkontrolovat",
|
||||
"form_enter_host": "Zadejte název hostitele",
|
||||
"filtered_custom_rules": "Filtrováno pomocí vlastních pravidel filtrování",
|
||||
"host_whitelisted": "Hostitel je na seznamu povolených",
|
||||
"check_ip": "IP adresy: {{ip}}",
|
||||
"check_cname": "CNAME: {{cname}}",
|
||||
"check_reason": "Důvod: {{reason}}",
|
||||
"check_rule": "Pravidlo: {{rule}}",
|
||||
"check_service": "Název služby: {{service}}",
|
||||
"check_not_found": "Nenalezeno ve Vašich seznamech filtrů",
|
||||
"client_confirm_block": "Opravdu chcete zablokovat klienta „{{ip}}“?",
|
||||
"client_confirm_unblock": "Opravdu chcete odblokovat klienta „{{ip}}“?",
|
||||
"client_blocked": "Klient „{{ip}}“ byl úspěšně zablokován",
|
||||
"client_unblocked": "Klient „{{ip}}“ byl úspěšně odblokován",
|
||||
"static_ip": "Statická IP adresa",
|
||||
"static_ip_desc": "AdGuard Home je server, takže pro správné fungování potřebuje statickou IP adresu. V opačném případě může váš router tomuto zařízení přiřadit jinou IP adresu.",
|
||||
"set_static_ip": "Nastavit statickou IP adresu",
|
||||
"install_static_ok": "Skvělá zpráva! Statická IP adresa je již nakonfigurována",
|
||||
"install_static_error": "AdGuard Home nemůže automaticky nakonfigurovat toto síťové rozhraní. Prosím vyhledejte návod, jak to provést ručně.",
|
||||
"install_static_configure": "Detekovali jsme, že se používá dynamická IP adresa — <0>{{ip}}</0>. Chcete ji použít jako statickou adresu?",
|
||||
"confirm_static_ip": "AdGuard Home nakonfiguruje {{ip}} jako statickou IP adresu. Chcete pokračovat?",
|
||||
"list_updated": "Byl aktualizován {{count}} seznam",
|
||||
"list_updated_plural": "Aktualizované seznamy: {{count}}"
|
||||
}
|
||||
@@ -23,6 +23,7 @@
|
||||
"form_error_ip6_format": "Ugyldigt IPv6-format",
|
||||
"form_error_ip_format": "Ugyldigt IP-format",
|
||||
"form_error_mac_format": "Ugyldigt MAC-format",
|
||||
"form_error_client_id_format": "Ugyldigt klient-ID-format",
|
||||
"form_error_positive": "Skal være større end 0",
|
||||
"form_error_negative": "Skal være lig med 0 eller større",
|
||||
"dhcp_form_gateway_input": "Gateway IP",
|
||||
@@ -104,6 +105,11 @@
|
||||
"no_servers_specified": "Ingen servere specificeret",
|
||||
"general_settings": "Generelle indstillinger",
|
||||
"dns_settings": "DNS-indstillinger",
|
||||
"dns_blocklists": "DNS-blokeringslister",
|
||||
"dns_allowlists": "Lister over tilladte DNS",
|
||||
"dns_blocklists_desc": "AdGuard Home vil blokere domæner, der matcher blokeringslisterne.",
|
||||
"dns_allowlists_desc": "Domæner fra listerne over tilladte DNS vil være tilladt, selvom de er i nogen af blokeringslisterne.",
|
||||
"custom_filtering_rules": "Brugerdefinerede filtreringsregler",
|
||||
"encryption_settings": "Krypteringsindstillinger",
|
||||
"dhcp_settings": "DHCP-indstillinger",
|
||||
"upstream_dns": "Upstream DNS-servere",
|
||||
@@ -121,22 +127,28 @@
|
||||
"enabled_save_search_toast": "Sikker søgning aktiveret",
|
||||
"enabled_table_header": "Aktiveret",
|
||||
"name_table_header": "Navn",
|
||||
"filter_url_table_header": "Filter URL",
|
||||
"list_url_table_header": "Listernes 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",
|
||||
"no_blocklist_added": "Ingen blokeringslister tilføjet",
|
||||
"no_whitelist_added": "Ingen lister over tilladte tilføjet",
|
||||
"add_blocklist": "Tilføj blokeringsliste",
|
||||
"add_allowlist": "Tilføj liste over tilladte",
|
||||
"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.",
|
||||
"new_blocklist": "Ny blokeringsliste",
|
||||
"new_allowlist": "Ny liste over tilladte",
|
||||
"edit_blocklist": "Rediger blokeringsliste",
|
||||
"edit_allowlist": "Rediger liste over tilladte",
|
||||
"enter_valid_blocklist": "Indtast en gyldig URL til blokeringslisten.",
|
||||
"enter_valid_allowlist": "Indtast en gyldig URL til listen over tilladte.",
|
||||
"form_error_url_format": "Ugyldigt url-format",
|
||||
"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",
|
||||
@@ -152,7 +164,7 @@
|
||||
"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",
|
||||
"all_lists_up_to_date_toast": "Alle lister er allerede opdaterede",
|
||||
"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",
|
||||
@@ -172,7 +184,6 @@
|
||||
"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",
|
||||
@@ -190,6 +201,7 @@
|
||||
"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",
|
||||
"dns_config": "DNS-serverkonfiguration",
|
||||
"blocking_mode": "Blokeringstilstand",
|
||||
"default": "Standard",
|
||||
"nxdomain": "NXDOMAIN",
|
||||
"null_ip": "Null IP",
|
||||
"custom_ip": "Tilpasset IP",
|
||||
@@ -202,13 +214,16 @@
|
||||
"rate_limit_desc": "Antallet af anmodninger pr. sekund, som en enkelt klient får lov til at fremsætte (0: ubegrænset)",
|
||||
"blocking_ipv4_desc": "IP-adresse, der skal returneres for en blokeret A-anmodning",
|
||||
"blocking_ipv6_desc": "IP-adresse, der skal returneres for en blokeret AAAA-anmodning",
|
||||
"blocking_mode_desc": "<0>NXDOMAIN - Svar med NXDOMAIN-kode;</0> <0>Null IP - Svar med nul IP-adresse (0.0.0.0 for A, :: for AAAA);</0> <0>Brugerdefineret IP - Svar med en manuelt indstillet IP-adresse.</0>",
|
||||
"blocking_mode_default": "Standard: Svar med NXDOMAIN, når det blokeres af Adblock-stil-reglen; svar med den IP-adresse, der er angivet i reglen, når den blokeres af /etc/hosts-style-reglen",
|
||||
"blocking_mode_nxdomain": "NXDOMAIN: Svar med NXDOMAIN-kode",
|
||||
"blocking_mode_null_ip": "Null IP: Svar med nul IP-adresse (0.0.0.0 for A; :: for AAAA)",
|
||||
"blocking_mode_custom_ip": "Brugerdefineret IP: Svar med en manuelt indstillet IP-adresse",
|
||||
"upstream_dns_client_desc": "Hvis du lader dette felt være tomt, vil AdGuard Home bruge de servere, der er konfigureret i <0>DNS-indstillingerne</0>.",
|
||||
"source_label": "Kilde",
|
||||
"found_in_known_domain_db": "Fundet i databasen med kendte domæner.",
|
||||
"category_label": "Kategori",
|
||||
"rule_label": "Regel",
|
||||
"filter_label": "Filter",
|
||||
"list_label": "Liste",
|
||||
"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.",
|
||||
@@ -320,7 +335,7 @@
|
||||
"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>",
|
||||
"client_identifier_desc": "Klienter kan identificeres ud fra IP-adressen, CIDR eller MAC-adressen. Bemærk, 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",
|
||||
@@ -332,7 +347,7 @@
|
||||
"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?",
|
||||
"list_confirm_delete": "Er du sikker på, at du vil slette denne liste?",
|
||||
"auto_clients_title": "Klienter (runtime)",
|
||||
"auto_clients_desc": "Data om de klienter, der bruger AdGuard Home, men ikke gemt i konfigurationen",
|
||||
"access_title": "Adgangsindstillinger",
|
||||
@@ -371,6 +386,7 @@
|
||||
"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ænenavn eller wildcard",
|
||||
"form_answer": "Indtast IP-adresser eller domænenavne",
|
||||
"form_error_domain_format": "Ugyldigt domæneformat",
|
||||
"form_error_answer_format": "Ugyldigt svarformat",
|
||||
@@ -397,7 +413,8 @@
|
||||
"interval_days_plural": "{{count}} dage",
|
||||
"domain": "Domæne",
|
||||
"answer": "Svar",
|
||||
"filter_added_successfully": "Filtret er blevet tilføjet",
|
||||
"filter_added_successfully": "Listen er tilføjet",
|
||||
"filter_updated": "Listen er blevet opdateret",
|
||||
"statistics_configuration": "Konfiguration af statistik",
|
||||
"statistics_retention": "Tilbageholdelse af statistikker",
|
||||
"statistics_retention_desc": "Hvis du mindsker intervalværdien, vil nogle data gå tabt",
|
||||
@@ -426,5 +443,41 @@
|
||||
"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",
|
||||
"try_again": "Prøv igen"
|
||||
"try_again": "Prøv igen",
|
||||
"domain_desc": "Indtast det domænenavn eller wildcard, du ønsker skal omskrives.",
|
||||
"example_rewrite_domain": "omskriv kun svar for dette domænenavn.",
|
||||
"example_rewrite_wildcard": "omskriv svar for alle <0>example.org</0> subdomæner.",
|
||||
"disable_ipv6": "Deaktiver IPv6",
|
||||
"disable_ipv6_desc": "Hvis denne funktion er aktiveret, slettes alle DNS-forespørgsler til IPv6-adresser (type AAAA).",
|
||||
"autofix_warning_text": "Hvis du klikker på \"Reparer\", vil AdGuardHome konfigurere dit system til at bruge AdGuardHome DNS-server.",
|
||||
"autofix_warning_list": "Den vil udføre disse opgaver: <0>Deaktivering af DNSStubListener systemet</0> <0>Indstille DNS-serveradressen til 127.0.0.1</0> <0>Erstatte det symbolske linkmål for /etc/resolv.conf til /run/systemd/resolve/resolv.conf</0> <0>Stop DNSStubListener (genindlæs systemd-løst tjeneste)</0>",
|
||||
"autofix_warning_result": "Som et resultat behandles alle DNS-anmodninger fra dit system som standard af AdGuard Home.",
|
||||
"tags_title": "Tags",
|
||||
"tags_desc": "Du kan vælge de tags, der svarer til klienten. Tags kan inkluderes i filtreringsreglerne og giver dig mulighed for at anvende dem mere nøjagtigt. <0>Læs mere</0>",
|
||||
"form_select_tags": "Vælg klient tags",
|
||||
"check_title": "Kontroller filtreringen",
|
||||
"check_desc": "Kontroller, om værtsnavnet er filtreret",
|
||||
"check": "Kontroller",
|
||||
"form_enter_host": "Indtast et værtsnavn",
|
||||
"filtered_custom_rules": "Filtreret af brugerdefinerede filtreringsregler",
|
||||
"host_whitelisted": "Værten er hvidlistet",
|
||||
"check_ip": "IP-adresser: {{ip}}",
|
||||
"check_cname": "CNAME: {{cname}}",
|
||||
"check_reason": "Årsag: {{reason}}",
|
||||
"check_rule": "Regel: {{rule}}",
|
||||
"check_service": "Servicenavn: {{service}}",
|
||||
"check_not_found": "Ikke fundet i dine filterlister",
|
||||
"client_confirm_block": "Er du sikker på, at du vil blokere klienten \"{{ip}}\"?",
|
||||
"client_confirm_unblock": "Er du sikker på, at du vil fjerne blokeringen af klienten \"{{ip}}\"?",
|
||||
"client_blocked": "Klient \"{{ip}}\" blev blokeret",
|
||||
"client_unblocked": "Blokering af klient \"{{ip}}\" fjernet",
|
||||
"static_ip": "Statisk IP-adresse",
|
||||
"static_ip_desc": "AdGuard Home er en server, så den har brug for en statisk IP-adresse for at fungere korrekt. Ellers på et tidspunkt vil din router muligvis tildele en anden IP-adresse til denne enhed.",
|
||||
"set_static_ip": "Indstil en statisk IP-adresse",
|
||||
"install_static_ok": "Gode nyheder! Den statiske IP-adresse er allerede konfigureret",
|
||||
"install_static_error": "AdGuard Home kan ikke konfigurere det automatisk for denne netværksgrænseflade. Søg efter en instruktion om, hvordan man gør dette manuelt.",
|
||||
"install_static_configure": "Vi har registreret, at der bruges en dynamisk IP-adresse — <0>{{ip}}</0>. Vil du bruge den som din statiske adresse?",
|
||||
"confirm_static_ip": "AdGuard Home vil konfigurere {{ip}} til at være din statiske IP-adresse. Vil du fortsætte?",
|
||||
"list_updated": "{{count}} liste opdateret",
|
||||
"list_updated_plural": "{{count}} lister opdateret"
|
||||
}
|
||||
@@ -76,7 +76,7 @@
|
||||
"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": "am letzten {{count}} Tag",
|
||||
"for_last_days_plural": "in den letzten {{count}} Tage",
|
||||
"no_domains_found": "Keine Domains gefunden",
|
||||
"requests_count": "Anzahl der Anfragen",
|
||||
@@ -84,7 +84,7 @@
|
||||
"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": "Anzahl der in den letzten {{count}} Tagen verarbeiteten DNS-Anfragen",
|
||||
"number_of_dns_query_days_plural": "Anzahl der DNS-Abfragen, die in den letzten {{count}}} Tagen verarbeitet wurden",
|
||||
"number_of_dns_query_24_hours": "Anzahl der in den letzten 24 Stunden durchgeführten DNS-Anfragen",
|
||||
"number_of_dns_query_blocked_24_hours": "Anzahl der durch Werbefilter und Host-Blocklisten geblockten DNS-Anfragen",
|
||||
@@ -105,6 +105,11 @@
|
||||
"no_servers_specified": "Keine Server festgelegt",
|
||||
"general_settings": "Allgemeine Einstellungen",
|
||||
"dns_settings": "DNS-Einstellungen",
|
||||
"dns_blocklists": "DNS-Sperrliste",
|
||||
"dns_allowlists": "DNS-Freigabelisten",
|
||||
"dns_blocklists_desc": "AdGuard Home sperrt Domains, die in den Sperrlisten enthalten sind.",
|
||||
"dns_allowlists_desc": "Domains aus DNS-Freigabelisten werden auch dann zugelassen, wenn sie in einer der Sperrlisten enthalten sind.",
|
||||
"custom_filtering_rules": "Benutzerdefinierte Filterregeln",
|
||||
"encryption_settings": "Verschlüsselungseinstellungen",
|
||||
"dhcp_settings": "DHCP-Einstellungen",
|
||||
"upstream_dns": "Upstream-DNS-Server",
|
||||
@@ -122,22 +127,28 @@
|
||||
"enabled_save_search_toast": "SafeSearch aktiviert",
|
||||
"enabled_table_header": "Aktiviert",
|
||||
"name_table_header": "Name",
|
||||
"filter_url_table_header": "Filter-URL",
|
||||
"list_url_table_header": "Adressliste",
|
||||
"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",
|
||||
"no_blocklist_added": "Keine Sperrliste hinzugefügt",
|
||||
"no_whitelist_added": "Keine Freigabeliste hinzugefügt",
|
||||
"add_blocklist": "Sperrliste hinzufügen",
|
||||
"add_allowlist": "Freigabeliste 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.",
|
||||
"new_blocklist": "Neue Sperrliste",
|
||||
"new_allowlist": "Neue Freigabeliste",
|
||||
"edit_blocklist": "Sperrliste bearbeiten",
|
||||
"edit_allowlist": "Freigabeliste bearbeiten",
|
||||
"enter_valid_blocklist": "Geben Sie eine gültige Adresse in die Sperrliste ein.",
|
||||
"enter_valid_allowlist": "Geben Sie eine gültige Adresse in die Freigabeliste ein.",
|
||||
"form_error_url_format": "Ungültiges Adress-Format",
|
||||
"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",
|
||||
@@ -153,7 +164,7 @@
|
||||
"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",
|
||||
"all_lists_up_to_date_toast": "Alle Listen sind bereits auf dem neuesten Stand",
|
||||
"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",
|
||||
@@ -173,7 +184,6 @@
|
||||
"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",
|
||||
@@ -191,6 +201,7 @@
|
||||
"query_log_retention_confirm": "Möchten Sie die Aufbewahrung des Abfrageprotokolls wirklich ändern? Wenn Sie den Zeitabstand verringern, gehen einige Daten verloren.",
|
||||
"dns_config": "DNS-Serverkonfiguration",
|
||||
"blocking_mode": "Sperrmodus",
|
||||
"default": "Standard",
|
||||
"nxdomain": "NXDomain",
|
||||
"null_ip": "Null-IP-Adresse",
|
||||
"custom_ip": "Benutzerdefinierte IP",
|
||||
@@ -203,13 +214,16 @@
|
||||
"rate_limit_desc": "Die Anzahl der Anfragen pro Sekunde, die ein einzelner Client stellen darf (0: unbegrenzt)",
|
||||
"blocking_ipv4_desc": "IP-Adresse, die für eine gesperrte A-Anfrage zurückgegeben werden soll",
|
||||
"blocking_ipv6_desc": "IP-Adresse, die für eine gesperrte AAAA-Anfrage zurückgegeben werden soll",
|
||||
"blocking_mode_desc": "<0>NXDomain - Antwortet mit NXDomain-Code;</0> <0>Null-IP-Adresse - Antwortet mit Null-IP-Adresse (0.0.0.0 für A; :: für AAAA);</0> <0>Benutzerdefinierte IP - Antwortet mit einer manuell festgelegten IP-Adresse.</0>",
|
||||
"blocking_mode_default": "Standard: Mit NXDOMAIN antworten, wenn sie durch eine Regel im Adblock-Stil gesperrt sind; mit der in der Regel angegebenen IP-Adresse antworten, wenn sie durch eine Regel im /etc/hosts-Stil gesperrt wurde",
|
||||
"blocking_mode_nxdomain": "NXDOMAIN: Mit NXDOMAIN-Code antworten",
|
||||
"blocking_mode_null_ip": "Null-IP: Antworten mit Null-IP-Adresse (0.0.0.0.0 für A; :: für AAAA)",
|
||||
"blocking_mode_custom_ip": "Benutzerdefinierte IP: Mit einer manuell eingestellten IP-Adresse antworten",
|
||||
"upstream_dns_client_desc": "Wenn Sie dieses Feld leer lassen, verwendet AdGuard Home die Server, die in den <0>DNS-Einstellungen</0> konfiguriert sind.",
|
||||
"source_label": "Quelle",
|
||||
"found_in_known_domain_db": "In der Datenbank der bekannten Domains gefunden.",
|
||||
"category_label": "Kategorie",
|
||||
"rule_label": "Regel",
|
||||
"filter_label": "Filter",
|
||||
"list_label": "Liste",
|
||||
"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.",
|
||||
@@ -321,7 +335,7 @@
|
||||
"client_edit": "Client bearbeiten",
|
||||
"client_identifier": "Bezeichner",
|
||||
"ip_address": "IP-Adresse",
|
||||
"client_identifier_desc": "Clients können durch die IP-Adresse oder MAC-Adresse identifiziert werden. Bitte beachten Sie, dass die Verwendung der MAC-Adresse als Identifikator nur möglich ist, wenn AdGuard Home gleichzeitig auch ein <0>DHCP-Server</0> ist.",
|
||||
"client_identifier_desc": "Clients können durch die IP-Adresse oder MAC-Adresse identifiziert werden. Bitte beachten Sie, dass die Verwendung der MAC-Adresse als Identifikator nur möglich ist, wenn AdGuard Home gleichzeitig als <0>DHCP-Server</0> eingerichtet ist.",
|
||||
"form_enter_ip": "IP-Adresse eingeben",
|
||||
"form_enter_mac": "MAC-Adresse eingeben",
|
||||
"form_enter_id": "Kennung eingeben",
|
||||
@@ -333,7 +347,7 @@
|
||||
"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?",
|
||||
"list_confirm_delete": "Möchten Sie diese Liste 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",
|
||||
@@ -400,6 +414,7 @@
|
||||
"domain": "Domain",
|
||||
"answer": "Antwort",
|
||||
"filter_added_successfully": "Der Filter wurde erfolgreich hinzugefügt",
|
||||
"filter_updated": "Der Filter wurde erfolgreich aktualisiert",
|
||||
"statistics_configuration": "Statistikkonfiguration",
|
||||
"statistics_retention": "Statistiken speichern",
|
||||
"statistics_retention_desc": "Wenn Sie Intervallwert verringern, werden einige Daten verloren gehen",
|
||||
@@ -431,5 +446,38 @@
|
||||
"try_again": "Erneut versuchen",
|
||||
"domain_desc": "Geben Sie den Domain-Namen oder den Platzhalter ein, der umgeschrieben werden soll.",
|
||||
"example_rewrite_domain": "Antworten nur für diesen Domain-Namen umschreiben.",
|
||||
"example_rewrite_wildcard": "Antworten nur für alle <0>example.org</0> Subdomains umschreiben."
|
||||
"example_rewrite_wildcard": "Antworten nur für alle <0>example.org</0> Subdomains umschreiben.",
|
||||
"disable_ipv6": "IPv6 deaktivieren",
|
||||
"disable_ipv6_desc": "Wenn diese Funktion aktiviert ist, werden alle DNS-Abfragen für IPv6-Adressen (Typ AAAA) verworfen.",
|
||||
"autofix_warning_text": "Wenn Sie auf „Beheben” klicken, konfiguriert AdGuardHome Ihr System für die Verwendung des AdGuardHome-DNS-Servers.",
|
||||
"autofix_warning_list": "Es werden folgende Aufgaben ausgeführt: <0>Deaktivieren des DNSStubListener-Systems</0> <0>Festlegen der DNS-Server-Adresse auf 127.0.0.1</0> <0>Ersetzen des symbolischen Linkziels von /etc/resolv.conf auf /run/systemd/resolve/resolv.conf</0> <0>Anhalten des DNSStubListener (systemseitig aufgelöster Dienst wird nachladen)</0>",
|
||||
"autofix_warning_result": "Als Folge daraus werden alle DNS-Anforderungen von Ihrem System standardmäßig von AdGuardHome verarbeitet.",
|
||||
"tags_title": "Schlagwörter",
|
||||
"tags_desc": "Sie können die Schlagwörter auswählen, die dem Client entsprechen. Die Schlagwörter können in die Filterregeln aufgenommen werden und erlauben Ihnen, sie genauer anzuwenden. <0>Mehr erfahren</0>",
|
||||
"form_select_tags": "Schlagwörter des Clients auswählen",
|
||||
"check_title": "Filterung überprüfen",
|
||||
"check_desc": "Prüfen, ob der Hostname gefiltert wird",
|
||||
"check": "Prüfen",
|
||||
"form_enter_host": "Gerätenamen eingeben",
|
||||
"filtered_custom_rules": "Nach benutzerdefinierten Filterregeln gefiltert",
|
||||
"host_whitelisted": "Der Host ist in der Positivliste enthalten",
|
||||
"check_ip": "IP-Adressen: {{ip}}",
|
||||
"check_cname": "CNAME: {{cname}}",
|
||||
"check_reason": "Grund: {{reason}}",
|
||||
"check_rule": "Regel: {{rule}}",
|
||||
"check_service": "Dienstname: {{service}}",
|
||||
"check_not_found": "Nicht in Ihren Filterlisten enthalten",
|
||||
"client_confirm_block": "Möchten Sie den Client „{{ip}}” wirklich sperren?",
|
||||
"client_confirm_unblock": "Möchten Sie den Client „{{ip}}” wirklich entsperren?",
|
||||
"client_blocked": "Client „{{ip}}” erfolgreich gesperrt",
|
||||
"client_unblocked": "Client „{{ip}}” erfolgreich entsperrt",
|
||||
"static_ip": "Feste IP-Adresse",
|
||||
"static_ip_desc": "AdGuard Home ist ein Server und benötigt daher eine feste IP-Adresse, um ordnungsgemäß zu funktionieren. Andernfalls weist Ihr Router diesem Gerät möglicherweise irgendwann eine andere IP-Adresse zu.",
|
||||
"set_static_ip": "Feste IP-Adresse festlegen",
|
||||
"install_static_ok": "Gute Nachrichten! Die feste IP-Adresse ist bereits konfiguriert",
|
||||
"install_static_error": "AdGuard Home kann nicht automatisch für diese Netzwerkschnittstelle konfiguriert werden. Bitte suchen Sie nach einer Anleitung, wie Sie dies manuell durchführen können.",
|
||||
"install_static_configure": "Wir haben festgestellt, dass eine dynamische IP-Adresse verwendet wird — <0>{{ip}}</0>. Möchten Sie diese als feste Adresse verwenden?",
|
||||
"confirm_static_ip": "AdGuard Home konfiguriert {{ip}} als Ihre feste IP-Adresse. Möchten Sie fortfahren?",
|
||||
"list_updated": "{{count}} Liste aktualisiert",
|
||||
"list_updated_plural": "{{count}} Listen aktualisiert"
|
||||
}
|
||||
@@ -105,6 +105,11 @@
|
||||
"no_servers_specified": "No servers specified",
|
||||
"general_settings": "General settings",
|
||||
"dns_settings": "DNS settings",
|
||||
"dns_blocklists": "DNS blocklists",
|
||||
"dns_allowlists": "DNS allowlists",
|
||||
"dns_blocklists_desc": "AdGuard Home will block domains matching the blocklists.",
|
||||
"dns_allowlists_desc": "Domains from DNS allowlists will be allowed even if they are in any of the blocklists.",
|
||||
"custom_filtering_rules": "Custom filtering rules",
|
||||
"encryption_settings": "Encryption settings",
|
||||
"dhcp_settings": "DHCP settings",
|
||||
"upstream_dns": "Upstream DNS servers",
|
||||
@@ -122,22 +127,28 @@
|
||||
"enabled_save_search_toast": "Enabled safe search",
|
||||
"enabled_table_header": "Enabled",
|
||||
"name_table_header": "Name",
|
||||
"filter_url_table_header": "Filter URL",
|
||||
"list_url_table_header": "List URL",
|
||||
"rules_count_table_header": "Rules count",
|
||||
"last_time_updated_table_header": "Last time updated",
|
||||
"actions_table_header": "Actions",
|
||||
"edit_table_action": "Edit",
|
||||
"delete_table_action": "Delete",
|
||||
"filters_and_hosts": "Filters and hosts blocklists",
|
||||
"filters_and_hosts_hint": "AdGuard Home understands basic adblock rules and hosts files syntax.",
|
||||
"no_filters_added": "No filters added",
|
||||
"add_filter_btn": "Add filter",
|
||||
"no_blocklist_added": "No blocklists added",
|
||||
"no_whitelist_added": "No allowlists added",
|
||||
"add_blocklist": "Add blocklist",
|
||||
"add_allowlist": "Add allowlist",
|
||||
"cancel_btn": "Cancel",
|
||||
"enter_name_hint": "Enter name",
|
||||
"enter_url_hint": "Enter URL",
|
||||
"check_updates_btn": "Check updates",
|
||||
"new_filter_btn": "New filter subscription",
|
||||
"enter_valid_filter_url": "Enter a valid URL to a filter subscription or a hosts file.",
|
||||
"check_updates_btn": "Check for updates",
|
||||
"new_blocklist": "New blocklist",
|
||||
"new_allowlist": "New allowlist",
|
||||
"edit_blocklist": "Edit blocklist",
|
||||
"edit_allowlist": "Edit allowlist",
|
||||
"enter_valid_blocklist": "Enter a valid URL to the blocklist.",
|
||||
"enter_valid_allowlist": "Enter a valid URL to the allowlist.",
|
||||
"form_error_url_format": "Invalid url format",
|
||||
"custom_filter_rules": "Custom filtering rules",
|
||||
"custom_filter_rules_hint": "Enter one rule on a line. You can use either adblock rules or hosts files syntax.",
|
||||
"examples_title": "Examples",
|
||||
@@ -153,7 +164,7 @@
|
||||
"example_upstream_doh": "encrypted <0>DNS-over-HTTPS</0>",
|
||||
"example_upstream_sdns": "you can use <0>DNS Stamps</0> for <1>DNSCrypt</1> or <2>DNS-over-HTTPS</2> resolvers",
|
||||
"example_upstream_tcp": "regular DNS (over TCP)",
|
||||
"all_filters_up_to_date_toast": "All filters are already up-to-date",
|
||||
"all_lists_up_to_date_toast": "All lists are already up-to-date",
|
||||
"updated_upstream_dns_toast": "Updated the upstream DNS servers",
|
||||
"dns_test_ok_toast": "Specified DNS servers are working correctly",
|
||||
"dns_test_not_ok_toast": "Server \"{{key}}\": could not be used, please check that you've written it correctly",
|
||||
@@ -173,7 +184,6 @@
|
||||
"next_btn": "Next",
|
||||
"loading_table_status": "Loading...",
|
||||
"page_table_footer_text": "Page",
|
||||
"of_table_footer_text": "of",
|
||||
"rows_table_footer_text": "rows",
|
||||
"updated_custom_filtering_toast": "Updated the custom filtering rules",
|
||||
"rule_removed_from_custom_filtering_toast": "Rule removed from the custom filtering rules",
|
||||
@@ -191,6 +201,7 @@
|
||||
"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",
|
||||
"default": "Default",
|
||||
"nxdomain": "NXDOMAIN",
|
||||
"null_ip": "Null IP",
|
||||
"custom_ip": "Custom IP",
|
||||
@@ -203,13 +214,16 @@
|
||||
"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>",
|
||||
"blocking_mode_default": "Default: Respond with NXDOMAIN when blocked by Adblock-style rule; respond with the IP address specified in the rule when blocked by /etc/hosts-style rule",
|
||||
"blocking_mode_nxdomain": "NXDOMAIN: Respond with NXDOMAIN code",
|
||||
"blocking_mode_null_ip": "Null IP: Respond with zero IP address (0.0.0.0 for A; :: for AAAA)",
|
||||
"blocking_mode_custom_ip": "Custom IP: Respond with a manually set IP address",
|
||||
"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",
|
||||
"rule_label": "Rule",
|
||||
"filter_label": "Filter",
|
||||
"list_label": "List",
|
||||
"unknown_filter": "Unknown filter {{filterId}}",
|
||||
"install_welcome_title": "Welcome to AdGuard Home!",
|
||||
"install_welcome_desc": "AdGuard Home is a network-wide ad-and-tracker blocking DNS server. Its purpose is to let you control your entire network and all your devices, and it does not require using a client-side program.",
|
||||
@@ -321,7 +335,7 @@
|
||||
"client_edit": "Edit Client",
|
||||
"client_identifier": "Identifier",
|
||||
"ip_address": "IP address",
|
||||
"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>",
|
||||
"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",
|
||||
@@ -333,7 +347,7 @@
|
||||
"client_updated": "Client \"{{key}}\" successfully updated",
|
||||
"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?",
|
||||
"list_confirm_delete": "Are you sure you want to delete this list?",
|
||||
"auto_clients_title": "Clients (runtime)",
|
||||
"auto_clients_desc": "Data on the clients that use AdGuard Home, but not stored in the configuration",
|
||||
"access_title": "Access settings",
|
||||
@@ -399,7 +413,8 @@
|
||||
"interval_days_plural": "{{count}} days",
|
||||
"domain": "Domain",
|
||||
"answer": "Answer",
|
||||
"filter_added_successfully": "The filter has been successfully added",
|
||||
"filter_added_successfully": "The list has been successfully added",
|
||||
"filter_updated": "The list has been successfully updated",
|
||||
"statistics_configuration": "Statistics configuration",
|
||||
"statistics_retention": "Statistics retention",
|
||||
"statistics_retention_desc": "If you decrease the interval value, some data will be lost",
|
||||
@@ -431,5 +446,38 @@
|
||||
"try_again": "Try again",
|
||||
"domain_desc": "Enter the domain name or wildcard you want to be rewritten.",
|
||||
"example_rewrite_domain": "rewrite responses for this domain name only.",
|
||||
"example_rewrite_wildcard": "rewrite responses for all <0>example.org</0> subdomains."
|
||||
"example_rewrite_wildcard": "rewrite responses for all <0>example.org</0> subdomains.",
|
||||
"disable_ipv6": "Disable IPv6",
|
||||
"disable_ipv6_desc": "If this feature is enabled, all DNS queries for IPv6 addresses (type AAAA) will be dropped.",
|
||||
"autofix_warning_text": "If you click \"Fix\", AdGuard Home will configure your system to use AdGuard Home DNS server.",
|
||||
"autofix_warning_list": "It will perform these tasks: <0>Deactivate system DNSStubListener</0> <0>Set DNS server address to 127.0.0.1</0> <0>Replace symbolic link target of /etc/resolv.conf with /run/systemd/resolve/resolv.conf</0> <0>Stop DNSStubListener (reload systemd-resolved service)</0>",
|
||||
"autofix_warning_result": "As a result all DNS requests from your system will be processed by AdGuard Home by default.",
|
||||
"tags_title": "Tags",
|
||||
"tags_desc": "You can select the tags that correspond to the client. Tags can be included in the filtering rules and allow you to apply them more accurately. <0>Learn more</0>",
|
||||
"form_select_tags": "Select client tags",
|
||||
"check_title": "Check the filtering",
|
||||
"check_desc": "Check if the host name is filtered",
|
||||
"check": "Check",
|
||||
"form_enter_host": "Enter a host name",
|
||||
"filtered_custom_rules": "Filtered by Custom filtering rules",
|
||||
"host_whitelisted": "The host is whitelisted",
|
||||
"check_ip": "IP addresses: {{ip}}",
|
||||
"check_cname": "CNAME: {{cname}}",
|
||||
"check_reason": "Reason: {{reason}}",
|
||||
"check_rule": "Rule: {{rule}}",
|
||||
"check_service": "Service name: {{service}}",
|
||||
"check_not_found": "Not found in your filter lists",
|
||||
"client_confirm_block": "Are you sure you want to block the client \"{{ip}}\"?",
|
||||
"client_confirm_unblock": "Are you sure you want to unblock the client \"{{ip}}\"?",
|
||||
"client_blocked": "Client \"{{ip}}\" successfully blocked",
|
||||
"client_unblocked": "Client \"{{ip}}\" successfully unblocked",
|
||||
"static_ip": "Static IP Address",
|
||||
"static_ip_desc": "AdGuard Home is a server so it needs a static IP address to function properly. Otherwise, at some point, your router may assign a different IP address to this device.",
|
||||
"set_static_ip": "Set a static IP address",
|
||||
"install_static_ok": "Good news! The static IP address is already configured",
|
||||
"install_static_error": "AdGuard Home cannot configure it automatically for this network interface. Please look for an instruction on how to do this manually.",
|
||||
"install_static_configure": "We have detected that a dynamic IP address is used — <0>{{ip}}</0>. Do you want to use it as your static address?",
|
||||
"confirm_static_ip": "AdGuard Home will configure {{ip}} to be your static IP address. Do you want to proceed?",
|
||||
"list_updated": "{{count}} list updated",
|
||||
"list_updated_plural": "{{count}} lists updated"
|
||||
}
|
||||
@@ -9,7 +9,7 @@
|
||||
"enabled_dhcp": "Servidor DHCP habilitado",
|
||||
"disabled_dhcp": "Servidor DHCP deshabilitado",
|
||||
"dhcp_title": "Servidor DHCP (experimental)",
|
||||
"dhcp_description": "Si su router no proporciona la configuración DHCP, puede utilizar el propio servidor DHCP incorporado de AdGuard.",
|
||||
"dhcp_description": "Si tu router no proporciona la configuración DHCP, puede utilizar el propio servidor DHCP incorporado de AdGuard.",
|
||||
"dhcp_enable": "Habilitar servidor DHCP",
|
||||
"dhcp_disable": "Deshabilitar servidor DHCP",
|
||||
"dhcp_not_found": "Es seguro habilitar el servidor DHCP incorporado. No se ha encontrado ningún servidor DHCP activo en la red, sin embargo le recomendamos que lo vuelva a comprobar manualmente, ya que nuestra prueba automática no ofrece actualmente una garantía del 100 %.",
|
||||
@@ -23,6 +23,7 @@
|
||||
"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_client_id_format": "Formato de ID de cliente no válido",
|
||||
"form_error_positive": "Debe ser mayor que 0",
|
||||
"form_error_negative": "Debe ser igual o mayor que 0",
|
||||
"dhcp_form_gateway_input": "IP de puerta de enlace",
|
||||
@@ -37,10 +38,10 @@
|
||||
"dhcp_ip_addresses": "Direcciones IP",
|
||||
"dhcp_table_hostname": "Nombre del host",
|
||||
"dhcp_table_expires": "Expira",
|
||||
"dhcp_warning": "Si de todos modos desea habilitar el servidor DHCP, asegúrese de que no hay otro servidor DHCP activo en su red. ¡De lo contrario, puede dejar sin Internet a los dispositivos conectados!",
|
||||
"dhcp_warning": "Si de todos modos desea habilitar el servidor DHCP, asegúrese de que no hay otro servidor DHCP activo en tu red. ¡De lo contrario, puede dejar sin Internet a los dispositivos conectados!",
|
||||
"dhcp_error": "No pudimos determinar si hay otro servidor DHCP en la red.",
|
||||
"dhcp_static_ip_error": "Para poder utilizar el servidor DHCP se debe establecer una dirección IP estática. No hemos podido determinar si esta interfaz de red está configurada utilizando una dirección IP estática. Por favor establezca una dirección IP estática manualmente.",
|
||||
"dhcp_dynamic_ip_found": "Su sistema utiliza la configuración de dirección IP dinámica para la interfaz <0>{{interfaceName}}</0>. Para poder utilizar el servidor DHCP se debe establecer una dirección IP estática. Su dirección IP actual es <0>{{ipAddress}}</0>. Si presiona el botón Habilitar servidor DHCP, estableceremos automáticamente esta dirección IP como estática.",
|
||||
"dhcp_dynamic_ip_found": "Tu sistema utiliza la configuración de dirección IP dinámica para la interfaz <0>{{interfaceName}}</0>. Para poder utilizar el servidor DHCP se debe establecer una dirección IP estática. Tu dirección IP actual es <0>{{ipAddress}}</0>. Si presiona el botón Habilitar servidor DHCP, estableceremos automáticamente esta dirección IP como estática.",
|
||||
"dhcp_lease_added": "Asignación estática \"{{key}}\" añadido correctamente",
|
||||
"dhcp_lease_deleted": "Asignación estática \"{{key}}\" eliminado correctamente",
|
||||
"dhcp_new_static_lease": "Nueva asignación estática",
|
||||
@@ -104,6 +105,11 @@
|
||||
"no_servers_specified": "No hay servidores especificados",
|
||||
"general_settings": "Configuración general",
|
||||
"dns_settings": "Configuración del DNS",
|
||||
"dns_blocklists": "Listas de bloqueo DNS",
|
||||
"dns_allowlists": "Listas de permitido DNS",
|
||||
"dns_blocklists_desc": "AdGuard Home bloqueará los dominios que coincidan con las listas de bloqueo.",
|
||||
"dns_allowlists_desc": "Los dominios de las listas de permitido DNS serán permitidos incluso si están en cualquiera de las listas de bloqueo.",
|
||||
"custom_filtering_rules": "Reglas de filtrado personalizado",
|
||||
"encryption_settings": "Configuración de cifrado",
|
||||
"dhcp_settings": "Configuración DHCP",
|
||||
"upstream_dns": "Servidores DNS de subida",
|
||||
@@ -121,26 +127,32 @@
|
||||
"enabled_save_search_toast": "Búsqueda segura habilitada",
|
||||
"enabled_table_header": "Habilitado",
|
||||
"name_table_header": "Nombre",
|
||||
"filter_url_table_header": "URL del filtro",
|
||||
"list_url_table_header": "URL de la lista",
|
||||
"rules_count_table_header": "Número de reglas",
|
||||
"last_time_updated_table_header": "Última actualización",
|
||||
"actions_table_header": "Acciones",
|
||||
"edit_table_action": "Editar",
|
||||
"delete_table_action": "Eliminar",
|
||||
"filters_and_hosts": "Filtros y listas de bloqueo de hosts",
|
||||
"filters_and_hosts_hint": "AdGuard Home entiende las reglas básicas de bloqueo y la sintaxis de los archivos hosts.",
|
||||
"no_filters_added": "No hay filtros añadidos",
|
||||
"add_filter_btn": "Añadir filtro",
|
||||
"no_blocklist_added": "No se han añadido listas de bloqueo",
|
||||
"no_whitelist_added": "No se han añadido listas de permitido",
|
||||
"add_blocklist": "Añadir lista de bloqueo",
|
||||
"add_allowlist": "Añadir lista de permitido",
|
||||
"cancel_btn": "Cancelar",
|
||||
"enter_name_hint": "Ingrese el nombre",
|
||||
"enter_url_hint": "Ingrese la URL",
|
||||
"check_updates_btn": "Buscar actualizaciones",
|
||||
"new_filter_btn": "Nueva suscripción a filtro",
|
||||
"enter_valid_filter_url": "Ingrese una URL válida para suscribirse a un filtro o archivo hosts.",
|
||||
"new_blocklist": "Nueva lista de bloqueo",
|
||||
"new_allowlist": "Nueva lista de permitido",
|
||||
"edit_blocklist": "Editar lista de bloqueo",
|
||||
"edit_allowlist": "Editar lista de permitido",
|
||||
"enter_valid_blocklist": "Ingrese una URL válida para la lista de bloqueo.",
|
||||
"enter_valid_allowlist": "Ingrese una URL válida para la lista de permitido.",
|
||||
"form_error_url_format": "Formato de URL no válido",
|
||||
"custom_filter_rules": "Reglas de filtrado personalizado",
|
||||
"custom_filter_rules_hint": "Ingrese una regla por línea. Puede utilizar reglas de bloqueo o la sintaxis de los archivos hosts.",
|
||||
"examples_title": "Ejemplos",
|
||||
"example_meaning_filter_block": "bloquea el acceso al dominio ejemplo.org\ny a todos sus subdominios",
|
||||
"example_meaning_filter_block": "bloquea el acceso al dominio ejemplo.org y a todos sus subdominios",
|
||||
"example_meaning_filter_whitelist": "desbloquea el acceso al dominio ejemplo.org y a todos sus subdominios",
|
||||
"example_meaning_host_block": "AdGuard Home devolverá la dirección 127.0.0.1 para el dominio ejemplo.org (pero no para sus subdominios).",
|
||||
"example_comment": "! Aquí va un comentario",
|
||||
@@ -152,7 +164,7 @@
|
||||
"example_upstream_doh": "cifrado <0>DNS mediante HTTPS</0>",
|
||||
"example_upstream_sdns": "puedes usar <0>DNS Stamps</0> para <1>DNSCrypt</1> o resolutores <2>DNS mediante HTTPS</2>",
|
||||
"example_upstream_tcp": "DNS regular (mediante TCP)",
|
||||
"all_filters_up_to_date_toast": "Todos los filtros ya están actualizados",
|
||||
"all_lists_up_to_date_toast": "Todas las listas ya están actualizadas",
|
||||
"updated_upstream_dns_toast": "Servidores DNS de subida actualizados",
|
||||
"dns_test_ok_toast": "Los servidores DNS especificados funcionan correctamente",
|
||||
"dns_test_not_ok_toast": "Servidor \"{{key}}\": no se puede utilizar, por favor revise si lo ha escrito correctamente",
|
||||
@@ -172,7 +184,6 @@
|
||||
"next_btn": "Siguiente",
|
||||
"loading_table_status": "Cargando...",
|
||||
"page_table_footer_text": "Página",
|
||||
"of_table_footer_text": "de",
|
||||
"rows_table_footer_text": "filas",
|
||||
"updated_custom_filtering_toast": "Reglas de filtrado personalizado actualizadas",
|
||||
"rule_removed_from_custom_filtering_toast": "Regla eliminada de las reglas de filtrado personalizado",
|
||||
@@ -190,6 +201,7 @@
|
||||
"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",
|
||||
"dns_config": "Configuración del servidor DNS",
|
||||
"blocking_mode": "Modo de bloqueo",
|
||||
"default": "Predeterminado",
|
||||
"nxdomain": "NXDOMAIN",
|
||||
"null_ip": "IP nulo",
|
||||
"custom_ip": "IP personalizada",
|
||||
@@ -202,16 +214,19 @@
|
||||
"rate_limit_desc": "Número de peticiones por segundo que un solo cliente puede hacer (0: ilimitado)",
|
||||
"blocking_ipv4_desc": "Dirección IP devolverá una petición A bloqueada",
|
||||
"blocking_ipv6_desc": "Dirección IP devolverá una petición AAAA bloqueada",
|
||||
"blocking_mode_desc": "<0>NXDOMAIN - Responde con el código NXDOMAIN.</0> <0>IP nulo - Responde con una dirección IP cero (0.0.0.0 para A; :: para AAAA).</0> <0>IP personalizada - Responde con una dirección IP establecida manualmente.</0>",
|
||||
"blocking_mode_default": "Predeterminado: Responde con NXDOMAIN cuando está bloqueado por la regla de estilo Adblock; responde con la dirección IP especificada en la regla cuando está bloqueado por una regla de estilo /etc/hosts",
|
||||
"blocking_mode_nxdomain": "NXDOMAIN: Responde con el código NXDOMAIN",
|
||||
"blocking_mode_null_ip": "IP nulo: Responde con dirección IP cero (0.0.0.0 para A; :: para AAAA)",
|
||||
"blocking_mode_custom_ip": "IP personalizada: Responde con una dirección IP establecida manualmente",
|
||||
"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",
|
||||
"rule_label": "Regla",
|
||||
"filter_label": "Filtro",
|
||||
"list_label": "Lista",
|
||||
"unknown_filter": "Filtro desconocido {{filterId}}",
|
||||
"install_welcome_title": "¡Bienvenido a AdGuard Home!",
|
||||
"install_welcome_desc": "AdGuard Home es un servidor DNS para bloqueo de anuncios y rastreadores a nivel de red. Su propósito es permitirle controlar toda su red y todos sus dispositivos, y no requiere el uso de un programa del lado del cliente.",
|
||||
"install_welcome_desc": "AdGuard Home es un servidor DNS para bloqueo de anuncios y rastreadores a nivel de red. Su propósito es permitirte controlar toda tu red y todos tus dispositivos, y no requiere el uso de un programa del lado del cliente.",
|
||||
"install_settings_title": "Interfaz web de administración",
|
||||
"install_settings_listen": "Interfaz de escucha",
|
||||
"install_settings_port": "Puerto",
|
||||
@@ -266,7 +281,7 @@
|
||||
"encryption_config_saved": "Configuración de cifrado guardado",
|
||||
"encryption_server": "Nombre del servidor",
|
||||
"encryption_server_enter": "Ingrese su nombre de dominio",
|
||||
"encryption_server_desc": "Para utilizar HTTPS, debe ingresar el nombre del servidor que coincida con su certificado SSL.",
|
||||
"encryption_server_desc": "Para utilizar HTTPS, debe ingresar el nombre del servidor que coincida con tu certificado SSL.",
|
||||
"encryption_redirect": "Redireccionar a HTTPS automáticamente",
|
||||
"encryption_redirect_desc": "Si está marcado, AdGuard Home redireccionará automáticamente de HTTP a las direcciones HTTPS.",
|
||||
"encryption_https": "Puerto HTTPS",
|
||||
@@ -274,12 +289,12 @@
|
||||
"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 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_certificates_desc": "Para utilizar el cifrado, debe proporcionar una cadena de certificado SSL válida para tu 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": "Copia/pega aquí tu certificado codificado PEM.",
|
||||
"encryption_status": "Estado",
|
||||
"encryption_expire": "Expira",
|
||||
"encryption_key": "Clave privada",
|
||||
"encryption_key_input": "Copie/pegue aquí su clave privada codificada PEM para su certificado.",
|
||||
"encryption_key_input": "Copia/pega aquí tu clave privada codificada PEM para tu certificado.",
|
||||
"encryption_enable": "Habilitar cifrado (HTTPS, DNS mediante HTTPS y DNS mediante TLS)",
|
||||
"encryption_enable_desc": "Si el cifrado está habilitado, la interfaz de administración de AdGuard Home funcionará a través de HTTPS, y el servidor DNS escuchará las peticiones DNS mediante HTTPS y DNS mediante TLS.",
|
||||
"encryption_chain_valid": "La cadena de certificado es válida",
|
||||
@@ -290,8 +305,8 @@
|
||||
"encryption_issuer": "Emisor",
|
||||
"encryption_hostnames": "Nombres de hosts",
|
||||
"encryption_reset": "¿Está seguro de que desea restablecer la configuración de cifrado?",
|
||||
"topline_expiring_certificate": "Su certificado SSL está a punto de expirar. Actualice la <0>configuración del cifrado</0>.",
|
||||
"topline_expired_certificate": "Su certificado SSL ha expirado. Actualice la <0>configuración del cifrado</0>.",
|
||||
"topline_expiring_certificate": "Tu certificado SSL está a punto de expirar. Actualice la <0>configuración del cifrado</0>.",
|
||||
"topline_expired_certificate": "Tu certificado SSL ha expirado. Actualice la <0>configuración del cifrado</0>.",
|
||||
"form_error_port_range": "Ingrese el valor del puerto en el rango de 80 a 65535",
|
||||
"form_error_port_unsafe": "Este es un puerto inseguro",
|
||||
"form_error_equal": "No debería ser igual",
|
||||
@@ -332,7 +347,7 @@
|
||||
"client_updated": "Cliente \"{{key}}\" actualizado correctamente",
|
||||
"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?",
|
||||
"list_confirm_delete": "¿Está seguro de que deseas eliminar esta lista?",
|
||||
"auto_clients_title": "Clientes (activos)",
|
||||
"auto_clients_desc": "Datos de los clientes que utilizan AdGuard Home, pero no se almacenan en la configuración",
|
||||
"access_title": "Configuración de acceso",
|
||||
@@ -371,6 +386,7 @@
|
||||
"rewrite_desc": "Permite configurar fácilmente la respuesta DNS personalizada para un nombre de dominio específico.",
|
||||
"rewrite_applied": "Regla de reescritura aplicada",
|
||||
"dns_rewrites": "Reescrituras DNS",
|
||||
"form_domain": "Ingrese el nombre del dominio o comodín",
|
||||
"form_answer": "Ingrese la dirección IP o el nombre del dominio",
|
||||
"form_error_domain_format": "Formato de dominio no válido",
|
||||
"form_error_answer_format": "Formato de respuesta no válido",
|
||||
@@ -397,7 +413,8 @@
|
||||
"interval_days_plural": "{{count}} días",
|
||||
"domain": "Dominio",
|
||||
"answer": "Respuesta",
|
||||
"filter_added_successfully": "El filtro ha sido añadido correctamente",
|
||||
"filter_added_successfully": "La lista ha sido añadida correctamente",
|
||||
"filter_updated": "La lista ha sido actualizada 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",
|
||||
@@ -426,5 +443,41 @@
|
||||
"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",
|
||||
"try_again": "Volver a intentar"
|
||||
"try_again": "Volver a intentar",
|
||||
"domain_desc": "Ingrese el nombre de dominio o comodín que desea reescribir.",
|
||||
"example_rewrite_domain": "reescribe las respuestas solo para este nombre de dominio.",
|
||||
"example_rewrite_wildcard": "reescribe las respuestas para todos los subdominios de <0>ejemplo.org</0>.",
|
||||
"disable_ipv6": "Deshabilitar IPv6",
|
||||
"disable_ipv6_desc": "Si esta función está habilitada, se eliminarán todas las consultas DNS para direcciones IPv6 (tipo AAAA).",
|
||||
"autofix_warning_text": "Si hace clic en \"Corregir\", AdGuard Home configurará tu sistema para utilizar el servidor DNS de AdGuard Home.",
|
||||
"autofix_warning_list": "Realizará estas tareas: <0>Deshabilitar el sistema DNSStubListener</0> <0>Establecer la dirección del servidor DNS en 127.0.0.1</0> <0>Reemplazar el destino del enlace simbólico de /etc/resolv.conf por /run/systemd/resolve/resolv.conf</0> <0>Detener DNSStubListener (recargar el servicio systemd-resolved)</0>",
|
||||
"autofix_warning_result": "Como resultado, todas las peticiones DNS de su sistema serán procesadas por AdGuard Home de manera predeterminada.",
|
||||
"tags_title": "Etiquetas",
|
||||
"tags_desc": "Puede seleccionar las etiquetas que correspondan al cliente. Las etiquetas pueden ser incluidas en las reglas de filtrado y te permiten aplicarlas con mayor precisión. <0>Más información</0>",
|
||||
"form_select_tags": "Seleccione las etiquetas del cliente",
|
||||
"check_title": "Comprobar filtrado",
|
||||
"check_desc": "Comprueba si el nombre del host está siendo filtrado",
|
||||
"check": "Comprobar",
|
||||
"form_enter_host": "Ingrese un nombre de host",
|
||||
"filtered_custom_rules": "Filtrado por reglas de filtrado personalizadas",
|
||||
"host_whitelisted": "El host está en la lista blanca",
|
||||
"check_ip": "Direcciones IP: {{ip}}",
|
||||
"check_cname": "CNAME: {{cname}}",
|
||||
"check_reason": "Razón: {{reason}}",
|
||||
"check_rule": "Regla: {{rule}}",
|
||||
"check_service": "Nombre del servicio: {{service}}",
|
||||
"check_not_found": "No se ha encontrado en tus listas de filtros",
|
||||
"client_confirm_block": "¿Está seguro de que desea bloquear al cliente \"{{ip}}\"?",
|
||||
"client_confirm_unblock": "¿Está seguro de que desea desbloquear al cliente \"{{ip}}\"?",
|
||||
"client_blocked": "Cliente \"{{ip}}\" bloqueado correctamente",
|
||||
"client_unblocked": "Cliente \"{{ip}}\" desbloqueado correctamente",
|
||||
"static_ip": "Dirección IP estática",
|
||||
"static_ip_desc": "AdGuard Home es un servidor, por lo que necesita una dirección IP estática para funcionar correctamente. De lo contrario, en algún momento tu router puede asignar una dirección IP diferente a este dispositivo.",
|
||||
"set_static_ip": "Establecer una dirección IP estática",
|
||||
"install_static_ok": "¡Buenas noticias! La dirección IP estática ya está configurada",
|
||||
"install_static_error": "AdGuard Home no puede configurarlo automáticamente para esta interfaz de red. Busque instrucciones sobre cómo hacer esto manualmente.",
|
||||
"install_static_configure": "Hemos detectado que utiliza una dirección IP dinámica: <0>{{ip}}</0>. ¿Deseas usarla como tu dirección estática?",
|
||||
"confirm_static_ip": "AdGuard Home configurará {{ip}} para ser tu dirección IP estática. ¿Desea continuar?",
|
||||
"list_updated": "{{count}} lista actualizada",
|
||||
"list_updated_plural": "{{count}} listas actualizadas"
|
||||
}
|
||||
@@ -17,9 +17,15 @@
|
||||
"dhcp_leases": "اجاره DHCP",
|
||||
"dhcp_static_leases": "اجاره DHCP ایستا",
|
||||
"dhcp_leases_not_found": "اجاره DHCP یافت نشد",
|
||||
"dhcp_config_saved": "پیکربندی سرور DHCP ذخیره شده است",
|
||||
"form_error_required": "فیلد مورد نیاز",
|
||||
"form_error_ip4_format": "فرمت نامعتبر IPv4",
|
||||
"form_error_ip6_format": "فرمت نامعتبر IPv6",
|
||||
"form_error_ip_format": "فرمت IPv4 نامعتبر است",
|
||||
"form_error_mac_format": "فرمت مَک نامعتبر است",
|
||||
"form_error_client_id_format": "فرمت شناسه کلاینت نامعتبر است",
|
||||
"form_error_positive": "باید بزرگتر از 0 باشد",
|
||||
"form_error_negative": "باید برابر با 0 یا بزرگتر باشد",
|
||||
"dhcp_form_gateway_input": "آی پی دروازه",
|
||||
"dhcp_form_subnet_input": "ماسک زیر شبکه",
|
||||
"dhcp_form_range_title": "دامنه آدرس های آی پی",
|
||||
@@ -41,6 +47,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": "جزئیات خطا",
|
||||
@@ -69,7 +76,7 @@
|
||||
"stats_adult": "وبسایت غیراخلاقی مسدود شده است",
|
||||
"stats_query_domain": "دامنه جستار بالا",
|
||||
"for_last_24_hours": "برای 24 ساعت گذشته",
|
||||
"for_last_days": "برای {{value}} روز آخر",
|
||||
"for_last_days": "برای {{count}} روز آخر",
|
||||
"for_last_days_plural": "برای {{count}} روز گذشته",
|
||||
"no_domains_found": "دامنه یافت نشد",
|
||||
"requests_count": "تعداد درخواست ها",
|
||||
@@ -77,7 +84,7 @@
|
||||
"top_clients": "بالاترین کلاینت ها",
|
||||
"no_clients_found": "کلاینتی یافت نشد",
|
||||
"general_statistics": "آمار عمومی",
|
||||
"number_of_dns_query_days": "تعداد جستار DNS پردازش شده در {{value}} روز آخر",
|
||||
"number_of_dns_query_days": "تعداد جستار DNS پردازش شده در {{count}} روز آخر",
|
||||
"number_of_dns_query_days_plural": "تعداد جستار DNS پردازش شده در {{count}} روز گذشته",
|
||||
"number_of_dns_query_24_hours": "تعداد جستار DNS پردازش شده در 24 ساعت گذشته",
|
||||
"number_of_dns_query_blocked_24_hours": "تعداد درخواست DNS مسدود شده با فیلترهای مسدودساز تبلیغ و لیست سیاه میزبان",
|
||||
@@ -94,13 +101,21 @@
|
||||
"use_adguard_parental": "از سرویس وب نظارت والدین AdGuard استفاده کن",
|
||||
"use_adguard_parental_hint": "AdGuard Home بررسی می کند اگر دامنه حاوی موارد غیر اخلاقی است.آن از همان اِی پی آی دارای حریم خصوصی سرویس وب امنیت وب گردی استفاده می کند.",
|
||||
"enforce_safe_search": "اجبار جستجوی اَمن",
|
||||
"enforce_save_search_hint": "AdGuard Home میتواند جستجوی اَمن را در موتور جستجوهای زیر اعمال کند:گوگل،یوتوب،بینگ و یاندکس",
|
||||
"no_servers_specified": "سروری تعیین نشده است",
|
||||
"general_settings": "تنظیمات عمومی",
|
||||
"dns_settings": "تنظیمات DNS",
|
||||
"dns_blocklists": "لیست سیاه DNS",
|
||||
"dns_allowlists": "لیست مجاز DNS",
|
||||
"dns_blocklists_desc": "AdGuard Home دامنه های مطابق با لیست سیاه را مسدود می کند.",
|
||||
"dns_allowlists_desc": "دامنه ها از لیست مجاز DNS اجازه داده میشوند حتی اگر آنها در هر لیست سیاهی باشند.",
|
||||
"custom_filtering_rules": "دستورات فیلترینگ دستی",
|
||||
"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> بعنوان یک جریان ارسالی استفاده می کند. از پیشوند tls:// برای سرورهای DNS over TLS استفاده کنید.",
|
||||
"test_upstream_btn": "تست جریان ارسالی",
|
||||
"upstreams": "جریان ارسالی",
|
||||
"apply_btn": "اِعمال",
|
||||
"disabled_filtering_toast": "فیلترینگ غیرفعال شده است",
|
||||
"enabled_filtering_toast": "فیلترینگ فعال شده است",
|
||||
@@ -112,22 +127,28 @@
|
||||
"enabled_save_search_toast": "جستجوی اَمن فعال شده",
|
||||
"enabled_table_header": "فعال شده",
|
||||
"name_table_header": "نام",
|
||||
"filter_url_table_header": "فیلتر آدرس",
|
||||
"list_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": "افزودن فیلتر",
|
||||
"no_blocklist_added": "به لیست سیاه اضافه نشد",
|
||||
"no_whitelist_added": "به لیست مجاز اضافه نشد",
|
||||
"add_blocklist": "افزودن لیست سیاه",
|
||||
"add_allowlist": "افزودن لیست مجاز",
|
||||
"cancel_btn": "لغو",
|
||||
"enter_name_hint": "نام را وارد کنید",
|
||||
"enter_url_hint": "آدرس را وارد کنید...",
|
||||
"check_updates_btn": "بررسی بروز رسانی",
|
||||
"new_filter_btn": "اشتراک فیلتر جدید",
|
||||
"enter_valid_filter_url": "آدرس معتبر برای اشتراک در فیلتر یا فایل میزبان وارد کنید.",
|
||||
"new_blocklist": "لیست سیاه جدید",
|
||||
"new_allowlist": "لیست مجاز جدید",
|
||||
"edit_blocklist": "ویرایش لیست سیاه",
|
||||
"edit_allowlist": "ویرایش لیست مجاز",
|
||||
"enter_valid_blocklist": "آدرس معتبر برای لیست سیاه وارد کنید.",
|
||||
"enter_valid_allowlist": "آدرس معتبر برای لیست مجاز وارد کنید.",
|
||||
"form_error_url_format": "فرمت آدرس نامعتبر است",
|
||||
"custom_filter_rules": "دستورات فیلترینگ دستی",
|
||||
"custom_filter_rules_hint": "یک دستور در خط وارد کنید.میتوانید از دستورات مسدودساز تبلیغ یا نحو فایل های میزبان استفاده کنید.",
|
||||
"examples_title": "مثال ها",
|
||||
@@ -137,12 +158,13 @@
|
||||
"example_comment": "! در اینجا نظر قرار می گیرد",
|
||||
"example_comment_meaning": "فقط یک توضیح",
|
||||
"example_comment_hash": "# همچنین یک نظر",
|
||||
"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-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": "همه فیلترها از قبل بروز رسانی شده است",
|
||||
"all_lists_up_to_date_toast": "همه لیست ها از قبل بروز اند",
|
||||
"updated_upstream_dns_toast": "سرورهای DNS جریان ارسالی بروز رسانی شده است",
|
||||
"dns_test_ok_toast": "سرورهای DNS تعیین شده بدرستی کار می کنند",
|
||||
"dns_test_not_ok_toast": "سرور \"{{key}}\": نمیتواند مورد استفاده قرار گیرد،لطفا بررسی کنید آن را بدرستی نوشته اید",
|
||||
@@ -162,18 +184,46 @@
|
||||
"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": "آیا واقعا میخواهید مدت حفظ وقایع جستار را تغییر دهید؟ اگر فاصله را کاهش دهید، برخی داده ها حذف میشود",
|
||||
"dns_config": "پیکربندی DNS سرور",
|
||||
"blocking_mode": "حالت مسدودسازی",
|
||||
"default": "پيش فرض",
|
||||
"nxdomain": "NXDOMAIN",
|
||||
"null_ip": "Null IP",
|
||||
"custom_ip": "آی پی دستی",
|
||||
"blocking_ipv4": "مسدودسازی IPv4",
|
||||
"blocking_ipv6": "مسدودسازی IPv6",
|
||||
"form_enter_rate_limit": "میزان محدودیت را وارد کنید",
|
||||
"rate_limit": "میزان محدودیت",
|
||||
"edns_enable": "فعالسازی زیرشبکه کلاینت EDNS",
|
||||
"edns_cs_desc": "اگر فعال باشد،AdGuard Home زیرشبکه های کلاینت ها را به سرورهای DNS می فرستد.",
|
||||
"rate_limit_desc": "تعداد درخواست های بر ثانیه مجازی که یک کلاینت میتواند بسازد (0: نامحدود)",
|
||||
"blocking_ipv4_desc": "آدرس آی پی برگشت داده شده برای درخواست مسدود شده A",
|
||||
"blocking_ipv6_desc": "آدرس آی پی برگشت داده شده برای درخواست مسدود شده AAAA",
|
||||
"blocking_mode_default": "پیش فرض: وقتی مسدود شود با دستور سبک-مسدودساز تبلیغ NXDOMAIN پاسخ میدهد،پاسخ با آدرس آی پی تعیین شده در دستور وقتی با دستور /etc/hosts-style rule مسدود شود",
|
||||
"blocking_mode_nxdomain": "NXDOMAIN: پاسخ با کُد NXDOMAIN",
|
||||
"blocking_mode_null_ip": "Null IP: پاسخ با آدرس آی پی صفر(0.0.0.0 برای A; :: برای AAAA)",
|
||||
"blocking_mode_custom_ip": "آی پی دستی: پاسخ با آدرس آی پی دستی تنظیم شده",
|
||||
"upstream_dns_client_desc": "اگر این فیلد را خالی نگه دارید، AdGuard Home از سرور پیکربندی شده در <0> تنظیماتDNS </0> استفاده می کند.",
|
||||
"source_label": "منبع",
|
||||
"found_in_known_domain_db": "در پایگاه داده دامنه های شناخته شده پیدا شد",
|
||||
"category_label": "دسته بندی",
|
||||
"rule_label": "دستور",
|
||||
"filter_label": "فیلتر",
|
||||
"list_label": "لیست",
|
||||
"unknown_filter": "فیلتر ناشناخته {{filterId}}",
|
||||
"install_welcome_title": "به AdGuard Home خوش آمدید!",
|
||||
"install_welcome_desc": "AdGuard Home یک شبکه گسترده و ردیاب و مسدوساز تبلیغ با سرور DNS است.هدف آن این است که به شما اجازه کنترل کل شبکه و همه دستگاه های شما را بدهد و آن نیازی به برنامه سمت-کاربر ندارد.",
|
||||
@@ -186,6 +236,7 @@
|
||||
"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": "تأیید رمزعبور",
|
||||
@@ -264,6 +315,8 @@
|
||||
"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> برای انتخاب هست.",
|
||||
@@ -282,8 +335,11 @@
|
||||
"client_edit": "ویرایش کلاینت",
|
||||
"client_identifier": "احراز با",
|
||||
"ip_address": "آدرس آی پی",
|
||||
"client_identifier_desc": "کلاینت میتواند با آدرس آی پی یا آدرس مَک احراز شود. لطفا توجه کنید،که استفاده از مَک بعنوان عامل احراز زمانی امکان دارد که AdGuard Home نیز <0>سرور DHCP </0> باشد",
|
||||
"form_enter_ip": "آی پی را وارد کنید",
|
||||
"form_enter_mac": "مَک را وارد کنید",
|
||||
"form_enter_id": "خطای احرازکننده",
|
||||
"form_add_id": "افزودن احرازکننده",
|
||||
"form_client_name": "نام کلاینت را وارد کنید",
|
||||
"client_global_settings": "استفاده از تنظیمات سراسری",
|
||||
"client_deleted": "کلاینت \"{{key}}\" را با موفقیت حذف کرد",
|
||||
@@ -291,7 +347,7 @@
|
||||
"client_updated": "کلاینت \"{{key}}\" با موفقیت بروز رسانی شد",
|
||||
"clients_not_found": "کلاینتی یافت نشد",
|
||||
"client_confirm_delete": "آیا واقعا میخواهید \"{{key}}\" کلاینت را حذف کنید؟",
|
||||
"filter_confirm_delete": "آیا واقعا میخواهید فیلتر را حذف کنید؟",
|
||||
"list_confirm_delete": "آیا واقعا میخواهید این لیست را حذف کنید؟",
|
||||
"auto_clients_title": "کلاینت ها (زمان اِجرا)",
|
||||
"auto_clients_desc": "داده در کلاینت ها که از AdGuard Home استفاده می کند،اما در پیکربندی ذخیره نمی شود",
|
||||
"access_title": "تنظیمات دسترسی",
|
||||
@@ -330,6 +386,7 @@
|
||||
"rewrite_desc": "به آسانی اجازه پیکربندی پاسخ DNS دستی برای یک نام دامنه خاص را می دهد.",
|
||||
"rewrite_applied": "دستور بازنویسی اِعمال شد",
|
||||
"dns_rewrites": "بازنویسی های DNS",
|
||||
"form_domain": "نام دامنه را وارد کنید",
|
||||
"form_answer": "نام دامنه یا آدرس آی پی را وارد کنید",
|
||||
"form_error_domain_format": "فرمت دامنه اشتباه است",
|
||||
"form_error_answer_format": "فرمت پاسخ اشتباه است",
|
||||
@@ -357,9 +414,70 @@
|
||||
"domain": "دامنه",
|
||||
"answer": "پاسخ",
|
||||
"filter_added_successfully": "فیلتر با موفقیت اضافه شد",
|
||||
"filter_updated": "فیلتر با موفقیت بروز رسانی شد",
|
||||
"statistics_configuration": "پیکربندی آمارها",
|
||||
"statistics_retention": "مدت حفظ آمارها",
|
||||
"statistics_retention_desc": "اگر مقدار فاصله را کاهش دهید،برخی داده ها از بین خواهد رفت",
|
||||
"statistics_clear": " پاکسازی آمار",
|
||||
"statistics_clear_confirm": "آیا واقعا میخواهید آمار را پاک کنید؟",
|
||||
"statistics_cleared": "آمارها با موفقیت حذف شد"
|
||||
"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>.",
|
||||
"blocked_by_response": "مسدودسازی با CNAME یا IP در پاسخ",
|
||||
"try_again": "امتحان دوباره",
|
||||
"domain_desc": "نامه دامنه یا علامت تطبیقی را برای بازنویسی وارد کنید.",
|
||||
"example_rewrite_domain": "فقط بازنویسی پاسخ برای این دامنه.",
|
||||
"example_rewrite_wildcard": "بازنویسی پاسخ ها برای همه زیردامنه های <0>example.org</0>.",
|
||||
"disable_ipv6": "غیرفعالسازی IPv6",
|
||||
"disable_ipv6_desc": "اگر این ویژگی فعال شده، همه جستارهای DNS برای آدرس های IPv6 (نوع AAAA) رها میشود.",
|
||||
"autofix_warning_text": "اگر روی \"تعمیر\" کلیک کنید، AdGuardHome سیستم شما را برای استفاده از DNS سرور AdGuardHome پیکربندی می کند.",
|
||||
"autofix_warning_list": "این وظایف را اجرا میکند: <0>غیرفعالسازی DNSStubListener سیستم</0> <0>تنظیم آدرس DNS 127.0.0.1</0> سرور به <0>جایگزینی لینک نمادی هدف /etc/resolv.conf به/run/systemd/resolve/resolv.conf</0> <0>توقف DNSStubListener (بارگیری مجدد سرویس systemd-resolved)</0>",
|
||||
"autofix_warning_result": "در نتیجه همه درخواست های DNS از سیستم شما بطور پیش فرض با AdGuardHome پردازش خواهد شد.",
|
||||
"tags_title": "برچسب ها",
|
||||
"tags_desc": "میتوانید برچسب مطابق با کلاینت را انتخاب کنید. برچسب ها میتواند شامل دستورات فیلترینگ بوده و به شما اجازه اعمال دقیق تر را میدهد. <0>بیشتر بدانید</0>",
|
||||
"form_select_tags": "انتخاب برچسب کلاینت",
|
||||
"check_title": "بررسی فیلترینگ",
|
||||
"check_desc": "برسی اینکه نام میزبان فیلتر شده است یا نه",
|
||||
"check": "بررسی",
|
||||
"form_enter_host": "نام میزبان را وارد کنید",
|
||||
"filtered_custom_rules": "با دستورات فیلترینگ دستی فیلتر شده است",
|
||||
"host_whitelisted": "سایت در لیست سفید است",
|
||||
"check_ip": "آدرس آی پی: {{ip}}",
|
||||
"check_cname": "CNAME: {{cname}}",
|
||||
"check_reason": "علت: {{reason}}",
|
||||
"check_rule": "دستور: {{rule}}",
|
||||
"check_service": "نام سرویس: {{service}}",
|
||||
"check_not_found": "در لیست فیلترهای شما یافت نشد",
|
||||
"client_confirm_block": "آیا واقعا میخواهید کلاینت \"{{ip}}\" را مسدود کنید؟",
|
||||
"client_confirm_unblock": "آیا واقعا میخواهید کلاینت \"{{ip}}\" را باز کنید؟",
|
||||
"client_blocked": "کلاینت \"{{ip}}\" با موفقیت مسدود شد",
|
||||
"client_unblocked": "کلاینت \"{{ip}}\" با موفقیت باز شد",
|
||||
"static_ip": "آدرس آی پی ثابت",
|
||||
"static_ip_desc": "AdGuard Home یک سرور است بنابراین به یک آدرس آی پی ثابت برای کارکرد درست نیاز دارد. در غیراینصورت، در نهایت، روتر شما میتواند آدرس آی پی متفاوت به این دستگاه اختصاص دهد.",
|
||||
"set_static_ip": "تنظیم یک آدرس آی پی ثابت",
|
||||
"install_static_ok": "خبر خوب! آدرس آی پی ثابت از قبل پیکربندی شده است",
|
||||
"install_static_error": "AdGuard Home نمیتواند رابط این شبکه را خودکار پیکربندی کند. لطفا دستورالعمل چگونگی انجام دستی آن را مطالعه کنید.",
|
||||
"install_static_configure": "ما تشخیص دادیم از آدرس آی پی پویا استفاده شده است — <0>{{ip}}</0>. آیا میخواهید از آن بعنوان آدرس ثابت استفاده کنید؟",
|
||||
"confirm_static_ip": "AdGuard Home {{ip}} بعنوان آدرس آی پی ثابت شما پیکربندی می کند. ادامه میدهید؟",
|
||||
"list_updated": "{{count}} لیست بروز رسانی شد",
|
||||
"list_updated_plural": "{{count}} لیست بروز رسانی شد"
|
||||
}
|
||||
@@ -15,9 +15,17 @@
|
||||
"dhcp_not_found": "Aucun serveur DHCP actif trouvé sur le réseau. Vous pouvez activer le serveur DHCP intégré.",
|
||||
"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_static_leases": "Baux statiques 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_ip4_format": "Format IPv4 invalide",
|
||||
"form_error_ip6_format": "Format IPv6 invalide",
|
||||
"form_error_ip_format": "Format IPv4 invalide",
|
||||
"form_error_mac_format": "Format MAC invalide",
|
||||
"form_error_client_id_format": "Format d'ID client non valide",
|
||||
"form_error_positive": "Doit être supérieur à 0",
|
||||
"form_error_negative": "Doit être égal à 0 ou supérieur",
|
||||
"dhcp_form_gateway_input": "IP de la passerelle",
|
||||
"dhcp_form_subnet_input": "Masque de sous-réseau",
|
||||
"dhcp_form_range_title": "Rangée des adresses IP",
|
||||
@@ -30,34 +38,55 @@
|
||||
"dhcp_ip_addresses": "Adresses IP",
|
||||
"dhcp_table_hostname": "Nom de machine",
|
||||
"dhcp_table_expires": "Expire le",
|
||||
"dhcp_warning": "Si vous souhaitez tout de même activer le serveur DHCP, assurez-vous qu'il n'y a d'autre serveur DHCP actif sur votre réseau. Sinon, cela peut faire dysfonctionner Internet sur tous les appareils connectés au réseau !",
|
||||
"dhcp_error": "Nous ne pouvons pas déterminer s'il y a un autre serveur DHCP sur le réseau.",
|
||||
"dhcp_static_ip_error": "Pour utiliser un serveur DHCP, une adresse IP statique est requise. Nous ne sommes pas parvenus à déterminer si cette interface réseau est configurée via une adresse IP statique. Veuillez définir une adresse IP manuellement.",
|
||||
"dhcp_dynamic_ip_found": "Votre système utilise une configuration d'adresses IP dynamiques pour l'interface <0>{{interfaceName}}</0>. Pour utiliser un serveur DHCP, une adresse IP statique est requise. Votre adresse IP actuelle est <0>{{ipAddress}}</0>. Nous allons automatiquement définir une adresse IP comme statique si vous appuyez sur le bouton Activer DHCP.",
|
||||
"dhcp_lease_added": "\"{{key}}\" de bail statique ajoutée avec succès",
|
||||
"dhcp_lease_deleted": "\"{{key}}\" de bail statique supprimée avec succès",
|
||||
"dhcp_new_static_lease": "Nouveau bail statique",
|
||||
"dhcp_static_leases_not_found": "Aucun bail statique DHCP trouvé",
|
||||
"dhcp_add_static_lease": "Ajoutez un bail statique",
|
||||
"dhcp_reset": "Voulez-vous vraiment réinitialiser votre configuration DHCP ?",
|
||||
"delete_confirm": "Voulez-vous vraiment supprimer \"{{key}}\" ?",
|
||||
"form_enter_hostname": "Saisissez un nom d'hôte",
|
||||
"error_details": "Détails des erreurs",
|
||||
"back": "Retour",
|
||||
"dashboard": "Tableau de bord",
|
||||
"settings": "Paramètres",
|
||||
"filters": "Filtres",
|
||||
"query_log": "Journal des requêtes",
|
||||
"faq": "FAQ",
|
||||
"version": "version",
|
||||
"address": "addresse",
|
||||
"on": "Activé",
|
||||
"off": "Éteint",
|
||||
"copyright": "Copyright",
|
||||
"homepage": "Page d'accueil",
|
||||
"report_an_issue": "Signaler un problème",
|
||||
"privacy_policy": "Politique de confidentialité",
|
||||
"enable_protection": "Activer la protection",
|
||||
"enabled_protection": "Protection activée",
|
||||
"disable_protection": "Désactiver la protection",
|
||||
"disabled_protection": "Protection désactivée",
|
||||
"refresh_statics": "Renouveler les statistiques",
|
||||
"dns_query": "Requêtes DNS",
|
||||
"blocked_by": "<0>Bloqué par Filtres</0>",
|
||||
"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",
|
||||
"for_last_24_hours": "pendant les dernières 24 heures",
|
||||
"for_last_days": "pour les {{count}} derniers jours",
|
||||
"for_last_days_plural": "pour les {{count}} derniers jours",
|
||||
"no_domains_found": "Pas de domaines trouvés",
|
||||
"requests_count": "Nombre de requêtes",
|
||||
"top_blocked_domains": "Les domaines les plus fréquemment bloqués",
|
||||
"top_clients": "Meilleurs clients",
|
||||
"no_clients_found": "Pas de clients trouvés",
|
||||
"general_statistics": "Statistiques générales",
|
||||
"number_of_dns_query_days": "Le nombre de requêtes DNS traitées pour les {{count}} derniers jours",
|
||||
"number_of_dns_query_days_plural": "Le nombre de requêtes DNS traitées ces {{count}} derniers jours",
|
||||
"number_of_dns_query_24_hours": "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",
|
||||
@@ -72,11 +101,20 @@
|
||||
"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, DuckDuckGo, Yandex, Pixabay.",
|
||||
"no_servers_specified": "Pas de serveurs spécifiés",
|
||||
"general_settings": "Paramètres généraux",
|
||||
"dns_settings": "Paramètres DNS",
|
||||
"dns_blocklists": "Listes de blocage DNS",
|
||||
"dns_allowlists": "Listes d’autorisation DNS",
|
||||
"dns_blocklists_desc": "AdGuard Home bloquera les domaines correspondant aux listes de blocage.",
|
||||
"custom_filtering_rules": "Règles de filtrage personnalisées",
|
||||
"encryption_settings": "Paramètres de cryptage",
|
||||
"dhcp_settings": "Paramètres DHCP",
|
||||
"upstream_dns": "Serveurs DNS upstream",
|
||||
"upstream_dns_hint": "Si vous laissez ce champ vide, AdGuard Home va utiliser <a href='https://www.quad9.net/' target='_blank'>Quad9</a> comme upstream.",
|
||||
"test_upstream_btn": "Tester les upstreams",
|
||||
"upstreams": "En amont",
|
||||
"apply_btn": "Appliquer",
|
||||
"disabled_filtering_toast": "Filtrage désactivé",
|
||||
"enabled_filtering_toast": "Filtrage activé",
|
||||
@@ -88,20 +126,28 @@
|
||||
"enabled_save_search_toast": "Recherche sécurisée activée",
|
||||
"enabled_table_header": "Activé",
|
||||
"name_table_header": "Nom",
|
||||
"filter_url_table_header": "URL du filtre",
|
||||
"list_url_table_header": "URL de la liste",
|
||||
"rules_count_table_header": "Nombre des règles",
|
||||
"last_time_updated_table_header": "Dernière mise à jour",
|
||||
"actions_table_header": "Actions",
|
||||
"edit_table_action": "Modifier",
|
||||
"delete_table_action": "Supprimer",
|
||||
"filters_and_hosts": "Listes de blocage des filtres et hosts",
|
||||
"filters_and_hosts_hint": "AdGuard Home comprend les règles basiques de blocage ainsi que la syntaxe des fichiers hosts.",
|
||||
"no_filters_added": "Aucun filtre ajouté",
|
||||
"add_filter_btn": "Ajouter filtre",
|
||||
"no_blocklist_added": "Aucune liste de blocage ajoutée",
|
||||
"no_whitelist_added": "Aucune liste d’autorisation ajoutée",
|
||||
"add_blocklist": "Ajouter liste de blocage",
|
||||
"add_allowlist": "Ajouter liste d’autorisation",
|
||||
"cancel_btn": "Annuler",
|
||||
"enter_name_hint": "Saisir nom",
|
||||
"enter_url_hint": "Saisir URL",
|
||||
"check_updates_btn": "Vérifier les mises à jour",
|
||||
"new_filter_btn": "Abonnement à un nouveau filtre",
|
||||
"enter_valid_filter_url": "Saisir un URL valide pour s'abonner au filtre ou à un fichier host.",
|
||||
"new_blocklist": "Nouvelle liste de blocage",
|
||||
"new_allowlist": "Nouvelle liste d’autorisation",
|
||||
"edit_blocklist": "Modifier la liste de blocage",
|
||||
"edit_allowlist": "Modifier la liste d’autorisation",
|
||||
"enter_valid_blocklist": "Saisissez une URL valide vers la liste de blocage.",
|
||||
"enter_valid_allowlist": "Saisissez une URL valide vers la liste d’autorisation.",
|
||||
"form_error_url_format": "Format d’URL incorrect",
|
||||
"custom_filter_rules": "Règles de filtrage d'utilisateur",
|
||||
"custom_filter_rules_hint": "Saisissez la règle en une ligne. C'est possible d'utiliser les règles de blocage ou la syntaxe des fichiers hosts.",
|
||||
"examples_title": "Exemples",
|
||||
@@ -111,12 +157,13 @@
|
||||
"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": "bloquer l'accés aux domaines correspondants à l'expression régulière spécifiée",
|
||||
"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é",
|
||||
"example_upstream_sdns": "vous pouvez utiliser <a href='https://dnscrypt.info/stamps/' target='_blank'>DNS Stamps</a> pour <a href='https://dnscrypt.info/' target='_blank'>DNSCrypt</a> ou les resolveurs <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-au-dessus-de-HTTPS</a>",
|
||||
"example_upstream_tcp": "DNS classique (au-dessus de TCP)",
|
||||
"all_filters_up_to_date_toast": "Tous les filtres sont mis à jour",
|
||||
"all_lists_up_to_date_toast": "Toutes les listes sont déjà à jour",
|
||||
"updated_upstream_dns_toast": "Les serveurs DNS upstream sont mis à jour",
|
||||
"dns_test_ok_toast": "Les serveurs DNS spécifiés fonctionnent correctement",
|
||||
"dns_test_not_ok_toast": "Impossible d'utiliser le serveur \"{{key}}\": veuillez vérifier si le nom saisi est bien correct",
|
||||
@@ -124,7 +171,9 @@
|
||||
"block_btn": "Bloquer",
|
||||
"time_table_header": "Temps",
|
||||
"domain_name_table_header": "Nom de domaine",
|
||||
"type_table_header": "Type",
|
||||
"response_table_header": "Réponse",
|
||||
"client_table_header": "Client",
|
||||
"empty_response_status": "Vide",
|
||||
"show_all_filter_type": "Montrer tout",
|
||||
"show_filtered_type": "Montrer les sites filtrés",
|
||||
@@ -133,18 +182,67 @@
|
||||
"previous_btn": "Précédent",
|
||||
"next_btn": "Suivant",
|
||||
"loading_table_status": "Chargement en cours ...",
|
||||
"of_table_footer_text": "de",
|
||||
"page_table_footer_text": "Page",
|
||||
"rows_table_footer_text": "lignes",
|
||||
"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_response_status": "Statut : {{value}}",
|
||||
"query_log_filtered": "Filtré par {{filter}}",
|
||||
"query_log_confirm_clear": "Êtes-vous sûr de vouloir effacer tout le journal des requêtes ?",
|
||||
"query_log_cleared": "Le journal des requêtes a été effacé",
|
||||
"query_log_clear": "Effacer journal des requêtes",
|
||||
"query_log_retention": "Rétention du journal des requêtes",
|
||||
"query_log_enable": "Activer le journal",
|
||||
"query_log_configuration": "Configuration du journal",
|
||||
"query_log_disabled": "Le journal des requêtes est désactivé et peut être configuré dans les <0>paramètres</0>",
|
||||
"query_log_strict_search": "Utilisez les doubles guillemets pour une recherche stricte",
|
||||
"query_log_retention_confirm": "Êtes-vous sûr de vouloir modifier la rétention des journaux de requêtes ? Si vous diminuez la valeur de l'intervalle, certaines données seront perdues",
|
||||
"dns_config": "Configuration du serveur DNS",
|
||||
"blocking_mode": "Mode du blocage",
|
||||
"default": "Par défaut",
|
||||
"nxdomain": "NXDOMAIN",
|
||||
"null_ip": "IP nulle",
|
||||
"custom_ip": "IP personnalisée",
|
||||
"blocking_ipv4": "Blocage IPv4",
|
||||
"blocking_ipv6": "Blocage IPv6",
|
||||
"form_enter_rate_limit": "Entrez la limite de taux",
|
||||
"rate_limit": "Limite de taux",
|
||||
"edns_enable": "Activer le sous-réseau du client EDNS",
|
||||
"edns_cs_desc": "Si activé, AdGuard Home enverra les sous-réseaux des clients aux serveurs DNS.",
|
||||
"rate_limit_desc": "Le nombre de requêtes par seconde qu’un seul client est autorisé à faire (0 : illimité)",
|
||||
"blocking_ipv4_desc": "Adresse IP à renvoyer pour une demande A bloquée",
|
||||
"blocking_ipv6_desc": "Adresse IP à renvoyer pour une demande AAAA bloquée",
|
||||
"blocking_mode_default": "Par défaut : Répondre avec NXDOMAIN lorsque bloqué par la règle de style Adblock; répondre avec l’adresse IP spécifiée dans la règle lorsque bloquée par la règle de style /etc/hosts",
|
||||
"blocking_mode_nxdomain": "NXDOMAIN : Répondre avec le code NXDOMAIN",
|
||||
"blocking_mode_null_ip": "IP nulle : Répondre avec une adresse IP nulle (0.0.0.0 pour A; :: pour AAAA)",
|
||||
"blocking_mode_custom_ip": "IP personnalisée : Répondre avec une adresse IP définie manuellement",
|
||||
"upstream_dns_client_desc": "Si vous laissez ce champ vide, AdGuard Home utilisera les serveurs configurés dans les <0>paramètres DNS</0>.",
|
||||
"source_label": "Source",
|
||||
"found_in_known_domain_db": "Trouvé dans la base de données des domaines connus",
|
||||
"category_label": "Catégorie",
|
||||
"rule_label": "Règle",
|
||||
"filter_label": "Filtre",
|
||||
"list_label": "Liste",
|
||||
"unknown_filter": "Filtre inconnu {{filterId}}",
|
||||
"install_welcome_title": "Bienvenue sur AdGuard Home !",
|
||||
"install_welcome_desc": "AdGuard Home est un seveur DNS pour bloquer les pubs et traceurs sur tout un réseau. Son but est de vous donner le contrôle sur l'ensemble de votre réseau et tous vos appareils sans programme côté client supplémentaire.",
|
||||
"install_settings_title": "Interface web administrateur",
|
||||
"install_settings_listen": "Interface d'écoute",
|
||||
"install_settings_port": "Port",
|
||||
"install_settings_interface_link": "Votre interface web administrateur AdGuard Home sera disponible sur les adresses suivantes :",
|
||||
"form_error_port": "Saisissez un port valide",
|
||||
"install_settings_dns": "Serveur DNS",
|
||||
"install_settings_dns_desc": "Vous devrez configurer vos appareils et votre routeur pour utiliser le serveur DNS sur les adresses suivantes :",
|
||||
"install_settings_all_interfaces": "Toutes les interfaces",
|
||||
"install_auth_title": "Authentification",
|
||||
"install_auth_desc": "Il est fortement recommandé de configurer un mot de passe pour accéder à l'interface web administrateur AdGuard Home. Même si elle est disponible que dans votre réseau local, cela reste important de se protéger contre des accès non désirés.",
|
||||
"install_auth_username": "Nom d'utilisateur",
|
||||
"install_auth_password": "Mot de passe",
|
||||
"install_auth_confirm": "Confirmer le mot de passe",
|
||||
"install_auth_username_enter": "Saisir un nom d'utilisateur",
|
||||
"install_auth_password_enter": "Saisir un mot de passe",
|
||||
"install_step": "Étape",
|
||||
"install_devices_title": "Configurer vos appareils",
|
||||
"install_devices_desc": "Pour commencer à utiliser AdGuard Home, vous devez configurer vos appareils.",
|
||||
"install_submit_title": "Félicitations !",
|
||||
"install_submit_desc": "La procédure d'installation est terminée et vous êtes prêt(e) pour commencer à utiliser AdGuard Home.",
|
||||
@@ -159,6 +257,226 @@
|
||||
"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_6": "Sélectionnez Utiliser l’adresse de serveur DNS suivante et saisissez votre adresse de seveur AdGuard Home.",
|
||||
"install_devices_macos_list_1": "Cliquez sur l'icône Apple et allez dans les Préférences Système.",
|
||||
"install_devices_macos_list_2": "Cliquez sur Réseau.",
|
||||
"install_devices_macos_list_3": "Sélectionnez la première connexion dans votre liste et cliquez sur Avancés.",
|
||||
"install_devices_macos_list_4": "Sélectionnez l'onglet DNS et saisissez votre adresse de serveur AdGuard.",
|
||||
"install_devices_android_list_1": "Depuis l'écran d'accueil Android, appuyez sur Paramètres.",
|
||||
"install_devices_android_list_2": "Appuyez sur Wi-Fi dans le menu. Tous les réseaux disponibles s'afficheront (il est impossible de définir des DNS personnalisés pour les connexions mobiles).",
|
||||
"install_devices_android_list_3": "Faites un appui long sur le réseau auquel vous êtes connecté(e) et appuyez sur Modifier le réseau.",
|
||||
"install_devices_android_list_4": "Sur certains appareils, vous avez parfois besoin de cocher la case Avancés pour davantage de paramètres. Pour ajuster vos paramètres DNS Android, vous devrez basculer les paramètres IP de DHCP à Statique.",
|
||||
"install_devices_android_list_5": "Modifier les valeurs DNS 1 et DNS 2 pour vos adresses de serveur AdGuard Home.",
|
||||
"install_devices_ios_list_1": "Depuis l'écran d'accueil, appuyez sur Paramètres.",
|
||||
"install_devices_ios_list_2": "Choisissez Wi-Fi dans le menu de gauche (il est impossible de configurer les DNS pour les réseaux mobiles).",
|
||||
"install_devices_ios_list_3": "Appuyez sur le nom de votre réseau actuellement utilisé.",
|
||||
"install_devices_ios_list_4": "Dans le champ DNS, saisissez votre adresse de serveur AdGuard Home.",
|
||||
"get_started": "C'est parti",
|
||||
"next": "Suivant",
|
||||
"open_dashboard": "Ouvrir le Tableau de bord",
|
||||
"install_saved": "Enregistré avec succès",
|
||||
"encryption_title": "Chiffrement",
|
||||
"encryption_desc": "Le support du chiffrement (HTTPS/TLS) pour les DNS et l'interface web administrateur",
|
||||
"encryption_config_saved": "Configuration de chiffrement enregistrée",
|
||||
"encryption_server": "Nom du serveur",
|
||||
"encryption_server_enter": "Entrez votre nom de domaine",
|
||||
"encryption_server_desc": "Pour utiliser HTTPS, vous devez entrer le nom du serveur qui correspond à votre certificat SSL.",
|
||||
"encryption_redirect": "Redirection automatiquement vers HTTPS",
|
||||
"encryption_redirect_desc": "Si coché, AdGuard Home vous redirigera automatiquement d'adresses HTTP vers HTTPS.",
|
||||
"encryption_https": "Port HTTPS",
|
||||
"encryption_https_desc": "Si le port HTTPS est configuré, l'interface administrateur de AdGuard Home sera accessible via HTTPS et fournira aussi un service DNS-over-HTTPS sur l'emplacement '/dns-query'.",
|
||||
"encryption_dot": "Port DNS-over-TLS",
|
||||
"encryption_dot_desc": "Si ce port est configuré, AdGuard Home exécutera un serveur DNS-over-TLS sur ce port.",
|
||||
"encryption_certificates": "Certificats",
|
||||
"encryption_certificates_desc": "Pour utiliser le chiffrement, vous devez fournir une chaîne de certificats SSL valide pour votre domaine. Vous pouvez en obtenir une gratuitement sur <0>{{link}}</0> ou vous pouvez en acheter une via les Autorités de Certification de confiance.",
|
||||
"encryption_certificates_input": "Copiez/coller vos certificats encodés PEM ici.",
|
||||
"encryption_status": "État",
|
||||
"encryption_expire": "Expire le",
|
||||
"encryption_key": "Clé privée",
|
||||
"encryption_key_input": "Copiez/coller votre clé privée PEM encodée pour votre certificat ici.",
|
||||
"encryption_enable": "Activer le chiffrement (HTTPS, DNS-over-HTTPS et DNS-over-TLS)",
|
||||
"encryption_enable_desc": "Si le chiffrement est activé, l'interface administrateur AdGuard Home fonctionnera via HTTPS et le serveur DNS écoutera les requêtes via DNS-over-HTTPS et DNS-over-TLS.",
|
||||
"encryption_chain_valid": "Chaîne de certificat valide",
|
||||
"encryption_chain_invalid": "Chaîne de certificat invalide",
|
||||
"encryption_key_valid": "Ceci est une clé privée {{type}} valide",
|
||||
"encryption_key_invalid": "Ceci est une clé privée {{type}} invalide",
|
||||
"encryption_subject": "Objet",
|
||||
"encryption_issuer": "Émetteur",
|
||||
"encryption_hostnames": "Noms d'hôte",
|
||||
"encryption_reset": "Voulez-vous vraiment réinitialiser les paramètres de chiffrement ?",
|
||||
"topline_expiring_certificate": "Votre certificat SSL est sur le point d'expirer. Mettez à jour vos <0>Paramètres de chiffrement</0>.",
|
||||
"topline_expired_certificate": "Votre certificat SSL a expiré. Mettez à jour vos <0>Paramètres de chiffrement</0>.",
|
||||
"form_error_port_range": "Saisissez une valeur de port entre 80 et 65535",
|
||||
"form_error_port_unsafe": "C'est un port non fiable",
|
||||
"form_error_equal": "Ne devrait pas être égal",
|
||||
"form_error_password": "Mots de passe différents",
|
||||
"reset_settings": "Réinitialiser les paramètres",
|
||||
"update_announcement": "AdGuard Home {{version}} est disponible ! <0>Cliquez ici</0> pour plus d'informations.",
|
||||
"setup_guide": "Guide d'installation",
|
||||
"dns_addresses": "Adresses DNS",
|
||||
"dns_start": "Démarrage du serveur DNS",
|
||||
"dns_status_error": "Erreur lors de la récupération du statut du serveur DNS",
|
||||
"down": "Descendant",
|
||||
"fix": "Corriger",
|
||||
"dns_providers": "Voici une <0>liste de fournisseurs DNS connus</0>.",
|
||||
"update_now": "Mettre à jour maintenant",
|
||||
"update_failed": "Échec de la mise à jour automatique. Veuillez <a href='https://github.com/AdguardTeam/AdGuardHome/wiki/Getting-Started#update'>suivre ces étapes</a> pour mettre à jour manuellement.",
|
||||
"processing_update": "Veuillez patienter, AdGuard Home est en cours de mise à jour",
|
||||
"clients_title": "Clients",
|
||||
"clients_desc": "Configurer les appareils connectés à AdGuard Home",
|
||||
"settings_global": "Général",
|
||||
"settings_custom": "Personnalisé",
|
||||
"table_client": "Client",
|
||||
"table_name": "Nom",
|
||||
"save_btn": "Enregistrer",
|
||||
"client_add": "Ajouter un client",
|
||||
"client_new": "Nouveau client",
|
||||
"client_edit": "Modifier le client",
|
||||
"client_identifier": "Identifiant",
|
||||
"ip_address": "Adresse IP",
|
||||
"client_identifier_desc": "Les clients peuvent être identifiés par les adresses IP ou MAC. Veuillez noter que l'utilisation de l'adresse MAC comme identifiant est possible uniquement si AdGuard Home est aussi un <0>serveur DHCP</0>",
|
||||
"form_enter_ip": "Saisissez l'IP",
|
||||
"form_enter_mac": "Saisissez MAC",
|
||||
"form_enter_id": "Entrer identifiant",
|
||||
"form_add_id": "Ajouter identifiant",
|
||||
"form_client_name": "Saisissez le nom du client",
|
||||
"client_global_settings": "Utiliser les paramètres généraux",
|
||||
"client_deleted": "Le client \"{{key}}\" a été supprimé avec succès",
|
||||
"client_added": "Le client \"{{key}}\" a été ajouté",
|
||||
"client_updated": "Le client \"{{key}}\" a été mis à jour",
|
||||
"clients_not_found": "Aucun client trouvé",
|
||||
"client_confirm_delete": "Voulez-vous vraiment supprimer le client \"{{key}}\" ?",
|
||||
"list_confirm_delete": "Voulez-vous vraiment supprimer cette liste ?",
|
||||
"auto_clients_title": "Clients (exécution)",
|
||||
"auto_clients_desc": "Les données des clients qu'utilisent AdGuard Home, mais non stockées dans la configuration",
|
||||
"access_title": "Paramètres d'accès",
|
||||
"access_desc": "Ici vous pouvez configurer les règles d'accès au serveur DNS AdGuard Home.",
|
||||
"access_allowed_title": "Clients autorisés",
|
||||
"access_allowed_desc": "Une liste d'adresses IP ou CIDR. Si configuré, AdGuard Home acceptera uniquement les requêtes provenant de ces adresses IP.",
|
||||
"access_disallowed_title": "Clients non autorisés",
|
||||
"access_disallowed_desc": "Une liste d'adresses IP ou CIDR. Si configuré, AdGuard Home bloquera les requêtes provenant de ces adresses IP.",
|
||||
"access_blocked_title": "Domaines bloqués",
|
||||
"access_blocked_desc": "Ne confondez pas ceci avec les filtres. AdGuard Home bloquera les requêtes DNS avec ces domaines dans la requête.",
|
||||
"updates_version_equal": "AdGuard Home est à jour"
|
||||
"access_settings_saved": "Paramètres d'accès enregistrés avec succès",
|
||||
"updates_checked": "Mises à jour vérifiées",
|
||||
"updates_version_equal": "AdGuard Home est à jour",
|
||||
"check_updates_now": "Vérifier les mises à jour",
|
||||
"dns_privacy": "Confidentialité DNS",
|
||||
"setup_dns_privacy_1": "<0>DNS-over-TLS :</0> Utiliser le string <1>{{address}}</1>.",
|
||||
"setup_dns_privacy_2": "<0>DNS-over-HTTPS :</0> Utiliser le string <1>{{address}}</1>.",
|
||||
"setup_dns_privacy_3": "<0>Veuillez noter que les protocoles DNS chiffrés sont supportés que sur Android 9. Donc vous devez installer un logiciel complémentaire pour les autres systèmes opérationnels.</0><0>Voici une liste de logiciels que vous pouvez utiliser.</0>",
|
||||
"setup_dns_privacy_android_1": "Android 9 supporte nativement le DNS-over-TLS. Pour le configurer, allez dans Paramètres → Réseau et Internet → Avancés → DNS privé et saisissez votre nom de domaine ici.",
|
||||
"setup_dns_privacy_android_2": "<0>AdGuard pour Android</0> supporte le <1>DNS-over-HTTPS</1> et le <1>DNS-over-TLS</1>.",
|
||||
"setup_dns_privacy_android_3": "<0>Intra</0> ajoute le support <1>DNS-over-HTTPS</1> sur Android.",
|
||||
"setup_dns_privacy_ios_1": "<0>DNSCloak</0> supporte le <1>DNS-over-HTTPS</1> mais pour le configurer pour utiliser votre propre serveur, vous devrez générer un <2>DNS Stamp</2> pour lui.",
|
||||
"setup_dns_privacy_ios_2": "<0>AdGuard pour iOS</0> supporte les configurations <1>DNS-over-HTTPS</1> et <1>DNS-over-TLS</1>.",
|
||||
"setup_dns_privacy_other_title": "Autres implémentations",
|
||||
"setup_dns_privacy_other_1": "AdGuard Home lui-même peut être un client DNS sécurisé sur n'importe quelle plateforme.",
|
||||
"setup_dns_privacy_other_2": "<0>dnsproxy</0> supporte tous les protocoles DNS sécurisés connus.",
|
||||
"setup_dns_privacy_other_3": "<0>dnscrypt-proxy</0> supporte le <1>DNS-over-HTTPS</1>.",
|
||||
"setup_dns_privacy_other_4": "<0>Mozilla Firefox</0> supporte le <1>DNS-over-HTTPS</1>.",
|
||||
"setup_dns_privacy_other_5": "Vous trouverez plus d'implémentations <0>ici</0> et <1>ici</1>.",
|
||||
"setup_dns_notice": "Pour utiliser le <1>DNS-over-HTTPS</1> ou le <1>DNS-over-TLS</1>, vous devez <0>configurer le Cryptage</0> dans les paramètres de AdGuard Home.",
|
||||
"rewrite_added": "Réécriture DNS pour \"{{key}}\" ajoutée",
|
||||
"rewrite_deleted": "Réécriture DNS pour \"{{key}}\" supprimée",
|
||||
"rewrite_add": "Ajouter une réécriture DNS",
|
||||
"rewrite_not_found": "Aucune réécriture DNS trouvée",
|
||||
"rewrite_confirm_delete": "Voulez-vous vraiment supprimer la réécriture DNS pour \"{{key}}\" ?",
|
||||
"rewrite_desc": "Permet de configurer facilement la réponse DNS personnalisée pour un nom de domaine spécifique.",
|
||||
"rewrite_applied": "Règle de réécriture appliquée",
|
||||
"dns_rewrites": "Réécritures DNS",
|
||||
"form_domain": "Saisissez un domaine ou caracrtère générique",
|
||||
"form_answer": "Saisissez une adresse IP ou un nom de domaine",
|
||||
"form_error_domain_format": "Format de domaine invalide",
|
||||
"form_error_answer_format": "Format de réponse invalide",
|
||||
"configure": "Configurer",
|
||||
"main_settings": "Paramètres principaux",
|
||||
"block_services": "Bloquer des services spécifiques",
|
||||
"blocked_services": "Services bloqués",
|
||||
"blocked_services_desc": "Permet de bloquer les sites et services populaires rapidement.",
|
||||
"blocked_services_saved": "Services bloqués enregistrés",
|
||||
"blocked_services_global": "Utiliser les services bloqués globaux",
|
||||
"blocked_service": "Service bloqué",
|
||||
"block_all": "Tout bloquer",
|
||||
"unblock_all": "Tout débloquer",
|
||||
"encryption_certificate_path": "Emplacement du certificat",
|
||||
"encryption_private_key_path": "Emplacement de la clef privée",
|
||||
"encryption_certificates_source_path": "Définir un emplacement du fichier des certificats",
|
||||
"encryption_certificates_source_content": "Coller les contenus des certificats",
|
||||
"encryption_key_source_path": "Définir un fichier pour la clef privée",
|
||||
"encryption_key_source_content": "Coller les contenus de la clef privée",
|
||||
"stats_params": "Configuration des statistiques",
|
||||
"config_successfully_saved": "Configuration sauvegardée",
|
||||
"interval_24_hour": "24 heures",
|
||||
"interval_days": "{{count}} jour",
|
||||
"interval_days_plural": "{{count}} jours",
|
||||
"domain": "Domaine",
|
||||
"answer": "Réponse",
|
||||
"filter_added_successfully": "Le filtre a été ajouté avec succès",
|
||||
"filter_updated": "Le filtre a été mis à jour avec succès",
|
||||
"statistics_configuration": "Configuration des statistiques",
|
||||
"statistics_retention": "Maintien des statistiques",
|
||||
"statistics_retention_desc": "Si vous baissez la valeur de l'intervalle, des données seront perdues",
|
||||
"statistics_clear": " Effacer les statistiques",
|
||||
"statistics_clear_confirm": "Voulez-vous vraiment effacer les statistiques ?",
|
||||
"statistics_retention_confirm": "Êtes-vous sûr de vouloir modifier le maintien des statistiques ? Si vous diminuez la valeur de l'intervalle, certaines données seront perdues",
|
||||
"statistics_cleared": "Statistiques effacées",
|
||||
"interval_hours": "{{count}} heure",
|
||||
"interval_hours_plural": "{{count}} heures",
|
||||
"filters_configuration": "Configuration des filtres",
|
||||
"filters_enable": "Activer les filtres",
|
||||
"filters_interval": "Intervalle de mise à jour des filtres",
|
||||
"disabled": "Désactivé",
|
||||
"username_label": "Nom d'utilisateur",
|
||||
"username_placeholder": "Saisir un nom d'utilisateur",
|
||||
"password_label": "Mot de passe",
|
||||
"password_placeholder": "Saisir un mot de passe",
|
||||
"sign_in": "Connexion",
|
||||
"sign_out": "Déconnexion",
|
||||
"forgot_password": "Mot de passe oublié ?",
|
||||
"forgot_password_desc": "Veuillez suivre <0>ces quelques étapes</0> pour créer un nouveau mot de passe pour votre compte.",
|
||||
"location": "Localisation",
|
||||
"orgname": "Nom de l'organisation",
|
||||
"netname": "Nom du réseau",
|
||||
"descr": "Description",
|
||||
"whois": "Whois",
|
||||
"filtering_rules_learn_more": "<0>Apprenez-en plus</0> à propos de la création de vos propres listes de blocage d’hôtes.",
|
||||
"blocked_by_response": "Bloqué par un CNAME ou une réponse IP",
|
||||
"try_again": "Réessayer",
|
||||
"domain_desc": "Saisissez le nom de domaine ou le caractère générique que vous souhaitez réécrire.",
|
||||
"example_rewrite_domain": "réécrivez les réponses pour ce nom de domaine uniquement.",
|
||||
"example_rewrite_wildcard": "réécrire les réponses pour tous les sous-domaines <0>exemple.org</0>.",
|
||||
"disable_ipv6": "Désactiver IPv6",
|
||||
"disable_ipv6_desc": "Si cette fonctionnalité est activée, toutes les requêtes DNS visant des adresses IPv6 (type AAAA) seront annulées.",
|
||||
"autofix_warning_text": "Si vous cliquez sur \"Réparer\", AdGuardHome configurera votre système pour utiliser le serveur DNS AdGuardHome.",
|
||||
"autofix_warning_list": "Ceci effectuera les tâches suivantes : <0>Désactiver le système DNSStubListener</0> <0>Définir l’adresse du serveur DNS à 127.0.0.1 </0> <0>Remplacer la cible du lien symbolique de /etc/resolv.conf par /run/systemd/resolve/resolv.conf</0> <0>Arrêter DNSStubListener (recharger le service résolu par systemd)</0>",
|
||||
"autofix_warning_result": "Par conséquent, toutes les demandes DNS de votre système seront traitées par AdGuardHome par défaut.",
|
||||
"tags_title": "Mots clés",
|
||||
"tags_desc": "Vous pouvez sélectionner les mots clés qui correspondent au client. Les mots clés peuvent être inclus dans les règles de filtrage et vous permettent de les appliquer plus précisément. <0>En savoir plus</0>",
|
||||
"form_select_tags": "Sélectionner les mots clés du client",
|
||||
"check_title": "Vérification du filtrage",
|
||||
"check_desc": "Vérifier si le nom d’hôte est filtré",
|
||||
"check": "Vérifier",
|
||||
"form_enter_host": "Saisissez un nom d’hôte",
|
||||
"filtered_custom_rules": "Filtré par des règles de filtrage personnalisées",
|
||||
"host_whitelisted": "L’hôte est sur liste blanche",
|
||||
"check_ip": "Adresses IP : {{ip}}",
|
||||
"check_cname": "CNAME : {{cname}}",
|
||||
"check_reason": "Raison : {{reason}}",
|
||||
"check_rule": "Règle : {{rule}}",
|
||||
"check_service": "Nom du service : {{service}}",
|
||||
"check_not_found": "Introuvable dans vos listes de filtres",
|
||||
"client_confirm_block": "Voulez-vous vraiment bloquer le client « {{ip}} »?",
|
||||
"client_confirm_unblock": "Voulez-vous vraiment débloquer le client « {{ip}} »?",
|
||||
"client_blocked": "Client « {{ip}} » bloqué avec succès",
|
||||
"client_unblocked": "Client « {{ip}} » débloqué avec succès",
|
||||
"static_ip": "Adresse IP statique",
|
||||
"static_ip_desc": "AdGuard Home est un serveur, il a donc besoin d’une adresse IP statique pour fonctionner correctement. Autrement, à un moment donné, votre routeur pourrait attribuer une adresse IP différente à cet appareil.",
|
||||
"set_static_ip": "Définir une adresse IP statique",
|
||||
"install_static_ok": "Bonne nouvelle! L’adresse IP statique est déjà configurée",
|
||||
"install_static_error": "AdGuard Home ne peut pas le configurer automatiquement pour cette interface réseau. Veuillez rechercher une instruction sur la façon de procéder manuellement.",
|
||||
"install_static_configure": "Nous avons détecté qu’une adresse IP dynamique est utilisée — <0>{{ip}}</0>. Voulez-vous l’utiliser comme votre adresse statique?",
|
||||
"confirm_static_ip": "AdGuard Home configurera {{ip}} pour être votre adresse IP statique. Voulez-vous poursuivre?",
|
||||
"list_updated": "{{count}} liste mise à jour",
|
||||
"list_updated_plural": "{{count}} listes mises à jour"
|
||||
}
|
||||
@@ -23,6 +23,7 @@
|
||||
"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_client_id_format": "Nevažeći format ID-a klijenta",
|
||||
"form_error_positive": "Mora biti veće od 0",
|
||||
"form_error_negative": "Mora biti jednako ili veće od 0",
|
||||
"dhcp_form_gateway_input": "Gateway IP",
|
||||
@@ -71,7 +72,7 @@
|
||||
"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_malware_phishing": "Blokiran zločudni program/krađe identiteta",
|
||||
"stats_adult": "Blokirane web stranice za odrasle",
|
||||
"stats_query_domain": "Top tražene domene",
|
||||
"for_last_24_hours": "u zadnja 24 sata",
|
||||
@@ -104,6 +105,11 @@
|
||||
"no_servers_specified": "Nije odabran nijedan poslužitelj",
|
||||
"general_settings": "Opće postavke",
|
||||
"dns_settings": "DNS postavke",
|
||||
"dns_blocklists": "DNS popisi blokiranih",
|
||||
"dns_allowlists": "DNS popisi omogućenih",
|
||||
"dns_blocklists_desc": "AdGuard Home će blokirati domene koje odgovaraju popisu blokiranih.",
|
||||
"dns_allowlists_desc": "Domene iz DNS popisa omogućenih će biti omogućene čak i kada se nalaze na nekoj listi blokiranih.",
|
||||
"custom_filtering_rules": "Prilagođena pravila filtriranja",
|
||||
"encryption_settings": "Postavke šifriranja",
|
||||
"dhcp_settings": "DHCP postavke",
|
||||
"upstream_dns": "Upstream DNS poslužitelji",
|
||||
@@ -113,30 +119,36 @@
|
||||
"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_safe_browsing_toast": "Onemogućena sigurna pretraga",
|
||||
"enabled_safe_browsing_toast": "Omogućena sigurna pretraga",
|
||||
"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",
|
||||
"list_url_table_header": "URL popisa",
|
||||
"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",
|
||||
"no_blocklist_added": "Nema dodanih popisa blokiranih",
|
||||
"no_whitelist_added": "Nema dodanih popisa omogućenih",
|
||||
"add_blocklist": "Dodaj popis blokiranih",
|
||||
"add_allowlist": "Dodaj popis omogućenih",
|
||||
"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.",
|
||||
"new_blocklist": "Novi popis blokiranih",
|
||||
"new_allowlist": "Novi popis omogućenih",
|
||||
"edit_blocklist": "Uredi popis blokiranih",
|
||||
"edit_allowlist": "Uredi popis omogućenih",
|
||||
"enter_valid_blocklist": "Unesite valjani URL za popis blokiranih.",
|
||||
"enter_valid_allowlist": "Unesite valjani URL za popis omogućenih.",
|
||||
"form_error_url_format": "Nevažeći url format",
|
||||
"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",
|
||||
@@ -152,7 +164,7 @@
|
||||
"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",
|
||||
"all_lists_up_to_date_toast": "Svi popisi 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",
|
||||
@@ -172,7 +184,6 @@
|
||||
"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",
|
||||
@@ -190,6 +201,7 @@
|
||||
"query_log_retention_confirm": "Jeste li sigurni da želite promijeniti zadržavanje zapisnika upita? Ako smanjite vrijednost intervala, neki će podaci biti izgubljeni",
|
||||
"dns_config": "DNS postavke poslužitelja",
|
||||
"blocking_mode": "Način blokiranja",
|
||||
"default": "Zadano",
|
||||
"nxdomain": "NXDOMAIN",
|
||||
"null_ip": "Null IP",
|
||||
"custom_ip": "Prilagođen IP",
|
||||
@@ -202,13 +214,16 @@
|
||||
"rate_limit_desc": "Broj zahtjeva u sekundi koji su dopušteni po jednom klijentu (0: neograničeno)",
|
||||
"blocking_ipv4_desc": "Povratna IP adresa za blokirane A zahtjeve",
|
||||
"blocking_ipv6_desc": "Povratna IP adresa za blokirane AAAA zahtjeve",
|
||||
"blocking_mode_desc": "<0>NXDOMAIN – Odgovor s NXDOMAIN kôdom;</0> <0>Null IP – Odgovor s nuliranom IP adresom (0.0.0.0 za A; :: za AAAA);</0> <0>Prilagođeni IP - Odgovor s ručno postavljenom IP adresom.</0>",
|
||||
"blocking_mode_default": "Zadano: Odgovor s NXDOMAIN kada je blokirano od Adblock sličnog pravila; odgovor s IP adresom definiranom u pravilu kada je blokirano od /etc/hosts sličnog pravila",
|
||||
"blocking_mode_nxdomain": "NXDOMAIN: Odgovor s NXDOMAIN kôdom",
|
||||
"blocking_mode_null_ip": "Nuliran IP: Odgovor s nuliranom IP adresom (0.0.0.0 za A; :: za AAAA)",
|
||||
"blocking_mode_custom_ip": "Prilagođeni IP: Odgovor s ručno postavljenom IP adresom",
|
||||
"upstream_dns_client_desc": "Ako ovo polje ostane prazno, AdGuard Home će upotrijebiti poslužitelje postavljene u <0>DNS postavkama</0>.",
|
||||
"source_label": "Izvor",
|
||||
"found_in_known_domain_db": "Pronađeno u bazi poznatih domena.",
|
||||
"category_label": "Kategorija",
|
||||
"rule_label": "Pravilo",
|
||||
"filter_label": "Filtar",
|
||||
"list_label": "Popis",
|
||||
"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.",
|
||||
@@ -320,7 +335,7 @@
|
||||
"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>",
|
||||
"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 i <0>DHCP poslužitelj</0>",
|
||||
"form_enter_ip": "Unesite IP adresu",
|
||||
"form_enter_mac": "Unesite MAC adresu",
|
||||
"form_enter_id": "Unesi identifikator",
|
||||
@@ -332,7 +347,7 @@
|
||||
"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?",
|
||||
"list_confirm_delete": "Jeste li sigurni da želite ukloniti ovaj popis?",
|
||||
"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",
|
||||
@@ -350,7 +365,7 @@
|
||||
"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_3": "<0>Imajte na umu da su šifrirani DNS protokoli podržani samo na Androidu 9. Stoga morate instalirati dodatni program za ostale operativne sustave.</0><0>Evo popisa programa koje 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.",
|
||||
@@ -371,6 +386,7 @@
|
||||
"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 naziv domene ili zamjenski znak",
|
||||
"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",
|
||||
@@ -397,7 +413,8 @@
|
||||
"interval_days_plural": "{{count}} dana",
|
||||
"domain": "Domena",
|
||||
"answer": "Odgovor",
|
||||
"filter_added_successfully": "Filtar je uspješno dodan",
|
||||
"filter_added_successfully": "Popis je uspješno dodan",
|
||||
"filter_updated": "Ovaj popis je uspješno ažuriran",
|
||||
"statistics_configuration": "Postavke statistike",
|
||||
"statistics_retention": "Spremanje statistike",
|
||||
"statistics_retention_desc": "Ako smanjite vrijednost intervala, neki će podaci biti izgubljeni",
|
||||
@@ -426,5 +443,41 @@
|
||||
"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",
|
||||
"try_again": "Pokušajte ponovno"
|
||||
"try_again": "Pokušajte ponovno",
|
||||
"domain_desc": "Unesite naziv domene ili zamjenski znak koji želite prepisati.",
|
||||
"example_rewrite_domain": "prepiši odgovore samo za ovaj naziv domene.",
|
||||
"example_rewrite_wildcard": "prepiši odgovore za sve <0>example.org</0> poddomene.",
|
||||
"disable_ipv6": "Onemogući IPv6",
|
||||
"disable_ipv6_desc": "Ukoliko je ova značajka omogućena, svi DNS upiti za IPv6 adrese (AAAA tip) će biti odbačeni.",
|
||||
"autofix_warning_text": "Ako pritisnete \"Popravi\", AdGuard Home će postaviti vaš sustav da koristi AdGuardHome DNS poslužitelj.",
|
||||
"autofix_warning_list": "Izvodi sljedeće radnje: <0>Deaktiviraj DNSStubListener sustav</0> <0>Postavi adresu DNS poslužitelja na 127.0.0.1</0> <0>Zamijeni simbolički cilj veze iz /etc/resolv.conf u /run/systemd/resolve/resolv.conf</0> <0>Zaustavi DNSStubListener (ponovno pokreni systemd-resolved uslugu)</0>",
|
||||
"autofix_warning_result": "Kao rezultat toga, sve DNS zahtjeve iz vašeg sustava će AdGuard Home obraditi prema zadanim postavkama.",
|
||||
"tags_title": "Oznake",
|
||||
"tags_desc": "Možete odabrati oznake koje odgovaraju klijentu. Oznake se mogu uključiti u pravila filtriranja i omogućuju vam da ih točnije primijenite. <0>Saznajte više</0>",
|
||||
"form_select_tags": "Odaberite oznake klijenta",
|
||||
"check_title": "Provjerite filtriranje",
|
||||
"check_desc": "Provjerite je li naziv računala filtriran",
|
||||
"check": "Provjeri",
|
||||
"form_enter_host": "Unesite naziv računala",
|
||||
"filtered_custom_rules": "Filtrirano prilagođenim pravilima filtriranja",
|
||||
"host_whitelisted": "Računalo je na popisu dopuštenih",
|
||||
"check_ip": "IP adrese: {{ip}}",
|
||||
"check_cname": "CNAME: {{cname}}",
|
||||
"check_reason": "Razlog: {{reason}}",
|
||||
"check_rule": "Pravilo: {{rule}}",
|
||||
"check_service": "Naziv usluge: {{service}}",
|
||||
"check_not_found": "Nije pronađeno na vašoj listi filtara",
|
||||
"client_confirm_block": "Jeste li sigurni da želite blokirati \"{{ip}}\" klijenta?",
|
||||
"client_confirm_unblock": "Jeste li sigurni da želite odblokirati \"{{ip}}\" klijenta?",
|
||||
"client_blocked": "Klijent \"{{ip}}\" je uspješno blokiran",
|
||||
"client_unblocked": "Klijent \"{{ip}}\" je uspješno odblokiran",
|
||||
"static_ip": "Statička IP adresa",
|
||||
"static_ip_desc": "AdGuard Home je poslužitelj pa mu za pravilno funkcioniranje treba statička IP adresa. Inače, u određenom trenutku vaš router može ovom uređaju dodijeliti drugu IP adresu.",
|
||||
"set_static_ip": "Postavite statičku IP adresu",
|
||||
"install_static_ok": "Dobre vijesti! Statička IP adresa već je postavljena",
|
||||
"install_static_error": "AdGuard Home ne može je automatski postaviti za ovo mrežno sučelje. Molimo potražite upute kako to učiniti ručno.",
|
||||
"install_static_configure": "Otkrili smo da se koristi dinamička IP adresa - <0>{{ip}}</0>. Želite li je koristiti kao svoju statičku adresu?",
|
||||
"confirm_static_ip": "AdGuard Home će postaviti {{ip}} kao vašu statičku IP adresu. Želiš li nastaviti?",
|
||||
"list_updated": "{{count}} popis ažuriran",
|
||||
"list_updated_plural": "{{count}} popisa ažurirana"
|
||||
}
|
||||
@@ -19,9 +19,13 @@
|
||||
"dhcp_leases_not_found": "DHCP lease tidak ditemukan",
|
||||
"dhcp_config_saved": "Pengaturan server DHCP tersimpan",
|
||||
"form_error_required": "Kolom yang harus diisi",
|
||||
"form_error_ip4_format": "Format IPv4 tidak valid",
|
||||
"form_error_ip6_format": "Format IPv6 tidak valid",
|
||||
"form_error_ip_format": "Format IPv4 tidak valid",
|
||||
"form_error_mac_format": "Format MAC tidak valid",
|
||||
"form_error_client_id_format": "Format client ID tidak valid",
|
||||
"form_error_positive": "Harus lebih dari 0",
|
||||
"form_error_negative": "Harus berjumlah 0 atau lebih besar dari 0",
|
||||
"dhcp_form_gateway_input": "IP gateway",
|
||||
"dhcp_form_subnet_input": "Subnet mask",
|
||||
"dhcp_form_range_title": "Rentang alamat IP",
|
||||
@@ -43,6 +47,7 @@
|
||||
"dhcp_new_static_lease": "Static lease baru",
|
||||
"dhcp_static_leases_not_found": "DHCP static lease tidak ditemukan",
|
||||
"dhcp_add_static_lease": "Tambah static lease",
|
||||
"dhcp_reset": "Apakah anda yakin ingin mengatur ulang konfigurasi DHCP anda?",
|
||||
"delete_confirm": "Apakah anda yakin ingin menghapus \"{{key}}\"?",
|
||||
"form_enter_hostname": "Masukkan hostname",
|
||||
"error_details": "Detail kesalahan",
|
||||
@@ -71,7 +76,7 @@
|
||||
"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": "untuk {{count}} hari terakhir",
|
||||
"for_last_days_plural": "selama {{count}} hari terakhir",
|
||||
"no_domains_found": "Domain tidak ditemukan",
|
||||
"requests_count": "Jumlah permintaan",
|
||||
@@ -79,7 +84,7 @@
|
||||
"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": "Jumlah kueri DNS diproses selama {{count}} 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",
|
||||
@@ -116,22 +121,16 @@
|
||||
"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",
|
||||
@@ -147,7 +146,6 @@
|
||||
"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",
|
||||
@@ -167,7 +165,6 @@
|
||||
"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",
|
||||
@@ -183,11 +180,16 @@
|
||||
"query_log_disabled": "Kueri log dinonaktifkan dan dapat dikonfigurasi di <0>pengaturan</0>",
|
||||
"query_log_strict_search": "Gunakan tanda kutip ganda untuk pencarian ketat",
|
||||
"query_log_retention_confirm": "Apakah Anda yakin ingin mengubah retensi kueri log? Jika Anda menurunkan nilai interval, beberapa data akan hilang",
|
||||
"blocking_mode": "Mode blokir",
|
||||
"blocking_ipv4": "Blokiran IPv4",
|
||||
"blocking_ipv6": "Blokiran IPv6",
|
||||
"edns_cs_desc": "Apabila dinyalakan, AdGuard Home akan mengirim subnet klien ke server-server DNS.",
|
||||
"rate_limit_desc": "Jumlah permintaan per detik yang diperbolehkan untuk satu klien (0: tidak terbatas)",
|
||||
"blocking_mode_custom_ip": "IP kustom: respon dengan alamat IP yang diset secara manual",
|
||||
"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",
|
||||
@@ -279,6 +281,7 @@
|
||||
"update_announcement": "AdGuard Home {{version}} sekarang tersedia! <0>Klik di sini</0> untuk info lebih lanjut.",
|
||||
"setup_guide": "Panduan Penyiapan",
|
||||
"dns_addresses": "Alamat DNS",
|
||||
"dns_start": "Server DNS sedang dinyalakan",
|
||||
"dns_status_error": "Kesalahan dalam mendapatkan status server DNS",
|
||||
"down": "Padam",
|
||||
"fix": "Perbaiki",
|
||||
@@ -308,7 +311,6 @@
|
||||
"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",
|
||||
@@ -347,6 +349,7 @@
|
||||
"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",
|
||||
@@ -369,7 +372,7 @@
|
||||
"stats_params": "Konfigurasi statistik",
|
||||
"config_successfully_saved": "Konfigurasi berhasil disimpan",
|
||||
"interval_24_hour": "24 jam",
|
||||
"interval_days": "{{value}} hari",
|
||||
"interval_days": "{{count}} hari",
|
||||
"interval_days_plural": "{{count}} hari",
|
||||
"domain": "Domain",
|
||||
"answer": "Jawab",
|
||||
@@ -400,5 +403,11 @@
|
||||
"netname": "Nama jaringan",
|
||||
"descr": "Deskripsi",
|
||||
"whois": "Whois",
|
||||
"filtering_rules_learn_more": "<0>Pelajari lebih lanjut</0> tentang membuat daftar hitam host Anda sendiri."
|
||||
"filtering_rules_learn_more": "<0>Pelajari lebih lanjut</0> tentang membuat daftar hitam host Anda sendiri.",
|
||||
"blocked_by_response": "Diblokir oleh CNAME atau IP sebagai respon",
|
||||
"try_again": "Coba lagi",
|
||||
"disable_ipv6": "Matikan IPv6",
|
||||
"disable_ipv6_desc": "Apabila fitur ini dinyalakan, semua permintaan DNS untuk alamat-alamat IPv6 (tipe AAAA) akan diputus.",
|
||||
"autofix_warning_text": "Apabila anda menekan \"Perbaiki\", AdGuardHome akan mengatur sistem anda untuk menggunakan server DNS AdGuardHome.",
|
||||
"autofix_warning_result": "Hasilnya, semua permintaan DNS dari sistem anda akan diproses oleh AdGuardHome secara standar."
|
||||
}
|
||||
@@ -17,9 +17,15 @@
|
||||
"dhcp_leases": "Leases DHCP",
|
||||
"dhcp_static_leases": "Leases DHCP statici",
|
||||
"dhcp_leases_not_found": "Nessun lease DHCP trovato",
|
||||
"dhcp_config_saved": "Configurazione server DHCP salvata",
|
||||
"form_error_required": "Campo richiesto",
|
||||
"form_error_ip4_format": "Formato IPv4 non valido",
|
||||
"form_error_ip6_format": "Formato IPv6 non valido",
|
||||
"form_error_ip_format": "Formato IPv4 non valido",
|
||||
"form_error_mac_format": "Formato MAC non valido",
|
||||
"form_error_client_id_format": "Formato ID cliente non valido",
|
||||
"form_error_positive": "Deve essere maggiore di 0",
|
||||
"form_error_negative": "Deve essere maggiore o uguale a 0 (zero)",
|
||||
"dhcp_form_gateway_input": "IP Gateway",
|
||||
"dhcp_form_subnet_input": "Subnet mask",
|
||||
"dhcp_form_range_title": "Range indirizzi IP",
|
||||
@@ -41,6 +47,7 @@
|
||||
"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",
|
||||
"dhcp_reset": "Sei sicuro di voler ripristinare la configurazione DHCP?",
|
||||
"delete_confirm": "Sei sicuro di voler cancellare \"{{key}}\"?",
|
||||
"form_enter_hostname": "Inserisci hostname",
|
||||
"error_details": "Dettagli errore",
|
||||
@@ -69,7 +76,7 @@
|
||||
"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": "per gli ultimi {{count}} giorni",
|
||||
"for_last_days_plural": "per gli ultimi {{count}} giorni",
|
||||
"no_domains_found": "Nessun dominio trovato",
|
||||
"requests_count": "Numero richieste",
|
||||
@@ -94,13 +101,16 @@
|
||||
"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",
|
||||
"enforce_save_search_hint": "AdGuard Home può forzare la ricerca sicura sui seguenti motori di ricerca: Google, YouTube, Bing e Yandex",
|
||||
"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",
|
||||
"upstream_dns_hint": "Se lasci vuoto questo campo, AdGuard Home imposterà i <a href='https://1.1.1.1/' target='_blank'>DNS di Cloudflare</a> come upstream. Inserisci il prefisso tls:// per i server con DNS over TLS",
|
||||
"test_upstream_btn": "Testa gli upstream",
|
||||
"upstreams": "Upstream",
|
||||
"apply_btn": "Applica",
|
||||
"disabled_filtering_toast": "Disabilita filtri",
|
||||
"enabled_filtering_toast": "Abilita filtri",
|
||||
@@ -112,22 +122,17 @@
|
||||
"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",
|
||||
"form_error_url_format": "Formato url non valido",
|
||||
"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",
|
||||
@@ -143,7 +148,6 @@
|
||||
"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",
|
||||
@@ -163,7 +167,6 @@
|
||||
"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",
|
||||
@@ -179,11 +182,30 @@
|
||||
"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",
|
||||
"dns_config": "Configurazione server DNS",
|
||||
"blocking_mode": "Modalità di blocco",
|
||||
"default": "Predefinito",
|
||||
"nxdomain": "NXDOMAIN",
|
||||
"null_ip": "Nessun IP",
|
||||
"custom_ip": "IP personalizzato",
|
||||
"blocking_ipv4": "Blocca IPv4",
|
||||
"blocking_ipv6": "Blocca IPv6",
|
||||
"form_enter_rate_limit": "Imposta limite delle richieste",
|
||||
"rate_limit": "Limite delle richieste",
|
||||
"edns_enable": "Abilita client di sottorete EDNS",
|
||||
"edns_cs_desc": "Se abilitato, AdGuard Home invierà le sottoreti cdei client ai server DNS.",
|
||||
"rate_limit_desc": "Il numero di richieste al secondo chheun singolo client può fare (0: illimitato)",
|
||||
"blocking_ipv4_desc": "Indirizzo IP per una richiesta DNS IPv4 bloccata",
|
||||
"blocking_ipv6_desc": "Indirizzo IP restituito per una richiesta DNS IPv6 bloccata",
|
||||
"blocking_mode_default": "Predefinito: Rispondi con NXDOMAIN quando bloccato da una regola di Adblock; rispondi con l'indirizzo IP specificato nella regola quando bloccato dalla regola / etc / hosts-style",
|
||||
"blocking_mode_nxdomain": "NXDOMAIN: Rispondi con il codice NXDOMAIN",
|
||||
"blocking_mode_null_ip": "IP nullo: Rispondi con indirizzo IP zero (0.0.0.0 per A; :: per AAAA)",
|
||||
"blocking_mode_custom_ip": "IP personalizzato: Rispondi con un indirizzo IP impostato manualmente",
|
||||
"upstream_dns_client_desc": "Se lasci questo spazio vuoto, AdGuard Home utilizzerà i server configurati nelle <0>impostazioni DNS</0>.",
|
||||
"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.",
|
||||
@@ -275,6 +297,8 @@
|
||||
"update_announcement": "AdGuard Home {{version}} è ora disponibile! <0>Clicca qui</0> per più informazioni.",
|
||||
"setup_guide": "Configurazione guidata",
|
||||
"dns_addresses": "Indirizzo DNS",
|
||||
"dns_start": "Il server DNS si sta avviando",
|
||||
"dns_status_error": "Errore nel recupero dello stato del server DNS",
|
||||
"down": "Spenta",
|
||||
"fix": "Risolvi",
|
||||
"dns_providers": "Qui c'è una <0>list di provider DNS</0> da cui scegliere",
|
||||
@@ -293,8 +317,11 @@
|
||||
"client_edit": "Modifica Client",
|
||||
"client_identifier": "Identificatore",
|
||||
"ip_address": "Indirizzo IP",
|
||||
"client_identifier_desc": "I client possono essere identificati dall indirizzo IP o dall' indirizzo MAC. Nota che l' utilizzo dell' indirizzo MAC come identificatore è consentito solo se AdGuard Home è anche il <0>server DHCP</0>",
|
||||
"form_enter_ip": "Inserisci IP",
|
||||
"form_enter_mac": "Inserisci MAC",
|
||||
"form_enter_id": "Inserisci identificatore",
|
||||
"form_add_id": "Aggiungi identificatore",
|
||||
"form_client_name": "Inserisci nome client",
|
||||
"client_global_settings": "Usa le impostazioni globali",
|
||||
"client_deleted": "Client \"{{key}}\" eliminato correttamente",
|
||||
@@ -302,7 +329,6 @@
|
||||
"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",
|
||||
@@ -341,6 +367,7 @@
|
||||
"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",
|
||||
@@ -368,6 +395,7 @@
|
||||
"domain": "Dominio",
|
||||
"answer": "Risposta",
|
||||
"filter_added_successfully": "Il filtro è stato aggiunto correttamente",
|
||||
"filter_updated": "Il filtro è stato aggiornato correttamente",
|
||||
"statistics_configuration": "Configurazione delle statistiche",
|
||||
"statistics_retention": "Conservazione statistiche",
|
||||
"statistics_retention_desc": "Se si diminuisce il valore di intervallo, alcuni dati saranno persi",
|
||||
@@ -394,5 +422,41 @@
|
||||
"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."
|
||||
"filtering_rules_learn_more": "<0>Impara di più</0> come creare i tuoi elenchi di blocco per i hosts.",
|
||||
"blocked_by_response": "Bloccato per CNAME o IP in risposta",
|
||||
"try_again": "Riprova",
|
||||
"domain_desc": "Inserire il nome di dominio o carattere jolly che si vuole riscrivere.",
|
||||
"example_rewrite_domain": "riscrivi risposte per questo dominio soltanto.",
|
||||
"example_rewrite_wildcard": "riscrivi risposte per tutti i sottodomini di <0>esempio.org</0>.",
|
||||
"disable_ipv6": "Disabilita IPv6",
|
||||
"disable_ipv6_desc": "Se questa funzione è abilitata, tutte le query DNS per gli indirizzi IPv6 (tipo AAAA) verranno eliminate.",
|
||||
"autofix_warning_text": "Se fai clic su \"Correggi\", AdGuardHome configurerà il tuo sistema per utilizzare il server DNS AdGuardHome.",
|
||||
"autofix_warning_list": "Eseguirà queste attività: <0> Disattiva DNSStubListener di sistema </0> <0> Imposta l'indirizzo del server DNS su 127.0.0.1 </0> <0> Sostituisci la destinazione del collegamento simbolico di /etc/resolv.conf su / run / systemd /resolve/resolv.conf </0> <0> Arresta DNSStubListener (ricarica il servizio systemd-resolved) </0>",
|
||||
"autofix_warning_result": "Di conseguenza, tutte le richieste DNS dal sistema verranno elaborate da AdGuardHome per impostazione predefinita.",
|
||||
"tags_title": "Tag",
|
||||
"tags_desc": "È possibile selezionare i tag che corrispondono al client. I tag possono essere inclusi nelle regole dei filtri e consentono di applicarli in modo più accurato. <0> Ulteriori informazioni </0>",
|
||||
"form_select_tags": "Seleziona i tag client",
|
||||
"check_title": "Controlla il filtro",
|
||||
"check_desc": "Controlla se il nome host è filtrato",
|
||||
"check": "Controlla",
|
||||
"form_enter_host": "Inserisci un nome per l'host",
|
||||
"filtered_custom_rules": "Filtrato dalle regole filtro personalizzate",
|
||||
"host_whitelisted": "L'host è presente nella whitelist",
|
||||
"check_ip": "Indirizzi IP: {{ip}}",
|
||||
"check_cname": "CNAME: {{cname}}",
|
||||
"check_reason": "Motivo: {{reason}}",
|
||||
"check_rule": "Regola: {{rule}}",
|
||||
"check_service": "Nome servizio: {{service}}",
|
||||
"check_not_found": "Non trovato negli elenchi dei filtri",
|
||||
"client_confirm_block": "Sei sicuro di voler bloccare il client \"{{ip}}\"?",
|
||||
"client_confirm_unblock": "Sei sicuro di voler sbloccare il client \"{{ip}}\"?",
|
||||
"client_blocked": "Client \"{{ip}}\" bloccato correttamente",
|
||||
"client_unblocked": "Client \"{{ip}}\" sbloccato correttamente",
|
||||
"static_ip": "Indirizzo IP statico",
|
||||
"static_ip_desc": "AdGuard Home è un server quindi ha bisogno di un indirizzo IP statico per funzionare correttamente. Altrimenti, a un certo punto, il router potrebbe assegnare un indirizzo IP diverso a questo dispositivo.",
|
||||
"set_static_ip": "Imposta un indirizzo IP statico",
|
||||
"install_static_ok": "Buone notizie! L'indirizzo IP statico è già configurato",
|
||||
"install_static_error": "AdGuard Home non può configurarlo automaticamente per questa interfaccia di rete. Si prega di cercare un'istruzione su come farlo manualmente.",
|
||||
"install_static_configure": "Abbiamo rilevato che viene utilizzato un indirizzo IP dinamico - <0> {{ip}} </0>. Vuoi usarlo come indirizzo statico?",
|
||||
"confirm_static_ip": "AdGuard Home configurerà {{ip}} come indirizzo IP statico. Vuoi procedere?"
|
||||
}
|
||||
@@ -23,6 +23,7 @@
|
||||
"form_error_ip6_format": "IPv6フォーマットではありません",
|
||||
"form_error_ip_format": "IPv4フォーマットではありません",
|
||||
"form_error_mac_format": "MACフォーマットではありません",
|
||||
"form_error_client_id_format": "Client IDの形式が無効です",
|
||||
"form_error_positive": "0より大きい必要があります",
|
||||
"form_error_negative": "0以上である必要があります",
|
||||
"dhcp_form_gateway_input": "ゲートウェイIP",
|
||||
@@ -104,6 +105,11 @@
|
||||
"no_servers_specified": "サーバが指定されていません",
|
||||
"general_settings": "一般設定",
|
||||
"dns_settings": "DNS設定",
|
||||
"dns_blocklists": "DNSブロックリスト",
|
||||
"dns_allowlists": "DNS許可リスト",
|
||||
"dns_blocklists_desc": "AdGuard Homeは、ブロックリストに一致するドメインをブロックします。",
|
||||
"dns_allowlists_desc": "DNS許可リストにあるドメインは、ブロックリストに含まれていても許可されます。",
|
||||
"custom_filtering_rules": "カスタム・フィルタリングルール",
|
||||
"encryption_settings": "暗号化設定",
|
||||
"dhcp_settings": "DHCP設定",
|
||||
"upstream_dns": "上流DNSサーバ",
|
||||
@@ -121,22 +127,28 @@
|
||||
"enabled_save_search_toast": "セーフサーチを有効にしました",
|
||||
"enabled_table_header": "有効",
|
||||
"name_table_header": "名称",
|
||||
"filter_url_table_header": "フィルタのURL",
|
||||
"list_url_table_header": "URLリスト",
|
||||
"rules_count_table_header": "ルール数",
|
||||
"last_time_updated_table_header": "最終更新時刻",
|
||||
"actions_table_header": "操作",
|
||||
"edit_table_action": "編集する",
|
||||
"delete_table_action": "削除する",
|
||||
"filters_and_hosts": "フィルタとhostsブロックリスト",
|
||||
"filters_and_hosts_hint": "AdGuard Homeは、基本的な広告ブロックルールとhostsファイルの構文を理解します。",
|
||||
"no_filters_added": "フィルタは追加されませんでした",
|
||||
"add_filter_btn": "フィルタを追加する",
|
||||
"no_blocklist_added": "ブロックリストには何も追加されていません",
|
||||
"no_whitelist_added": "許可リストには何も追加されていません",
|
||||
"add_blocklist": "ブロックリストに追加する",
|
||||
"add_allowlist": "許可リストに追加する",
|
||||
"cancel_btn": "キャンセル",
|
||||
"enter_name_hint": "名称を入力",
|
||||
"enter_url_hint": "URLを入力",
|
||||
"check_updates_btn": "アップデートを確認する",
|
||||
"new_filter_btn": "新しいフィルタ・サブスクリプション",
|
||||
"enter_valid_filter_url": "フィルタ・サブスクリプションもしくはhostsファイルの有効なURLを入力してください。",
|
||||
"new_blocklist": "新しいブロックリスト",
|
||||
"new_allowlist": "新しい許可リスト",
|
||||
"edit_blocklist": "ブロックリストの編集",
|
||||
"edit_allowlist": "許可リストの編集",
|
||||
"enter_valid_blocklist": "ブロックリストへ有効なURLを入力してください。",
|
||||
"enter_valid_allowlist": "許可リストへ有効なURLを入力してください。",
|
||||
"form_error_url_format": "URLのフォーマットではありません",
|
||||
"custom_filter_rules": "カスタム・フィルタリングルール",
|
||||
"custom_filter_rules_hint": "1つの行に1つのルールを入力してください。 広告ブロックルールやhostsファイル構文を使用できます。",
|
||||
"examples_title": "例",
|
||||
@@ -152,7 +164,7 @@
|
||||
"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/' target='_blank'>DNSCrypt</a> または <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a> リゾルバのために <a href='https://dnscrypt.info/stamps/' target='_blank'>DNS Stamps</a> を使えます",
|
||||
"example_upstream_tcp": "通常のDNS(TCPでの問い合わせ)",
|
||||
"all_filters_up_to_date_toast": "すべてのフィルタは既に最新です",
|
||||
"all_lists_up_to_date_toast": "すべてのリストは既に最新です",
|
||||
"updated_upstream_dns_toast": "上流DNSサーバを更新しました",
|
||||
"dns_test_ok_toast": "指定されたDNSサーバは正しく動作しています",
|
||||
"dns_test_not_ok_toast": "サーバ \"{{key}}\": 使用できませんでした。正しく入力されているかどうかを確認してください",
|
||||
@@ -172,7 +184,6 @@
|
||||
"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": "ルールをカスタム・フィルタリングルールから除去しました",
|
||||
@@ -190,6 +201,7 @@
|
||||
"query_log_retention_confirm": "クエリ・ログの保持を変更してもよろしいですか? 期間を短くすると、一部のデータが失われます",
|
||||
"dns_config": "DNSサーバ設定",
|
||||
"blocking_mode": "ブロックモード",
|
||||
"default": "デフォルト",
|
||||
"nxdomain": "NXDOMAIN",
|
||||
"null_ip": "Null IP",
|
||||
"custom_ip": "カスタムIP",
|
||||
@@ -202,13 +214,16 @@
|
||||
"rate_limit_desc": "単一のクライアントに許可される1秒あたりのリクエスト数(0:無制限)",
|
||||
"blocking_ipv4_desc": "ブロックされたAリクエストに対して応答されるIPアドレス",
|
||||
"blocking_ipv6_desc": "ブロックされたAAAAリクエストに対して応答されるIPアドレス",
|
||||
"blocking_mode_desc": "<0>NXDOMAIN - NXDOMAINコードで応答;</0> <0>Null IP - ゼロのIPアドレスで応答(Aの場合は0.0.0.0; AAAAの場合は::);</0> <0>カスタムIP - 手動で設定されたIPアドレスで応答。</0>",
|
||||
"blocking_mode_default": "デフォルト:Adblockスタイルのルールによってブロックされると、NXDOMAINで応答します。 /etc/hostsスタイルのルールによってブロックされると、ルールで指定されたIPアドレスで応答します",
|
||||
"blocking_mode_nxdomain": "NXDOMAIN:NXDOMAINコードで応答します",
|
||||
"blocking_mode_null_ip": "Null IP:ゼロのIPアドレスで応答します(Aの場合は0.0.0.0; AAAAの場合は::)",
|
||||
"blocking_mode_custom_ip": "カスタムIP:手動で設定されたIPアドレスで応答します",
|
||||
"upstream_dns_client_desc": "このフィールドを未入力のままにすると、AdGuard Homeは<0>DNS設定</0>で構成されたサーバを使用します。",
|
||||
"source_label": "ソース",
|
||||
"found_in_known_domain_db": "既知のドメインデータベースに見つかりました。",
|
||||
"category_label": "カテゴリ",
|
||||
"rule_label": "ルール",
|
||||
"filter_label": "フィルタ",
|
||||
"list_label": "リスト",
|
||||
"unknown_filter": "不明なフィルタ {{filterId}}",
|
||||
"install_welcome_title": "ようこそ、AdGuard Home へ!",
|
||||
"install_welcome_desc": "AdGuard Homeは、ネットワーク全体で広告と追跡をブロックするDNSサーバです。その目的は、ネットワークとデバイスのすべてをあなたが制御できるようにすることであり、クライアント側のプログラムを使用する必要はありません。",
|
||||
@@ -332,7 +347,7 @@
|
||||
"client_updated": "クライアント \"{{key}}\" の更新に成功しました",
|
||||
"clients_not_found": "クライアント情報はありません",
|
||||
"client_confirm_delete": "クライアント \"{{key}}\" を削除してもよろしいですか?",
|
||||
"filter_confirm_delete": "フィルターを削除してもよろしいですか?",
|
||||
"list_confirm_delete": "このリストを削除してもよろしいですか?",
|
||||
"auto_clients_title": "クライアント(実行時)",
|
||||
"auto_clients_desc": "AdGuard Homeで使用しているが設定に保存されていないクライアント上のデータ",
|
||||
"access_title": "アクセス設定",
|
||||
@@ -399,6 +414,7 @@
|
||||
"domain": "ドメイン",
|
||||
"answer": "応答",
|
||||
"filter_added_successfully": "フィルタの追加に成功しました",
|
||||
"filter_updated": "フィルタの更新に成功しました",
|
||||
"statistics_configuration": "統計設定",
|
||||
"statistics_retention": "統計保持",
|
||||
"statistics_retention_desc": "期間を短くすると、一部のデータが失われます",
|
||||
@@ -427,5 +443,41 @@
|
||||
"whois": "Whois",
|
||||
"filtering_rules_learn_more": "独自のブラックリストの作成に関して<0>詳しく学習します</0>。",
|
||||
"blocked_by_response": "応答されたCNAMEかIPアドレスによるブロック",
|
||||
"try_again": "再試行する"
|
||||
"try_again": "再試行する",
|
||||
"domain_desc": "DNSリライトしたいドメイン名やワイルドカードを入力してください。",
|
||||
"example_rewrite_domain": "このドメイン名のみへのレスポンスをリライトする",
|
||||
"example_rewrite_wildcard": "<0>example.org</0>のすべてのサブドメインへのレスポンスをリライトする",
|
||||
"disable_ipv6": "IPv6を無効にする",
|
||||
"disable_ipv6_desc": "チェックすると、IPv6アドレス(タイプAAAA)のすべてのDNSクエリは破棄されます。",
|
||||
"autofix_warning_text": "\"改善\"をクリックすると、AdGuardHomeはAdGuardHome DNSサーバを使用するようにシステムを構成します。",
|
||||
"autofix_warning_list": "次のタスクを実行します:<0>システムDNSStubListenerを非アクティブ化します</0> <0>DNSサーバのアドレスを127.0.0.1に設定します</0> <0>/etc/resolv.confのシンボリックリンクの対象を/run/systemd/resolve/resolv.confに置換します</0> <0>DNSStubListenerを停止します(systemd-resolvedサービスをリロードします)</0>",
|
||||
"autofix_warning_result": "その結果、システムからのすべてのDNS要求は、デフォルトでAdGuardHomeによって処理されます。",
|
||||
"tags_title": "タグ",
|
||||
"tags_desc": "クライアントに対応するタグを選択できます。タグはフィルタリングルールに含めることができ、より正確に適用できます。 <0>詳細</0>",
|
||||
"form_select_tags": "クライアントのタグを選択する",
|
||||
"check_title": "フィルタのチェック",
|
||||
"check_desc": "ホスト名がフィルタで処理されるかをチェックします",
|
||||
"check": "チェックする",
|
||||
"form_enter_host": "ホスト名を入力してください",
|
||||
"filtered_custom_rules": "カスタム・フィルタリングルールによる処理されました",
|
||||
"host_whitelisted": "ホストはホワイトリストに登録されています",
|
||||
"check_ip": "IPアドレス: {{ip}}",
|
||||
"check_cname": "CNAME: {{cname}}",
|
||||
"check_reason": "理由: {{reason}}",
|
||||
"check_rule": "ルール: {{rule}}",
|
||||
"check_service": "サービス名: {{service}}",
|
||||
"check_not_found": "フィルタ一覧には見つかりません",
|
||||
"client_confirm_block": "クライアント\"{{ip}}\"をブロックしてもよろしいですか?",
|
||||
"client_confirm_unblock": "クライアント\"{{ip}}\"のブロックを解除してもよろしいですか?",
|
||||
"client_blocked": "クライアント\"{{ip}}\"のブロックに成功しました",
|
||||
"client_unblocked": "クライアント\"{{ip}}\"のブロックの解除に成功しました",
|
||||
"static_ip": "静的IPアドレス",
|
||||
"static_ip_desc": "AdGuard Homeはサーバであり、正しく機能させるには静的IPアドレスが必要です。そうしないと、ある時点で、ルータがこのデバイスに異なるIPアドレスを割り当てるかもしれません。",
|
||||
"set_static_ip": "静的IPアドレスを設定する",
|
||||
"install_static_ok": "良いニュースです! 既に静的IPアドレスで構成されています",
|
||||
"install_static_error": "AdGuard Homeは、このネットワークインターフェースを自動構成することはできません。手動で行う方法に関する取扱説明書を探してください。",
|
||||
"install_static_configure": "動的IPアドレスが使用されていることを検出しました— <0>{{ip}}</0>。静的アドレスとして使用しますか?",
|
||||
"confirm_static_ip": "AdGuard Homeは、{{ip}}を静的IPアドレスとして設定します。よろしいですか?",
|
||||
"list_updated": "{{count}}個のリストが更新されました",
|
||||
"list_updated_plural": "{{count}}個のリストが更新されました"
|
||||
}
|
||||
@@ -23,7 +23,9 @@
|
||||
"form_error_ip6_format": "잘못된 IPv6 형식",
|
||||
"form_error_ip_format": "잘못된 IP 형식",
|
||||
"form_error_mac_format": "잘못된 MAC 형식",
|
||||
"form_error_client_id_format": "잘못된 클라이언트 ID 형식",
|
||||
"form_error_positive": "0보다 커야 합니다",
|
||||
"form_error_negative": "반드시 0 이상이여야 합니다",
|
||||
"dhcp_form_gateway_input": "게이트웨이 IP",
|
||||
"dhcp_form_subnet_input": "서브넷 마스크",
|
||||
"dhcp_form_range_title": "IP 주소 범위",
|
||||
@@ -74,7 +76,7 @@
|
||||
"stats_adult": "차단된 성인 웹사이트",
|
||||
"stats_query_domain": "쿼리 도메인",
|
||||
"for_last_24_hours": "지난 24시간 동안",
|
||||
"for_last_days": "마지막 {{value}} 일",
|
||||
"for_last_days": "마지막 {{count}} 일",
|
||||
"for_last_days_plural": "마지막 {{count}} 일의 기록",
|
||||
"no_domains_found": "도메인이 없습니다",
|
||||
"requests_count": "요청 수",
|
||||
@@ -82,7 +84,7 @@
|
||||
"top_clients": "클라이언트",
|
||||
"no_clients_found": "클라이언트가 없습니다",
|
||||
"general_statistics": "일반 통계",
|
||||
"number_of_dns_query_days": "최근 {{value}} 일 동안 처리된 DNS 쿼리의 수",
|
||||
"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 요청수",
|
||||
@@ -103,6 +105,11 @@
|
||||
"no_servers_specified": "지정된 서버 없음",
|
||||
"general_settings": "일반 설정",
|
||||
"dns_settings": "DNS 설정",
|
||||
"dns_blocklists": "DNS 차단 목록",
|
||||
"dns_allowlists": "DNS 허용 목록",
|
||||
"dns_blocklists_desc": "AdGuard Home은 차단 목록과 일치하는 도메인을 차단합니다.",
|
||||
"dns_allowlists_desc": "DNS 허용 목록에 있는 도메인은 아무 차단 목록에 있어도 허용됩니다.",
|
||||
"custom_filtering_rules": "커스텀 필터링 규칙",
|
||||
"encryption_settings": "암호화 설정",
|
||||
"dhcp_settings": "DHCP 설정",
|
||||
"upstream_dns": "업스트림 DNS 서버",
|
||||
@@ -120,22 +127,28 @@
|
||||
"enabled_save_search_toast": "세이프서치 활성화됨",
|
||||
"enabled_table_header": "활성화됨",
|
||||
"name_table_header": "이름",
|
||||
"filter_url_table_header": "필터 주소",
|
||||
"list_url_table_header": "리스트 URL",
|
||||
"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": "필터 추가",
|
||||
"no_blocklist_added": "차단 목록이 추가되지 않음",
|
||||
"no_whitelist_added": "허용 목록이 추가되지 않음",
|
||||
"add_blocklist": "차단 목록 추가",
|
||||
"add_allowlist": "허용 목록 추가",
|
||||
"cancel_btn": "취소",
|
||||
"enter_name_hint": "이름을 입력하세요",
|
||||
"enter_url_hint": "주소를 입력하세요",
|
||||
"check_updates_btn": "업데이트 확인",
|
||||
"new_filter_btn": "새로운 필터 구독",
|
||||
"enter_valid_filter_url": "호스트 파일 또는 필터 구독에 올바른 URL 을 입력하세요.",
|
||||
"new_blocklist": "새 차단 목록",
|
||||
"new_allowlist": "새 허용 목록",
|
||||
"edit_blocklist": "차단 목록 수정",
|
||||
"edit_allowlist": "허용 목록 수정",
|
||||
"enter_valid_blocklist": "차단 목록에 유효한 URL을 입력해주세요.",
|
||||
"enter_valid_allowlist": "허용 목록에 유효한 URL을 입력해주세요.",
|
||||
"form_error_url_format": "잘못된 URL 형식",
|
||||
"custom_filter_rules": "커스텀 필터링 규칙",
|
||||
"custom_filter_rules_hint": "한 라인에 한 규칙만 입력하세요. 광고 차단 규칙과 호스트 파일 문법 중 하나를 사용할 수 있습니다",
|
||||
"examples_title": "예시",
|
||||
@@ -151,7 +164,7 @@
|
||||
"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": "모든 필터는 이미 최신입니다",
|
||||
"all_lists_up_to_date_toast": "모든 리스트가 이미 최신입니다",
|
||||
"updated_upstream_dns_toast": "업스트림 DNS 서버를 업데이트하였습니다",
|
||||
"dns_test_ok_toast": "특정 DNS 서버들은 정상적으로 동작 중입니다",
|
||||
"dns_test_not_ok_toast": "서버 \"{{key}}\": 사용할 수 없습니다, 제대로 작성했는지 확인하세요.",
|
||||
@@ -171,7 +184,6 @@
|
||||
"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": "사용자 정의 필터링 규칙에서 규칙 제거",
|
||||
@@ -187,11 +199,31 @@
|
||||
"query_log_disabled": "쿼리 로그가 비활성화되어 있으며 <0>설정</0>에서 설정할 수 있습니다",
|
||||
"query_log_strict_search": "검색을 제한하려면 쌍따옴표를 사용해주세요",
|
||||
"query_log_retention_confirm": "정말로 쿼리 로그 저장 기간을 변경하시겠습니까? 저장 주기를 낮출 경우, 일부 데이터가 손실됩니다",
|
||||
"dns_config": "DNS 서버 설정",
|
||||
"blocking_mode": "차단 모드",
|
||||
"default": "기본",
|
||||
"nxdomain": "NXDOMAIN",
|
||||
"null_ip": "빈 IP",
|
||||
"custom_ip": "사용자 지정 IP",
|
||||
"blocking_ipv4": "IPv4 차단",
|
||||
"blocking_ipv6": "IPv6 차단",
|
||||
"form_enter_rate_limit": "한도 제한 입력하기",
|
||||
"rate_limit": "한도 제한",
|
||||
"edns_enable": "EDNS 클라이언트 서브넷 활성화",
|
||||
"edns_cs_desc": "활성화되면 AdGuard Home은 클라이언트의 서브넷을 DNS 서버에 전달합니다.",
|
||||
"rate_limit_desc": "단일 클라이언트에서 허용 가능한 초 당 요청 생성 숫자 (0: 무제한)",
|
||||
"blocking_ipv4_desc": "차단된 A 요청에 대해서 반환할 IP 주소",
|
||||
"blocking_ipv6_desc": "차단된 AAAA 요청에 대해서 반환할 IP 주소",
|
||||
"blocking_mode_default": "기본: Adblock 스타일 규칙에 의해 차단되면 NXDOMAIN으로 응답합니다; /etc/hosts 스타일 규칙에 의해 차단되면 규칙에 정의된 IP 주소로 응답합니다",
|
||||
"blocking_mode_nxdomain": "NXDOMAIN: NXDOMAIN 코드로 응답",
|
||||
"blocking_mode_null_ip": "Null IP: 제로 IP 주소 (A는 0.0.0.0; AAAA는 ::) 로 응답합니다",
|
||||
"blocking_mode_custom_ip": "커스텀 IP: 직접 설정한 IP 주소로 응답합니다",
|
||||
"upstream_dns_client_desc": "이 값을 비워둔다면 AdGuard Home은 <0>DNS 설정</0>에 설정되어 있는 값을 사용합니다.",
|
||||
"source_label": "소스",
|
||||
"found_in_known_domain_db": "알려진 도메인 데이터베이스에서 발견됨.",
|
||||
"category_label": "카테고리",
|
||||
"rule_label": "규칙",
|
||||
"filter_label": "필터",
|
||||
"list_label": "목록",
|
||||
"unknown_filter": "알려지지 않은 필터 {{filterId}}",
|
||||
"install_welcome_title": "AdGuard Home에 오신 것을 환영합니다!",
|
||||
"install_welcome_desc": "AdGuard Home은 광범위한 네트워크 광고와 추적 DNS 서버를 차단 합니다. 그것의 목적은 당신이 당신의 전체 네트워크와 당신의 모든 기기를 제어하는 것이며, 그것은 클라이언트의 프로그램을 사용할 필요가 없습니다.",
|
||||
@@ -315,7 +347,7 @@
|
||||
"client_updated": "클라이언트 \"{{key}}\"가 정상적으로 업데이트되었습니다",
|
||||
"clients_not_found": "클라이언트 없음",
|
||||
"client_confirm_delete": "정말 클라이언트 \"{{key}}\" 삭제하시겠습니까?",
|
||||
"filter_confirm_delete": "정말 이 필터를 삭제하시겠습니까?",
|
||||
"list_confirm_delete": "정말로 이 목록을 제거하시겠습니까?",
|
||||
"auto_clients_title": "클라이언트 (런타임)",
|
||||
"auto_clients_desc": "AdGuard Home을 사용하지만 구성에 저장되지 않은 클라이언트의 데이터입니다.",
|
||||
"access_title": "접근 설정",
|
||||
@@ -354,6 +386,7 @@
|
||||
"rewrite_desc": "특정 도메인 이름에 대한 사용자 지정 DNS 응답을 쉽게 구성할 수 있습니다.",
|
||||
"rewrite_applied": "적용된 변경 규칙",
|
||||
"dns_rewrites": "DNS 변경",
|
||||
"form_domain": "도메인 이름 또는 와일드카드를 입력합니다",
|
||||
"form_answer": "IP 주소 또는 도메인 이름을 입력하세요",
|
||||
"form_error_domain_format": "도메인 형식이 잘못되었습니다",
|
||||
"form_error_answer_format": "답변 형식이 잘못되었습니다. ",
|
||||
@@ -376,11 +409,12 @@
|
||||
"stats_params": "통계 구성",
|
||||
"config_successfully_saved": "설정이 성공적으로 저장되었습니다.",
|
||||
"interval_24_hour": "24시간",
|
||||
"interval_days": "{{value}} 일",
|
||||
"interval_days": "{{count}} 일",
|
||||
"interval_days_plural": "{{count}} 일",
|
||||
"domain": "도메인",
|
||||
"answer": "응답",
|
||||
"filter_added_successfully": "필터가 성공적으로 추가되었습니다.",
|
||||
"filter_added_successfully": "목록이 성공적으로 추가됨",
|
||||
"filter_updated": "필터가 성공적으로 업데이트됨",
|
||||
"statistics_configuration": "통계 구성",
|
||||
"statistics_retention": "통계 저장 기간",
|
||||
"statistics_retention_desc": "값을 줄이면 설정한 값보다 오래된 데이터가 소멸됩니다.",
|
||||
@@ -408,5 +442,42 @@
|
||||
"descr": "설명",
|
||||
"whois": "후이즈",
|
||||
"filtering_rules_learn_more": "차단 리스트를 직접 호스트하는 법을 <0>알아보세요</0>.",
|
||||
"blocked_by_response": "응답 중 차단된 CNAME 또는 IP"
|
||||
"blocked_by_response": "응답 중 차단된 CNAME 또는 IP",
|
||||
"try_again": "다시 시도해주세요",
|
||||
"domain_desc": "다시 작성할 도메인 이름 또는 와일드카드를 입력합니다.",
|
||||
"example_rewrite_domain": "이 도메인 이름에 대한 응답을 변경합니다.",
|
||||
"example_rewrite_wildcard": "모든 서브 도메인에 대한 <0>example.org</0> 응답을 변경합니다",
|
||||
"disable_ipv6": "IPv6 비활성화",
|
||||
"disable_ipv6_desc": "이 기능이 활성화되면 IPv6 (타입 AAAA) 의 모든 DNS 쿼리가 드랍됩니다.",
|
||||
"autofix_warning_text": "\"Fix\"를 클릭한다면 AdGuard Home은 시스템이 AdGuard Home의 DNS 서버를 사용하도록 설정합니다.",
|
||||
"autofix_warning_list": "다음 작업을 진행합니다: <0>DNSStubListener 시스템 비활성화</0> <0>DNS 서버 주소를 127.0.0.1로 설정</0> <0>/etc/resolv.conf의 심볼릭 링크 타겟을 /run/systemd/resolve/resolv.conf로 변경</0> <0>DNSStubListener 중지 (systemd-resolved 서비스 새로고침)</0>",
|
||||
"autofix_warning_result": "결과적으로 시스템의 모든 DNS 요청은 기본적으로 AdGuard Home에 의해 처리됩니다.",
|
||||
"tags_title": "태그",
|
||||
"tags_desc": "클라이언트에 해당하는 태그를 선택할 수 있습니다. 필터링 규칙에 태그를 포함시키면 더 정확하게 적용시킬 수 있습니다. <0>자세히 알아보기</0>",
|
||||
"form_select_tags": "클라이언트 태그 선택",
|
||||
"check_title": "필터링 확인",
|
||||
"check_desc": "호스트 이름이 필터링되는지 확인",
|
||||
"check": "확인",
|
||||
"form_enter_host": "호스트 이름을 입력해주세요",
|
||||
"filtered_custom_rules": "사용자 정의 필터링 규칙으로 필터링됨",
|
||||
"host_whitelisted": "예외 목록에 있는 호스트",
|
||||
"check_ip": "IP 주소: {{ip}}",
|
||||
"check_cname": "CNAME: {{cname}}",
|
||||
"check_reason": "이유: {{reason}}",
|
||||
"check_rule": "규칙: {{rule}}",
|
||||
"check_service": "서비스 이름: {{service}}",
|
||||
"check_not_found": "필터 목록에서 찾을 수 없음",
|
||||
"client_confirm_block": "정말로 클라이언트 \"{{ip}}\"을(를) 차단하시겠습니까?",
|
||||
"client_confirm_unblock": "정말로 클라이언트 \"{{ip}}\"의 차단을 해제하시겠습니까?",
|
||||
"client_blocked": "클라이언트 \"{{ip}}\"(이)가 성공적으로 차단되었습니다",
|
||||
"client_unblocked": "클라이언트 \"{{ip}}\"의 차단을 성공적으로 해제했습니다",
|
||||
"static_ip": "고정 IP 주소",
|
||||
"static_ip_desc": "AdGuard Home는 서버라서 정상적으로 작동하려면 고정 IP 주소가 필요합니다. 그렇지 않다면 라우터가 언젠가 이 기기에 다른 IP 주소를 할당할 수도 있습니다.",
|
||||
"set_static_ip": "고정 IP 주소 설정",
|
||||
"install_static_ok": "좋은 소식입니다! 고정 IP 주소가 이미 설정되어있네요",
|
||||
"install_static_error": "AdGuard Home는 이 네트워크 인터페이스에서 자동 설정할 수 없습니다. 여기에서 어떻게 이걸 수동으로 할 수 있는지 확인해주세요.",
|
||||
"install_static_configure": "동적 IP 주소를 사용하는 것을 감지했습니다 — <0>{{ip}}</0>. 정말로 이걸 고정 IP로 사용하시겠습니까?",
|
||||
"confirm_static_ip": "AdGuard Home이 {{ip}}를 고정 IP 주소로 설정하려고 합니다. 계속하시겠습니까?",
|
||||
"list_updated": "{{count}} 리스트 업데이트됨",
|
||||
"list_updated_plural": "{{count}} 리스트 업데이트됨"
|
||||
}
|
||||
@@ -23,6 +23,7 @@
|
||||
"form_error_ip6_format": "Ongeldig IPv6 formaat",
|
||||
"form_error_ip_format": "Ongeldig IPv4 formaat",
|
||||
"form_error_mac_format": "Ongeldig MAC formaat.",
|
||||
"form_error_client_id_format": "Opmaak cliënt-ID is ongeldig",
|
||||
"form_error_positive": "Moet groter zijn dan 0",
|
||||
"dhcp_form_gateway_input": "Gateway IP",
|
||||
"dhcp_form_subnet_input": "Subnet mask",
|
||||
@@ -103,6 +104,11 @@
|
||||
"no_servers_specified": "Geen servers gespecificeerd",
|
||||
"general_settings": "Generieke instellingen",
|
||||
"dns_settings": "DNS Instellingen",
|
||||
"dns_blocklists": "DNS blokkeerlijsten",
|
||||
"dns_allowlists": "DNS toestemmingslijsten",
|
||||
"dns_blocklists_desc": "AdGuard Home zal domeinen blokkeren die voorkomen in de blokkeerlijsten.",
|
||||
"dns_allowlists_desc": "Domeinen in de DNS toestemmingslijsten worden toegestaan zelfs al komen ze voor in de blokkeerlijsten.",
|
||||
"custom_filtering_rules": "Aangepaste filter regels",
|
||||
"encryption_settings": "Encryptie Instellingen",
|
||||
"dhcp_settings": "DHCP Instellingen",
|
||||
"upstream_dns": "Upstream DNS servers",
|
||||
@@ -120,22 +126,28 @@
|
||||
"enabled_save_search_toast": "Veilig zoeken ingeschakeld",
|
||||
"enabled_table_header": "Ingeschakeld",
|
||||
"name_table_header": "Naam",
|
||||
"filter_url_table_header": "Filter URL",
|
||||
"list_url_table_header": "URL lijst",
|
||||
"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",
|
||||
"no_blocklist_added": "Geen blokkeerlijsten toegevoegd",
|
||||
"no_whitelist_added": "Geen toestemmingslijsten toegevoegd",
|
||||
"add_blocklist": "Blokkeerlijst toevoegen",
|
||||
"add_allowlist": "Toestemmingslijst 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.",
|
||||
"new_blocklist": "Nieuwe blokkeerlijst",
|
||||
"new_allowlist": "Nieuwe toestemmingslijst",
|
||||
"edit_blocklist": "Blokkeerlijst beheren",
|
||||
"edit_allowlist": "Toestemmingslijst beheren",
|
||||
"enter_valid_blocklist": "Voer een geldige URL in voor de blokkeerlijst.",
|
||||
"enter_valid_allowlist": "Voer een geldige URL in voor de toestemmingslijst.",
|
||||
"form_error_url_format": "Ongeldig URL formaat",
|
||||
"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",
|
||||
@@ -151,7 +163,7 @@
|
||||
"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",
|
||||
"all_lists_up_to_date_toast": "Alle lijsten zijn reeds 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",
|
||||
@@ -171,7 +183,6 @@
|
||||
"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",
|
||||
@@ -192,7 +203,7 @@
|
||||
"found_in_known_domain_db": "Gevonden in de bekende domeingegevensbank.",
|
||||
"category_label": "Categorie",
|
||||
"rule_label": "Regel",
|
||||
"filter_label": "Filter",
|
||||
"list_label": "Lijst",
|
||||
"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.",
|
||||
@@ -304,7 +315,7 @@
|
||||
"client_edit": "Wijzig gebruiker",
|
||||
"client_identifier": "Identificeer via",
|
||||
"ip_address": "IP adres",
|
||||
"client_identifier_desc": "Gebruikers kunnen worden geïdentificeerd door het IP-adres of MAC-adres. Houd er rekening mee dat het gebruik van MAC als ID alleen mogelijk is als AdGuard Home ook een <0> DHCP-server </0> is",
|
||||
"client_identifier_desc": "Gebruikers kunnen worden geïdentificeerd door het IP-adres, CIDR of MAC-adres. Hou er rekening mee dat het gebruik van MAC als ID alleen mogelijk is als AdGuard Home ook een <0>DHCP-server</0> is",
|
||||
"form_enter_ip": "Vul IP in",
|
||||
"form_enter_mac": "Vul MAC in",
|
||||
"form_enter_id": "ID invoeren",
|
||||
@@ -316,7 +327,7 @@
|
||||
"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?",
|
||||
"list_confirm_delete": "Ben je zeker om deze lijst te verwijderen?",
|
||||
"auto_clients_title": "Gebruikers (runtime)",
|
||||
"auto_clients_desc": "Data over gebruikers die AdGuard Home gebruiken, maar niet geconfigureerd zijn",
|
||||
"access_title": "Toegangs instellingen",
|
||||
@@ -355,6 +366,7 @@
|
||||
"rewrite_desc": "Hiermee kunt u eenvoudig aangepaste DNS-antwoorden configureren voor een specifieke domeinnaam.",
|
||||
"rewrite_applied": "Toegepaste herschrijf regel",
|
||||
"dns_rewrites": "DNS herschrijvingen",
|
||||
"form_domain": "Vul domein of wildcard in",
|
||||
"form_answer": "Vul IP adres of domeinnaam in",
|
||||
"form_error_domain_format": "Ongeldige domeinnaam",
|
||||
"form_error_answer_format": "Ongeldig antwoord",
|
||||
@@ -381,7 +393,8 @@
|
||||
"interval_days_plural": "{{count}} dagen",
|
||||
"domain": "Domein",
|
||||
"answer": "Antwoord",
|
||||
"filter_added_successfully": "Het filter is succesvol toegevoegd",
|
||||
"filter_added_successfully": "De lijst is succesvol toegevoegd",
|
||||
"filter_updated": "De lijst is succesvol geüpdatet",
|
||||
"statistics_configuration": "Statistieken configuratie",
|
||||
"statistics_retention": "Statistieken retentie",
|
||||
"statistics_retention_desc": "Als je de interval waarde vermindert, zullen sommige gegevens verloren gaan",
|
||||
@@ -410,5 +423,19 @@
|
||||
"whois": "Whois",
|
||||
"filtering_rules_learn_more": "<0>Meer informatie</0> over het maken van uw eigen hosts-blocklists.",
|
||||
"blocked_by_response": "Geblokkeerd door CNAME of IP als antwoord",
|
||||
"try_again": "Probeer opnieuw"
|
||||
"try_again": "Probeer opnieuw",
|
||||
"domain_desc": "Voer de domeinnaam of wildcard in die herschreven moet worden.",
|
||||
"example_rewrite_domain": "herschrijf reacties uitsluitend voor deze domeinnaam.",
|
||||
"example_rewrite_wildcard": "herschrijf reacties voor alle subdomeinen van <0>example.org</0>.",
|
||||
"tags_title": "Labels",
|
||||
"check": "Controleren",
|
||||
"form_enter_host": "Voer een hostnaam in",
|
||||
"host_whitelisted": "De host staat op de toestemmingslijst",
|
||||
"check_ip": "IP-adressen: {{ip}}",
|
||||
"check_cname": "CNAME: {{cname}}",
|
||||
"check_reason": "Reden: {{reason}}",
|
||||
"check_rule": "Regel: {{rule}}",
|
||||
"check_service": "Servicenaam: {{service}}",
|
||||
"list_updated": "{{count}} lijst geüpdatet",
|
||||
"list_updated_plural": "{{count}} lijsten geüpdatet"
|
||||
}
|
||||
@@ -17,12 +17,15 @@
|
||||
"dhcp_leases": "DHCP-leieavtaler",
|
||||
"dhcp_static_leases": "Statiske DHCP-leieavtaler",
|
||||
"dhcp_leases_not_found": "Ingen DHCP-leieavtaler ble funnet",
|
||||
"dhcp_config_saved": "Lagret DHCP-tjeneroppsettet",
|
||||
"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_client_id_format": "Ugyldig ID-klientformat",
|
||||
"form_error_positive": "Må være høyere enn 0",
|
||||
"form_error_negative": "Må være ≥0",
|
||||
"dhcp_form_gateway_input": "Gateway-IP",
|
||||
"dhcp_form_subnet_input": "Nettverksmaske",
|
||||
"dhcp_form_range_title": "Spennvidden til IP-adressene",
|
||||
@@ -44,6 +47,7 @@
|
||||
"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",
|
||||
"dhcp_reset": "Er du sikker på at du vil tilbakestille DHCP-oppsettet?",
|
||||
"delete_confirm": "Er du sikker på at du vil slette «{{key}}»?",
|
||||
"form_enter_hostname": "Skriv inn vertsnavnet",
|
||||
"error_details": "Feildetaljer",
|
||||
@@ -101,10 +105,17 @@
|
||||
"no_servers_specified": "Ingen tjenere er spesifisert",
|
||||
"general_settings": "Generelle innstillinger",
|
||||
"dns_settings": "DNS-innstillinger",
|
||||
"dns_blocklists": "DNS-blokkeringslister",
|
||||
"dns_allowlists": "DNS-hvitelister",
|
||||
"dns_blocklists_desc": "AdGuard Home vil blokkere domener som samsvarer med blokkeringslistene.",
|
||||
"dns_allowlists_desc": "Domener fra DNS-hvitelistene vil bli sluppet gjennom, selv hvis de er i noen av blokkeringslistene.",
|
||||
"custom_filtering_rules": "Selvvalgte filtreringsoppføringer",
|
||||
"encryption_settings": "Krypteringsinnstillinger",
|
||||
"dhcp_settings": "DHCP-innstillinger",
|
||||
"upstream_dns": "Oppstrøms-DNS-tjenere",
|
||||
"upstream_dns_hint": "Hvis du lar dette feltet stå tomt, vil AdGuard Home will bruke <a href='https://1.1.1.1/' target='_blank'>Cloudflare DNS</a> som en oppstrømstjener.",
|
||||
"test_upstream_btn": "Test oppstrømstilkoblinger",
|
||||
"upstreams": "Oppstrømstjenere",
|
||||
"apply_btn": "Benytt",
|
||||
"disabled_filtering_toast": "Skrudde av filtrering",
|
||||
"enabled_filtering_toast": "Skrudde på filtrering",
|
||||
@@ -116,22 +127,28 @@
|
||||
"enabled_save_search_toast": "Skrudde på barnevennlige søk",
|
||||
"enabled_table_header": "Skrudd på",
|
||||
"name_table_header": "Navn",
|
||||
"filter_url_table_header": "Filterets URL",
|
||||
"list_url_table_header": "Listens nettadresse",
|
||||
"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",
|
||||
"no_blocklist_added": "Ingen blokkeringslister er lagt til",
|
||||
"no_whitelist_added": "Ingen hvitelister er lagt til",
|
||||
"add_blocklist": "Legg til blokkeringsliste",
|
||||
"add_allowlist": "Legg til hviteliste",
|
||||
"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.",
|
||||
"new_blocklist": "Ny blokkeringsliste",
|
||||
"new_allowlist": "Ny hviteliste",
|
||||
"edit_blocklist": "Rediger blokkeringsliste",
|
||||
"edit_allowlist": "Rediger hviteliste",
|
||||
"enter_valid_blocklist": "Skriv inn en gyldig nettadresse til blokkeringslisten.",
|
||||
"enter_valid_allowlist": "Skriv inn en gyldig nettadresse til hvitelisten.",
|
||||
"form_error_url_format": "Ugyldig URL-format",
|
||||
"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",
|
||||
@@ -147,7 +164,7 @@
|
||||
"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",
|
||||
"all_lists_up_to_date_toast": "Alle listene er allerede 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",
|
||||
@@ -167,7 +184,6 @@
|
||||
"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",
|
||||
@@ -183,11 +199,31 @@
|
||||
"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",
|
||||
"dns_config": "DNS-tjeneroppsett",
|
||||
"blocking_mode": "Blokkeringsmodus",
|
||||
"default": "Standardmodus",
|
||||
"nxdomain": "NXDOMAIN",
|
||||
"null_ip": "Null-IP",
|
||||
"custom_ip": "Tilpasset IP",
|
||||
"blocking_ipv4": "IPv4-blokkering",
|
||||
"blocking_ipv6": "IPv6-blokkering",
|
||||
"form_enter_rate_limit": "Skriv inn forespørselsfrekvensgrense",
|
||||
"rate_limit": "Forespørselsfrekvensgrense",
|
||||
"edns_enable": "Aktiver EDNS-klientundernett",
|
||||
"edns_cs_desc": "Hvis det er skrudd på, vil AdGuard Home sende klientenes undernett til DNS-tjenerne.",
|
||||
"rate_limit_desc": "Antallet forespørsler per sekund som én enkelt klient har lov til å be om (0: ubegrenset)",
|
||||
"blocking_ipv4_desc": "IP-adressen som det skal svares med for blokkerte A-forespørsler",
|
||||
"blocking_ipv6_desc": "IP-adressen som det skal svares med for blokkerte AAAA-forespørsler",
|
||||
"blocking_mode_default": "Standardmodus: Svar med NXDOMAIN når det blokkeres med en adblockoppføring; svar med IP-adressen spesifisert i oppføringen når det blokkeres av en «Hosts»-oppføring",
|
||||
"blocking_mode_nxdomain": "NXDOMAIN: Svar med NXDOMAIN-koden",
|
||||
"blocking_mode_null_ip": "Null IP: Svar med en 0-IP-adresse (0.0.0.0 for A; :: for AAAA)",
|
||||
"blocking_mode_custom_ip": "Tilpasset IP: Svar med en manuelt valgt IP-adresse",
|
||||
"upstream_dns_client_desc": "Hvis dette feltet holdes tomt, vil AdGuard Home bruke tjenerne som er satt opp i <0>DNS-innstillingene</0>.",
|
||||
"source_label": "Kilde",
|
||||
"found_in_known_domain_db": "Funnet i databasen over kjente domener.",
|
||||
"category_label": "Kategori",
|
||||
"rule_label": "Oppføring",
|
||||
"filter_label": "Filter",
|
||||
"list_label": "Liste",
|
||||
"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.",
|
||||
@@ -279,6 +315,8 @@
|
||||
"update_announcement": "AdGuard Home {{version}} er nå tilgjengelig! <0>Klikk her</0> for mere informasjon.",
|
||||
"setup_guide": "Oppsettsveiledning",
|
||||
"dns_addresses": "DNS-adresser",
|
||||
"dns_start": "DNS-tjeneren starter opp",
|
||||
"dns_status_error": "Feil ved sjekk av DNS-tjenerstatusen",
|
||||
"down": "Nedstrøm",
|
||||
"fix": "Fiks",
|
||||
"dns_providers": "Her er en <0>liste over kjente DNS-leverandører</0> som du kan velge blant.",
|
||||
@@ -297,8 +335,11 @@
|
||||
"client_edit": "Rediger klienten",
|
||||
"client_identifier": "Identifikator",
|
||||
"ip_address": "IP-adresse",
|
||||
"client_identifier_desc": "Klienter kan bli identifisert gjennom IP-adressen eller MAC-adressen. Vennligst bemerk at å bruke MAC som en identifikator, bare er mulig dersom AdGuard Home også er en <0>DHCP-tjener</0>",
|
||||
"form_enter_ip": "Skriv inn IP",
|
||||
"form_enter_mac": "Skriv inn MAC",
|
||||
"form_enter_id": "Skriv inn identifikator",
|
||||
"form_add_id": "Legg til identifikator",
|
||||
"form_client_name": "Skriv inn klientnavnet",
|
||||
"client_global_settings": "Bruk de overbestyrte innstillingene",
|
||||
"client_deleted": "Klienten «{{key}}» ble vellykket slettet",
|
||||
@@ -306,7 +347,7 @@
|
||||
"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?",
|
||||
"list_confirm_delete": "Er du sikker på at du vil slette denne listen?",
|
||||
"auto_clients_title": "Klienter (kjørende)",
|
||||
"auto_clients_desc": "Loggføring over klientene som bruker AdGuard Home, men som ikke har blitt lagret i oppsettet",
|
||||
"access_title": "Tilgangsinnstillinger",
|
||||
@@ -345,6 +386,7 @@
|
||||
"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",
|
||||
@@ -372,6 +414,7 @@
|
||||
"domain": "Domene",
|
||||
"answer": "Svar",
|
||||
"filter_added_successfully": "Filteret har blitt vellykket lagt til",
|
||||
"filter_updated": "Listen ble vellykket oppdatert",
|
||||
"statistics_configuration": "Statistikk-oppsett",
|
||||
"statistics_retention": "Statistikkbeholding",
|
||||
"statistics_retention_desc": "Hvis du reduserer intervallverdien, vil noen av dataene gå tapt",
|
||||
@@ -398,5 +441,43 @@
|
||||
"netname": "Nettverksnavn",
|
||||
"descr": "Beskrivelse",
|
||||
"whois": "Whois",
|
||||
"filtering_rules_learn_more": "<0>Lær mer</0> om å lage dine egne filterlister for AdGuard Home."
|
||||
"filtering_rules_learn_more": "<0>Lær mer</0> om å lage dine egne filterlister for AdGuard Home.",
|
||||
"blocked_by_response": "Blokkert av responsens CNAME eller IP",
|
||||
"try_again": "Prøv på nytt",
|
||||
"domain_desc": "Skriv inn domenenavnet eller jokertegnet som du vil skal skrives om.",
|
||||
"example_rewrite_domain": "omskriv svarene til kun dette domenenavnet.",
|
||||
"example_rewrite_wildcard": "omskriv svarene til alle <0>example.org</0>-underdomener.",
|
||||
"disable_ipv6": "Skru av IPv6",
|
||||
"disable_ipv6_desc": "Hvis dette er skrudd på, vil alle DNS-forespørslene til IPv6-adresser (AAAA-type) bli droppet.",
|
||||
"autofix_warning_text": "Hvis du klikker på «Fiks», vil AdGuard Home sette opp systemet ditt til å bruke 'AdGuard Home'-DNS-tjeneren.",
|
||||
"autofix_warning_list": "Den vil utføre disse handlingene: <0>Skru av systemets DNSStubListener</0> <0>Sette DNS-tjeneradressen til 127.0.0.1</0> <0>Bytte ut det symbolske lenkemålet til /etc/resolv.conf med /run/systemd/resolve/resolv.conf</0> <0>Stoppe DNSStubListener (gjeninnlast 'systemd-resolved'-tjenesten)</0>",
|
||||
"autofix_warning_result": "Som følge av det vil alle DNS-forespørsler fra systemet ditt bli behandlet av AdGuard Home som standard.",
|
||||
"tags_title": "Stempler",
|
||||
"tags_desc": "Du kan velge stemplene som passer til klienten. Stempler kan bli inkludert i filtreringsoppføringene, og lar deg benytte dem mer nøyaktig. <0>Lær mer</0>",
|
||||
"form_select_tags": "Velg klientstempler",
|
||||
"check_title": "Sjekk filtreringen",
|
||||
"check_desc": "Sjekk om domenenavnet er filtrert",
|
||||
"check": "Sjekk",
|
||||
"form_enter_host": "Legg til et domenenavn",
|
||||
"filtered_custom_rules": "Filtrert av Selvvalgte filtreringsoppføringer",
|
||||
"host_whitelisted": "Domenet er hvitelistet",
|
||||
"check_ip": "IP-adresser: {{ip}}",
|
||||
"check_cname": "CNAME: {{cname}}",
|
||||
"check_reason": "Årsak: {{reason}}",
|
||||
"check_rule": "Oppføring: {{rule}}",
|
||||
"check_service": "Tjenestenavn: {{service}}",
|
||||
"check_not_found": "Ikke funnet i filterlistene dine",
|
||||
"client_confirm_block": "Er du sikker på at du vil blokkere klienten «{{ip}}»?",
|
||||
"client_confirm_unblock": "Er du sikker på at du vil oppheve blokkeringen av klienten «{{ip}}»?",
|
||||
"client_blocked": "Klienten «{{ip}}» ble vellykket blokkert",
|
||||
"client_unblocked": "Opphevingen av blokkeringen av klienten «{{ip}}» var vellykket",
|
||||
"static_ip": "Statisk IP-adresse",
|
||||
"static_ip_desc": "AdGuard Home er en tjener, så den trenger en statisk IP-adresse for å fungere ordentlig. Hvis ikke, kan ruteren din en dag kan tilegne en annen IP-adresse til denne enheten.",
|
||||
"set_static_ip": "Velg en statisk IP-adresse",
|
||||
"install_static_ok": "Gode nyheter! Den statiske IP-adressen er allerede satt opp",
|
||||
"install_static_error": "AdGuard Home kan ikke sette opp automatisk i dette nettverksgrensesnitt. Vennligst let opp anvisningen for hvordan man gjør det manuellt.",
|
||||
"install_static_configure": "Vi har oppdaget at det brukes en dynamisk IP-adresse — <0>{{ip}}</0>. Vil du bruke det som din statiske adresse?",
|
||||
"confirm_static_ip": "AdGuard Home vil sette opp {{ip}} til å bli din statiske IP-adresse. Vil du fortsette?",
|
||||
"list_updated": "{{count}} liste oppdatert",
|
||||
"list_updated_plural": "{{count}} lister oppdatert"
|
||||
}
|
||||
@@ -17,9 +17,15 @@
|
||||
"dhcp_leases": "Dzierżawa DHCP",
|
||||
"dhcp_static_leases": "Dzierżawy statyczne DHCP",
|
||||
"dhcp_leases_not_found": "Nie znaleziono dzierżaw DHCP",
|
||||
"dhcp_config_saved": "Konfiguracja DHCP pomyślnie zapisana",
|
||||
"form_error_required": "Pole wymagane",
|
||||
"form_error_ip4_format": "Nieprawidłowy format IPv4",
|
||||
"form_error_ip6_format": "Nieprawidłowy format IPv6",
|
||||
"form_error_ip_format": "Nieprawidłowy format IP",
|
||||
"form_error_mac_format": "Nieprawidłowy format MAC",
|
||||
"form_error_client_id_format": "Nieprawidłowy format identyfikatora klienta",
|
||||
"form_error_positive": "Musi być większa niż 0",
|
||||
"form_error_negative": "Musi być równy 0 lub większy",
|
||||
"dhcp_form_gateway_input": "Adres IP bramy",
|
||||
"dhcp_form_subnet_input": "Maska podsieci",
|
||||
"dhcp_form_range_title": "Zakres adresów IP",
|
||||
@@ -41,6 +47,7 @@
|
||||
"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ą",
|
||||
"dhcp_reset": "Czy na pewno chcesz zresetować konfigurację DHCP?",
|
||||
"delete_confirm": "Czy na pewno chcesz usunąć \"{{key}}\"?",
|
||||
"form_enter_hostname": "Wpisz nazwę hosta",
|
||||
"error_details": "Szczegóły błędu",
|
||||
@@ -69,7 +76,7 @@
|
||||
"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": "z ostatnich {{count}} dni",
|
||||
"for_last_days_plural": "z ostatnich {{count}} dni",
|
||||
"no_domains_found": "Nie znaleziono domen",
|
||||
"requests_count": "Licznik żądań",
|
||||
@@ -77,7 +84,7 @@
|
||||
"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": "Liczba przetworzonych zapytań DNS w ciągu ostatnich {{count}} dni",
|
||||
"number_of_dns_query_days_plural": "Liczba przetworzonych zapytań DNS w ciągu ostatnich {{count}} dni",
|
||||
"number_of_dns_query_24_hours": "Liczba zapytań DNS przetworzonych w ciągu ostatnich 24 godzin",
|
||||
"number_of_dns_query_blocked_24_hours": "Liczba żądań DNS zablokowanych przez filtry blokowania reklam i listy bloków hosta",
|
||||
@@ -94,13 +101,21 @@
|
||||
"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",
|
||||
"enforce_save_search_hint": "AdGuard Home może wymusić bezpieczne wyszukiwanie w następujących wyszukiwarkach: Google, Youtube, Bing, DuckDuckGo, Yandex, Pixabay.",
|
||||
"no_servers_specified": "Nie określono serwerów",
|
||||
"general_settings": "Ustawienia główne",
|
||||
"dns_settings": "Ustawienia DNS",
|
||||
"dns_blocklists": "Lista zablokowanych DNS",
|
||||
"dns_allowlists": "Lista dozwolonych DNS",
|
||||
"dns_blocklists_desc": "AdGuard Home zablokuje domeny pasujące do listy zablokowanych.",
|
||||
"dns_allowlists_desc": "Domeny z białej listy DNS będą dozwolone, nawet jeśli znajdują się na jednej z zablokowanych list.",
|
||||
"custom_filtering_rules": "Niestandardowe reguły filtrowania",
|
||||
"encryption_settings": "Ustawienia szyfrowania",
|
||||
"dhcp_settings": "Ustawienia DHCP",
|
||||
"upstream_dns": "Serwery DNS z wyższego poziomu",
|
||||
"upstream_dns_hint": "Jeśli to pole pozostanie puste, AdGuard Home użyje <a href='https://www.quad9.net/' target='_blank'>Quad9</a> jako upstream.",
|
||||
"test_upstream_btn": "Test upstreamów",
|
||||
"upstreams": "Upstreams",
|
||||
"apply_btn": "Zastosuj",
|
||||
"disabled_filtering_toast": "Wyłączone filtrowanie",
|
||||
"enabled_filtering_toast": "Włączone filtrowanie",
|
||||
@@ -112,22 +127,28 @@
|
||||
"enabled_save_search_toast": "Włączone bezpieczne wyszukiwanie",
|
||||
"enabled_table_header": "Włączone",
|
||||
"name_table_header": "Nazwa",
|
||||
"filter_url_table_header": "Filtruj adres URL",
|
||||
"list_url_table_header": "Adres URL listy",
|
||||
"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",
|
||||
"no_blocklist_added": "Nie dodano listy zablokowanych",
|
||||
"no_whitelist_added": "Nie dodano listy dozwolonych",
|
||||
"add_blocklist": "Dodaj listę zablokowanych",
|
||||
"add_allowlist": "Dodaj listę dozwolonych",
|
||||
"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.",
|
||||
"new_blocklist": "Nowa lista zablokowanych",
|
||||
"new_allowlist": "Nowa lista dozwolonych",
|
||||
"edit_blocklist": "Edytuj listę zablokowanych",
|
||||
"edit_allowlist": "Edytuj listę dozwolonych",
|
||||
"enter_valid_blocklist": "Wprowadź prawidłowy adres URL do listy zablokowanych.",
|
||||
"enter_valid_allowlist": "Wprowadź prawidłowy adres URL do listy dozwolonych.",
|
||||
"form_error_url_format": "Nieprawidłowy format Url",
|
||||
"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",
|
||||
@@ -137,12 +158,13 @@
|
||||
"example_comment": "! Tutaj idzie komentarz",
|
||||
"example_comment_meaning": "komentarz",
|
||||
"example_comment_hash": "# Również komentarz",
|
||||
"example_regex_meaning": "blokuj dostęp do domen pasujących do określonego wyrażenia regularnego",
|
||||
"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",
|
||||
"all_lists_up_to_date_toast": "Wszystkie listy 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",
|
||||
@@ -162,18 +184,46 @@
|
||||
"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}}",
|
||||
"query_log_confirm_clear": "Czy na pewno chcesz wyczyścić cały dziennik zapytań?",
|
||||
"query_log_cleared": "Dziennik zapytań został pomyślnie wyczyszczony",
|
||||
"query_log_clear": "Wyczyść dzienniki zapytań",
|
||||
"query_log_retention": "Przechowywanie dzienników zapytań",
|
||||
"query_log_enable": "Włącz dziennik",
|
||||
"query_log_configuration": "Konfiguracja dzienników",
|
||||
"query_log_disabled": "Dziennik zapytań jest wyłączony i można go skonfigurować w <0>ustawieniach</0>",
|
||||
"query_log_strict_search": "Używaj podwójnych cudzysłowów do ścisłego wyszukiwania",
|
||||
"query_log_retention_confirm": "Czy na pewno chcesz zmienić sposób przechowywania dziennika zapytań? Jeśli zmniejszysz wartość interwału, niektóre dane zostaną utracone",
|
||||
"dns_config": "Konfiguracja serwera DNS",
|
||||
"blocking_mode": "Tryb blokowania",
|
||||
"default": "Domyślny",
|
||||
"nxdomain": "NXDOMAIN",
|
||||
"null_ip": "Null IP",
|
||||
"custom_ip": "Niestandardowe IP",
|
||||
"blocking_ipv4": "Blokowanie IPv4",
|
||||
"blocking_ipv6": "Blokowanie IPv6",
|
||||
"form_enter_rate_limit": "Wprowadź limit ilościowy",
|
||||
"rate_limit": "Limit ilościowy",
|
||||
"edns_enable": "Włącz podsieć klienta EDNS",
|
||||
"edns_cs_desc": "Po włączeniu AdGuard Home będzie wysyłał podsieci klientów na serwery DNS.",
|
||||
"rate_limit_desc": "Liczba żądań na sekundę, które może wykonać pojedynczy klient (0: nieograniczona)",
|
||||
"blocking_ipv4_desc": "Adres IP, który ma zostać zwrócony w przypadku zablokowanego żądania A",
|
||||
"blocking_ipv6_desc": "Adres IP, który ma zostać zwrócony w przypadku zablokowanego żądania AAAA",
|
||||
"blocking_mode_default": "Domyślny: odpowiedz z NXDOMAIN, gdy zostanie zablokowany przez regułę w stylu Adblock; odpowiedz na adres IP określony w regule, gdy zostanie zablokowany przez regułę w stylu /etc/hosts",
|
||||
"blocking_mode_nxdomain": "NXDOMAIN: Odpowiedz kodem NXDOMAIN",
|
||||
"blocking_mode_null_ip": "Null IP: Odpowiedz z zerowym adresem IP (0.0.0.0 dla A; :: dla AAAA)",
|
||||
"blocking_mode_custom_ip": "Niestandardowy adres IP: Odpowiedz ręcznie ustawionym adresem IP",
|
||||
"upstream_dns_client_desc": "Jeśli to pole pozostanie puste, AdGuard Home użyje serwerów skonfigurowanych w <0>Ustawieniach DNS</0>.",
|
||||
"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",
|
||||
"list_label": "Lista",
|
||||
"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.",
|
||||
@@ -186,6 +236,7 @@
|
||||
"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_desc": "Zalecamy skonfigurowanie strony AdGuard Home Admin, aby zweryfikować swoją tożsamość za pomocą hasła. Chociaż jest dostępny tylko w sieci lokalnej, nadal ważne jest, aby chronić go przed nieograniczonym dostępem.",
|
||||
"install_auth_username": "Nazwa użytkownika",
|
||||
"install_auth_password": "Hasło",
|
||||
"install_auth_confirm": "Potwierdź hasło",
|
||||
@@ -264,6 +315,8 @@
|
||||
"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",
|
||||
"dns_start": "Serwer DNS uruchamia się",
|
||||
"dns_status_error": "Błąd uzyskania statusu serwera DNS",
|
||||
"down": "Utrata połączenia",
|
||||
"fix": "Napraw",
|
||||
"dns_providers": "Oto lista <0>znanych dostawców DNS</0> do wyboru.",
|
||||
@@ -282,8 +335,11 @@
|
||||
"client_edit": "Edytuj klienta",
|
||||
"client_identifier": "Identyfikator",
|
||||
"ip_address": "Adres IP",
|
||||
"client_identifier_desc": "Klienci mogą być identyfikowani na podstawie adresu IP, CIDR, adresu MAC. Pamiętaj, że użycie MAC jako identyfikatora jest możliwe tylko wtedy, gdy AdGuard Home jest również <0>serwerem DHCP</0>",
|
||||
"form_enter_ip": "Wpisz adres IP",
|
||||
"form_enter_mac": "Wpisz adres MAC",
|
||||
"form_enter_id": "Wprowadź identyfikator",
|
||||
"form_add_id": "Dodaj identyfikator",
|
||||
"form_client_name": "Wpisz nazwę klienta",
|
||||
"client_global_settings": "Użyj ustawień globalnych",
|
||||
"client_deleted": "Klient \"{{key}}\" został pomyślnie usunięty",
|
||||
@@ -291,7 +347,7 @@
|
||||
"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?",
|
||||
"list_confirm_delete": "Czy na pewno chcesz usunąć tę listę?",
|
||||
"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",
|
||||
@@ -330,6 +386,7 @@
|
||||
"rewrite_desc": "Pozwala łatwo skonfigurować niestandardową odpowiedź DNS dla określonej nazwy domeny.",
|
||||
"rewrite_applied": "Przepisano regułę",
|
||||
"dns_rewrites": "Przepisywanie DNS",
|
||||
"form_domain": "Wpisz nazwę domeny lub symbol wieloznaczny",
|
||||
"form_answer": "Wpisz adres IP lub nazwę domeny",
|
||||
"form_error_domain_format": "Niepoprawny format domeny",
|
||||
"form_error_answer_format": "Nieprawidłowy format odpowiedzi",
|
||||
@@ -352,14 +409,75 @@
|
||||
"stats_params": "Konfiguracja statystyk",
|
||||
"config_successfully_saved": "Konfiguracja została pomyślnie zapisana",
|
||||
"interval_24_hour": "24 godziny",
|
||||
"interval_days": "{{value}} dni",
|
||||
"interval_days": "{{count}} dni",
|
||||
"interval_days_plural": "{{count}} dni",
|
||||
"domain": "Domena",
|
||||
"answer": "Odpowiedź",
|
||||
"filter_added_successfully": "Pomyślnie dodano filtr",
|
||||
"filter_added_successfully": "Lista została pomyślnie dodana",
|
||||
"filter_updated": "Filtr został pomyślnie zaktualizowany",
|
||||
"statistics_configuration": "Konfiguracja statystyk",
|
||||
"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"
|
||||
"statistics_retention_confirm": "Czy chcesz zmienić sposób przechowania statystyk? Jeżeli obniżysz wartość interwału, niektóre dane będą utracone",
|
||||
"statistics_cleared": "Statystyki zostały pomyślnie wyczyszczone",
|
||||
"interval_hours": "{{count}} godzin",
|
||||
"interval_hours_plural": "{{count}} godziny",
|
||||
"filters_configuration": "Konfiguracja filtrów",
|
||||
"filters_enable": "Włącz filtry",
|
||||
"filters_interval": "Częstotliwość aktualizacji filtrów",
|
||||
"disabled": "Wyłączone",
|
||||
"username_label": "Nazwa użytkownika",
|
||||
"username_placeholder": "Wpisz nazwę użytkownika",
|
||||
"password_label": "Hasło",
|
||||
"password_placeholder": "Wprowadź hasło",
|
||||
"sign_in": "Zaloguj się",
|
||||
"sign_out": "Wyloguj się",
|
||||
"forgot_password": "Zapomniałeś hasła?",
|
||||
"forgot_password_desc": "Wykonaj <0>te kroki</0> aby utworzyć nowe hasło do konta użytkownika.",
|
||||
"location": "Lokalizacja",
|
||||
"orgname": "Nazwa firmy",
|
||||
"netname": "Nazwa sieci",
|
||||
"descr": "Opis",
|
||||
"whois": "Whois",
|
||||
"filtering_rules_learn_more": "<0>Dowiedz się więcej</0> o tworzeniu własnych czarnych list hostów.",
|
||||
"blocked_by_response": "W odpowiedzi zablokowany przez CNAME lub IP",
|
||||
"try_again": "Spróbuj ponownie",
|
||||
"domain_desc": "Wpisz nazwę domeny lub symbol wieloznaczny, który chcesz przepisać.",
|
||||
"example_rewrite_domain": "przepisz odpowiedzi tylko dla tej nazwy domeny.",
|
||||
"example_rewrite_wildcard": "przepisz odpowiedzi dla wszystkich subdomen <0>example.org</0>.",
|
||||
"disable_ipv6": "Wyłącz IPv6",
|
||||
"disable_ipv6_desc": "Jeśli ta funkcja jest włączona, wszystkie zapytania DNS dotyczące adresów IPv6 (typ AAAA) zostaną usunięte.",
|
||||
"autofix_warning_text": "Jeśli klikniesz „Napraw”, AdGuardHome skonfiguruje system do korzystania z serwera DNS AdGuardHome.",
|
||||
"autofix_warning_list": "Wykona następujące zadania: <0>Dezaktywuj system DNSStubListener</0> <0>Ustaw adres serwera DNS na 127.0.0.1</0> <0>Zamień symboliczny cel łącza z /etc/resolv.conf na /run/systemd/resolve/resolv.conf</0> <0>Zatrzymaj DNSStubListener (przeładuj usługę systemową)</0>",
|
||||
"autofix_warning_result": "W rezultacie wszystkie żądania DNS z Twojego systemu będą domyślnie przetwarzane przez AdGuardHome.",
|
||||
"tags_title": "Tagi",
|
||||
"tags_desc": "Możesz wybrać tagi odpowiadające klientowi. Tagi mogą być uwzględnione w regułach filtrowania i umożliwiają ich dokładniejsze stosowanie. <0>Dowiedz się więcej </0>",
|
||||
"form_select_tags": "Wybierz tagi klienta",
|
||||
"check_title": "Sprawdź filtrowanie",
|
||||
"check_desc": "Sprawdź, czy nazwa hosta jest filtrowana",
|
||||
"check": "Sprawdź",
|
||||
"form_enter_host": "Wpisz nazwę hosta",
|
||||
"filtered_custom_rules": "Filtrowane według niestandardowych reguł filtrowania",
|
||||
"host_whitelisted": "Host znajduje się na białej liście",
|
||||
"check_ip": "Adresy IP: {{ip}}",
|
||||
"check_cname": "CNAME: {{cname}}",
|
||||
"check_reason": "Powód: {{reason}}",
|
||||
"check_rule": "Reguła: {{rule}}",
|
||||
"check_service": "Nazwa usługi: {{service}}",
|
||||
"check_not_found": "Nie znaleziono na Twoich listach filtrów",
|
||||
"client_confirm_block": "Czy na pewno chcesz zablokować klienta \"{{ip}}\"?",
|
||||
"client_confirm_unblock": "Czy na pewno chcesz odblokować klienta \"{{ip}}\"?",
|
||||
"client_blocked": "Klient \"{{ip}}\" został pomyślnie zablokowany",
|
||||
"client_unblocked": "Klient \"{{ip}}\" został pomyślnie odblokowany",
|
||||
"static_ip": "Statyczny adres IP",
|
||||
"static_ip_desc": "AdGuard Home to serwer, więc do poprawnego działania potrzebuje statycznego adresu IP. W przeciwnym razie router może przypisać temu urządzeniu inny adres IP.",
|
||||
"set_static_ip": "Ustaw statyczny adres IP",
|
||||
"install_static_ok": "Dobre wieści! Statyczny adres IP jest już skonfigurowany",
|
||||
"install_static_error": "AdGuard Home nie może skonfigurować go automatycznie dla tego interfejsu sieciowego. Poszukaj instrukcji, jak to zrobić ręcznie.",
|
||||
"install_static_configure": "Wykryliśmy, że używany jest dynamiczny adres IP — <0>{{ip}}</0>. Czy chcesz użyć go jako adresu statycznego?",
|
||||
"confirm_static_ip": "AdGuard Home skonfiguruje {{ip}} aby był Twoim statycznym adresem IP. Czy chcesz kontynuować?",
|
||||
"list_updated": "{{count}} lista zaktualizowana",
|
||||
"list_updated_plural": "{{count}} list zaktualizowanych"
|
||||
}
|
||||
@@ -23,6 +23,7 @@
|
||||
"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_client_id_format": "Formato do ID de cliente inválido",
|
||||
"form_error_positive": "Deve ser maior que 0",
|
||||
"form_error_negative": "Deve ser igual ou superior a 0",
|
||||
"dhcp_form_gateway_input": "IP do gateway",
|
||||
@@ -121,22 +122,17 @@
|
||||
"enabled_save_search_toast": "Pesquisa segura ativada",
|
||||
"enabled_table_header": "Ativado",
|
||||
"name_table_header": "Nome",
|
||||
"filter_url_table_header": "URL do filtro",
|
||||
"rules_count_table_header": "Quantidade de regras",
|
||||
"last_time_updated_table_header": "Última atualização",
|
||||
"actions_table_header": "Ações",
|
||||
"edit_table_action": "Editar",
|
||||
"delete_table_action": "Excluir",
|
||||
"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": "Digite o nome",
|
||||
"enter_url_hint": "Digite a URL",
|
||||
"check_updates_btn": "Verificar atualizações",
|
||||
"new_filter_btn": "Nova inscrição de filtro",
|
||||
"enter_valid_filter_url": "Digite a URL válida para efetuar a inscrição de filtro ou um arquivo de hosts.",
|
||||
"form_error_url_format": "Formato da url inválida",
|
||||
"custom_filter_rules": "Regras de filtragem personalizadas",
|
||||
"custom_filter_rules_hint": "Digite uma regra por linha. Você pode usar regras de bloqueio de anúncios ou a sintaxe de arquivos de hosts.",
|
||||
"examples_title": "Exemplos",
|
||||
@@ -152,7 +148,6 @@
|
||||
"example_upstream_doh": "<0>DNS-sobre-HTTPS</0> criptografado",
|
||||
"example_upstream_sdns": "Você 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": "Todos os filtros já estão atualizados",
|
||||
"updated_upstream_dns_toast": "Atualizado os servidores DNS upstream",
|
||||
"dns_test_ok_toast": "Os servidores DNS especificados estão funcionando corretamente",
|
||||
"dns_test_not_ok_toast": "O servidor \"{{key}}\": não pôde ser utilizado. Por favor, verifique se você escreveu corretamente",
|
||||
@@ -172,7 +167,6 @@
|
||||
"next_btn": "Próximo",
|
||||
"loading_table_status": "Carregando",
|
||||
"page_table_footer_text": "Página",
|
||||
"of_table_footer_text": "de",
|
||||
"rows_table_footer_text": "linhas",
|
||||
"updated_custom_filtering_toast": "Regras de filtragem personalizadas atualizadas",
|
||||
"rule_removed_from_custom_filtering_toast": "Regra removida das regras de filtragem personalizadas",
|
||||
@@ -190,6 +184,7 @@
|
||||
"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",
|
||||
"dns_config": "Configuração do servidor DNS",
|
||||
"blocking_mode": "Modo de bloqueio",
|
||||
"default": "Padrão",
|
||||
"nxdomain": "NXDOMAIN",
|
||||
"null_ip": "IP nulo",
|
||||
"custom_ip": "IP personalizado",
|
||||
@@ -202,13 +197,15 @@
|
||||
"rate_limit_desc": "O número de solicitações por segundo que um único cliente pode fazer (0: ilimitado)",
|
||||
"blocking_ipv4_desc": "Endereço de IP a ser retornado para uma solicitação bloqueada",
|
||||
"blocking_ipv6_desc": "Endereço de IP a ser retornado para uma solicitação AAAA bloqueada",
|
||||
"blocking_mode_desc": "<0>NXDOMAIN - Responde com o código NXDOMAIN;</0> <0>IP nulo - Responde com endereço IP zero (0.0.0.0.0 para A; :: para AAAA);</0><0>IP personalizado - Responde com um endereço de IP definido manualmente.</0>",
|
||||
"blocking_mode_default": "Por padrão: Responder com NXDOMAIN quando bloqueado pela regra estilo Adblock e responde com o endereço de IP especificado na regra quando bloqueado pela regra estilo /etc/hosts-style",
|
||||
"blocking_mode_nxdomain": "NXDOMAIN: Responder com o código NXDOMAIN",
|
||||
"blocking_mode_null_ip": "IP nulo: Responder com endereço IP zero (0.0.0.0 para A; :: para AAAA)",
|
||||
"blocking_mode_custom_ip": "IP personalizado: Responder com um endereço IP definido manualmente",
|
||||
"upstream_dns_client_desc": "Se você mantiver este campo vazio, o AdGuard Home usará os servidores configurados nas configurações <0>DNS</0>.",
|
||||
"source_label": "Fonte",
|
||||
"found_in_known_domain_db": "Encontrado no banco de dados de domínios conhecidos.",
|
||||
"category_label": "Categoria",
|
||||
"rule_label": "Regra",
|
||||
"filter_label": "Filtro",
|
||||
"unknown_filter": "Filtro desconhecido {{filterId}}",
|
||||
"install_welcome_title": "Bem-vindo(a) ao AdGuard Home!",
|
||||
"install_welcome_desc": "O AdGuard Home é um servidor de DNS para bloqueio de anúncios e rastreamento em toda a rede. Sua finalidade é permitir que você controle toda a sua rede e seus dispositivos sem precisar ter um programa instalado.",
|
||||
@@ -332,7 +329,6 @@
|
||||
"client_updated": "Cliente \"{{key}}\" atualizado com sucesso",
|
||||
"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?",
|
||||
"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 acessos",
|
||||
@@ -371,6 +367,7 @@
|
||||
"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": "Digite o nome do domínio ou wildcard",
|
||||
"form_answer": "Digite 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",
|
||||
@@ -398,6 +395,7 @@
|
||||
"domain": "Domínio",
|
||||
"answer": "Resposta",
|
||||
"filter_added_successfully": "O filtro foi adicionado com sucesso",
|
||||
"filter_updated": "O filtro atualizado 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",
|
||||
@@ -426,5 +424,39 @@
|
||||
"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",
|
||||
"try_again": "Tente novamente"
|
||||
"try_again": "Tente novamente",
|
||||
"domain_desc": "Digite o nome do domínio ou wildcard que pretende reescrever.",
|
||||
"example_rewrite_domain": "reescrever respostas apenas para este nome de domínio.",
|
||||
"example_rewrite_wildcard": "reescrever respostas para todos subdomínios <0>exemplo.org</0>.",
|
||||
"disable_ipv6": "Desativar IPv6",
|
||||
"disable_ipv6_desc": "Se este recurso estiver ativado, todas as consultas de DNS para endereços IPv6 (tipo AAAA) serão ignoradas.",
|
||||
"autofix_warning_text": "Se clicar em \"Corrigir\", o AdGuardHome irá configurar o seu sistema para utilizar o servidor DNS do AdGuardHome.",
|
||||
"autofix_warning_list": "Ele irá realizar estas tarefas: <0>Desativar sistema DNSStubListener</0> <0>Definir endereço do servidor DNS para 127.0.0.1</0> <0>Substituir o alvo simbólico do link /etc/resolv.conf para /run/systemd/resolv.conf</0> <0>Parar DNSStubListener (recarregar serviço resolvido pelo sistema)</0>",
|
||||
"autofix_warning_result": "Como resultado, todos as solicitações DNS do seu sistema serão processadas pelo AdGuardHome por padrão.",
|
||||
"tags_title": "Marcadores",
|
||||
"tags_desc": "Você pode selecionar as tags que correspondem ao cliente. As tags podem ser incluídas nas regras de filtragem e permitir que você as aplique com mais precisão. <0>Saiba mais</0>",
|
||||
"form_select_tags": "Selecione as tags do cliente",
|
||||
"check_title": "Verifique a filtragem",
|
||||
"check_desc": "Verificar se o nome do host está sendo filtrado",
|
||||
"check": "Verificar",
|
||||
"form_enter_host": "Digite o nome do host",
|
||||
"filtered_custom_rules": "Filtrado pelas regras de filtragem personalizadas",
|
||||
"host_whitelisted": "O host está na lista branca",
|
||||
"check_ip": "Endereços de IP: {{ip}}",
|
||||
"check_cname": "CNAME: {{cname}}",
|
||||
"check_reason": "Motivo: {{reason}}",
|
||||
"check_rule": "Regra: {{rule}}",
|
||||
"check_service": "Nome do serviço: {{service}}",
|
||||
"check_not_found": "Não encontrado em suas listas de filtros",
|
||||
"client_confirm_block": "Você tem certeza de que deseja bloquear o cliente \"{{ip}}\"?",
|
||||
"client_confirm_unblock": "Você tem certeza de que deseja desbloquear o cliente \"{{ip}}\"?",
|
||||
"client_blocked": "Cliente \"{{ip}}\" foi bloqueado com sucesso",
|
||||
"client_unblocked": "Cliente \"{{ip}}\" foi desbloqueado com sucesso",
|
||||
"static_ip": "Endereço de IP estático",
|
||||
"static_ip_desc": "O AdGuard Home é um servidor, portanto, ele precisa de um endereço de IP estático para funcionar corretamente. Caso contrário, em algum momento, seu roteador poderá atribuir um novo endereço de IP neste dispositivo.",
|
||||
"set_static_ip": "Definir um endereço de IP estático",
|
||||
"install_static_ok": "Boas notícias! O endereço de IP estático já está configurado",
|
||||
"install_static_error": "O AdGuard Home não pode configurar automaticamente para esta interface de rede. Por favor, procure uma instrução sobre como fazer isso manualmente.",
|
||||
"install_static_configure": "Detectamos que um endereço de IP dinâmico é sendo usado — <0>{{ip}}</0>. Deseja utilizar como seu endereço estático?",
|
||||
"confirm_static_ip": "O AdGuard Home irá configurar {{ip}} para ser seu endereço IP estático. Deseja continuar?"
|
||||
}
|
||||
@@ -23,6 +23,7 @@
|
||||
"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_client_id_format": "Formato inválido",
|
||||
"form_error_positive": "Deve ser maior que 0",
|
||||
"form_error_negative": "Deve ser igual ou superior a 0",
|
||||
"dhcp_form_gateway_input": "IP do gateway",
|
||||
@@ -121,22 +122,16 @@
|
||||
"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",
|
||||
@@ -152,7 +147,6 @@
|
||||
"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",
|
||||
@@ -172,7 +166,6 @@
|
||||
"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",
|
||||
@@ -202,13 +195,11 @@
|
||||
"rate_limit_desc": "O número de solicitações por segundo que um único cliente pode fazer (0: ilimitado)",
|
||||
"blocking_ipv4_desc": "Endereço IP a ser devolvido para uma solicitação A bloqueada",
|
||||
"blocking_ipv6_desc": "Endereço IP a ser devolvido para uma solicitação AAAA bloqueada",
|
||||
"blocking_mode_desc": "<0>NXDOMAIN – Responda com o código NXDOMAIN;;</0> <0>IP nulo - responda com zero endereço IP (0.0.0.0 for A; :: for AAAA);</0> <0>IP personalizado - Responda com um endereço IP definido manualmente.</0>",
|
||||
"upstream_dns_client_desc": "Se mantiver esse campo vazio, o AdGuard Home usará os servidores configurados nas <0>Definições de DNS</0>.",
|
||||
"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.",
|
||||
@@ -332,7 +323,6 @@
|
||||
"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",
|
||||
@@ -371,6 +361,7 @@
|
||||
"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",
|
||||
@@ -426,5 +417,8 @@
|
||||
"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",
|
||||
"try_again": "Tente novamente"
|
||||
"try_again": "Tente novamente",
|
||||
"domain_desc": "Insere o nome do domínio para ser reescrito.",
|
||||
"example_rewrite_domain": "reescrever resposta apenas para este domínio.",
|
||||
"example_rewrite_wildcard": "reescrever resposta para todos <0>example.org</0> sub-domínios."
|
||||
}
|
||||
@@ -76,16 +76,12 @@
|
||||
"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": "Количество DNS-запросов за последний {{count}} день",
|
||||
"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",
|
||||
@@ -105,6 +101,11 @@
|
||||
"no_servers_specified": "Нет указанных серверов",
|
||||
"general_settings": "Основные настройки",
|
||||
"dns_settings": "Настройки DNS",
|
||||
"dns_blocklists": "Черные списки DNS",
|
||||
"dns_allowlists": "Белые списки DNS",
|
||||
"dns_blocklists_desc": "AdGuard Home будет блокировать домены из черных списков.",
|
||||
"dns_allowlists_desc": "Домены из белых списков DNS будут разрешены, даже если они находятся в любом из черных списков.",
|
||||
"custom_filtering_rules": "Пользовательские правила фильтрации",
|
||||
"encryption_settings": "Настройки шифрования",
|
||||
"dhcp_settings": "Настройки DHCP",
|
||||
"upstream_dns": "Upstream DNS-серверы",
|
||||
@@ -122,22 +123,28 @@
|
||||
"enabled_save_search_toast": "Безопасный поиск вкл.",
|
||||
"enabled_table_header": "Вкл.",
|
||||
"name_table_header": "Имя",
|
||||
"filter_url_table_header": "URL фильтра",
|
||||
"list_url_table_header": "URL-адрес списка",
|
||||
"rules_count_table_header": "Количество правил:",
|
||||
"last_time_updated_table_header": "Последнее обновление",
|
||||
"actions_table_header": "Действия",
|
||||
"edit_table_action": "Редактировать",
|
||||
"delete_table_action": "Удалить",
|
||||
"filters_and_hosts": "Фильтры и черные списки hosts",
|
||||
"filters_and_hosts_hint": "AdGuard Home распознает базовые правила блокировки и синтаксис файлов hosts.",
|
||||
"no_filters_added": "Фильтры не добавлены",
|
||||
"add_filter_btn": "Добавить фильтр",
|
||||
"no_blocklist_added": "Черные списки не добавлены",
|
||||
"no_whitelist_added": "Белые списки не добавлены",
|
||||
"add_blocklist": "Добавить черный список",
|
||||
"add_allowlist": "Добавить белый список",
|
||||
"cancel_btn": "Отмена",
|
||||
"enter_name_hint": "Введите имя",
|
||||
"enter_url_hint": "Введите URL",
|
||||
"check_updates_btn": "Проверить обновления",
|
||||
"new_filter_btn": "Добавление нового фильтра",
|
||||
"enter_valid_filter_url": "Введите действующий URL для подписки на фильтр или файл hosts.",
|
||||
"new_blocklist": "Новый черный список",
|
||||
"new_allowlist": "Новый белый список",
|
||||
"edit_blocklist": "Редактировать черный список",
|
||||
"edit_allowlist": "Редактировать белый список",
|
||||
"enter_valid_blocklist": "Добавьте действующий URL-адрес в черный список.",
|
||||
"enter_valid_allowlist": "Добавьте действующий URL-адрес в белый список.",
|
||||
"form_error_url_format": "Неверный формат URL",
|
||||
"custom_filter_rules": "Пользовательское правило фильтрации",
|
||||
"custom_filter_rules_hint": "Вводите по одному правилу на строчку. Вы можете использовать правила блокировки или синтаксис файлов hosts.",
|
||||
"examples_title": "Примеры",
|
||||
@@ -153,7 +160,7 @@
|
||||
"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": "Все фильтры обновлены",
|
||||
"all_lists_up_to_date_toast": "Все списки уже обновлены",
|
||||
"updated_upstream_dns_toast": "Upstream DNS-серверы обновлены",
|
||||
"dns_test_ok_toast": "Указанные серверы DNS работают корректно",
|
||||
"dns_test_not_ok_toast": "Сервер \"{{key}}\": невозможно использовать, проверьте правильность написания",
|
||||
@@ -173,7 +180,6 @@
|
||||
"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": "Правило удалено из авторского списка правил фильтрации",
|
||||
@@ -191,6 +197,7 @@
|
||||
"query_log_retention_confirm": "Вы уверены, что хотите изменить срок хранения запросов? При сокращении интервала данные могут быть утеряны",
|
||||
"dns_config": "Настройки DNS-сервера",
|
||||
"blocking_mode": "Режим блокировки",
|
||||
"default": "Стандартный",
|
||||
"nxdomain": "NXDOMAIN",
|
||||
"null_ip": "Нулевой IP",
|
||||
"custom_ip": "Свой IP",
|
||||
@@ -203,13 +210,16 @@
|
||||
"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>",
|
||||
"blocking_mode_default": "Стандартный: Отвечает с NXDOMAIN, когда заблокировано правилом в стиле Adblock; отвечает с IP-адресом, указанным в правиле, когда заблокировано правилом в стиле /etc/hosts\n",
|
||||
"blocking_mode_nxdomain": "NXDOMAIN: Отвечает с кодом NXDOMAIN\n",
|
||||
"blocking_mode_null_ip": "Нулевой IP: Отвечает с нулевым IP-адресом (0.0.0.0 для A; :: для AAAA)",
|
||||
"blocking_mode_custom_ip": "Пользовательский IP: Отвечает с вручную настроенным IP-адресом",
|
||||
"upstream_dns_client_desc": "Если оставить поле пустым, AdGuard Home будет обращаться к серверам, указанным в <0>настройках DNS</0>.",
|
||||
"source_label": "Источник",
|
||||
"found_in_known_domain_db": "Найден в базе известных доменов.",
|
||||
"category_label": "Категория",
|
||||
"rule_label": "Правило",
|
||||
"filter_label": "Фильтр",
|
||||
"list_label": "Список",
|
||||
"unknown_filter": "Неизвестный фильтр {{filterId}}",
|
||||
"install_welcome_title": "Добро пожаловать в AdGuard Home!",
|
||||
"install_welcome_desc": "AdGuard Home – это DNS-сервер, блокирующий рекламу и трекинг. Его цель – дать вам возможность контролировать всю вашу сеть и все подключенные устройства. Он не требует установки клиентских программ.",
|
||||
@@ -333,7 +343,7 @@
|
||||
"client_updated": "Клиент \"{{key}}\" успешно обновлен",
|
||||
"clients_not_found": "Клиентов не найдено",
|
||||
"client_confirm_delete": "Вы уверены, что хотите удалить клиента \"{{key}}\"?",
|
||||
"filter_confirm_delete": "Вы уверены, что хотите удалить фильтр?",
|
||||
"list_confirm_delete": "Вы уверены, что хотите удалить этот список?",
|
||||
"auto_clients_title": "Клиенты (runtime)",
|
||||
"auto_clients_desc": "Данные о клиентах, которые используют AdGuard Home, но не хранятся в настройках",
|
||||
"access_title": "Настройки доступа",
|
||||
@@ -395,11 +405,10 @@
|
||||
"stats_params": "Конфигурация статистики",
|
||||
"config_successfully_saved": "Конфигурация успешно сохранена",
|
||||
"interval_24_hour": "24 часа",
|
||||
"interval_days": "{{count}} день",
|
||||
"interval_days_plural": "{{count}} дней",
|
||||
"domain": "Домен",
|
||||
"answer": "Ответ",
|
||||
"filter_added_successfully": "Фильтр успешно добавлен",
|
||||
"filter_added_successfully": "Список успешно добавлен",
|
||||
"filter_updated": "Список успешно обновлен",
|
||||
"statistics_configuration": "Конфигурация статистики",
|
||||
"statistics_retention": "Сохранение статистики",
|
||||
"statistics_retention_desc": "Если вы уменьшите значение интервала, некоторые данные могут быть утеряны",
|
||||
@@ -407,8 +416,6 @@
|
||||
"statistics_clear_confirm": "Вы уверены, что хотите очистить статистику?",
|
||||
"statistics_retention_confirm": "Вы уверены, что хотите изменить срок хранения статистики? При сокращении интервала данные могут быть утеряны",
|
||||
"statistics_cleared": "Статистика успешно очищена",
|
||||
"interval_hours": "{{count}} час",
|
||||
"interval_hours_plural": "{{count}} часов",
|
||||
"filters_configuration": "Настройка фильтров",
|
||||
"filters_enable": "Включить фильтры",
|
||||
"filters_interval": "Интервал обновления фильтров",
|
||||
@@ -429,7 +436,53 @@
|
||||
"filtering_rules_learn_more": "<0>Узнайте больше</0> о создании собственных списков блокировки хостов.",
|
||||
"blocked_by_response": "Заблокировано по CNAME или IP в ответе",
|
||||
"try_again": "Попробовать еще раз",
|
||||
"domain_desc": "Введите имя или маску домены, который вы хотите перенаправить.",
|
||||
"example_rewrite_domain": "перенаправляет только для этот домен.",
|
||||
"example_rewrite_wildcard": "перенправляет все поддомены <0>example.org</0>."
|
||||
"domain_desc": "Введите имя или маску домена, который вы хотите перенаправить.",
|
||||
"example_rewrite_domain": "перенаправляет ответы только для этого домена.",
|
||||
"example_rewrite_wildcard": "перенаправляет ответы для всех поддоменов <0>example.org</0>.",
|
||||
"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}} дней",
|
||||
"disable_ipv6": "Отключить IPv6",
|
||||
"disable_ipv6_desc": "Если эта опция включена, все DNS-запросы адресов IPv6 (тип AAAA) будут игнорироваться.",
|
||||
"autofix_warning_text": "При нажатии \"Исправить\" AdGuard Home настроит вашу систему на использование DNS-сервера AdGuard Home.",
|
||||
"autofix_warning_list": "Будут выполняться следующие задачи: <0>Деактивировать системный DNSStubListener</0> <0>Установить адрес сервера DNS на 127.0.0.1</0> <0>Создать символическую ссылку /etc/resolv.conf на /run/systemd/resolve/resolv.conf</0> <0>Остановить DNSStubListener (перезагрузить системную службу)</0>.",
|
||||
"autofix_warning_result": "В результате все DNS-запросы от вашей системы будут по умолчанию обрабатываться AdGuard Home.\n",
|
||||
"tags_title": "Теги",
|
||||
"tags_desc": "Вы можете выбрать теги, которые соответствуют клиенту. Теги могут быть включены в правила фильтрации и позволят вам применять их более точно. <0>Узнать больше</0>.",
|
||||
"form_select_tags": "Выбрать теги клиента",
|
||||
"check_title": "Проверить фильтрацию",
|
||||
"check_desc": "Проверить фильтрацию имени хоста",
|
||||
"check": "Проверить",
|
||||
"form_enter_host": "Введите имя хоста",
|
||||
"filtered_custom_rules": "Отфильтрованы с помощью пользовательских правил фильтрации",
|
||||
"host_whitelisted": "Хост занесен в белый список",
|
||||
"check_ip": "IP-адреса: {{ip}}",
|
||||
"check_cname": "CNAME: {{cname}}",
|
||||
"check_reason": "Причина: {{reason}}",
|
||||
"check_rule": "Правило: {{rule}}",
|
||||
"check_service": "Название сервиса: {{service}}",
|
||||
"check_not_found": "Не найдено в вашем списке фильтров",
|
||||
"client_confirm_block": "Вы уверены, что хотите заблокировать клиента \"{{ip}}\"?",
|
||||
"client_confirm_unblock": "Вы уверены, что хотите разблокировать клиента \"{{ip}}\"?",
|
||||
"client_blocked": "Клиент \"{{ip}}\" успешно заблокирован",
|
||||
"client_unblocked": "Клиент \"{{ip}}\" успешно разблокирован",
|
||||
"static_ip": "Статический IP-адрес",
|
||||
"static_ip_desc": "AdGuard Home является сервером, поэтому для корректной работы ему необходим статический IP-адрес. В противном случае, в какой-то момент ваш роутер может присвоить этому устройству другой IP-адрес.",
|
||||
"set_static_ip": "Установить статический IP-адрес",
|
||||
"install_static_ok": "Хорошие новости! Ваш статический IP-адрес уже настроен",
|
||||
"install_static_error": "AdGuard Home не может автоматически настроить его для этого сетевого интерфейса. Пожалуйста, посмотрите инструкцию о том, как это сделать вручную.",
|
||||
"install_static_configure": "Мы обнаружили использование динамического IP-адреса — <0>{{ip}}</0>. Хотите использовать его в качестве статического адреса?",
|
||||
"confirm_static_ip": "AdGuard Home настроит {{ip}} в качестве вашего статического IP-адреса. Хотите продолжить?",
|
||||
"list_updated_0": "Обновлен {{count}} список",
|
||||
"list_updated_1": "Обновлено списка: {{count}}",
|
||||
"list_updated_2": "Обновлено списков: {{count}}"
|
||||
}
|
||||
@@ -23,6 +23,7 @@
|
||||
"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_client_id_format": "Neplatný formát client ID",
|
||||
"form_error_positive": "Musí byť väčšie ako 0",
|
||||
"form_error_negative": "Musí byť číslo 0 alebo viac",
|
||||
"dhcp_form_gateway_input": "IP brána",
|
||||
@@ -35,7 +36,7 @@
|
||||
"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_hostname": "Meno 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.",
|
||||
@@ -48,7 +49,7 @@
|
||||
"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",
|
||||
"form_enter_hostname": "Zadajte meno hostiteľa",
|
||||
"error_details": "Podrobnosti chyby",
|
||||
"back": "Naspäť",
|
||||
"dashboard": "Riadiaci panel",
|
||||
@@ -104,6 +105,11 @@
|
||||
"no_servers_specified": "Neboli špecifikované žiadne servery",
|
||||
"general_settings": "Všeobecné nastavenia",
|
||||
"dns_settings": "Nastavenia DNS",
|
||||
"dns_blocklists": "Zoznam blokovaných DNS",
|
||||
"dns_allowlists": "Zoznam povolených DNS",
|
||||
"dns_blocklists_desc": "AdGuard Home bude blokovať domény obsiahnuté v zozname blokovaných DNS.",
|
||||
"dns_allowlists_desc": "Domény zo zoznamu povolených DNS budú povolené, aj keď sa nachádzajú v niektorom zo zoznamov blokovaných DNS.",
|
||||
"custom_filtering_rules": "Vlastné filtračné pravidlá",
|
||||
"encryption_settings": "Nastavenia šifrovania",
|
||||
"dhcp_settings": "Nastavenia DHCP",
|
||||
"upstream_dns": "Upstream DNS servery",
|
||||
@@ -120,25 +126,31 @@
|
||||
"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",
|
||||
"name_table_header": "Meno",
|
||||
"list_url_table_header": "Zoznam URL adries",
|
||||
"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",
|
||||
"no_blocklist_added": "Nebol pridaný žiaden zoznam blokovaných DNS",
|
||||
"no_whitelist_added": "Nebol pridaný žiaden zoznam povolených DNS",
|
||||
"add_blocklist": "Pridať zoznam blokovaných DNS",
|
||||
"add_allowlist": "Pridať zoznam povolených DNS",
|
||||
"cancel_btn": "Zrušiť",
|
||||
"enter_name_hint": "Zadajte názov",
|
||||
"enter_url_hint": "Vložte URL adresu",
|
||||
"enter_name_hint": "Zadajte meno",
|
||||
"enter_url_hint": "Zadajte 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.",
|
||||
"new_blocklist": "Nový zoznam blokovaných DNS",
|
||||
"new_allowlist": "Nový zoznam povolených DNS",
|
||||
"edit_blocklist": "Upraviť zoznam blokovaných DNS",
|
||||
"edit_allowlist": "Upraviť zoznam povolených DNS",
|
||||
"enter_valid_blocklist": "Zadajte platnú URL adresu do zoznamu blokovaných DNS.",
|
||||
"enter_valid_allowlist": "Zadajte platnú URL adresu do zoznamu povolených DNS.",
|
||||
"form_error_url_format": "Neplatný URL formát",
|
||||
"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.",
|
||||
"custom_filter_rules_hint": "Zadajte 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",
|
||||
@@ -152,14 +164,14 @@
|
||||
"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",
|
||||
"all_lists_up_to_date_toast": "Všetky zoznamy 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",
|
||||
"domain_name_table_header": "Meno domény",
|
||||
"type_table_header": "Typ",
|
||||
"response_table_header": "Odozva",
|
||||
"client_table_header": "Klient",
|
||||
@@ -172,7 +184,6 @@
|
||||
"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",
|
||||
@@ -190,6 +201,7 @@
|
||||
"query_log_retention_confirm": "Naozaj chcete zmeniť uchovávanie denníku dopytov? Ak znížite hodnotu intervalu, niektoré údaje sa stratia",
|
||||
"dns_config": "Konfigurácia DNS servera",
|
||||
"blocking_mode": "Spôsob blokovania",
|
||||
"default": "Predvolené",
|
||||
"nxdomain": "NXDOMAIN",
|
||||
"null_ip": "Nulová IP adresa",
|
||||
"custom_ip": "Vlastná IP adresa",
|
||||
@@ -202,13 +214,16 @@
|
||||
"rate_limit_desc": "Počet požiadaviek za sekundu, ktoré môže jeden klient vykonať (0: neobmedzene)",
|
||||
"blocking_ipv4_desc": "IP adresa, ktorá sa má vrátiť v prípade blokovanej žiadosti A",
|
||||
"blocking_ipv6_desc": "IP adresa, ktorá sa má vrátiť v prípade blokovanej žiadosti AAAA",
|
||||
"blocking_mode_desc": "<0>NXDOMAIN - Odpoveď s kódom NXDOMAIN;</0> <0>Null IP - Odpoveď s nulovou IP adresou (0,0.0,0 pre A; :: pre AAAA);</0> <0>Vlastná IP adresa - Odpoveď s manuálne nastavenou IP adresou.</0>",
|
||||
"blocking_mode_default": "Predvolená hodnota: Odpovedať pomocou NXDOMAIN, ak je blokovaný pravidlom v štýle Adblock; odpovedať pomocou IP adresy určenej v pravidle, ak je blokovaná pravidlom v štýle /etc/hosts",
|
||||
"blocking_mode_nxdomain": "NXDOMAIN: Odpovedať kódom NXDOMAIN",
|
||||
"blocking_mode_null_ip": "Null IP: Odpoveď s nulovou IP adresou (0.0.0.0 pre A; :: pre AAAA)",
|
||||
"blocking_mode_custom_ip": "Vlastná IP adresa: Odpovedzte s manuálne nastavenou IP adresou",
|
||||
"upstream_dns_client_desc": "Ak ponecháte toto pole prázdne, AdGuard Home použije servery nakonfigurované v <0>nastaveniach DNS</0>.",
|
||||
"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",
|
||||
"list_label": "Zoznam",
|
||||
"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.",
|
||||
@@ -239,15 +254,15 @@
|
||||
"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_2": "Prejdite do kategórie Sieť a internet a potom do Centra sietí a zdieľania.",
|
||||
"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_windows_list_6": "Zvoľte Použiť tieto adresy serverov DNS a zadajte 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_macos_list_4": "Vyberte kartu DNS a zadajte adresy Vašich AdGuard Home serverov.",
|
||||
"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ť.",
|
||||
@@ -255,8 +270,8 @@
|
||||
"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.",
|
||||
"install_devices_ios_list_3": "Klepnite na meno aktuálne aktívnej siete.",
|
||||
"install_devices_ios_list_4": "Do poľa DNS zadajte adresy Vašich AdGuard Home serverov.",
|
||||
"get_started": "Začíname",
|
||||
"next": "Ďalej",
|
||||
"open_dashboard": "Otvoriť riadiaci panel",
|
||||
@@ -264,9 +279,9 @@
|
||||
"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": "Meno 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_server_desc": "Ak chcete používať HTTPS, musíte zadať meno 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",
|
||||
@@ -313,26 +328,26 @@
|
||||
"settings_global": "Globálne",
|
||||
"settings_custom": "Vlastné",
|
||||
"table_client": "Klient",
|
||||
"table_name": "Názov",
|
||||
"table_name": "Meno",
|
||||
"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",
|
||||
"client_identifier_desc": "Klienti môžu byť identifikovaní podľa IP adresy, CIDR 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 adresu",
|
||||
"form_enter_mac": "Zadajte MAC adresu",
|
||||
"form_enter_id": "Zadajte identifikátor",
|
||||
"form_add_id": "Pridajte identifikátor",
|
||||
"form_client_name": "Zadajte názov klienta",
|
||||
"form_client_name": "Zadajte meno 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?",
|
||||
"list_confirm_delete": "Naozaj chcete vymazať tento zoznam?",
|
||||
"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",
|
||||
@@ -351,7 +366,7 @@
|
||||
"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_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 meno 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>.",
|
||||
@@ -368,10 +383,11 @@
|
||||
"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_desc": "Umožňuje ľahko nakonfigurovať vlastnú odpoveď DNS pre konkrétne meno domény.",
|
||||
"rewrite_applied": "Použilo sa pravidlo prepisovania",
|
||||
"dns_rewrites": "DNS prepisovanie",
|
||||
"form_answer": "Zadajte IP adresu alebo názov domény",
|
||||
"form_domain": "Zadajte meno domény alebo zástupný znak",
|
||||
"form_answer": "Zadajte IP adresu alebo meno domény",
|
||||
"form_error_domain_format": "Neplatný formát domény",
|
||||
"form_error_answer_format": "Neplatný formát odpovede",
|
||||
"configure": "Konfigurovať",
|
||||
@@ -387,7 +403,7 @@
|
||||
"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_certificates_source_content": "Vložte 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",
|
||||
@@ -398,6 +414,7 @@
|
||||
"domain": "Doména",
|
||||
"answer": "Odpoveď",
|
||||
"filter_added_successfully": "Filter bol úspešne pridaný",
|
||||
"filter_updated": "Filter bol úspešne aktualizovaný",
|
||||
"statistics_configuration": "Konfigurácia štatistiky",
|
||||
"statistics_retention": "Štatistika za obdobie",
|
||||
"statistics_retention_desc": "Ak znížite hodnotu intervalu, niektoré údaje sa stratia",
|
||||
@@ -426,5 +443,41 @@
|
||||
"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",
|
||||
"try_again": "Skúste znova"
|
||||
"try_again": "Skúste znova",
|
||||
"domain_desc": "Zadajte meno domény alebo zástupný znak, ktorý chcete prepísať.",
|
||||
"example_rewrite_domain": "prepísať odpovede iba pre toto meno domény.",
|
||||
"example_rewrite_wildcard": "prepísať odpovede pre všetky subdomény <0>example.org</0>.",
|
||||
"disable_ipv6": "Vypnúť IPv6",
|
||||
"disable_ipv6_desc": "Ak je táto funkcia zapnutá, všetky dotazy DNS na adresy IPv6 (typ AAAA) budú zrušené.",
|
||||
"autofix_warning_text": "Ak kliknete na „Opraviť“, AdGuardHome nakonfiguruje Váš systém tak, aby používal DNS server AdGuardHome.",
|
||||
"autofix_warning_list": "Bude vykonávať tieto úlohy: <0>Deaktivovať systém DNSStubListener</0> <0>Nastaviť adresu servera DNS na 127.0.0.1</0> <0>Nahradiť cieľový symbolický odkaz /etc/resolv.conf na /run/systemd/resolve/resolv.conf</0> <0>Zastaviť službu DNSStubListener (znova načítať službu systemd-resolved)</0>",
|
||||
"autofix_warning_result": "Výsledkom bude, že všetky požiadavky DNS z Vášho systému budú štandardne spracované službou AdGuardHome.",
|
||||
"tags_title": "Tagy",
|
||||
"tags_desc": "Môžete vybrať tagy ktoré zodpovedajú klientovi. Tagy môžu byť súčasťou filtračných pravidiel a umožňujú Vám použiť ich presnejšie. <0>Viac informácií</0>",
|
||||
"form_select_tags": "Zvoľte tagy klienta",
|
||||
"check_title": "Skontrolujte filtráciu",
|
||||
"check_desc": "Skontrolujte, či je názov hostiteľa filtrovaný",
|
||||
"check": "Kontrola",
|
||||
"form_enter_host": "Zadajte meno hostiteľa",
|
||||
"filtered_custom_rules": "Filtrované podľa vlastných filtračných pravidiel",
|
||||
"host_whitelisted": "Hostiteľ je na bielej listine",
|
||||
"check_ip": "IP adresy: {{ip}}",
|
||||
"check_cname": "CNAME: {{cname}}",
|
||||
"check_reason": "Dôvod: {{reason}}",
|
||||
"check_rule": "Pravidlo: {{rule}}",
|
||||
"check_service": "Meno služby: {{service}}",
|
||||
"check_not_found": "Nenašlo sa vo Vašom zozname filtrov",
|
||||
"client_confirm_block": "Naozaj chcete zablokovať klienta \"{{ip}}\"?",
|
||||
"client_confirm_unblock": "Naozaj chcete odblokovať klienta \"{{ip}}\"?",
|
||||
"client_blocked": "Klient \"{{ip}}\" úspešne zablokovaný",
|
||||
"client_unblocked": "Klient \"{{ip}}\" úspešne odblokovaný",
|
||||
"static_ip": "Statická IP adresa",
|
||||
"static_ip_desc": "AdGuard Home je server, takže na správne fungovanie potrebuje statickú IP adresu. V opačnom prípade môže smerovač tomuto zariadeniu prideliť inú IP adresu.",
|
||||
"set_static_ip": "Nastaviť statickú IP adresu",
|
||||
"install_static_ok": "Dobré správy! Statická IP adresa je už nakonfigurovaná",
|
||||
"install_static_error": "AdGuard Home ho nemôže automaticky nakonfigurovať pre toto sieťové rozhranie. Vyhľadajte návod, ako to urobiť manuálne.",
|
||||
"install_static_configure": "Zistili sme, že sa používa dynamická IP adresa — <0>{{ip}}</0>. Chcete ju použiť ako svoju statickú adresu?",
|
||||
"confirm_static_ip": "AdGuard Home nakonfiguruje {{ip}} ako statickú IP adresu. Chcete pokračovať?",
|
||||
"list_updated": "{{count}} zoznam aktualizovaný",
|
||||
"list_updated_plural": "{{count}} zoznamov aktualizovaných"
|
||||
}
|
||||
@@ -23,6 +23,7 @@
|
||||
"form_error_ip6_format": "Neveljaven format IPv6",
|
||||
"form_error_ip_format": "Neveljaven format IP",
|
||||
"form_error_mac_format": "Neveljaven MAC format",
|
||||
"form_error_client_id_format": "Neveljaven format ID odjemalca",
|
||||
"form_error_positive": "Mora biti večja od 0",
|
||||
"form_error_negative": "Mora biti enako ali več kot 0",
|
||||
"dhcp_form_gateway_input": "IP prehoda",
|
||||
@@ -104,6 +105,11 @@
|
||||
"no_servers_specified": "Ni določenih strežnikov",
|
||||
"general_settings": "Splošne nastavitve",
|
||||
"dns_settings": "Nastavitve DNS",
|
||||
"dns_blocklists": "Seznam nedovoljenih DNS",
|
||||
"dns_allowlists": "Seznam dovoljenih DNS",
|
||||
"dns_blocklists_desc": "AdGuard Home bo onemogočil domene, ki ustrezajo seznamom.",
|
||||
"dns_allowlists_desc": "Domene i dovoljenih seznamov DNS bodo dovoljene, tudi če so na katerem koli od seznamov nedovoljenih.",
|
||||
"custom_filtering_rules": "Pravila filtriranja po meri",
|
||||
"encryption_settings": "Nastavitve šifriranja",
|
||||
"dhcp_settings": "Nastavitve DHCP",
|
||||
"upstream_dns": "Zagonski DNS strežniki",
|
||||
@@ -121,22 +127,28 @@
|
||||
"enabled_save_search_toast": "Omogočeno varno iskanje",
|
||||
"enabled_table_header": "Omogočeno",
|
||||
"name_table_header": "Ime",
|
||||
"filter_url_table_header": "Filter URL",
|
||||
"list_url_table_header": "Seznam URL naslovov",
|
||||
"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",
|
||||
"no_blocklist_added": "Ni dodanih nobenih seznamov nedovoljenih",
|
||||
"no_whitelist_added": "Ni dodanih nobenih dovoljenih seznamov",
|
||||
"add_blocklist": "Dodaj seznam nedovoljenih",
|
||||
"add_allowlist": "Dodaj seznam dovoljenih",
|
||||
"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.",
|
||||
"check_updates_btn": "Preveri obstoj posodobitev",
|
||||
"new_blocklist": "Nov seznam nedovoljenih",
|
||||
"new_allowlist": "Nov seznam dovoljenih",
|
||||
"edit_blocklist": "Uredi seznam nedovoljenih",
|
||||
"edit_allowlist": "Uredi seznam dovoljenih",
|
||||
"enter_valid_blocklist": "Vnesite veljaven URL naslov seznama nedovoljenih.",
|
||||
"enter_valid_allowlist": "Vnesite veljaven URL naslov seznama dovoljenih.",
|
||||
"form_error_url_format": "Neveljaven format Url",
|
||||
"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",
|
||||
@@ -146,13 +158,13 @@
|
||||
"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_regex_meaning": "onemogoča dostop do domen, ki se ujemajo z določenim regularnim izrazom",
|
||||
"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",
|
||||
"all_lists_up_to_date_toast": "Vsi seznami 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",
|
||||
@@ -172,7 +184,6 @@
|
||||
"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",
|
||||
@@ -190,6 +201,7 @@
|
||||
"query_log_retention_confirm": "Ali ste prepričani, da želite spremeniti zadrževanje dnevnika poizvedb? Če zmanjšate vrednost intervala, bodo nekateri podatki izgubljeni",
|
||||
"dns_config": "Konfiguracija strežnika DNS",
|
||||
"blocking_mode": "Način zaviranja",
|
||||
"default": "Privzeto",
|
||||
"nxdomain": "NXDOMAIN",
|
||||
"null_ip": "Prazen IP",
|
||||
"custom_ip": "IP po meri",
|
||||
@@ -202,13 +214,16 @@
|
||||
"rate_limit_desc": "Število zahtev na sekundo, ki jih lahko pošlje posamezni odjemalec (0: neomejeno)",
|
||||
"blocking_ipv4_desc": "IP naslov, ki mora biti vrnjen za onemogočeno zahtevo A",
|
||||
"blocking_ipv6_desc": "IP naslov, ki mora biti vrnjen za onemogočeno zahtevo AAAA",
|
||||
"blocking_mode_desc": "<0>NXDOMAIN – Odziva se s kodo NXDOMAIN;</0> <0>Prazen IP – Odziva se z ničelnim naslovom IP (0,0.0,0 za A; :: za AAAA);</0> <0>IP po meri - Odziva se z ročno nastavljenim IP naslovom.</0>",
|
||||
"blocking_mode_default": "Privzeto: odziv z NXDOMAIN, kadar je onemogočen s slogom pravila zaviranja oglasov; odziv z navedenim naslovom IP v pravilu, kadar je onemogočen s pravilom /etc/gostitelji",
|
||||
"blocking_mode_nxdomain": "NXDOMAIN: Odziv s kodo NXDOMAIN",
|
||||
"blocking_mode_null_ip": "Prazen IP: Odziv z ničelnim naslovom IP (0.0.0.0 za A; :: za AAAA)",
|
||||
"blocking_mode_custom_ip": "IP po meri: Odziv z ročno nastavljenim naslovom IP",
|
||||
"upstream_dns_client_desc": "Če pustite to polje prazno, bo AdGuard Home uporabil strežnike, konfigurirane v <0>nastavitvah DNS</0>.",
|
||||
"source_label": "Vir",
|
||||
"found_in_known_domain_db": "Najdeno v zbirki podatkov znanih domen.",
|
||||
"category_label": "Kategorija",
|
||||
"rule_label": "Pravilo",
|
||||
"filter_label": "Filter",
|
||||
"list_label": "Seznam",
|
||||
"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.",
|
||||
@@ -320,7 +335,7 @@
|
||||
"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>",
|
||||
"client_identifier_desc": "Odjemalce je mogoče identificirati po naslovu IP, CIDR, MAC naslovu. Upoštevajte, da je uporaba MAC kot identifikatorja mogoča le, če je AdGuard Home tudi <0>strežnik DHCP</0>",
|
||||
"form_enter_ip": "Vnesite IP",
|
||||
"form_enter_mac": "Vnesite MAC",
|
||||
"form_enter_id": "Vnesi identifikatorja",
|
||||
@@ -332,7 +347,7 @@
|
||||
"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?",
|
||||
"list_confirm_delete": "Ali ste prepričani, da želite izbrisati ta seznam?",
|
||||
"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",
|
||||
@@ -371,6 +386,7 @@
|
||||
"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": "Vnesite domeno ali nadomestni znak",
|
||||
"form_answer": "Vnesite IP naslov ali ime domene",
|
||||
"form_error_domain_format": "Neveljavna oblika domene",
|
||||
"form_error_answer_format": "Neveljavna oblika odgovora",
|
||||
@@ -397,7 +413,8 @@
|
||||
"interval_days_plural": "{{count}} dni",
|
||||
"domain": "Domena",
|
||||
"answer": "Odgovor",
|
||||
"filter_added_successfully": "Filter je bil uspešno dodan",
|
||||
"filter_added_successfully": "Seznam je bil uspešno dodan",
|
||||
"filter_updated": "Filter je bil uspešno posodobljen",
|
||||
"statistics_configuration": "Konfiguracija statistike",
|
||||
"statistics_retention": "Statistika zadrževanja",
|
||||
"statistics_retention_desc": "Če zmanjšate vrednost intervala, bodo nekateri podatki izgubljeni",
|
||||
@@ -405,7 +422,7 @@
|
||||
"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": "{{count}} ur",
|
||||
"interval_hours_plural": "{{count}} ur",
|
||||
"filters_configuration": "Konfiguracija filtrov",
|
||||
"filters_enable": "Omogoči filtre",
|
||||
@@ -426,5 +443,41 @@
|
||||
"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",
|
||||
"try_again": "Poskusi ponovno"
|
||||
"try_again": "Poskusi ponovno",
|
||||
"domain_desc": "Vnesite ime domene ali nadomestni znak, ki ga želite prepisati.",
|
||||
"example_rewrite_domain": "prepiše odgovore samo za to ime domene.",
|
||||
"example_rewrite_wildcard": "prepiše odgovore za vse poddomene <0>example.org</0>.",
|
||||
"disable_ipv6": "Onemogoči IPv6",
|
||||
"disable_ipv6_desc": "Če je ta funkcija omogočena, bodo vse poizvedbe DNS za naslove IPv6 (vrste AAAA) izpadle.",
|
||||
"autofix_warning_text": "Če kliknete 'Popravi', bo AdGuardHome konfiguriral vaš sistem za uporabo strežnika AdGuardHome DNS.",
|
||||
"autofix_warning_list": "To bo izvedlo naslednja opravila: <0>Deaktiviraj sistemski DNSStubListener</0> <0>Nastavi naslov strežnika DNS na 127.0.0.1</0> <0>Zamenjaj cilj simbolične povezave /etc/resolv.conf with /run/systemd/resolve/resolv.conf</0> <0>Zaustavi DNSStubListener (znova naloži storitev systemd-resolved)",
|
||||
"autofix_warning_result": "Kot rezultat, bo vse zahteve DNS iz vašega sistema privzeto obdelal AdGuard Home.",
|
||||
"tags_title": "Oznake",
|
||||
"tags_desc": "Izberete lahko oznake, ki ustrezajo odjemalcu. Oznake lahko vključite v pravila filtriranja in vam omogočajo, da jih natančneje uporabite. <0>Več o tem</0>",
|
||||
"form_select_tags": "Izberite odjemalske oznake",
|
||||
"check_title": "Preveri filtriranje",
|
||||
"check_desc": "Preverite, ali je ime gostitelja filtrirano",
|
||||
"check": "Preveri",
|
||||
"form_enter_host": "Vnesite ime gostitelja",
|
||||
"filtered_custom_rules": "Filtrirano s pravili filtriranja po meri",
|
||||
"host_whitelisted": "Gostitelj je na seznamu dovoljenih",
|
||||
"check_ip": "IP naslovi: {{ip}}",
|
||||
"check_cname": "CNAME: {{cname}}",
|
||||
"check_reason": "Razlog: {{reason}}",
|
||||
"check_rule": "Pravilo: {{rule}}",
|
||||
"check_service": "Ime storitve: {{service}}",
|
||||
"check_not_found": "Ni najdeno na vašem seznamu filtrov",
|
||||
"client_confirm_block": "Ali ste prepričani, da želite onemogočiti odjemalca \"{{ip}}\"?",
|
||||
"client_confirm_unblock": "Ali ste prepričani, da želite omogočiti odjemalca \"{{ip}}\"?",
|
||||
"client_blocked": "Odjemalec \"{{ip}}\" je uspešno onemogočen",
|
||||
"client_unblocked": "Odjemalec \"{{ip}}\" je uspešno omogočen",
|
||||
"static_ip": "Statičen IP naslov",
|
||||
"static_ip_desc": "AdGuard Home je strežnik, zato za pravilno delovanje potrebuje statičen IP naslov. V nasprotnem primeru lahko vaš usmerjevalnik tej napravi v nekem trenutku dodeli drug IP naslov.",
|
||||
"set_static_ip": "Nastavi statičen IP naslov",
|
||||
"install_static_ok": "Dobra novica! Statičen IP naslov je že konfiguriran",
|
||||
"install_static_error": "AdGuard Home tega omrežnega vmesnika ne more samodejno konfigurirati. Poiščite navodila, kako to storiti ročno.",
|
||||
"install_static_configure": "Zaznali smo, da je uporabljen dinamičen IP naslov — <0>{{ip}}</0>. Ali ga želite uporabiti kot svoj statičen naslov?",
|
||||
"confirm_static_ip": "AdGuard Home bo konfiguriral {{ip}}, da bo postal vas statičen IP naslov. Ali želite nadaljevati?",
|
||||
"list_updated": "{{count}} posodobljen seznam",
|
||||
"list_updated_plural": "{{count}} posodobljenih seznamov"
|
||||
}
|
||||
@@ -23,6 +23,7 @@
|
||||
"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_client_id_format": "Nevažeći format klijenta",
|
||||
"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",
|
||||
@@ -104,6 +105,11 @@
|
||||
"no_servers_specified": "Serveri nisu određeni",
|
||||
"general_settings": "Opšte postavke",
|
||||
"dns_settings": "DNS postavke",
|
||||
"dns_blocklists": "DNs blok liste",
|
||||
"dns_allowlists": "DNS dozvoljene liste",
|
||||
"dns_blocklists_desc": "AdGuard Home će blokirati domene koji se poklapaju sa blok listama.",
|
||||
"dns_allowlists_desc": "Domeni sa liste dozvoljenih će uvek biti dozvoljeni, čak iako se neki od njih nalazi na blok listi.",
|
||||
"custom_filtering_rules": "Prilagođena pravila filtriranja",
|
||||
"encryption_settings": "Postavke šifrovanja",
|
||||
"dhcp_settings": "DHCP postavke",
|
||||
"upstream_dns": "Upstream DNS serveri",
|
||||
@@ -121,22 +127,28 @@
|
||||
"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",
|
||||
"list_url_table_header": "URL do liste",
|
||||
"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",
|
||||
"no_blocklist_added": "Blok liste nisu dodate",
|
||||
"no_whitelist_added": "Liste dozvoljenih nisu dodate",
|
||||
"add_blocklist": "Dodaj blok listu",
|
||||
"add_allowlist": "Dodaj listu dozvoljenih",
|
||||
"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.",
|
||||
"new_blocklist": "Nova blok lista",
|
||||
"new_allowlist": "Nova lista dozvoljenih",
|
||||
"edit_blocklist": "Uredi blok listu",
|
||||
"edit_allowlist": "Uredi listu dozvoljenih",
|
||||
"enter_valid_blocklist": "Unesite važeći URL do blok liste.",
|
||||
"enter_valid_allowlist": "Unesite važeći URL do liste dozvoljenih.",
|
||||
"form_error_url_format": "Nevažeći format Url-a",
|
||||
"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",
|
||||
@@ -152,7 +164,7 @@
|
||||
"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",
|
||||
"all_lists_up_to_date_toast": "Sve liste su već ažurirane",
|
||||
"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",
|
||||
@@ -172,7 +184,6 @@
|
||||
"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",
|
||||
@@ -190,6 +201,7 @@
|
||||
"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",
|
||||
"default": "Podrazumevano",
|
||||
"nxdomain": "NXDOMAIN",
|
||||
"null_ip": "Null IP",
|
||||
"custom_ip": "Prilagođeni IP",
|
||||
@@ -202,13 +214,16 @@
|
||||
"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",
|
||||
"blocking_mode_default": "Podrazumevano: Odgovara sa NXDOMAIN kada je blokirano od Adblock-style pravila; odgovara sa IP adresom koja je određena u pravilu kada je blokiran od /etc/hosts-style pravila",
|
||||
"blocking_mode_nxdomain": "NXDOMAIN: Odgovara sa NXDOMAIN kodom",
|
||||
"blocking_mode_null_ip": "Null IP: Odgovara sa zero IP adresom (0.0.0.0 za A; :: za AAAA)",
|
||||
"blocking_mode_custom_ip": "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",
|
||||
"list_label": "Lista",
|
||||
"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.",
|
||||
@@ -332,7 +347,7 @@
|
||||
"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?",
|
||||
"list_confirm_delete": "Jeste li sigurni da želite da izbrišete ovu listu?",
|
||||
"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",
|
||||
@@ -371,6 +386,7 @@
|
||||
"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",
|
||||
@@ -398,6 +414,7 @@
|
||||
"domain": "Domen",
|
||||
"answer": "Odgovor",
|
||||
"filter_added_successfully": "Filter je uspešno dodat",
|
||||
"filter_updated": "Filter je uspešno ažuriran",
|
||||
"statistics_configuration": "Konfiguracija statistike",
|
||||
"statistics_retention": "Zadržavanje statistike",
|
||||
"statistics_retention_desc": "Ako smanjite vrednost intervala, neki podaci će biti izgubljeni",
|
||||
@@ -426,5 +443,41 @@
|
||||
"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"
|
||||
"try_again": "Pokušaj ponovo",
|
||||
"domain_desc": "Unesite domen ili džoker koji želite da prepišete.",
|
||||
"example_rewrite_domain": "prepiši odgovore samo za ovaj domen.",
|
||||
"example_rewrite_wildcard": "prepiši odgovore za sve poddomene na <0>example.org</0>.",
|
||||
"disable_ipv6": "Isključi IPv6",
|
||||
"disable_ipv6_desc": "Ako je ovo uključeno, svi DNS unosi za IPv6 adrese (type AAAA) će biti odbačeni.",
|
||||
"autofix_warning_text": "Ako kliknete \"Popravi\", AdGuardHome će konfigurisati vaš sistem da koristi AdGuardHome DNS server.",
|
||||
"autofix_warning_list": "To će izvršiti sledeće zadatke: <0>Deaktiviranje system DNSStubListener</0> <0>Set DNS server address to 127.0.0.1</0> <0>Replace symbolic link target of /etc/resolv.conf to /run/systemd/resolve/resolv.conf</0> <0>Stop DNSStubListener (reload systemd-resolved service)</0>",
|
||||
"autofix_warning_result": "Kao rezultat, svi DNS zahtevi sa vašeg sistema će biti obrađeni od AdGuardHome.",
|
||||
"tags_title": "Oznake",
|
||||
"tags_desc": "Možete izabrati oznake koje odgovaraju klijentu. Oznake mogu biti uključene u pravila filtriranja i dozvoljavaju vam da ih preciznije primenite. <0>Saznajte više</0>",
|
||||
"form_select_tags": "Izaberite oznake klijenta",
|
||||
"check_title": "Proverite filtriranje",
|
||||
"check_desc": "Proverite da li je host filtriran",
|
||||
"check": "Proveri",
|
||||
"form_enter_host": "Unesite host",
|
||||
"filtered_custom_rules": "Filtrirano od strane prilagođenog pravila",
|
||||
"host_whitelisted": "Host je na beloj listi",
|
||||
"check_ip": "IP adrese: {{ip}}",
|
||||
"check_cname": "CNAME: {{cname}}",
|
||||
"check_reason": "Razlog: {{reason}}",
|
||||
"check_rule": "Pravilo: {{rule}}",
|
||||
"check_service": "Ime usluge: {{service}}",
|
||||
"check_not_found": "Nije pronađeno na vašoj listi filtera",
|
||||
"client_confirm_block": "Jeste li sigurni da želite da blokirate klijent \"{{ip}}\"?",
|
||||
"client_confirm_unblock": "Jeste li sigurni da želite da odblokirate klijent \"{{ip}}\"?",
|
||||
"client_blocked": "Klijent \"{{ip}}\" uspešno blokiran",
|
||||
"client_unblocked": "Klijent \"{{ip}}\" uspešno odblokiran",
|
||||
"static_ip": "Statička IP adresa",
|
||||
"static_ip_desc": "AdGuard Home je server pa mu je zbog toga potrebna statička IP aadresa kako bi ispravno radio. Ako je nema, u nekim slučajevima, vaš ruter može dodeliti drugu IP adresu ovom uređaju.",
|
||||
"set_static_ip": "Postavite statičku IP adresu",
|
||||
"install_static_ok": "Dobre vesti! Statička IP adresa je već konfigurisana",
|
||||
"install_static_error": "AdGuard Home se ne može automatski konfigurisati za ovo mrežno okruženje. Pogledajte uputstvo kako da to ručno uradite.",
|
||||
"install_static_configure": "Otkrili smo da se koristi dinamička IP adresa — <0>{{ip}}</0>. Želite li da je koristite kao vašu statičku adresu?",
|
||||
"confirm_static_ip": "AdGuard Home će konfigurisati {{ip}} da bude vaša statička IP adresa. Želite li da nastavite?",
|
||||
"list_updated": "{{count}} lista ažurirana",
|
||||
"list_updated_plural": "{{count}} lista ažurirano"
|
||||
}
|
||||
@@ -116,22 +116,16 @@
|
||||
"enabled_save_search_toast": "Säker webbsökning inkopplat",
|
||||
"enabled_table_header": "Inkopplat",
|
||||
"name_table_header": "Namn",
|
||||
"filter_url_table_header": "Filtrerar URL",
|
||||
"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",
|
||||
"no_filters_added": "Inga filter tillagda",
|
||||
"add_filter_btn": "Lägg till filter",
|
||||
"cancel_btn": "Avbryt",
|
||||
"enter_name_hint": "Skriv in namn",
|
||||
"enter_url_hint": "Skriv in URL",
|
||||
"check_updates_btn": "Sök efter uppdateringar",
|
||||
"new_filter_btn": "Nytt filterabonemang",
|
||||
"enter_valid_filter_url": "Skriv in en giltigt URL till ett filterabonnemang eller värdfil.",
|
||||
"custom_filter_rules": "Egna filterregler",
|
||||
"custom_filter_rules_hint": "Skriv en regel per rad. Du kan använda antingen annonsblockeringsregler eller värdfilssyntax.",
|
||||
"examples_title": "Exempel",
|
||||
@@ -147,7 +141,6 @@
|
||||
"example_upstream_doh": "krypterat <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a>",
|
||||
"example_upstream_sdns": "Du kan använda <a href='https://dnscrypt.info/stamps/' target='_blank'>DNS-stamps</a> för <a href='https://dnscrypt.info/' target='_blank'>DNSCrypt</a> eller <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-över-HTTPS</a>\n-resolvers",
|
||||
"example_upstream_tcp": "vanlig DNS (över UDP)",
|
||||
"all_filters_up_to_date_toast": "Alla filter är redan aktuella",
|
||||
"updated_upstream_dns_toast": "Uppdaterade uppströms-dns-servrar",
|
||||
"dns_test_ok_toast": "Angivna DNS servrar fungerar korrekt",
|
||||
"dns_test_not_ok_toast": "Server \"{{key}}\": kunde inte användas. Var snäll och kolla att du skrivit in rätt",
|
||||
@@ -167,7 +160,6 @@
|
||||
"next_btn": "Nästa",
|
||||
"loading_table_status": "Läser in...",
|
||||
"page_table_footer_text": "Sida",
|
||||
"of_table_footer_text": "av",
|
||||
"rows_table_footer_text": "rader",
|
||||
"updated_custom_filtering_toast": "Uppdaterade de egna filterreglerna",
|
||||
"rule_removed_from_custom_filtering_toast": "Regel borttagen från de egna filterreglerna",
|
||||
@@ -187,7 +179,6 @@
|
||||
"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.",
|
||||
@@ -307,7 +298,6 @@
|
||||
"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",
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
"form_error_ip6_format": "Geçersiz IPv6 formatı",
|
||||
"form_error_ip_format": "Geçersiz IPv4 formatı",
|
||||
"form_error_mac_format": "Geçersiz MAC biçimi",
|
||||
"form_error_client_id_format": "Geçersiz müşteri kimliği formatı",
|
||||
"form_error_positive": "0'dan büyük olmalı",
|
||||
"form_error_negative": "0 veya daha büyük olmalıdır",
|
||||
"dhcp_form_gateway_input": "Ağ Geçidi IP'si",
|
||||
@@ -75,7 +76,7 @@
|
||||
"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": "son {{count}} gün için",
|
||||
"for_last_days_plural": "son {{count}} gün boyunca",
|
||||
"no_domains_found": "Alan adı bulunamadı",
|
||||
"requests_count": "İstek sayısı",
|
||||
@@ -83,7 +84,7 @@
|
||||
"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": "Son {{count}} gün boyunca işlenen DNS sorgularının sayısı",
|
||||
"number_of_dns_query_days_plural": "Son {{count}} gün boyunca işlenen DNS sorgularının sayısı",
|
||||
"number_of_dns_query_24_hours": "Son 24 saat içinde işlenen DNS sorgularının sayısı",
|
||||
"number_of_dns_query_blocked_24_hours": "Reklam engelleme filtreleri ve hosts listeleri tarafından engellenmiş DNS isteklerinin sayısı",
|
||||
@@ -104,6 +105,11 @@
|
||||
"no_servers_specified": "Sunucu adresi girilmedi",
|
||||
"general_settings": "Genel ayarlar",
|
||||
"dns_settings": "DNS ayarları",
|
||||
"dns_blocklists": "DNS blok listeleri",
|
||||
"dns_allowlists": "DNS izin listeleri",
|
||||
"dns_blocklists_desc": "AdGuard Home, blok listelerle eşleşen alanları engeller.",
|
||||
"dns_allowlists_desc": "DNS izin listelerindeki alanlara, engelleme listelerinden birinde olsalar bile izin verilir.",
|
||||
"custom_filtering_rules": "Özel filtreleme kuralları",
|
||||
"encryption_settings": "Şifreleme ayarları",
|
||||
"dhcp_settings": "DHCP ayarları",
|
||||
"upstream_dns": "Üst DNS sunucusu",
|
||||
@@ -121,22 +127,28 @@
|
||||
"enabled_save_search_toast": "Güvenli arama çalışıyor",
|
||||
"enabled_table_header": "Etkin",
|
||||
"name_table_header": "İsim",
|
||||
"filter_url_table_header": "Filtre URL'si",
|
||||
"list_url_table_header": "Liste 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",
|
||||
"no_blocklist_added": "Hiçbir blok listesi eklenmedi",
|
||||
"no_whitelist_added": "Hiçbir izin listesi eklenmedi",
|
||||
"add_blocklist": "Engelleme listesi ekle",
|
||||
"add_allowlist": "İzin listesi 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.",
|
||||
"new_blocklist": "Yeni engelleme listesi",
|
||||
"new_allowlist": "Yeni izin listesi",
|
||||
"edit_blocklist": "Engelleme listesini düzenle",
|
||||
"edit_allowlist": "İzin listesini düzenle",
|
||||
"enter_valid_blocklist": "Engelleme listesine geçerli bir URL girin.",
|
||||
"enter_valid_allowlist": "İzin listesine geçerli bir URL girin.",
|
||||
"form_error_url_format": "Geçersiz url biçim",
|
||||
"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",
|
||||
@@ -152,7 +164,7 @@
|
||||
"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",
|
||||
"all_lists_up_to_date_toast": "Tüm listeler zaten güncel",
|
||||
"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",
|
||||
@@ -172,7 +184,6 @@
|
||||
"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ı",
|
||||
@@ -190,6 +201,7 @@
|
||||
"query_log_retention_confirm": "Sorgu günlüğü saklama süresini değiştirmek istediğinize emin misiniz? Aralık değerini azaltırsanız, bazı veriler kaybolacaktır",
|
||||
"dns_config": "DNS sunucusu yapılandırması",
|
||||
"blocking_mode": "Engelleme modu",
|
||||
"default": "Varsayılan",
|
||||
"nxdomain": "NXDOMAIN",
|
||||
"null_ip": "Boş IP",
|
||||
"custom_ip": "Özel IP",
|
||||
@@ -202,13 +214,16 @@
|
||||
"rate_limit_desc": "Tek bir istemcinin saniye başına yapmasına izin verilen istek sayısı (0: sınırsız)",
|
||||
"blocking_ipv4_desc": "Engellenen bir A isteği için geri döndürülecek IP adresi",
|
||||
"blocking_ipv6_desc": "Engellenen bir AAAA isteği için geri döndürülecek IP adresi",
|
||||
"blocking_mode_desc": "<0>NXDOMAIN – NXDOMAIN ile yanıtla code;</0> <0> Boş IP – Sıfır IP adresi ile cevap verin (A için 0.0.0.0; :: AAAA için); </0> <0> Özel IP - Elle ayarlanmış bir IP adresi ile cevap verin.</0>",
|
||||
"blocking_mode_default": "Varsayılan: Adblock tarzı kural tarafından engellendiğinde NXDOMAIN ile yanıt verin; / etc / hosts-style kuralı tarafından engellendiğinde kuralda belirtilen IP adresiyle yanıt ver",
|
||||
"blocking_mode_nxdomain": "NXDOMAIN: NXDOMAIN koduyla yanıt",
|
||||
"blocking_mode_null_ip": "Boş IP: Sıfır IP adresiyle yanıtlayın (A için 0.0.0.0; :: AAAA için)",
|
||||
"blocking_mode_custom_ip": "Özel IP: Manuel olarak ayarlanmış bir IP adresiyle yanıt verin",
|
||||
"upstream_dns_client_desc": "Bu alanı boş tutarsanız, AdGuard Home, <0>DNS ayarlarında</0> yapılandırılmış sunucuları kullanır.",
|
||||
"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",
|
||||
"list_label": "Liste",
|
||||
"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.",
|
||||
@@ -332,7 +347,7 @@
|
||||
"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?",
|
||||
"list_confirm_delete": "Bu listeyi 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ı",
|
||||
@@ -394,11 +409,12 @@
|
||||
"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": "{{count}} gün",
|
||||
"interval_days_plural": "{{count}} gün",
|
||||
"domain": "Alan adı",
|
||||
"answer": "Cevap",
|
||||
"filter_added_successfully": "Filtre başarıyla eklendi",
|
||||
"filter_updated": "Filtre başarıyla güncellendi",
|
||||
"statistics_configuration": "İstatistik yapılandırması",
|
||||
"statistics_retention": "İstatistikleri depolama",
|
||||
"statistics_retention_desc": "Zaman değerini azaltırsanız bazı veriler kaybolacaktır",
|
||||
@@ -427,5 +443,40 @@
|
||||
"whois": "Whois",
|
||||
"filtering_rules_learn_more": "Ana makinelere dair kendi kara listelerinizi oluşturmakla alakalı <0>daha fazla bilgi edinin</0>.",
|
||||
"blocked_by_response": "Cevap olarak CNAME veya IP tarafından engellendi",
|
||||
"try_again": "Tekrar deneyin"
|
||||
"try_again": "Tekrar deneyin",
|
||||
"domain_desc": "Yeniden yazılmasını istediğiniz alan adını veya joker karakteri girin.",
|
||||
"example_rewrite_domain": "cevapları yalnızca bu alan adı için yeniden yaz.",
|
||||
"example_rewrite_wildcard": "tüm <0>example.org</0> alt alanları için cevapları yeniden yaz.",
|
||||
"disable_ipv6": "IPv6'yı Devre Dışı Bırak",
|
||||
"disable_ipv6_desc": "Bu özelliği etkinleştirirseniz, IPv6 adresleri (AAAA tipi) için gönderilen tüm DNS istekleri cevapsız bırakılacaktır.",
|
||||
"autofix_warning_text": "\"Düzelt\" i tıklatırsanız, AdGuardHome sisteminizi AdGuardHome DNS sunucusunu kullanacak şekilde yapılandırır.",
|
||||
"autofix_warning_list": "Bu görevleri gerçekleştirecektir: <0> sistemi DNSStubListener'ı devre dışı bırakma </0> <0> DNS sunucu adresini 127.0.0.1 olarak ayarlayın </0> <0> /etc/resolv.conf / / run / systemd sembolik bağlantı hedefini değiştirin /resolve/resolv.conf </0> <0> durdur DNSStubListener (sistemde yeniden çözülmüş hizmeti yeniden yükle) </0>",
|
||||
"autofix_warning_result": "Sonuç olarak, sisteminizden gelen tüm DNS istekleri varsayılan olarak AdGuardHome tarafından işlenir.",
|
||||
"tags_title": "Etiketler",
|
||||
"tags_desc": "İstemciye karşılık gelen etiketleri seçebilirsiniz. Etiketler, filtreleme kurallarına dahil edilebilir ve bunları daha doğru bir şekilde uygulamanıza olanak tanır. <0> Daha fazla bilgi edinin </0>",
|
||||
"form_select_tags": "Müşteri etiketlerini seçin",
|
||||
"check_title": "Filtrelemeyi kontrol edin",
|
||||
"check_desc": "Ana bilgisayar adının filtrelenip filtrelenmediğini kontrol edin",
|
||||
"check": "Kontrol",
|
||||
"form_enter_host": "Bir ana bilgisayar adı girin",
|
||||
"filtered_custom_rules": "Özel filtreleme kurallarına göre filtrelendi",
|
||||
"host_whitelisted": "Ana makine beyaz listeye alındı",
|
||||
"check_ip": "IP adresleri: {{ip}}",
|
||||
"check_cname": "CNAME: {{cname}}",
|
||||
"check_rule": "Kural: {{rule}}",
|
||||
"check_service": "Hizmet adı: {{service}}",
|
||||
"check_not_found": "Filtre listelerinizde bulunamadı",
|
||||
"client_confirm_block": "\"{{ip}}\" istemcisini engellemek istediğinizden emin misiniz?",
|
||||
"client_confirm_unblock": "\"{{ip}}\" istemcisinin engellemesini kaldırmak istediğinizden emin misiniz?",
|
||||
"client_blocked": "\"{{ip}}\" istemcisi başarıyla engellendi",
|
||||
"client_unblocked": "\"{{ip}}\" müşterisinin engellemesi başarıyla kaldırıldı",
|
||||
"static_ip": "Statik IP adres",
|
||||
"static_ip_desc": "AdGuard Home bir sunucudur, bu nedenle düzgün çalışması için statik bir IP adresine ihtiyaç duyar. Aksi takdirde, bir noktada yönlendiriciniz bu cihaza farklı bir IP adresi atayabilir.",
|
||||
"set_static_ip": "Statik IP adresi ayarlama",
|
||||
"install_static_ok": "İyi haberler! Statik IP adresi zaten yapılandırılmış",
|
||||
"install_static_error": "AdGuard Home, bu ağ arayüzü için otomatik olarak yapılandıramaz. Lütfen bunu manuel olarak nasıl yapacağınıza ilişkin bir talimat arayın.",
|
||||
"install_static_configure": "Dinamik bir IP adresi kullanıldığını tespit ettik - <0> {{ip}} </0>. Statik adresiniz olarak kullanmak ister misiniz?",
|
||||
"confirm_static_ip": "AdGuard Home, {{ip}} adresini statik IP adresiniz olacak şekilde yapılandıracak. Devam etmek istiyor musunuz?",
|
||||
"list_updated": "{{count}} liste güncellendi",
|
||||
"list_updated_plural": "{{count}} liste güncellendi"
|
||||
}
|
||||
@@ -19,18 +19,38 @@
|
||||
"dhcp_leases_not_found": "Không tìm thấy DHCP cho thuê",
|
||||
"dhcp_config_saved": "Đã lưu cấu hình máy chủ DHCP",
|
||||
"form_error_required": "Trường bắt buộc",
|
||||
"form_error_ip4_format": "Định dạng IPv4 không hợp lệ",
|
||||
"form_error_ip6_format": "Định dạng IPv6 không hợp lệ",
|
||||
"form_error_ip_format": "Định dạng IPv4 không hợp lệ",
|
||||
"form_error_mac_format": "Định dạng MAC không hợp lệ",
|
||||
"form_error_client_id_format": "Định dạng client ID không hợp lệ",
|
||||
"form_error_positive": "Phải lớn hơn 0",
|
||||
"form_error_negative": "Phải lớn hơn hoặc bằng 0",
|
||||
"dhcp_form_gateway_input": "Cổng IP",
|
||||
"dhcp_form_subnet_input": "Mặt nạ mạng con",
|
||||
"dhcp_form_range_title": "Phạm vi của địa chỉ IP",
|
||||
"dhcp_form_range_start": "Phạm vi bắt đầu",
|
||||
"dhcp_form_range_end": "IP kết thúc",
|
||||
"dhcp_form_lease_title": "Thời gian thuê DHCP (tính bằng giây)",
|
||||
"dhcp_form_lease_input": "Thời hạn thuê",
|
||||
"dhcp_interface_select": "Chọn một card mạng",
|
||||
"dhcp_hardware_address": "Địa chỉ phần cứng",
|
||||
"dhcp_ip_addresses": "Các địa chỉ IP",
|
||||
"dhcp_table_hostname": "Tên máy chủ",
|
||||
"dhcp_table_expires": "Hết hạn",
|
||||
"dhcp_warning": "Nếu bạn vẫn muốn bật máy chủ DHCP, hãy đảm bảo rằng không có máy chủ DHCP hoạt động nào khác trong mạng của bạn. Nếu không, nó có thể phá vỡ Internet cho các thiết bị được kết nối!",
|
||||
"dhcp_error": "Chúng tôi không thể xác định liệu có một máy chủ DHCP khác trong mạng hay không.",
|
||||
"dhcp_static_ip_error": "Để sử dụng máy chủ DHCP, phải đặt địa chỉ IP tĩnh. Chúng tôi không thể xác định xem giao diện mạng này có được cấu hình bằng địa chỉ IP tĩnh hay không. Vui lòng đặt địa chỉ IP tĩnh theo cách thủ công.",
|
||||
"dhcp_dynamic_ip_found": "Hệ thống của bạn sử dụng cấu hình địa chỉ IP động cho giao diện <0>{{interfaceName}}</0>. Để sử dụng máy chủ DHCP, phải đặt địa chỉ IP tĩnh. Địa chỉ IP hiện tại của bạn là <0>{{ipAddress}}</0>. Chúng tôi sẽ tự động đặt địa chỉ IP này thành tĩnh nếu bạn nhấn nút Bật DHCP.",
|
||||
"dhcp_lease_added": "Cho thuê tĩnh \"{{key}}\" đã được thêm thành công",
|
||||
"dhcp_lease_deleted": "Cho thuê tĩnh \"{{key}}\" đã xóa thành công",
|
||||
"dhcp_new_static_lease": "Cho thuê tĩnh mới",
|
||||
"dhcp_static_leases_not_found": "Không tìm thấy DHCP cho thuê tĩnh",
|
||||
"dhcp_add_static_lease": "Thêm thuê tĩnh",
|
||||
"dhcp_reset": "Bạn có chắc chắn muốn đặt lại thiết lập DHCP?",
|
||||
"delete_confirm": "Bạn có chắc chắn muốn xóa \"{{key}}\" không?",
|
||||
"form_enter_hostname": "Nhập tên máy chủ",
|
||||
"error_details": "Chi tiết lỗi",
|
||||
"back": "Quay lại",
|
||||
"dashboard": "Tổng quan",
|
||||
"settings": "Cài đặt",
|
||||
@@ -44,22 +64,29 @@
|
||||
"copyright": "Bản quyền",
|
||||
"homepage": "Trang chủ",
|
||||
"report_an_issue": "Báo lỗi",
|
||||
"privacy_policy": "Chính sách riêng tư",
|
||||
"enable_protection": "Bật bảo vệ",
|
||||
"enabled_protection": "Đã bật bảo vệ",
|
||||
"disable_protection": "Tắt bảo vệ",
|
||||
"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",
|
||||
"for_last_24_hours": "trong 24 giờ qua",
|
||||
"for_last_days": "trong {{count}} ngày qua",
|
||||
"for_last_days_plural": "trong {{count}} ngày qua",
|
||||
"no_domains_found": "Không có tên miền nào",
|
||||
"requests_count": "Số lần yêu cầu",
|
||||
"top_blocked_domains": "Tên miền chặn nhiều",
|
||||
"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_days": "Một số truy vấn DNS được xử lý trong {{count}} ngày qua",
|
||||
"number_of_dns_query_days_plural": "Một số truy vấn DNS được xử lý trong {{count}} ngày qua",
|
||||
"number_of_dns_query_24_hours": "Số yêu cầu DNS đã xử lý trong 24 giờ qua",
|
||||
"number_of_dns_query_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",
|
||||
@@ -74,9 +101,14 @@
|
||||
"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ê",
|
||||
"general_settings": "Cài đặt chung",
|
||||
"dns_settings": "Cài đặt DNS",
|
||||
"encryption_settings": "Cài đặt mã hóa",
|
||||
"dhcp_settings": "Cài đặt DHCP",
|
||||
"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",
|
||||
@@ -89,21 +121,16 @@
|
||||
"enabled_save_search_toast": "Đã bật tìm kiếm an toàn",
|
||||
"enabled_table_header": "Kích hoạt",
|
||||
"name_table_header": "Tên",
|
||||
"filter_url_table_header": "URL bộ lọc",
|
||||
"rules_count_table_header": "Số quy tắc",
|
||||
"last_time_updated_table_header": "Cập nhật cuối",
|
||||
"actions_table_header": "Thao tác",
|
||||
"edit_table_action": "Chỉnh sửa",
|
||||
"delete_table_action": "Xoá",
|
||||
"filters_and_hosts": "Danh sách bộ lọc và hosts",
|
||||
"filters_and_hosts_hint": "AdGuard home hiểu các quy tắc chặn quảng cáo đơn giản và cú pháp file hosts",
|
||||
"no_filters_added": "Không có bộ lọc nào được thêm",
|
||||
"add_filter_btn": "Thêm bộ lọc",
|
||||
"cancel_btn": "Huỷ",
|
||||
"enter_name_hint": "Nhập tên",
|
||||
"enter_url_hint": "Nhập URL",
|
||||
"check_updates_btn": "Kiểm tra cập nhật",
|
||||
"new_filter_btn": "Đăng ký bộ lọc mới",
|
||||
"enter_valid_filter_url": "Nhập URL hợp lệ của bộ lọc hoặc file hosts",
|
||||
"custom_filter_rules": "Quy tắc lọc tuỳ chỉnh",
|
||||
"custom_filter_rules_hint": "Nhập mỗi quy tắc 1 dòng. Có thể sử dụng quy tắc chặn quảng cáo hoặc cú pháp file host",
|
||||
"examples_title": "Ví dụ",
|
||||
@@ -113,12 +140,12 @@
|
||||
"example_comment": "! Đây là một chú thích",
|
||||
"example_comment_meaning": "Chỉ là một chú thích",
|
||||
"example_comment_hash": "# Cũng là một chú thích",
|
||||
"example_regex_meaning": "chặn quyền truy cập vào các miền khớp với <0>biểu thức chính được quy định</0>",
|
||||
"example_upstream_regular": "DNS thông thường (dùng UDP)",
|
||||
"example_upstream_dot": "được mã hoá <a href='https://en.wikipedia.org/wiki/DNS_over_TLS' target='_blank'>DNS-over-TLS</a>",
|
||||
"example_upstream_doh": "được mã hoá <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a>",
|
||||
"example_upstream_sdns": "bạn có thể sử dụng <a href='https://dnscrypt.info/stamps/' target='_blank'>DNS Stamps</a> for <a href='https://dnscrypt.info/' target='_blank'>DNSCrypt</a> hoặc<a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a> ",
|
||||
"example_upstream_tcp": "DNS thông thường(dùng TCP)",
|
||||
"all_filters_up_to_date_toast": "Tất cả bộ lọc đã được cập nhật",
|
||||
"updated_upstream_dns_toast": "Đã cập nhật máy chủ DNS tìm kiếm",
|
||||
"dns_test_ok_toast": "Máy chủ DNS có thể sử dụng",
|
||||
"dns_test_not_ok_toast": "Máy chủ \"\"': không thể sử dụng, vui lòng kiểm tra lại",
|
||||
@@ -138,19 +165,250 @@
|
||||
"next_btn": "Trang sau",
|
||||
"loading_table_status": "Đang tải...",
|
||||
"page_table_footer_text": "Trang",
|
||||
"of_table_footer_text": "của",
|
||||
"rows_table_footer_text": "hàng",
|
||||
"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_response_status": "Trạng thái: {{value}}",
|
||||
"query_log_filtered": "Được lọc bởi {{filter}}",
|
||||
"query_log_confirm_clear": "Bạn có chắc chắn muốn xóa toàn bộ nhật ký truy vấn không?",
|
||||
"query_log_cleared": "Nhật ký truy vấn đã được xóa thành công",
|
||||
"query_log_clear": "Xóa nhật ký truy vấn",
|
||||
"query_log_retention": "Lưu giữ nhật ký truy vấn",
|
||||
"query_log_enable": "Bật nhật ký",
|
||||
"query_log_configuration": "Cấu hình nhật ký",
|
||||
"query_log_disabled": "Nhật ký truy vấn bị vô hiệu hóa và có thể được định cấu hình trong <0>cài đặt</ 0>",
|
||||
"query_log_strict_search": "Sử dụng dấu ngoặc kép để tìm kiếm nghiêm ngặt",
|
||||
"query_log_retention_confirm": "Bạn có chắc chắn muốn thay đổi lưu giữ nhật ký truy vấn? Nếu bạn giảm giá trị khoảng, một số dữ liệu sẽ bị mất",
|
||||
"dns_config": "Thiết lập máy chủ DNS",
|
||||
"blocking_mode": "Chế độ chặn",
|
||||
"nxdomain": "NXDOMAIN",
|
||||
"null_ip": "Địa chỉ IP rỗng",
|
||||
"custom_ip": "IP tuỳ chỉnh",
|
||||
"blocking_ipv4": "Chặn IPv4",
|
||||
"blocking_ipv6": "Chặn IPv6",
|
||||
"form_enter_rate_limit": "Nhập giới hạn yêu cầu",
|
||||
"rate_limit": "Giới hạn yêu cầu",
|
||||
"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",
|
||||
"rule_label": "Quy tắc",
|
||||
"filter_label": "Bộ lọc",
|
||||
"unknown_filter": "Bộ lọc không rõ {{filterId}}",
|
||||
"install_welcome_title": "Chào mừng bạn đến với AdGuard Home!",
|
||||
"install_welcome_desc": "AdGuard Home là một máy chủ DNS chặn quảng cáo và theo dõi trên toàn mạng. Mục đích của nó là cho phép bạn kiểm soát toàn bộ mạng và tất cả các thiết bị của mình và không yêu cầu sử dụng chương trình phía máy khách.",
|
||||
"install_settings_title": "Giao Diện Web Quản Trị",
|
||||
"install_settings_listen": "Giao diện nghe",
|
||||
"install_settings_port": "Cổng",
|
||||
"install_settings_interface_link": "Giao diện web quản trị viên AdGuard Home của bạn sẽ có sẵn trên các địa chỉ sau:",
|
||||
"form_error_port": "Nhập giá trị cổng hợp lệ",
|
||||
"install_settings_dns": "Máy chủ DNS",
|
||||
"install_settings_dns_desc": "Bạn sẽ cần định cấu hình thiết bị hoặc bộ định tuyến của mình để sử dụng máy chủ DNS trên các địa chỉ sau:",
|
||||
"install_settings_all_interfaces": "Tất cả các giao diện",
|
||||
"install_auth_title": "Xác thực",
|
||||
"install_auth_desc": "Rất khuyến khích cấu hình xác thực mật khẩu cho giao diện web quản trị viên AdGuard Home của bạn. Ngay cả khi nó chỉ có thể truy cập được trong mạng cục bộ của bạn, điều quan trọng là phải bảo vệ nó khỏi sự truy cập không hạn chế.",
|
||||
"install_auth_username": "Tên đăng nhập",
|
||||
"install_auth_password": "Mật khẩu",
|
||||
"install_auth_confirm": "Xác nhận mật khẩu",
|
||||
"install_auth_username_enter": "Nhập tên đăng nhập",
|
||||
"install_auth_password_enter": "Nhập mật khẩu",
|
||||
"install_step": "Bước",
|
||||
"install_devices_title": "Định cấu hình thiết bị của bạn",
|
||||
"install_devices_desc": "Để bắt đầu sử dụng AdGuard Home, bạn cần định cấu hình thiết bị của mình để sử dụng nó.",
|
||||
"install_submit_title": "Xin chúc mừng!",
|
||||
"install_submit_desc": "Quy trình thiết lập đã kết thúc và bạn đã sẵn sàng bắt đầu sử dụng AdGuard Home.",
|
||||
"install_devices_router": "Bộ định tuyến",
|
||||
"install_devices_router_desc": "Thiết lập này sẽ tự động bao gồm tất cả các thiết bị được kết nối với bộ định tuyến gia đình của bạn và bạn sẽ không cần phải định cấu hình từng thiết bị theo cách thủ công.",
|
||||
"install_devices_address": "Máy chủ DNS của AdGuard Home đang lắng nghe các địa chỉ sau",
|
||||
"install_devices_router_list_1": "Mở các tùy chọn cho bộ định tuyến của bạn. Thông thường, bạn có thể truy cập nó từ trình duyệt của mình thông qua một URL (như http://192.168.0.1/ hoặc http://192.168.1.1/). Bạn có thể được yêu cầu nhập mật khẩu. Nếu bạn không nhớ nó, bạn có thể thường xuyên đặt lại mật khẩu bằng cách nhấn một nút trên chính bộ định tuyến. Một số bộ định tuyến yêu cầu một ứng dụng cụ thể, trong trường hợp đó nên được cài đặt trên máy tính/điện thoại của bạn.",
|
||||
"install_devices_router_list_2": "Tìm cài đặt DHCP/DNS. Tìm các chữ cái DNS bên cạnh một trường cho phép hai hoặc ba bộ số, mỗi bộ được chia thành bốn nhóm từ một đến ba chữ số.",
|
||||
"install_devices_router_list_3": "Nhập địa chỉ máy chủ AdGuard Home của bạn ở đó.",
|
||||
"install_devices_windows_list_1": "Mở Control Panel thông qua Trình đơn Bắt đầu hoặc Tìm kiếm Windows.",
|
||||
"install_devices_windows_list_2": "Chuyển đến danh mục Mạng và Internet, sau đó đến Trung tâm Mạng và Chia sẻ.",
|
||||
"install_devices_windows_list_3": "Ở bên trái màn hình, tìm Thay đổi cài đặt bộ điều hợp và nhấp vào nó.",
|
||||
"install_devices_windows_list_4": "Chọn kết nối hoạt động của bạn, nhấp chuột phải vào nó và chọn Thuộc tính.",
|
||||
"install_devices_windows_list_5": "Tìm Giao Thức Internet Phiên Bản 4 (TCP/IP) trong danh sách, chọn nó và sau đó nhấp vào Thuộc tính một lần nữa.",
|
||||
"install_devices_windows_list_6": "Chọn Sử dụng các địa chỉ máy chủ DNS sau và nhập địa chỉ máy chủ AdGuard Home của bạn.",
|
||||
"install_devices_macos_list_1": "Nhấp vào biểu tượng Apple và đi đến Tùy Chọn Hệ Thống.",
|
||||
"install_devices_macos_list_2": "Nhấp vào Mạng.",
|
||||
"install_devices_macos_list_3": "Chọn kết nối đầu tiên trong danh sách của bạn và nhấp vào Nâng cao.",
|
||||
"install_devices_macos_list_4": "Chọn thẻ DNS và nhập địa chỉ máy chủ AdGuard Home của bạn.",
|
||||
"install_devices_android_list_1": "Từ màn hình chính của Trình Đơn Android, chạm Cài đặt.",
|
||||
"install_devices_android_list_2": "Nhấp Wi-Fi trên trình đơn. Màn hình liệt kê tất cả các mạng khả dụng sẽ được hiển thị (không thể đặt DNS tùy chỉnh cho kết nối di động).",
|
||||
"install_devices_android_list_3": "Nhấn và giữ mạng mà bạn đã kết nối và chạm Sửa Đổi Mạng.",
|
||||
"install_devices_android_list_4": "Trên một số thiết bị, bạn có thể cần chọn hộp Nâng cao để xem thêm cài đặt. Để điều chỉnh cài đặt DNS Android của bạn, bạn sẽ cần chuyển cài đặt IP từ DHCP sang Tĩnh.",
|
||||
"install_devices_android_list_5": "Thay đổi giá trị DNS 1 và DNS 2 thành địa chỉ máy chủ AdGuard Home của bạn.",
|
||||
"install_devices_ios_list_1": "Từ màn hình chính, chạm Cài đặt.",
|
||||
"install_devices_ios_list_2": "Chọn Wi-Fi trong trình đơn bên trái (không thể định cấu hình DNS cho mạng di động).",
|
||||
"install_devices_ios_list_3": "Chạm vào tên của mạng hiện đang hoạt động.",
|
||||
"install_devices_ios_list_4": "Trong trường DNS nhập địa chỉ máy chủ AdGuard Home của bạn.",
|
||||
"get_started": "Bắt Đầu",
|
||||
"next": "Tiếp",
|
||||
"open_dashboard": "Mở Bảng Điều Khiển",
|
||||
"install_saved": "Đã lưu thành công",
|
||||
"encryption_title": "Mã hóa",
|
||||
"encryption_desc": "Hỗ trợ mã hóa (HTTPS/TLS) cho cả giao diện web quản trị viên và DNS",
|
||||
"encryption_config_saved": "Đã lưu cấu hình mã hóa",
|
||||
"encryption_server": "Tên máy chủ",
|
||||
"encryption_server_enter": "Nhập tên miền của bạn",
|
||||
"encryption_server_desc": "Để sử dụng HTTPS, bạn cần nhập tên máy chủ phù hợp với chứng chỉ SSL của bạn.",
|
||||
"encryption_redirect": "Tự động chuyển hướng đến HTTPS",
|
||||
"encryption_redirect_desc": "Nếu được chọn, AdGuard Home sẽ tự động chuyển hướng bạn từ địa chỉ HTTP sang địa chỉ HTTPS.",
|
||||
"encryption_https": "Cổng HTTPS",
|
||||
"encryption_https_desc": "Nếu cổng HTTPS được định cấu hình, giao diện quản trị viên AdGuard Home sẽ có thể truy cập thông qua HTTPS và nó cũng sẽ cung cấp DNS-over-HTTPS trên vị trí '/dns-query'.",
|
||||
"encryption_dot": "Cổng DNS-over-TLS",
|
||||
"encryption_dot_desc": "Nếu cổng này được định cấu hình, AdGuard Home sẽ chạy máy chủ DNS-over-TLS trên cổng này.",
|
||||
"encryption_certificates": "Giấy chứng nhận",
|
||||
"encryption_certificates_desc": "Để sử dụng mã hóa, bạn cần cung cấp chuỗi chứng chỉ SSL hợp lệ cho miền của mình. Bạn có thể nhận chứng chỉ miễn phí trên <0>{{link}}</0> hoặc bạn có thể mua chứng chỉ từ một trong các Cơ Quan Chứng Nhận tin cậy.",
|
||||
"encryption_certificates_input": "Sao chép/dán chứng chỉ được mã hóa PEM của bạn tại đây.",
|
||||
"encryption_status": "Trạng thái",
|
||||
"encryption_expire": "Hết hạn",
|
||||
"encryption_key": "Khóa riêng",
|
||||
"encryption_key_input": "Sao chép/dán khóa riêng được mã hóa PEM cho chứng chỉ của bạn tại đây.",
|
||||
"encryption_enable": "Kích Hoạt Mã Hóa (HTTPS, DNS-over-HTTPS và DNS-over-TLS)",
|
||||
"encryption_enable_desc": "Nếu mã hóa được bật, giao diện quản trị viên AdGuard Home sẽ hoạt động trên HTTPS và máy chủ DNS sẽ lắng nghe các yêu cầu qua DNS-over-HTTPS và DNS-over-TLS.",
|
||||
"encryption_chain_valid": "Chuỗi chứng chỉ hợp lệ",
|
||||
"encryption_chain_invalid": "Chuỗi chứng chỉ không hợp lệ",
|
||||
"encryption_key_valid": "Đây là khóa riêng {{type}} hợp lệ",
|
||||
"encryption_key_invalid": "Đây là khóa riêng {{type}} không hợp lệ",
|
||||
"encryption_subject": "Chủ đề",
|
||||
"encryption_issuer": "Phát hành",
|
||||
"encryption_hostnames": "Tên máy chủ",
|
||||
"encryption_reset": "Bạn có chắc chắn muốn đặt lại cài đặt mã hóa?",
|
||||
"topline_expiring_certificate": "Chứng chỉ SSL của bạn sắp hết hạn. Cập nhật <0>Cài đặt mã hóa</0>.",
|
||||
"topline_expired_certificate": "Chứng chỉ SSL của bạn đã hết hạn. Cập nhật <0>Cài đặt mã hóa</0>.",
|
||||
"form_error_port_range": "Nhập giá trị cổng trong phạm vi 80-65535",
|
||||
"form_error_port_unsafe": "Đây là một cổng không an toàn",
|
||||
"form_error_equal": "Không nên bằng nhau",
|
||||
"form_error_password": "Mật khẩu không khớp",
|
||||
"reset_settings": "Đặt lại cài đặt",
|
||||
"update_announcement": "AdGuard Home {{version}} hiện có sẵn! <0>Chạm vào đây</0> để biết thêm thông tin.",
|
||||
"setup_guide": "Hướng dẫn thiết lập",
|
||||
"dns_addresses": "Địa chỉ DNS",
|
||||
"dns_start": "Máy chủ DNS đang khởi động",
|
||||
"dns_status_error": "Có lỗi khi kiểm tra trạng thái máy chủ DNS",
|
||||
"down": "Xuống",
|
||||
"fix": "Sửa",
|
||||
"dns_providers": "Dưới đây là một <0>danh sách của các nhà cung cấp DNS đã biết</0> để lựa chọn.",
|
||||
"update_now": "Cập nhật ngay",
|
||||
"update_failed": "Tự động cập nhật thất bại. Vui lòng <a href='https://github.com/AdguardTeam/AdGuardHome/wiki/Getting-Started#update'>làm theo các bước</a> để cập nhật thủ công.",
|
||||
"processing_update": "Xin vui lòng chờ, AdGuard Home đang được cập nhật",
|
||||
"clients_title": "Máy khách",
|
||||
"clients_desc": "Định cấu hình thiết bị được kết nối với AdGuard Home",
|
||||
"settings_global": "Toàn cầu",
|
||||
"settings_custom": "Tùy chỉnh",
|
||||
"table_client": "Máy khách",
|
||||
"table_name": "Tên",
|
||||
"save_btn": "Lưu",
|
||||
"client_add": "Thêm Máy Khách",
|
||||
"client_new": "Máy Khách Mới",
|
||||
"client_edit": "Chỉnh Sửa Máy Khách",
|
||||
"client_identifier": "Định danh",
|
||||
"ip_address": "Địa chỉ IP",
|
||||
"client_identifier_desc": "Các máy khách có thể được xác định bằng địa chỉ IP hoặc địa chỉ MAC. Xin lưu ý rằng chỉ có thể sử dụng MAC làm định danh nếu AdGuard Home cũng là <0>máy chủ DHCP</0>",
|
||||
"form_enter_ip": "Nhập IP",
|
||||
"form_enter_mac": "Nhập MAC",
|
||||
"form_enter_id": "Nhập định danh",
|
||||
"form_add_id": "Thêm định danh",
|
||||
"form_client_name": "Nhập tên máy khách",
|
||||
"client_global_settings": "Sử dụng cài đặt toàn cầu",
|
||||
"client_deleted": "Máy khách \"{{key}}\" đã xóa thành công",
|
||||
"client_added": "Máy khách \"{{key}}\" đã thêm thành công",
|
||||
"client_updated": "Máy khách \"{{key}}\" đã cập nhật thành công",
|
||||
"clients_not_found": "Không tìm thấy máy khách",
|
||||
"client_confirm_delete": "Bạn có chắc chắn muốn xóa máy khách \"{{key}}\" không?",
|
||||
"auto_clients_title": "Máy khách (thời gian chạy)",
|
||||
"auto_clients_desc": "Dữ liệu trên các máy khách sử dụng AdGuard Home, nhưng không được lưu trong cấu hình",
|
||||
"access_title": "Cài đặt truy cập",
|
||||
"access_desc": "Tại đây bạn có thể định cấu hình quy tắc truy cập cho máy chủ AdGuard Home DNS.",
|
||||
"access_allowed_title": "Máy chủ được phép",
|
||||
"access_allowed_desc": "Một danh sách các địa chỉ CIDR hoặc IP. Nếu được định cấu hình, AdGuard Home sẽ chỉ chấp nhận các yêu cầu từ các địa chỉ IP này.",
|
||||
"access_disallowed_title": "Máy chủ không được phép",
|
||||
"access_disallowed_desc": "Một danh sách các địa chỉ CIDR hoặc IP. Nếu được định cấu hình, AdGuard Home sẽ bỏ yêu cầu từ các địa chỉ IP này.",
|
||||
"access_blocked_title": "Tên miền bị chặn",
|
||||
"access_blocked_desc": "Đừng nhầm lẫn điều này với các bộ lọc. AdGuard Home sẽ bỏ các truy vấn DNS với các tên miền này trong câu hỏi của truy vấn.",
|
||||
"access_settings_saved": "Cài đặt truy cập đã lưu thành công",
|
||||
"updates_checked": "Đã kiểm tra thành công cập nhật",
|
||||
"updates_version_equal": "AdGuard Home đã được cập nhật",
|
||||
"check_updates_now": "Kiểm tra cập nhật ngay bây giờ",
|
||||
"dns_privacy": "DNS Riêng Tư",
|
||||
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> Sử dụng chuỗi <1>{{address}}</1>.",
|
||||
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> Sử dụng chuỗi <1>{{address}}</1>.",
|
||||
"setup_dns_privacy_3": "<0>Xin lưu ý rằng các giao thức DNS được mã hóa chỉ được hỗ trợ trên Android 9. Vì vậy, bạn cần cài đặt phần mềm bổ sung cho các hệ điều hành khác.</0><0>Đây là danh sách các phần mềm bạn có thể sử dụng.</0>",
|
||||
"setup_dns_privacy_android_1": "Android 9 hỗ trợ DNS trên TLS nguyên bản. Để định cấu hình, hãy đi tới Cài đặt → Mạng & internet → Nâng cao → DNS Riêng Tư và nhập tên miền của bạn vào đó.",
|
||||
"setup_dns_privacy_android_2": "<0>AdGuard for Android</0> hỗ trợ <1>DNS-over-HTTPS</1> và <1>DNS-over-TLS</1>.",
|
||||
"setup_dns_privacy_android_3": "<0>Intra</0> thêm <1>DNS-over-HTTPS</1> hỗ trợ cho Android.",
|
||||
"setup_dns_privacy_ios_1": "<0>DNSCloak</0> hỗ trợ <1>DNS-over-HTTPS</1>, nhưng để định cấu hình nó để sử dụng máy chủ của riêng bạn, bạn sẽ cần phải tạo một <2>DNS Stamp</2> cho nó.",
|
||||
"setup_dns_privacy_ios_2": "<0>AdGuard for iOS</0> hỗ trợ thiết lập <1>DNS-over-HTTPS</1> và <1>DNS-over-TLS</1>.",
|
||||
"setup_dns_privacy_other_title": "Triển khai khác",
|
||||
"setup_dns_privacy_other_1": "Bản thân AdGuard Home có thể là máy khách DNS an toàn trên mọi nền tảng.",
|
||||
"setup_dns_privacy_other_2": "<0>dnsproxy</0> hỗ trợ tất cả các giao thức DNS bảo mật đã biết.",
|
||||
"setup_dns_privacy_other_3": "<0>dnscrypt-proxy</0> hỗ trợ <1>DNS-over-HTTPS</1>.",
|
||||
"setup_dns_privacy_other_4": "<0>Mozilla Firefox</0> hỗ trợ <1>DNS-over-HTTPS</1>.",
|
||||
"setup_dns_privacy_other_5": "Bạn sẽ tìm thấy nhiều triển khai hơn <0>tại đây</0> và <1>tại đây</1>.",
|
||||
"setup_dns_notice": "Để sử dụng <1>DNS-over-HTTPS</1> hoặc <1>DNS-over-TLS</1>, bạn cần <0>định cấu hình Mã hóa</0> trong cài đặt AdGuard Home.",
|
||||
"rewrite_added": "DNS viết lại cho \"{{key}}\" đã thêm thành công",
|
||||
"rewrite_deleted": "DNS viết lại cho \"{{key}}\" đã xóa thành công",
|
||||
"rewrite_add": "Thêm DNS viết lại",
|
||||
"rewrite_not_found": "Không tìm thấy DNS viết lại",
|
||||
"rewrite_confirm_delete": "Bạn có chắc chắn muốn xóa DNS viết lại cho \"{{key}}\" không?",
|
||||
"rewrite_desc": "Cho phép dễ dàng định cấu hình tùy chỉnh DNS phản hồi cho một tên miền cụ thể.",
|
||||
"rewrite_applied": "Đã áp dụng quy tắc Viết lại",
|
||||
"dns_rewrites": "DNS viết lại",
|
||||
"form_domain": "Nhập tên miền",
|
||||
"form_answer": "Nhập địa chỉ IP hoặc tên miền",
|
||||
"form_error_domain_format": "Định dạng tên miền không hợp lệ",
|
||||
"form_error_answer_format": "Định dạng câu trả lời không hợp lệ"
|
||||
"form_error_answer_format": "Định dạng câu trả lời không hợp lệ",
|
||||
"configure": "Cấu hình",
|
||||
"main_settings": "Cài đặt chính",
|
||||
"block_services": "Chặn các dịch vụ cụ thể",
|
||||
"blocked_services": "Dịch vụ bị chặn",
|
||||
"blocked_services_desc": "Cho phép nhanh chóng chặn các trang web và dịch vụ phổ biến.",
|
||||
"blocked_services_saved": "Dịch vụ bị chặn đã lưu thành công",
|
||||
"blocked_services_global": "Sử dụng các dịch vụ bị chặn toàn cầu",
|
||||
"blocked_service": "Dịch vụ bị chặn",
|
||||
"block_all": "Chặn tất cả",
|
||||
"unblock_all": "Bỏ chặn tất cả",
|
||||
"encryption_certificate_path": "Đường dẫn chứng chỉ",
|
||||
"encryption_private_key_path": "Đường dẫn khóa riêng",
|
||||
"encryption_certificates_source_path": "Đặt đường dẫn tệp chứng chỉ",
|
||||
"encryption_certificates_source_content": "Dán nội dung chứng chỉ",
|
||||
"encryption_key_source_path": "Đặt tệp khóa riêng",
|
||||
"encryption_key_source_content": "Dán nội dung khóa riêng",
|
||||
"stats_params": "Cấu hình thống kê",
|
||||
"config_successfully_saved": "Cấu hình được lưu thành công",
|
||||
"interval_24_hour": "24 giờ",
|
||||
"interval_days": "{{count}} ngày",
|
||||
"interval_days_plural": "{{count}} ngày",
|
||||
"domain": "Tên miền",
|
||||
"answer": "Trả lời",
|
||||
"filter_added_successfully": "Bộ lọc đã được thêm thành công",
|
||||
"statistics_configuration": "Cấu hình thống kê",
|
||||
"statistics_retention": "Duy trì thống kê",
|
||||
"statistics_retention_desc": "Nếu bạn giảm giá trị khoảng, một số dữ liệu sẽ bị mất",
|
||||
"statistics_clear": " Xoá thống kê",
|
||||
"statistics_clear_confirm": "Bạn có chắc chắn muốn xóa số liệu thống kê?",
|
||||
"statistics_retention_confirm": "Bạn có chắc chắn muốn thay đổi lưu giữ số liệu thống kê? Nếu bạn giảm giá trị khoảng, một số dữ liệu sẽ bị mất",
|
||||
"statistics_cleared": "Xoá thống kê thành công",
|
||||
"interval_hours": "{{count}} giờ",
|
||||
"interval_hours_plural": "{{count}} giờ",
|
||||
"filters_configuration": "Cấu hình bộ lọc",
|
||||
"filters_enable": "Kích hoạt bộ lọc",
|
||||
"filters_interval": "Khoảng thời gian cập nhật bộ lọc",
|
||||
"disabled": "Đã vô hiệu",
|
||||
"username_label": "Tên đăng nhập",
|
||||
"username_placeholder": "Nhập tên đăng nhập",
|
||||
"password_label": "Mật khẩu",
|
||||
"password_placeholder": "Nhập mật khẩu",
|
||||
"sign_in": "Đăng nhập",
|
||||
"sign_out": "Đăng xuất",
|
||||
"forgot_password": "Quên mật khẩu?",
|
||||
"forgot_password_desc": "Vui lòng làm theo <0>các bước này</0> để tạo mật khẩu mới cho tài khoản người dùng của bạn.",
|
||||
"location": "Vị trí",
|
||||
"orgname": "Tên tổ chức",
|
||||
"netname": "Tên mạng",
|
||||
"descr": "Mô tả",
|
||||
"whois": "Whois",
|
||||
"filtering_rules_learn_more": "<0>Tìm hiểu thêm</0> về việc tạo danh sách chặn máy chủ của riêng bạn.",
|
||||
"blocked_by_response": "Chặn bởi CNAME hoặc địa IP ở phản hồi",
|
||||
"try_again": "Hãy thử lại"
|
||||
}
|
||||
@@ -9,10 +9,10 @@
|
||||
"enabled_dhcp": "DHCP 服务器已启用",
|
||||
"disabled_dhcp": "DHCP 服务器已禁用",
|
||||
"dhcp_title": "DHCP 服务器(实验性)",
|
||||
"dhcp_description": "如果你的路由器没有提供动态主机设置协议(DHCP)设置,你可以使用 AdGuard 内置的 DHCP 服务器。",
|
||||
"dhcp_description": "如果你的路由器没有提供 DHCP (动态主机配置协议)设置,你可以使用 AdGuard 内置的 DHCP 服务器。",
|
||||
"dhcp_enable": "启用 DHCP 服务器",
|
||||
"dhcp_disable": "禁用 DHCP 服务器",
|
||||
"dhcp_not_found": "在当前网络中未检测到 DHCP 服务器。您可以安全地启用内置 DHCP 服务器。",
|
||||
"dhcp_disable": "停用 DHCP 服务器",
|
||||
"dhcp_not_found": "您可以安全地启用内置 DHCP 服务器 - 在当前网络中未检测到任何起作用的 DHCP 服务器。然而,我们鼓励您以手动方式重新检测,因为当前我们的自动检测不能确保100%准确。",
|
||||
"dhcp_found": "在当前网络中检测到 DHCP 服务器。如果启用内置的 DHCP 服务器可能不安全。",
|
||||
"dhcp_leases": "DHCP 租约",
|
||||
"dhcp_static_leases": "DHCP 静态租约",
|
||||
@@ -23,7 +23,9 @@
|
||||
"form_error_ip6_format": "无效的 IPv6 格式",
|
||||
"form_error_ip_format": "无效的 IPv4 格式",
|
||||
"form_error_mac_format": "无效的 MAC 格式",
|
||||
"form_error_client_id_format": "无效的客户端 ID 格式",
|
||||
"form_error_positive": "必须大于 0",
|
||||
"form_error_negative": "必须大于等于 0",
|
||||
"dhcp_form_gateway_input": "网关 IP",
|
||||
"dhcp_form_subnet_input": "子网掩码",
|
||||
"dhcp_form_range_title": "IP 地址范围",
|
||||
@@ -36,12 +38,12 @@
|
||||
"dhcp_ip_addresses": "IP 地址",
|
||||
"dhcp_table_hostname": "主机名",
|
||||
"dhcp_table_expires": "到期",
|
||||
"dhcp_warning": "如果你想要启用内置的 DHCP 服务器,请确保在当前网络中没有其它活动的 DHCP 服务器。否则,此操作可能会破坏已连接设备的网络连接!",
|
||||
"dhcp_error": "我们无法确定网络上是否有其它 DHCP 服务器。",
|
||||
"dhcp_static_ip_error": "要使用 DHCP 服务器,则必须设置静态 IP。我们无法确定此网络接口是否是使用静态 IP 配置的。请手动设置静态 IP 地址。",
|
||||
"dhcp_dynamic_ip_found": "您的系统使用了动态 IP 地址配置 <0>{{interfaceName}}</0> 接口。要使用 DHCP 服务器,则必须设置为静态 IP 地址。您当前的 IP 地址为 <0>{{ipAddress}}</0>。如您点击 开启 DHCP 按钮,则我们会自动设置此 IP 地址为静态。",
|
||||
"dhcp_lease_added": "静态租约 \"{{key}}\" 添加成功",
|
||||
"dhcp_lease_deleted": "静态租约 \"{{key}}\" 删除成功",
|
||||
"dhcp_warning": "如果你想要启用内置的 DHCP 服务器,请确保在当前网络中没有其它起作用的 DHCP 服务器。否则,此操作可能会破坏已连接设备的网络连接!",
|
||||
"dhcp_error": "我们无法确定在当前网络中是否存在其它 DHCP 服务器。",
|
||||
"dhcp_static_ip_error": "要使用 DHCP 服务器,则必须设置静态 IP 地址。我们无法确定此网络接口是否已被配置为使用静态 IP 地址。请手动为此网络接口设置静态 IP 地址。",
|
||||
"dhcp_dynamic_ip_found": "您的系统对网络接口 <0>{{interfaceName}}</0> 使用了动态 IP 地址配置。要使用 DHCP 服务器,则必须对此网络接口使用静态 IP 地址配置。此网络接口当前的 IP 地址为 <0>{{ipAddress}}</0>。如您点击 启用 DHCP 按钮,我们将自动修改此网络接口以使用静态 IP 地址配置。",
|
||||
"dhcp_lease_added": "静态租约 \"{{key}}\" 已成功添加",
|
||||
"dhcp_lease_deleted": "静态租约 \"{{key}}\" 已成功删除",
|
||||
"dhcp_new_static_lease": "新建静态租约",
|
||||
"dhcp_static_leases_not_found": "未找到 DHCP 静态租约",
|
||||
"dhcp_add_static_lease": "添加静态租约",
|
||||
@@ -74,7 +76,7 @@
|
||||
"stats_adult": "被拦截的成人网站",
|
||||
"stats_query_domain": "请求域名排行",
|
||||
"for_last_24_hours": "在过去 24 小时",
|
||||
"for_last_days": "最后 {{value}} 天",
|
||||
"for_last_days": "最近 {{count}} 天",
|
||||
"for_last_days_plural": "最近 {{count}} 天",
|
||||
"no_domains_found": "未找到域名",
|
||||
"requests_count": "请求数",
|
||||
@@ -103,10 +105,15 @@
|
||||
"no_servers_specified": "未找到指定的服务器",
|
||||
"general_settings": "常规设置",
|
||||
"dns_settings": "DNS 设置",
|
||||
"dns_blocklists": "DNS封锁清单",
|
||||
"dns_allowlists": "DNS允许清单",
|
||||
"dns_blocklists_desc": "AdGuard Home将阻止匹配DNS拦截清单的域名",
|
||||
"dns_allowlists_desc": "来自DNS允许列表的域将被允许,即使它们位于任意阻止列表中也是如此",
|
||||
"custom_filtering_rules": "自定义过滤规则",
|
||||
"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:// 为开头。",
|
||||
"upstream_dns_hint": "如果此处留空,AdGuard Home 将会使用 <a href='https://www.quad9.net/' target='_blank'>Cloudflare DNS</a> 作为上游 DNS。如果想要使用 DNS over TLS,请以 tls:// 为开头。",
|
||||
"test_upstream_btn": "测试上游 DNS",
|
||||
"upstreams": "上游服务器",
|
||||
"apply_btn": "应用",
|
||||
@@ -120,22 +127,28 @@
|
||||
"enabled_save_search_toast": "安全搜索已启用",
|
||||
"enabled_table_header": "已启用",
|
||||
"name_table_header": "名称",
|
||||
"filter_url_table_header": "过滤器地址",
|
||||
"list_url_table_header": "清单网址",
|
||||
"rules_count_table_header": "规则数",
|
||||
"last_time_updated_table_header": "上次更新时间",
|
||||
"actions_table_header": "活跃状态",
|
||||
"edit_table_action": "编辑",
|
||||
"delete_table_action": "删除",
|
||||
"filters_and_hosts": "过滤器和 Hosts 拦截清单",
|
||||
"filters_and_hosts_hint": "AdGuard Home 可以解析基础的 adblock 规则和 Hosts 语法。",
|
||||
"no_filters_added": "未添加任何过滤器",
|
||||
"add_filter_btn": "添加过滤器",
|
||||
"no_blocklist_added": "未添加阻止列表",
|
||||
"no_whitelist_added": "未添加允许列表",
|
||||
"add_blocklist": "添加阻止列表",
|
||||
"add_allowlist": "添加允许列表",
|
||||
"cancel_btn": "取消",
|
||||
"enter_name_hint": "输入名称",
|
||||
"enter_url_hint": "输入 URL",
|
||||
"check_updates_btn": "检查更新",
|
||||
"new_filter_btn": "订阅新的过滤器",
|
||||
"enter_valid_filter_url": "输入一个过滤器订阅或 Hosts 文件的有效 URL",
|
||||
"new_blocklist": "新封锁清单",
|
||||
"new_allowlist": "新的允许清单",
|
||||
"edit_blocklist": "编辑阻止列表",
|
||||
"edit_allowlist": "编辑允许列表",
|
||||
"enter_valid_blocklist": "输入有效的阻止列表URL",
|
||||
"enter_valid_allowlist": "输入有效的允许列表URL",
|
||||
"form_error_url_format": "无效的网址格式",
|
||||
"custom_filter_rules": "自定义过滤器规则",
|
||||
"custom_filter_rules_hint": "请确保每行只输入一条规则。你可以输入符合 adblock 语法或 Hosts 语法的规则。",
|
||||
"examples_title": "范例",
|
||||
@@ -151,7 +164,7 @@
|
||||
"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/' target='_blank'>DNSCrypt</a> 的 <a href='https://dnscrypt.info/stamps/' target='_blank'>DNS Stamps</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": "所有过滤器已更新至最新",
|
||||
"all_lists_up_to_date_toast": "所有列表都是最新的",
|
||||
"updated_upstream_dns_toast": "上游 DNS 已更新",
|
||||
"dns_test_ok_toast": "指定的 DNS 服务器现已正常运行",
|
||||
"dns_test_not_ok_toast": "服务器 \"{{key}}\":无法使用,请检查你输入的是否正确",
|
||||
@@ -171,7 +184,6 @@
|
||||
"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": "规则已从自定义过滤规则列表中移除",
|
||||
@@ -188,15 +200,30 @@
|
||||
"query_log_strict_search": "使用双引号进行严谨搜索",
|
||||
"query_log_retention_confirm": "您确定要更改查询记录保留时间吗? 如果您减少间隔时间的值, 某些数据可能会丢失。",
|
||||
"dns_config": "DNS服务设定",
|
||||
"blocking_mode": "拦截模式",
|
||||
"default": "默认",
|
||||
"nxdomain": "无效域名",
|
||||
"null_ip": "无效 IP",
|
||||
"custom_ip": "自定义 IP",
|
||||
"blocking_ipv4": "拦截 IPv4",
|
||||
"blocking_ipv6": "拦截 IPv6",
|
||||
"form_enter_rate_limit": "输入限制速率",
|
||||
"rate_limit": "速度限制",
|
||||
"edns_enable": "使用客户端的子网地址(EDNS)",
|
||||
"edns_cs_desc": "启用后AdGuard Home将会向DNS服务器发送客户端的子网地址进行查询",
|
||||
"rate_limit_desc": "每个客户端每秒钟查询次数的限制 (0:不限制)",
|
||||
"blocking_ipv4_desc": "拦截 A 记录请求返回的 IP 地址",
|
||||
"blocking_ipv6_desc": "拦截 AAAA 记录请求返回的 IP 地址",
|
||||
"blocking_mode_default": "默认:被Adblock规则拦截时以NXDOMAIN码响应;被/etc/hosts规则拦截时返回规则中指定IP",
|
||||
"blocking_mode_nxdomain": "NXDOMAIN:以NXDOMAIN码响应",
|
||||
"blocking_mode_null_ip": "无效IP:以零IP地址地址响应(A记录 0.0.0.0;AAAA记录 ::)",
|
||||
"blocking_mode_custom_ip": "自定IP:以手动设置的IP地址响应",
|
||||
"upstream_dns_client_desc": "如果将此字段留空,AdGuard Home 将使用在<0>DNS设置</0>中配置的服务器。",
|
||||
"source_label": "源",
|
||||
"found_in_known_domain_db": "成功在已知域名数据库中查询到",
|
||||
"category_label": "类别",
|
||||
"rule_label": "规则",
|
||||
"filter_label": "过滤器",
|
||||
"list_label": "列表",
|
||||
"unknown_filter": "未知过滤器 {{filterId}}",
|
||||
"install_welcome_title": "欢迎使用 AdGuard Home!",
|
||||
"install_welcome_desc": "AdGuard Home 是一个可在特定网络范围内拦截所有广告和跟踪器的 DNS 服务器。它的目的是让您控制整个网络和您的所有设备,且不需要使用任何客户端程序。",
|
||||
@@ -289,6 +316,7 @@
|
||||
"setup_guide": "设置指导",
|
||||
"dns_addresses": "DNS 地址",
|
||||
"dns_start": "正在启动DNS服务",
|
||||
"dns_status_error": "检查DNS服务器状态时出错",
|
||||
"down": "下移",
|
||||
"fix": "修复",
|
||||
"dns_providers": "此为可从中选择的<0>已知 DNS 提供商列表</0>。",
|
||||
@@ -310,6 +338,8 @@
|
||||
"client_identifier_desc": "客户端可通过 IP 地址或 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}}\" 删除成功",
|
||||
@@ -317,7 +347,7 @@
|
||||
"client_updated": "客户端 \"{{key}}\" 更新成功",
|
||||
"clients_not_found": "未找到客户端",
|
||||
"client_confirm_delete": "您确定要删除客户端 \"{{key}}\"?",
|
||||
"filter_confirm_delete": "您确定是要删除过滤器?",
|
||||
"list_confirm_delete": "您确定要删除此列表吗?",
|
||||
"auto_clients_title": "客户端(运行时间)",
|
||||
"auto_clients_desc": "使用 Adguard Home 但未存储在配置中的客户端上的数据",
|
||||
"access_title": "访问设置",
|
||||
@@ -356,6 +386,7 @@
|
||||
"rewrite_desc": "可以轻松地配置特定的域名的自定义 DNS 响应。",
|
||||
"rewrite_applied": "已应用的重写规则",
|
||||
"dns_rewrites": "DNS 重写",
|
||||
"form_domain": "输入域",
|
||||
"form_answer": "输入 IP 地址或域名",
|
||||
"form_error_domain_format": "无效的域格式",
|
||||
"form_error_answer_format": "无效的响应格式",
|
||||
@@ -378,11 +409,12 @@
|
||||
"stats_params": "统计配置",
|
||||
"config_successfully_saved": "配置保存成功",
|
||||
"interval_24_hour": "24 小时",
|
||||
"interval_days": "{{value}} 天",
|
||||
"interval_days": "{{count}} 天",
|
||||
"interval_days_plural": "{{count}} 天",
|
||||
"domain": "域",
|
||||
"answer": "应答",
|
||||
"filter_added_successfully": "已成功添加过滤器",
|
||||
"filter_updated": "成功更新过滤器",
|
||||
"statistics_configuration": "统计配置",
|
||||
"statistics_retention": "统计保留",
|
||||
"statistics_retention_desc": "如果您减少该间隔的数值, 某些数据可能会丢失",
|
||||
@@ -409,5 +441,43 @@
|
||||
"netname": "网络名称",
|
||||
"descr": "描述",
|
||||
"whois": "Whois",
|
||||
"filtering_rules_learn_more": "<0>了解更多</0>关于如何创建您自己的主机(hosts)拦截清单。"
|
||||
"filtering_rules_learn_more": "<0>了解更多</0>关于如何创建您自己的主机(hosts)拦截清单。",
|
||||
"blocked_by_response": "因响应的CNAME或IP被屏蔽",
|
||||
"try_again": "重试",
|
||||
"domain_desc": "输入您要重写的域名或通配符。",
|
||||
"example_rewrite_domain": "仅重写此域名的响应。",
|
||||
"example_rewrite_wildcard": "重写所有<0>example.org</0> 子域的响应。",
|
||||
"disable_ipv6": "禁用 IPv6",
|
||||
"disable_ipv6_desc": "启用后,所有IPv6地址 (type AAAA) 的DNS查询都会被丢弃。",
|
||||
"autofix_warning_text": "若您单击“修复”,AdGuardHome将会配置您的系统以使用AdGuardHome的DNS服务器",
|
||||
"autofix_warning_list": "其将会进行如下工作:<0>停用系统DNSStubListener</0><0>设置DNS服务器地址为127.0.0.1</0><0>将/etc/resolv.conf的符号链接目标替换为/run/systemd/resolv/resolv.conf</0><0>停止DNSStubListener(重新加载系统解析服务)</0>",
|
||||
"autofix_warning_result": "因此,默认情况下所有来自系统的DNS请求都将由AdGuardHome处理。",
|
||||
"tags_title": "标签",
|
||||
"tags_desc": "您可以选择与客户端对应的标记。标签可以包含在过滤规则中,并允许您更准确地应用它们。<0>了解更多</0>",
|
||||
"form_select_tags": "选择客户端标签",
|
||||
"check_title": "检查过滤",
|
||||
"check_desc": "检查主机名是否被过滤",
|
||||
"check": "检查",
|
||||
"form_enter_host": "输入主机名称",
|
||||
"filtered_custom_rules": "被自定义过滤规则过滤",
|
||||
"host_whitelisted": "主机在白名单内",
|
||||
"check_ip": "IP地址:{{ip}}",
|
||||
"check_cname": "CNAME: {{cname}}",
|
||||
"check_reason": "原因:{{reason}}",
|
||||
"check_rule": "规则:{{rule}}",
|
||||
"check_service": "服务名称:{{service}}",
|
||||
"check_not_found": "未在您的筛选列表中找到",
|
||||
"client_confirm_block": "您确定要阻止客户端\"{{ip}}\"?",
|
||||
"client_confirm_unblock": "您确定要解除对客户端\"{{ip}}\"的封锁吗?",
|
||||
"client_blocked": "客户端 \"{{ip}}\"被成功拦截",
|
||||
"client_unblocked": "成功解锁客户端\"{{ip}}\"",
|
||||
"static_ip": "静态IP地址",
|
||||
"static_ip_desc": "AdGuard Home 是一个服务器,所以它需要一个静态IP地址才能正常工作。否则,在某些情况下,你的路由器可能会给这个设备分配一个不同的IP地址。",
|
||||
"set_static_ip": "设置一个静态IP",
|
||||
"install_static_ok": "好消息!静态IP地址已经配置",
|
||||
"install_static_error": "AdGuard Home 无法为这个网络接口自动配置它。请参阅如何手动完成此操作的说明。",
|
||||
"install_static_configure": "我们检测到一个动态IP地址—<0>{{ip}}</0>被使用。您想把它作为您的静态地址吗?",
|
||||
"confirm_static_ip": "AdGuard Home 将把{{ip}} 配置为您的静态IP地址。您想要继续吗?",
|
||||
"list_updated": "{{count}} 列表已更新",
|
||||
"list_updated_plural": "{{count}} 条列表已更新"
|
||||
}
|
||||
@@ -14,38 +14,39 @@
|
||||
"dhcp_disable": "禁用動態主機設定協定(DHCP)伺服器",
|
||||
"dhcp_not_found": "啟用內建的動態主機設定協定(DHCP)伺服器為安全的 - 於該網路上,我們未發現任何現行的 DHCP 伺服器。然而,我們鼓勵您手動地重新檢查它,因為我們的自動之測試目前不予 100% 保證。",
|
||||
"dhcp_found": "於該網路上,一個現行的動態主機設定協定(DHCP)伺服器被發現。啟用內建的 DHCP 伺服器為不安全的。",
|
||||
"dhcp_leases": "動態主機設定協定(DHCP)租賃",
|
||||
"dhcp_static_leases": "動態主機設定協定(DHCP)靜態租賃",
|
||||
"dhcp_leases_not_found": "無已發現之動態主機設定協定(DHCP)租賃",
|
||||
"dhcp_leases": "動態主機設定協定(DHCP)租約",
|
||||
"dhcp_static_leases": "動態主機設定協定(DHCP)靜態租約",
|
||||
"dhcp_leases_not_found": "無已發現之動態主機設定協定(DHCP)租約",
|
||||
"dhcp_config_saved": "動態主機設定協定(DHCP)配置被成功地儲存",
|
||||
"form_error_required": "必填的欄位",
|
||||
"form_error_ip4_format": "無效的 IPv4 格式",
|
||||
"form_error_ip6_format": "無效的 IPv6 格式",
|
||||
"form_error_ip_format": "無效的 IP 格式",
|
||||
"form_error_mac_format": "無效的媒體存取控制(MAC)格式",
|
||||
"form_error_client_id_format": "無效的用戶端 ID 格式",
|
||||
"form_error_positive": "必須大於 0",
|
||||
"form_error_negative": "必須等於 0 或更大",
|
||||
"form_error_negative": "必須等於或大於 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_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_warning": "如果您無論如何想要啟用動態主機設定協定(DHCP)伺服器,確保在您的網路中無其它現行的 DHCP 伺服器。否則,它可能會破壞供已連線的裝置之網際網路!",
|
||||
"dhcp_error": "我們無法確定在該網路是否有另外的動態主機設定協定(DHCP)伺服器。",
|
||||
"dhcp_static_ip_error": "為了使用動態主機設定協定(DHCP)伺服器,靜態 IP 位址必須被設定。我們未能確定該網路介面是否被配置使用靜態 IP 位址。請手動地設定靜態 IP 位址。",
|
||||
"dhcp_dynamic_ip_found": "您的系統使用動態 IP 位址配置供介面 <0>{{interfaceName}}</0>。為了使用動態主機設定協定(DHCP)伺服器,靜態 IP 位址必須被設定。您現行的 IP 位址為 <0>{{ipAddress}}</0>。如果您按啟用 DHCP 按鈕,我們將自動地設定此 IP 位址作為靜態。",
|
||||
"dhcp_lease_added": "靜態租賃 \"{{key}}\" 被成功地加入",
|
||||
"dhcp_lease_deleted": "靜態租賃 \"{{key}}\" 被成功地刪除",
|
||||
"dhcp_new_static_lease": "新的靜態租賃",
|
||||
"dhcp_static_leases_not_found": "無已發現之動態主機設定協定(DHCP)靜態租賃",
|
||||
"dhcp_add_static_lease": "增加靜態租賃",
|
||||
"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": "您確定您想要刪除 \"{{key}}\" 嗎?",
|
||||
"form_enter_hostname": "輸入主機名稱",
|
||||
@@ -104,6 +105,11 @@
|
||||
"no_servers_specified": "無已明確指定的伺服器",
|
||||
"general_settings": "一般的設定",
|
||||
"dns_settings": "DNS 設定",
|
||||
"dns_blocklists": "DNS 封鎖清單",
|
||||
"dns_allowlists": "DNS 允許清單",
|
||||
"dns_blocklists_desc": "AdGuard Home 將封鎖與封鎖清單相符的網域。",
|
||||
"dns_allowlists_desc": "來自 DNS 允許清單的網域將被允許,即使它們在任何的封鎖清單中。",
|
||||
"custom_filtering_rules": "自訂的過濾規則",
|
||||
"encryption_settings": "加密設定",
|
||||
"dhcp_settings": "動態主機設定協定(DHCP)設定",
|
||||
"upstream_dns": "上游的 DNS 伺服器",
|
||||
@@ -121,22 +127,28 @@
|
||||
"enabled_save_search_toast": "已啟用安全搜尋",
|
||||
"enabled_table_header": "已啟用",
|
||||
"name_table_header": "名稱",
|
||||
"filter_url_table_header": "過濾器網址",
|
||||
"list_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": "增加過濾器",
|
||||
"no_blocklist_added": "無已加入的封鎖清單",
|
||||
"no_whitelist_added": "無已加入的允許清單",
|
||||
"add_blocklist": "增加封鎖清單",
|
||||
"add_allowlist": "增加允許清單",
|
||||
"cancel_btn": "取消",
|
||||
"enter_name_hint": "輸入名稱",
|
||||
"enter_url_hint": "輸入網址",
|
||||
"check_updates_btn": "檢查更新",
|
||||
"new_filter_btn": "新的過濾器訂閱",
|
||||
"enter_valid_filter_url": "輸入關於過濾器訂閱或主機檔案之有效的網址。",
|
||||
"new_blocklist": "新的封鎖清單",
|
||||
"new_allowlist": "新的允許清單",
|
||||
"edit_blocklist": "編輯封鎖清單",
|
||||
"edit_allowlist": "編輯允許清單",
|
||||
"enter_valid_blocklist": "輸入一個到該封鎖清單之有效的網址。",
|
||||
"enter_valid_allowlist": "輸入一個到該允許清單之有效的網址。",
|
||||
"form_error_url_format": "無效的網址格式",
|
||||
"custom_filter_rules": "自訂的過濾規則",
|
||||
"custom_filter_rules_hint": "於一行上輸入一個規則。您可使用廣告封鎖規則或主機檔案語法。",
|
||||
"examples_title": "範例",
|
||||
@@ -152,7 +164,7 @@
|
||||
"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": "所有的過濾器已是最新的",
|
||||
"all_lists_up_to_date_toast": "所有的清單已是最新的",
|
||||
"updated_upstream_dns_toast": "已更新上游的 DNS 伺服器",
|
||||
"dns_test_ok_toast": "已明確指定的 DNS 伺服器正在正確地運作",
|
||||
"dns_test_not_ok_toast": "伺服器 \"{{key}}\":無法被使用,請檢查您已正確地填寫它",
|
||||
@@ -163,7 +175,7 @@
|
||||
"type_table_header": "類型",
|
||||
"response_table_header": "回應",
|
||||
"client_table_header": "用戶端",
|
||||
"empty_response_status": "空白的",
|
||||
"empty_response_status": "空無的",
|
||||
"show_all_filter_type": "顯示全部",
|
||||
"show_filtered_type": "顯示已過濾的",
|
||||
"no_logs_found": "無已發現之記錄",
|
||||
@@ -172,7 +184,6 @@
|
||||
"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": "規則從自訂的過濾規則中被移除",
|
||||
@@ -190,6 +201,7 @@
|
||||
"query_log_retention_confirm": "您確定您想要更改查詢記錄保留嗎?如果您減少該間隔值,某些資料將被丟失",
|
||||
"dns_config": "DNS 伺服器配置",
|
||||
"blocking_mode": "封鎖模式",
|
||||
"default": "預設",
|
||||
"nxdomain": "不存在的網域(NXDOMAIN)",
|
||||
"null_ip": "無效的 IP",
|
||||
"custom_ip": "自訂的 IP",
|
||||
@@ -202,13 +214,16 @@
|
||||
"rate_limit_desc": "單一的用戶端被允許傳送的每秒請求之數量(0:無限制的)",
|
||||
"blocking_ipv4_desc": "要被返回給已封鎖的 A 請求之 IP 位址",
|
||||
"blocking_ipv6_desc": "要被返回給已封鎖的 AAAA 請求之 IP 位址",
|
||||
"blocking_mode_desc": "<0>不存在的網域(NXDOMAIN)– 以 NXDOMAIN 碼回覆;</0> <0>無效的 IP – 以零值 IP 位址(0.0.0.0 供 A;:: 供 AAAA)回覆;</0> <0>自訂的 IP - 以手動地被設定的 IP 位址回覆。</0>",
|
||||
"blocking_mode_default": "預設:當被廣告封鎖樣式的規則封鎖時,以 NXDOMAIN 回覆;當被 /etc/hosts 樣式的規則封鎖時,以在該規則中之已明確指定的 IP 位址回覆",
|
||||
"blocking_mode_nxdomain": "不存在的網域(NXDOMAIN):以 NXDOMAIN 碼回覆",
|
||||
"blocking_mode_null_ip": "無效的 IP:以零值 IP 位址(0.0.0.0 供 A;:: 供 AAAA)回覆",
|
||||
"blocking_mode_custom_ip": "自訂的 IP:以一組手動地被設定的 IP 位址回覆",
|
||||
"upstream_dns_client_desc": "如果您將該欄位留空,AdGuard Home 將使用在 <0>DNS 設定</0>中被配置的伺服器。",
|
||||
"source_label": "來源",
|
||||
"found_in_known_domain_db": "在已知的域名資料庫中被發現。",
|
||||
"category_label": "類別",
|
||||
"rule_label": "規則",
|
||||
"filter_label": "過濾器",
|
||||
"list_label": "清單",
|
||||
"unknown_filter": "未知的過濾器 {{filterId}}",
|
||||
"install_welcome_title": "歡迎至 AdGuard Home!",
|
||||
"install_welcome_desc": "AdGuard Home 是全網路範圍廣告和追蹤器封鎖的 DNS 伺服器。它的目的為讓您控制您的整個網路和所有您的裝置,且不需要使用用戶端程式。",
|
||||
@@ -307,7 +322,7 @@
|
||||
"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 正被更新",
|
||||
"processing_update": "請稍候,AdGuard Home 正被更新",
|
||||
"clients_title": "用戶端",
|
||||
"clients_desc": "配置被連線到 AdGuard Home 的裝置",
|
||||
"settings_global": "全域的",
|
||||
@@ -320,7 +335,7 @@
|
||||
"client_edit": "編輯用戶端",
|
||||
"client_identifier": "識別碼",
|
||||
"ip_address": "IP 位址",
|
||||
"client_identifier_desc": "用戶端可被 IP 位址、無類別網域間路由(CIDR)或媒體存取控制(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": "輸入識別碼",
|
||||
@@ -332,7 +347,7 @@
|
||||
"client_updated": "用戶端 \"{{key}}\" 被成功地更新",
|
||||
"clients_not_found": "無已發現之用戶端",
|
||||
"client_confirm_delete": "您確定您想要刪除用戶端 \"{{key}}\" 嗎?",
|
||||
"filter_confirm_delete": "您確定您想要刪除該過濾器嗎?",
|
||||
"list_confirm_delete": "您確定您想要刪除該清單嗎?",
|
||||
"auto_clients_title": "用戶端(執行時期)",
|
||||
"auto_clients_desc": "使用 AdGuard Home 但未被儲存在配置中之關於用戶端的資料",
|
||||
"access_title": "存取設定",
|
||||
@@ -371,6 +386,7 @@
|
||||
"rewrite_desc": "允許輕易地配置自訂的 DNS 回應供特定的域名。",
|
||||
"rewrite_applied": "已套用的改寫規則",
|
||||
"dns_rewrites": "DNS 改寫",
|
||||
"form_domain": "輸入域名或萬用字元(wildcard)",
|
||||
"form_answer": "輸入 IP 位址或域名",
|
||||
"form_error_domain_format": "無效的網域格式",
|
||||
"form_error_answer_format": "無效的回應格式",
|
||||
@@ -397,7 +413,8 @@
|
||||
"interval_days_plural": "{{count}} 日",
|
||||
"domain": "網域",
|
||||
"answer": "回應",
|
||||
"filter_added_successfully": "該過濾器已被成功地加入",
|
||||
"filter_added_successfully": "該清單已被成功地加入",
|
||||
"filter_updated": "該清單已被成功地更新",
|
||||
"statistics_configuration": "統計資料配置",
|
||||
"statistics_retention": "統計資料保留",
|
||||
"statistics_retention_desc": "如果您減少該間隔值,某些資料將被丟失",
|
||||
@@ -426,5 +443,41 @@
|
||||
"whois": "Whois",
|
||||
"filtering_rules_learn_more": "<0>了解更多</0>有關創建您自己的主機(hosts)封鎖清單。",
|
||||
"blocked_by_response": "被正規名稱(CNAME)或 IP 封鎖作為回應",
|
||||
"try_again": "再次嘗試"
|
||||
"try_again": "再次嘗試",
|
||||
"domain_desc": "輸入您想要被改寫的域名或萬用字元(wildcard)。",
|
||||
"example_rewrite_domain": "僅對於此域名改寫回應。",
|
||||
"example_rewrite_wildcard": "對於所有的 <0>example.org</0> 子網域改寫回應。",
|
||||
"disable_ipv6": "禁用 IPv6",
|
||||
"disable_ipv6_desc": "如果此功能被啟用,所有對於 IPv6 位址(類型 AAAA)的 DNS 查詢將被丟棄。",
|
||||
"autofix_warning_text": "如果您點擊\"修復\",AdGuard Home 將配置您的系統使用 AdGuard Home DNS 伺服器。",
|
||||
"autofix_warning_list": "它將執行這些任務:<0>撤銷系統 DNSStubListener</0> <0>設定 DNS 伺服器位址為 127.0.0.1</0> <0>用 /run/systemd/resolve/resolv.conf 取代 /etc/resolv.conf 的符號連結目標</0> <0>停止 DNSStubListener(重新載入 systemd 已解析的服務)</0>",
|
||||
"autofix_warning_result": "因此,預設下,來自您的系統之所有的 DNS 請求將被 AdGuard Home 處理。",
|
||||
"tags_title": "標記",
|
||||
"tags_desc": "您可選擇對應該用戶端的標記。標記可被包括在過濾規則中並允許您更準確地套用它們。<0>了解更多</0>",
|
||||
"form_select_tags": "選擇用戶端標記",
|
||||
"check_title": "檢查該過濾",
|
||||
"check_desc": "檢查該主機名稱是否被過濾",
|
||||
"check": "檢查",
|
||||
"form_enter_host": "輸入主機名稱",
|
||||
"filtered_custom_rules": "被自訂的過濾規則過濾",
|
||||
"host_whitelisted": "該主機被列入白名單",
|
||||
"check_ip": "IP 位址:{{ip}}",
|
||||
"check_cname": "正規名稱(CNAME):{{cname}}",
|
||||
"check_reason": "原因:{{reason}}",
|
||||
"check_rule": "規則:{{rule}}",
|
||||
"check_service": "服務名稱:{{service}}",
|
||||
"check_not_found": "未在您的過濾器清單中被找到",
|
||||
"client_confirm_block": "您確定您想要封鎖該用戶端 \"{{ip}}\" 嗎?",
|
||||
"client_confirm_unblock": "您確定您想要解除封鎖該用戶端 \"{{ip}}\" 嗎?",
|
||||
"client_blocked": "用戶端 \"{{ip}}\" 被成功地封鎖",
|
||||
"client_unblocked": "用戶端 \"{{ip}}\" 被成功地解除封鎖",
|
||||
"static_ip": "靜態 IP 位址",
|
||||
"static_ip_desc": "AdGuard Home 是一台伺服器,因此它需要一組靜態 IP 位址以正確地運作。否則,在某些時候,您的路由器可能分配一組不同的 IP 位址給此裝置。",
|
||||
"set_static_ip": "設定一組靜態 IP 位址",
|
||||
"install_static_ok": "好消息!該靜態 IP 位址已被配置",
|
||||
"install_static_error": "AdGuard Home 無法自動地配置它供此網路介面。請尋找有關如何手動地完成這個的用法說明。",
|
||||
"install_static_configure": "我們已偵測到一組動態 IP 位址被使用 — <0>{{ip}}</0>。您想要使用它作為您的靜態位址嗎?",
|
||||
"confirm_static_ip": "AdGuard Home 將配置 {{ip}} 為您的靜態 IP 位址。您想要繼續嗎?",
|
||||
"list_updated": "{{count}} 清單被更新",
|
||||
"list_updated_plural": "{{count}} 清單被更新"
|
||||
}
|
||||
@@ -1,7 +1,10 @@
|
||||
import { createAction } from 'redux-actions';
|
||||
import { t } from 'i18next';
|
||||
|
||||
import apiClient from '../api/Api';
|
||||
import { addErrorToast, addSuccessToast } from './index';
|
||||
import { normalizeTextarea } from '../helpers/helpers';
|
||||
import { ACTION } from '../helpers/constants';
|
||||
|
||||
export const getAccessListRequest = createAction('GET_ACCESS_LIST_REQUEST');
|
||||
export const getAccessListFailure = createAction('GET_ACCESS_LIST_FAILURE');
|
||||
@@ -28,9 +31,9 @@ export const setAccessList = config => async (dispatch) => {
|
||||
const { allowed_clients, disallowed_clients, blocked_hosts } = config;
|
||||
|
||||
const values = {
|
||||
allowed_clients: (allowed_clients && normalizeTextarea(allowed_clients)) || [],
|
||||
disallowed_clients: (disallowed_clients && normalizeTextarea(disallowed_clients)) || [],
|
||||
blocked_hosts: (blocked_hosts && normalizeTextarea(blocked_hosts)) || [],
|
||||
allowed_clients: normalizeTextarea(allowed_clients),
|
||||
disallowed_clients: normalizeTextarea(disallowed_clients),
|
||||
blocked_hosts: normalizeTextarea(blocked_hosts),
|
||||
};
|
||||
|
||||
await apiClient.setAccessList(values);
|
||||
@@ -41,3 +44,41 @@ export const setAccessList = config => async (dispatch) => {
|
||||
dispatch(setAccessListFailure());
|
||||
}
|
||||
};
|
||||
|
||||
export const toggleClientBlockRequest = createAction('TOGGLE_CLIENT_BLOCK_REQUEST');
|
||||
export const toggleClientBlockFailure = createAction('TOGGLE_CLIENT_BLOCK_FAILURE');
|
||||
export const toggleClientBlockSuccess = createAction('TOGGLE_CLIENT_BLOCK_SUCCESS');
|
||||
|
||||
export const toggleClientBlock = (type, ip) => async (dispatch) => {
|
||||
dispatch(toggleClientBlockRequest());
|
||||
try {
|
||||
const {
|
||||
allowed_clients, disallowed_clients, blocked_hosts,
|
||||
} = await apiClient.getAccessList();
|
||||
let updatedDisallowedClients = disallowed_clients || [];
|
||||
|
||||
if (type === ACTION.unblock && updatedDisallowedClients.includes(ip)) {
|
||||
updatedDisallowedClients = updatedDisallowedClients.filter(client => client !== ip);
|
||||
} else if (type === ACTION.block && !updatedDisallowedClients.includes(ip)) {
|
||||
updatedDisallowedClients.push(ip);
|
||||
}
|
||||
|
||||
const values = {
|
||||
allowed_clients,
|
||||
blocked_hosts,
|
||||
disallowed_clients: updatedDisallowedClients,
|
||||
};
|
||||
|
||||
await apiClient.setAccessList(values);
|
||||
dispatch(toggleClientBlockSuccess(values));
|
||||
|
||||
if (type === ACTION.unblock) {
|
||||
dispatch(addSuccessToast(t('client_unblocked', { ip })));
|
||||
} else if (type === ACTION.block) {
|
||||
dispatch(addSuccessToast(t('client_blocked', { ip })));
|
||||
}
|
||||
} catch (error) {
|
||||
dispatch(addErrorToast({ error }));
|
||||
dispatch(toggleClientBlockFailure());
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { createAction } from 'redux-actions';
|
||||
import { showLoading, hideLoading } from 'react-redux-loading-bar';
|
||||
import { t } from 'i18next';
|
||||
|
||||
import { normalizeFilteringStatus, normalizeRulesTextarea } from '../helpers/helpers';
|
||||
import { addErrorToast, addSuccessToast } from './index';
|
||||
@@ -44,10 +45,10 @@ 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) => {
|
||||
export const addFilter = (url, name, whitelist = false) => async (dispatch) => {
|
||||
dispatch(addFilterRequest());
|
||||
try {
|
||||
await apiClient.addFilter(url, name);
|
||||
await apiClient.addFilter({ url, name, whitelist });
|
||||
dispatch(addFilterSuccess(url));
|
||||
dispatch(toggleFilteringModal());
|
||||
dispatch(addSuccessToast('filter_added_successfully'));
|
||||
@@ -62,10 +63,10 @@ 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) => {
|
||||
export const removeFilter = (url, whitelist = false) => async (dispatch) => {
|
||||
dispatch(removeFilterRequest());
|
||||
try {
|
||||
await apiClient.removeFilter(url);
|
||||
await apiClient.removeFilter({ url, whitelist });
|
||||
dispatch(removeFilterSuccess(url));
|
||||
dispatch(getFilteringStatus());
|
||||
} catch (error) {
|
||||
@@ -78,10 +79,10 @@ 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) => {
|
||||
export const toggleFilterStatus = (url, data, whitelist = false) => async (dispatch) => {
|
||||
dispatch(toggleFilterRequest());
|
||||
try {
|
||||
await apiClient.setFilterUrl({ url, enabled: !enabled });
|
||||
await apiClient.setFilterUrl({ url, data, whitelist });
|
||||
dispatch(toggleFilterSuccess(url));
|
||||
dispatch(getFilteringStatus());
|
||||
} catch (error) {
|
||||
@@ -90,25 +91,40 @@ export const toggleFilterStatus = (url, enabled) => async (dispatch) => {
|
||||
}
|
||||
};
|
||||
|
||||
export const editFilterRequest = createAction('EDIT_FILTER_REQUEST');
|
||||
export const editFilterFailure = createAction('EDIT_FILTER_FAILURE');
|
||||
export const editFilterSuccess = createAction('EDIT_FILTER_SUCCESS');
|
||||
|
||||
export const editFilter = (url, data, whitelist = false) => async (dispatch) => {
|
||||
dispatch(editFilterRequest());
|
||||
try {
|
||||
await apiClient.setFilterUrl({ url, data, whitelist });
|
||||
dispatch(editFilterSuccess(url));
|
||||
dispatch(toggleFilteringModal());
|
||||
dispatch(addSuccessToast('filter_updated'));
|
||||
dispatch(getFilteringStatus());
|
||||
} catch (error) {
|
||||
dispatch(addErrorToast({ error }));
|
||||
dispatch(editFilterFailure());
|
||||
}
|
||||
};
|
||||
|
||||
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) => {
|
||||
export const refreshFilters = config => async (dispatch) => {
|
||||
dispatch(refreshFiltersRequest());
|
||||
dispatch(showLoading());
|
||||
try {
|
||||
const refreshText = await apiClient.refreshFilters();
|
||||
const data = await apiClient.refreshFilters(config);
|
||||
const { updated } = data;
|
||||
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, '')));
|
||||
}
|
||||
if (updated > 0) {
|
||||
dispatch(addSuccessToast(t('list_updated', { count: updated })));
|
||||
} else {
|
||||
dispatch(addErrorToast({ error: refreshText }));
|
||||
dispatch(addSuccessToast('all_lists_up_to_date_toast'));
|
||||
}
|
||||
|
||||
dispatch(getFilteringStatus());
|
||||
@@ -143,3 +159,23 @@ export const setFiltersConfig = config => async (dispatch, getState) => {
|
||||
dispatch(setFiltersConfigFailure());
|
||||
}
|
||||
};
|
||||
|
||||
export const checkHostRequest = createAction('CHECK_HOST_REQUEST');
|
||||
export const checkHostFailure = createAction('CHECK_HOST_FAILURE');
|
||||
export const checkHostSuccess = createAction('CHECK_HOST_SUCCESS');
|
||||
|
||||
export const checkHost = host => async (dispatch) => {
|
||||
dispatch(checkHostRequest());
|
||||
try {
|
||||
const data = await apiClient.checkHost(host);
|
||||
const [hostname] = Object.values(host);
|
||||
|
||||
dispatch(checkHostSuccess({
|
||||
hostname,
|
||||
...data,
|
||||
}));
|
||||
} catch (error) {
|
||||
dispatch(addErrorToast({ error }));
|
||||
dispatch(checkHostFailure());
|
||||
}
|
||||
};
|
||||
|
||||
@@ -208,6 +208,7 @@ export const getClients = () => async (dispatch) => {
|
||||
dispatch(getClientsSuccess({
|
||||
clients: sortedClients || [],
|
||||
autoClients: sortedAutoClients || [],
|
||||
supportedTags: data.supported_tags || [],
|
||||
}));
|
||||
} catch (error) {
|
||||
dispatch(addErrorToast({ error }));
|
||||
@@ -288,12 +289,8 @@ export const setUpstream = config => async (dispatch) => {
|
||||
dispatch(setUpstreamRequest());
|
||||
try {
|
||||
const values = { ...config };
|
||||
values.bootstrap_dns = (
|
||||
values.bootstrap_dns && normalizeTextarea(values.bootstrap_dns)
|
||||
) || [];
|
||||
values.upstream_dns = (
|
||||
values.upstream_dns && normalizeTextarea(values.upstream_dns)
|
||||
) || [];
|
||||
values.bootstrap_dns = normalizeTextarea(values.bootstrap_dns);
|
||||
values.upstream_dns = normalizeTextarea(values.upstream_dns);
|
||||
|
||||
await apiClient.setUpstream(values);
|
||||
dispatch(addSuccessToast('updated_upstream_dns_toast'));
|
||||
@@ -312,12 +309,8 @@ export const testUpstream = config => async (dispatch) => {
|
||||
dispatch(testUpstreamRequest());
|
||||
try {
|
||||
const values = { ...config };
|
||||
values.bootstrap_dns = (
|
||||
values.bootstrap_dns && normalizeTextarea(values.bootstrap_dns)
|
||||
) || [];
|
||||
values.upstream_dns = (
|
||||
values.upstream_dns && normalizeTextarea(values.upstream_dns)
|
||||
) || [];
|
||||
values.bootstrap_dns = normalizeTextarea(values.bootstrap_dns);
|
||||
values.upstream_dns = normalizeTextarea(values.upstream_dns);
|
||||
|
||||
const upstreamResponse = await apiClient.testUpstream(values);
|
||||
const testMessages = Object.keys(upstreamResponse).map((key) => {
|
||||
|
||||
@@ -11,7 +11,8 @@ export const processLogin = values => async (dispatch) => {
|
||||
dispatch(processLoginRequest());
|
||||
try {
|
||||
await apiClient.login(values);
|
||||
window.location.replace(window.location.origin);
|
||||
const dashboardUrl = window.location.origin + window.location.pathname.replace('/login.html', '/');
|
||||
window.location.replace(dashboardUrl);
|
||||
dispatch(processLoginSuccess());
|
||||
} catch (error) {
|
||||
dispatch(addErrorToast({ error }));
|
||||
|
||||
@@ -5,28 +5,20 @@ import { addErrorToast, addSuccessToast } from './index';
|
||||
import { normalizeLogs, getParamsForClientsSearch, addClientInfo } from '../helpers/helpers';
|
||||
import { TABLE_DEFAULT_PAGE_SIZE } from '../helpers/constants';
|
||||
|
||||
// Cache clients in closure
|
||||
const getLogsWithParamsWrapper = () => {
|
||||
let clients = {};
|
||||
return 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');
|
||||
if (!Object.values(clientsParams).every(client => client in clients)) {
|
||||
clients = await apiClient.findClients(clientsParams);
|
||||
}
|
||||
const logsWithClientInfo = addClientInfo(logs, clients, 'client');
|
||||
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,
|
||||
};
|
||||
return {
|
||||
logs: logsWithClientInfo, oldest, older_than, filter, ...values,
|
||||
};
|
||||
};
|
||||
|
||||
const getLogsWithParams = getLogsWithParamsWrapper();
|
||||
|
||||
export const getAdditionalLogsRequest = createAction('GET_ADDITIONAL_LOGS_REQUEST');
|
||||
export const getAdditionalLogsFailure = createAction('GET_ADDITIONAL_LOGS_FAILURE');
|
||||
export const getAdditionalLogsSuccess = createAction('GET_ADDITIONAL_LOGS_SUCCESS');
|
||||
@@ -44,7 +36,7 @@ const checkFilteredLogs = async (data, filter, dispatch, total) => {
|
||||
|
||||
try {
|
||||
const additionalLogs = await getLogsWithParams({ older_than: oldest, filter });
|
||||
if (additionalLogs.logs.length > 0) {
|
||||
if (additionalLogs.oldest.length > 0) {
|
||||
return await checkFilteredLogs(additionalLogs, filter, dispatch, {
|
||||
logs: [...totalData.logs, ...additionalLogs.logs],
|
||||
oldest: additionalLogs.oldest,
|
||||
|
||||
@@ -39,38 +39,30 @@ export const getStatsRequest = createAction('GET_STATS_REQUEST');
|
||||
export const getStatsFailure = createAction('GET_STATS_FAILURE');
|
||||
export const getStatsSuccess = createAction('GET_STATS_SUCCESS');
|
||||
|
||||
// Cache clients in closure
|
||||
const getStatsWrapper = () => {
|
||||
let clients = {};
|
||||
return () => async (dispatch) => {
|
||||
dispatch(getStatsRequest());
|
||||
try {
|
||||
const stats = await apiClient.getStats();
|
||||
const normalizedTopClients = normalizeTopStats(stats.top_clients);
|
||||
const clientsParams = getParamsForClientsSearch(normalizedTopClients, 'name');
|
||||
if (!Object.values(clientsParams).every(client => client in clients)) {
|
||||
clients = await apiClient.findClients(clientsParams);
|
||||
}
|
||||
const topClientsWithInfo = addClientInfo(normalizedTopClients, clients, 'name');
|
||||
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),
|
||||
};
|
||||
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());
|
||||
}
|
||||
};
|
||||
dispatch(getStatsSuccess(normalizedStats));
|
||||
} catch (error) {
|
||||
dispatch(addErrorToast({ error }));
|
||||
dispatch(getStatsFailure());
|
||||
}
|
||||
};
|
||||
|
||||
export const getStats = getStatsWrapper();
|
||||
|
||||
export const resetStatsRequest = createAction('RESET_STATS_REQUEST');
|
||||
export const resetStatsFailure = createAction('RESET_STATS_FAILURE');
|
||||
export const resetStatsSuccess = createAction('RESET_STATS_SUCCESS');
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import axios from 'axios';
|
||||
|
||||
import { getPathWithQueryString } from '../helpers/helpers';
|
||||
import { R_PATH_LAST_PART } from '../helpers/constants';
|
||||
|
||||
class Api {
|
||||
baseUrl = 'control';
|
||||
@@ -17,6 +18,12 @@ class Api {
|
||||
console.error(error);
|
||||
const errorPath = `${this.baseUrl}/${path}`;
|
||||
if (error.response) {
|
||||
if (error.response.status === 403) {
|
||||
const loginPageUrl = window.location.href.replace(R_PATH_LAST_PART, '/login.html');
|
||||
window.location.replace(loginPageUrl);
|
||||
return false;
|
||||
}
|
||||
|
||||
throw new Error(`${errorPath} | ${error.response.data} | ${error.response.status}`);
|
||||
}
|
||||
throw new Error(`${errorPath} | ${error.message ? error.message : error}`);
|
||||
@@ -75,26 +82,31 @@ class Api {
|
||||
FILTERING_REFRESH = { path: 'filtering/refresh', method: 'POST' };
|
||||
FILTERING_SET_URL = { path: 'filtering/set_url', method: 'POST' };
|
||||
FILTERING_CONFIG = { path: 'filtering/config', method: 'POST' };
|
||||
FILTERING_CHECK_HOST = { path: 'filtering/check_host', method: 'GET' };
|
||||
|
||||
getFilteringStatus() {
|
||||
const { path, method } = this.FILTERING_STATUS;
|
||||
return this.makeRequest(path, method);
|
||||
}
|
||||
|
||||
refreshFilters() {
|
||||
refreshFilters(config) {
|
||||
const { path, method } = this.FILTERING_REFRESH;
|
||||
return this.makeRequest(path, method);
|
||||
const parameters = {
|
||||
data: config,
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
};
|
||||
|
||||
return this.makeRequest(path, method, parameters);
|
||||
}
|
||||
|
||||
addFilter(url, name) {
|
||||
addFilter(config) {
|
||||
const { path, method } = this.FILTERING_ADD_FILTER;
|
||||
const config = {
|
||||
data: {
|
||||
name,
|
||||
url,
|
||||
},
|
||||
const parameters = {
|
||||
data: config,
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
};
|
||||
return this.makeRequest(path, method, config);
|
||||
|
||||
return this.makeRequest(path, method, parameters);
|
||||
}
|
||||
|
||||
removeFilter(config) {
|
||||
@@ -134,6 +146,12 @@ class Api {
|
||||
return this.makeRequest(path, method, parameters);
|
||||
}
|
||||
|
||||
checkHost(params) {
|
||||
const { path, method } = this.FILTERING_CHECK_HOST;
|
||||
const url = getPathWithQueryString(path, params);
|
||||
return this.makeRequest(url, method);
|
||||
}
|
||||
|
||||
// Parental
|
||||
PARENTAL_STATUS = { path: 'parental/status', method: 'GET' };
|
||||
PARENTAL_ENABLE = { path: 'parental/enable', method: 'POST' };
|
||||
|
||||
@@ -12,7 +12,11 @@ import './index.css';
|
||||
import Header from '../../containers/Header';
|
||||
import Dashboard from '../../containers/Dashboard';
|
||||
import Settings from '../../containers/Settings';
|
||||
import Filters from '../../containers/Filters';
|
||||
|
||||
import CustomRules from '../../containers/CustomRules';
|
||||
import DnsBlocklist from '../../containers/DnsBlocklist';
|
||||
import DnsAllowlist from '../../containers/DnsAllowlist';
|
||||
import DnsRewrites from '../../containers/DnsRewrites';
|
||||
|
||||
import Dns from '../../containers/Dns';
|
||||
import Encryption from '../../containers/Encryption';
|
||||
@@ -108,7 +112,10 @@ class App extends Component {
|
||||
<Route path="/encryption" component={Encryption} />
|
||||
<Route path="/dhcp" component={Dhcp} />
|
||||
<Route path="/clients" component={Clients} />
|
||||
<Route path="/filters" component={Filters} />
|
||||
<Route path="/filters" component={DnsBlocklist} />
|
||||
<Route path="/dns_allowlists" component={DnsAllowlist} />
|
||||
<Route path="/dns_rewrites" component={DnsRewrites} />
|
||||
<Route path="/custom_rules" component={CustomRules} />
|
||||
<Route path="/logs" component={Logs} />
|
||||
<Route path="/guide" component={SetupGuide} />
|
||||
</Fragment>
|
||||
|
||||
@@ -58,7 +58,7 @@ const BlockedDomains = ({
|
||||
noDataText={t('no_domains_found')}
|
||||
minRows={6}
|
||||
defaultPageSize={100}
|
||||
className="-striped -highlight card-table-overflow stats__table"
|
||||
className="-highlight card-table-overflow stats__table"
|
||||
/>
|
||||
</Card>
|
||||
);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import React from 'react';
|
||||
import React, { Fragment } from 'react';
|
||||
import ReactTable from 'react-table';
|
||||
import PropTypes from 'prop-types';
|
||||
import { Trans, withNamespaces } from 'react-i18next';
|
||||
@@ -28,17 +28,61 @@ const countCell = dnsQueries =>
|
||||
return <Cell value={value} percent={percent} color={percentColor} />;
|
||||
};
|
||||
|
||||
const clientCell = t =>
|
||||
const renderBlockingButton = (blocked, ip, handleClick, processing) => {
|
||||
let buttonProps = {
|
||||
className: 'btn-outline-danger',
|
||||
text: 'block_btn',
|
||||
type: 'block',
|
||||
};
|
||||
|
||||
if (blocked) {
|
||||
buttonProps = {
|
||||
className: 'btn-outline-secondary',
|
||||
text: 'unblock_btn',
|
||||
type: 'unblock',
|
||||
};
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="table__action">
|
||||
<button
|
||||
type="button"
|
||||
className={`btn btn-sm ${buttonProps.className}`}
|
||||
onClick={() => handleClick(buttonProps.type, ip)}
|
||||
disabled={processing}
|
||||
>
|
||||
<Trans>{buttonProps.text}</Trans>
|
||||
</button>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
const isBlockedClient = (clients, ip) => !!(clients && clients.includes(ip));
|
||||
|
||||
const clientCell = (t, toggleClientStatus, processing, disallowedClients) =>
|
||||
function cell(row) {
|
||||
const { value } = row;
|
||||
const blocked = isBlockedClient(disallowedClients, value);
|
||||
|
||||
return (
|
||||
<div className="logs__row logs__row--overflow logs__row--column">
|
||||
{formatClientCell(row, t)}
|
||||
</div>
|
||||
<Fragment>
|
||||
<div className="logs__row logs__row--overflow logs__row--column">
|
||||
{formatClientCell(row, t)}
|
||||
</div>
|
||||
{renderBlockingButton(blocked, value, toggleClientStatus, processing)}
|
||||
</Fragment>
|
||||
);
|
||||
};
|
||||
|
||||
const Clients = ({
|
||||
t, refreshButton, topClients, subtitle, dnsQueries,
|
||||
t,
|
||||
refreshButton,
|
||||
topClients,
|
||||
subtitle,
|
||||
dnsQueries,
|
||||
toggleClientStatus,
|
||||
processingAccessSet,
|
||||
disallowedClients,
|
||||
}) => (
|
||||
<Card
|
||||
title={t('top_clients')}
|
||||
@@ -47,10 +91,13 @@ const Clients = ({
|
||||
refresh={refreshButton}
|
||||
>
|
||||
<ReactTable
|
||||
data={topClients.map(({ name: ip, count, info }) => ({
|
||||
data={topClients.map(({
|
||||
name: ip, count, info, blocked,
|
||||
}) => ({
|
||||
ip,
|
||||
count,
|
||||
info,
|
||||
blocked,
|
||||
}))}
|
||||
columns={[
|
||||
{
|
||||
@@ -58,7 +105,7 @@ const Clients = ({
|
||||
accessor: 'ip',
|
||||
sortMethod: (a, b) =>
|
||||
parseInt(a.replace(/\./g, ''), 10) - parseInt(b.replace(/\./g, ''), 10),
|
||||
Cell: clientCell(t),
|
||||
Cell: clientCell(t, toggleClientStatus, processingAccessSet, disallowedClients),
|
||||
},
|
||||
{
|
||||
Header: <Trans>requests_count</Trans>,
|
||||
@@ -72,7 +119,24 @@ const Clients = ({
|
||||
noDataText={t('no_clients_found')}
|
||||
minRows={6}
|
||||
defaultPageSize={100}
|
||||
className="-striped -highlight card-table-overflow"
|
||||
className="-highlight card-table-overflow clients__table"
|
||||
getTrProps={(_state, rowInfo) => {
|
||||
if (!rowInfo) {
|
||||
return {};
|
||||
}
|
||||
|
||||
const { ip } = rowInfo.original;
|
||||
|
||||
if (isBlockedClient(disallowedClients, ip)) {
|
||||
return {
|
||||
className: 'red',
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
className: '',
|
||||
};
|
||||
}}
|
||||
/>
|
||||
</Card>
|
||||
);
|
||||
@@ -85,6 +149,9 @@ Clients.propTypes = {
|
||||
autoClients: PropTypes.array.isRequired,
|
||||
subtitle: PropTypes.string.isRequired,
|
||||
t: PropTypes.func.isRequired,
|
||||
toggleClientStatus: PropTypes.func.isRequired,
|
||||
processingAccessSet: PropTypes.bool.isRequired,
|
||||
disallowedClients: PropTypes.string.isRequired,
|
||||
};
|
||||
|
||||
export default withNamespaces()(Clients);
|
||||
|
||||
@@ -59,7 +59,7 @@ const QueriedDomains = ({
|
||||
noDataText={t('no_domains_found')}
|
||||
minRows={6}
|
||||
defaultPageSize={100}
|
||||
className="-striped -highlight card-table-overflow stats__table"
|
||||
className="-highlight card-table-overflow stats__table"
|
||||
/>
|
||||
</Card>
|
||||
);
|
||||
|
||||
@@ -10,6 +10,7 @@ import BlockedDomains from './BlockedDomains';
|
||||
|
||||
import PageTitle from '../ui/PageTitle';
|
||||
import Loading from '../ui/Loading';
|
||||
import { ACTION } from '../../helpers/constants';
|
||||
import './Dashboard.css';
|
||||
|
||||
class Dashboard extends Component {
|
||||
@@ -18,6 +19,7 @@ class Dashboard extends Component {
|
||||
}
|
||||
|
||||
getAllStats = () => {
|
||||
this.props.getAccessList();
|
||||
this.props.getStats();
|
||||
this.props.getStatsConfig();
|
||||
};
|
||||
@@ -39,9 +41,21 @@ class Dashboard extends Component {
|
||||
);
|
||||
};
|
||||
|
||||
toggleClientStatus = (type, ip) => {
|
||||
const confirmMessage = type === ACTION.block ? 'client_confirm_block' : 'client_confirm_unblock';
|
||||
|
||||
if (window.confirm(this.props.t(confirmMessage, { ip }))) {
|
||||
this.props.toggleClientBlock(type, ip);
|
||||
}
|
||||
};
|
||||
|
||||
render() {
|
||||
const { dashboard, stats, t } = this.props;
|
||||
const statsProcessing = stats.processingStats || stats.processingGetConfig;
|
||||
const {
|
||||
dashboard, stats, access, t,
|
||||
} = this.props;
|
||||
const statsProcessing = stats.processingStats
|
||||
|| stats.processingGetConfig
|
||||
|| access.processing;
|
||||
|
||||
const subtitle =
|
||||
stats.interval === 1
|
||||
@@ -116,6 +130,9 @@ class Dashboard extends Component {
|
||||
clients={dashboard.clients}
|
||||
autoClients={dashboard.autoClients}
|
||||
refreshButton={refreshButton}
|
||||
toggleClientStatus={this.toggleClientStatus}
|
||||
processingAccessSet={access.processingSet}
|
||||
disallowedClients={access.disallowed_clients}
|
||||
/>
|
||||
</div>
|
||||
<div className="col-lg-6">
|
||||
@@ -146,11 +163,14 @@ class Dashboard extends Component {
|
||||
Dashboard.propTypes = {
|
||||
dashboard: PropTypes.object.isRequired,
|
||||
stats: PropTypes.object.isRequired,
|
||||
access: PropTypes.object.isRequired,
|
||||
getStats: PropTypes.func.isRequired,
|
||||
getStatsConfig: PropTypes.func.isRequired,
|
||||
toggleProtection: PropTypes.func.isRequired,
|
||||
getClients: PropTypes.func.isRequired,
|
||||
t: PropTypes.func.isRequired,
|
||||
toggleClientBlock: PropTypes.func.isRequired,
|
||||
getAccessList: PropTypes.func.isRequired,
|
||||
};
|
||||
|
||||
export default withNamespaces()(Dashboard);
|
||||
|
||||
39
client/src/components/Filters/Actions.js
Normal file
39
client/src/components/Filters/Actions.js
Normal file
@@ -0,0 +1,39 @@
|
||||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { withNamespaces, Trans } from 'react-i18next';
|
||||
|
||||
const Actions = ({
|
||||
handleAdd, handleRefresh, processingRefreshFilters, whitelist,
|
||||
}) => (
|
||||
<div className="card-actions">
|
||||
<button
|
||||
className="btn btn-success btn-standard mr-2 btn-large"
|
||||
type="submit"
|
||||
onClick={handleAdd}
|
||||
>
|
||||
{whitelist ? (
|
||||
<Trans>add_allowlist</Trans>
|
||||
) : (
|
||||
<Trans>add_blocklist</Trans>
|
||||
)}
|
||||
</button>
|
||||
<button
|
||||
className="btn btn-primary btn-standard"
|
||||
type="submit"
|
||||
onClick={handleRefresh}
|
||||
disabled={processingRefreshFilters}
|
||||
>
|
||||
<Trans>check_updates_btn</Trans>
|
||||
</button>
|
||||
</div>
|
||||
);
|
||||
|
||||
Actions.propTypes = {
|
||||
handleAdd: PropTypes.func.isRequired,
|
||||
handleRefresh: PropTypes.func.isRequired,
|
||||
processingRefreshFilters: PropTypes.bool.isRequired,
|
||||
whitelist: PropTypes.bool,
|
||||
};
|
||||
|
||||
export default withNamespaces()(Actions);
|
||||
|
||||
160
client/src/components/Filters/Check/Info.js
Normal file
160
client/src/components/Filters/Check/Info.js
Normal file
@@ -0,0 +1,160 @@
|
||||
import React, { Fragment } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { withNamespaces } from 'react-i18next';
|
||||
|
||||
import {
|
||||
checkFiltered,
|
||||
checkRewrite,
|
||||
checkBlackList,
|
||||
checkNotFilteredNotFound,
|
||||
checkWhiteList,
|
||||
checkSafeSearch,
|
||||
checkSafeBrowsing,
|
||||
checkParental,
|
||||
} from '../../../helpers/helpers';
|
||||
import { FILTERED } from '../../../helpers/constants';
|
||||
|
||||
const getFilterName = (id, filters, whitelistFilters, t) => {
|
||||
if (id === 0) {
|
||||
return t('filtered_custom_rules');
|
||||
}
|
||||
|
||||
const filter = filters.find(filter => filter.id === id)
|
||||
|| whitelistFilters.find(filter => filter.id === id);
|
||||
|
||||
if (filter && filter.name) {
|
||||
return t('query_log_filtered', { filter: filter.name });
|
||||
}
|
||||
|
||||
return '';
|
||||
};
|
||||
|
||||
const getTitle = (reason, filterName, t, onlyFiltered) => {
|
||||
if (checkNotFilteredNotFound(reason)) {
|
||||
return t('check_not_found');
|
||||
}
|
||||
|
||||
if (checkRewrite(reason)) {
|
||||
return t('rewrite_applied');
|
||||
}
|
||||
|
||||
if (checkBlackList(reason)) {
|
||||
return filterName;
|
||||
}
|
||||
|
||||
if (checkWhiteList(reason)) {
|
||||
return (
|
||||
<div>
|
||||
{filterName}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
if (onlyFiltered) {
|
||||
const filterKey = reason.replace(FILTERED, '');
|
||||
|
||||
return (
|
||||
<div>
|
||||
{t('query_log_filtered', { filter: filterKey })}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<Fragment>
|
||||
<div>
|
||||
{t('check_reason', { reason })}
|
||||
</div>
|
||||
<div>
|
||||
{filterName}
|
||||
</div>
|
||||
</Fragment>
|
||||
);
|
||||
};
|
||||
|
||||
const getColor = (reason) => {
|
||||
if (checkFiltered(reason)) {
|
||||
return 'red';
|
||||
} else if (checkRewrite(reason)) {
|
||||
return 'blue';
|
||||
} else if (checkWhiteList(reason)) {
|
||||
return 'green';
|
||||
}
|
||||
|
||||
return '';
|
||||
};
|
||||
|
||||
const Info = ({
|
||||
filters,
|
||||
whitelistFilters,
|
||||
hostname,
|
||||
reason,
|
||||
filter_id,
|
||||
rule,
|
||||
service_name,
|
||||
cname,
|
||||
ip_addrs,
|
||||
t,
|
||||
}) => {
|
||||
const filterName = getFilterName(filter_id, filters, whitelistFilters, t);
|
||||
const onlyFiltered = checkSafeSearch(reason)
|
||||
|| checkSafeBrowsing(reason)
|
||||
|| checkParental(reason);
|
||||
const title = getTitle(reason, filterName, t, onlyFiltered);
|
||||
const color = getColor(reason);
|
||||
|
||||
if (onlyFiltered) {
|
||||
return (
|
||||
<div className={`card mb-0 p-3 ${color}`}>
|
||||
<div>
|
||||
<strong>{hostname}</strong>
|
||||
</div>
|
||||
|
||||
<div>{title}</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className={`card mb-0 p-3 ${color}`}>
|
||||
<div>
|
||||
<strong>{hostname}</strong>
|
||||
</div>
|
||||
|
||||
<div>{title}</div>
|
||||
|
||||
{rule && (
|
||||
<div>{t('check_rule', { rule })}</div>
|
||||
)}
|
||||
|
||||
{service_name && (
|
||||
<div>{t('check_service', { service: service_name })}</div>
|
||||
)}
|
||||
|
||||
{cname && (
|
||||
<div>{t('check_cname', { cname })}</div>
|
||||
)}
|
||||
|
||||
{ip_addrs && (
|
||||
<div>
|
||||
{t('check_ip', { ip: ip_addrs.join(', ') })}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
Info.propTypes = {
|
||||
filters: PropTypes.array.isRequired,
|
||||
whitelistFilters: PropTypes.array.isRequired,
|
||||
hostname: PropTypes.string.isRequired,
|
||||
reason: PropTypes.string.isRequired,
|
||||
filter_id: PropTypes.number,
|
||||
rule: PropTypes.string,
|
||||
service_name: PropTypes.string,
|
||||
cname: PropTypes.string,
|
||||
ip_addrs: PropTypes.array,
|
||||
t: PropTypes.func.isRequired,
|
||||
};
|
||||
|
||||
export default withNamespaces()(Info);
|
||||
98
client/src/components/Filters/Check/index.js
Normal file
98
client/src/components/Filters/Check/index.js
Normal file
@@ -0,0 +1,98 @@
|
||||
import React, { Fragment } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { Trans, withNamespaces } from 'react-i18next';
|
||||
import { Field, reduxForm } from 'redux-form';
|
||||
import flow from 'lodash/flow';
|
||||
import Card from '../../ui/Card';
|
||||
|
||||
import { renderInputField } from '../../../helpers/form';
|
||||
import Info from './Info';
|
||||
|
||||
const Check = (props) => {
|
||||
const {
|
||||
t,
|
||||
handleSubmit,
|
||||
pristine,
|
||||
invalid,
|
||||
processing,
|
||||
check,
|
||||
filters,
|
||||
whitelistFilters,
|
||||
} = props;
|
||||
|
||||
const {
|
||||
hostname,
|
||||
reason,
|
||||
filter_id,
|
||||
rule,
|
||||
service_name,
|
||||
cname,
|
||||
ip_addrs,
|
||||
} = check;
|
||||
|
||||
return (
|
||||
<Card
|
||||
title={t('check_title')}
|
||||
subtitle={t('check_desc')}
|
||||
>
|
||||
<form onSubmit={handleSubmit}>
|
||||
<div className="row">
|
||||
<div className="col-12 col-md-6">
|
||||
<div className="input-group">
|
||||
<Field
|
||||
id="name"
|
||||
name="name"
|
||||
component={renderInputField}
|
||||
type="text"
|
||||
className="form-control"
|
||||
placeholder={t('form_enter_host')}
|
||||
/>
|
||||
<span className="input-group-append">
|
||||
<button
|
||||
className="btn btn-success btn-standard btn-large"
|
||||
type="submit"
|
||||
onClick={this.handleSubmit}
|
||||
disabled={pristine || invalid || processing}
|
||||
>
|
||||
<Trans>check</Trans>
|
||||
</button>
|
||||
</span>
|
||||
</div>
|
||||
{check.hostname && (
|
||||
<Fragment>
|
||||
<hr/>
|
||||
<Info
|
||||
filters={filters}
|
||||
whitelistFilters={whitelistFilters}
|
||||
hostname={hostname}
|
||||
reason={reason}
|
||||
filter_id={filter_id}
|
||||
rule={rule}
|
||||
service_name={service_name}
|
||||
cname={cname}
|
||||
ip_addrs={ip_addrs}
|
||||
/>
|
||||
</Fragment>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</Card>
|
||||
);
|
||||
};
|
||||
|
||||
Check.propTypes = {
|
||||
t: PropTypes.func.isRequired,
|
||||
handleSubmit: PropTypes.func.isRequired,
|
||||
pristine: PropTypes.bool.isRequired,
|
||||
invalid: PropTypes.bool.isRequired,
|
||||
processing: PropTypes.bool.isRequired,
|
||||
check: PropTypes.object.isRequired,
|
||||
filters: PropTypes.array.isRequired,
|
||||
whitelistFilters: PropTypes.array.isRequired,
|
||||
};
|
||||
|
||||
export default flow([
|
||||
withNamespaces(),
|
||||
reduxForm({ form: 'domainCheckForm' }),
|
||||
])(Check);
|
||||
95
client/src/components/Filters/CustomRules.js
Normal file
95
client/src/components/Filters/CustomRules.js
Normal file
@@ -0,0 +1,95 @@
|
||||
import React, { Component, Fragment } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { Trans, withNamespaces } from 'react-i18next';
|
||||
|
||||
import Card from '../ui/Card';
|
||||
import PageTitle from '../ui/PageTitle';
|
||||
import Examples from './Examples';
|
||||
import Check from './Check';
|
||||
|
||||
class CustomRules extends Component {
|
||||
componentDidMount() {
|
||||
this.props.getFilteringStatus();
|
||||
}
|
||||
|
||||
handleChange = (e) => {
|
||||
const { value } = e.currentTarget;
|
||||
this.handleRulesChange(value);
|
||||
};
|
||||
|
||||
handleSubmit = (e) => {
|
||||
e.preventDefault();
|
||||
this.handleRulesSubmit();
|
||||
};
|
||||
|
||||
handleRulesChange = (value) => {
|
||||
this.props.handleRulesChange({ userRules: value });
|
||||
};
|
||||
|
||||
handleRulesSubmit = () => {
|
||||
this.props.setRules(this.props.filtering.userRules);
|
||||
};
|
||||
|
||||
handleCheck = (values) => {
|
||||
this.props.checkHost(values);
|
||||
}
|
||||
|
||||
render() {
|
||||
const {
|
||||
t,
|
||||
filtering: {
|
||||
filters,
|
||||
whitelistFilters,
|
||||
userRules,
|
||||
processingCheck,
|
||||
check,
|
||||
},
|
||||
} = this.props;
|
||||
|
||||
return (
|
||||
<Fragment>
|
||||
<PageTitle title={t('custom_filtering_rules')} />
|
||||
<Card
|
||||
subtitle={t('custom_filter_rules_hint')}
|
||||
>
|
||||
<form onSubmit={this.handleSubmit}>
|
||||
<textarea
|
||||
className="form-control form-control--textarea-large"
|
||||
value={userRules}
|
||||
onChange={this.handleChange}
|
||||
/>
|
||||
<div className="card-actions">
|
||||
<button
|
||||
className="btn btn-success btn-standard btn-large"
|
||||
type="submit"
|
||||
onClick={this.handleSubmit}
|
||||
>
|
||||
<Trans>apply_btn</Trans>
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
<hr />
|
||||
<Examples />
|
||||
</Card>
|
||||
<Check
|
||||
filters={filters}
|
||||
whitelistFilters={whitelistFilters}
|
||||
check={check}
|
||||
onSubmit={this.handleCheck}
|
||||
processing={processingCheck}
|
||||
/>
|
||||
</Fragment>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
CustomRules.propTypes = {
|
||||
filtering: PropTypes.object.isRequired,
|
||||
setRules: PropTypes.func.isRequired,
|
||||
checkHost: PropTypes.func.isRequired,
|
||||
getFilteringStatus: PropTypes.func.isRequired,
|
||||
handleRulesChange: PropTypes.func.isRequired,
|
||||
t: PropTypes.func.isRequired,
|
||||
};
|
||||
|
||||
export default withNamespaces()(CustomRules);
|
||||
133
client/src/components/Filters/DnsAllowlist.js
Normal file
133
client/src/components/Filters/DnsAllowlist.js
Normal file
@@ -0,0 +1,133 @@
|
||||
import React, { Component, Fragment } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { withNamespaces } from 'react-i18next';
|
||||
|
||||
import PageTitle from '../ui/PageTitle';
|
||||
import Card from '../ui/Card';
|
||||
import Modal from './Modal';
|
||||
import Actions from './Actions';
|
||||
import Table from './Table';
|
||||
|
||||
import { MODAL_TYPE } from '../../helpers/constants';
|
||||
import { getCurrentFilter } from '../../helpers/helpers';
|
||||
|
||||
class DnsAllowlist extends Component {
|
||||
componentDidMount() {
|
||||
this.props.getFilteringStatus();
|
||||
}
|
||||
|
||||
handleSubmit = (values) => {
|
||||
const { name, url } = values;
|
||||
const { filtering } = this.props;
|
||||
const whitelist = true;
|
||||
|
||||
if (filtering.modalType === MODAL_TYPE.EDIT) {
|
||||
this.props.editFilter(filtering.modalFilterUrl, values, whitelist);
|
||||
} else {
|
||||
this.props.addFilter(url, name, whitelist);
|
||||
}
|
||||
};
|
||||
|
||||
handleDelete = (url) => {
|
||||
if (window.confirm(this.props.t('list_confirm_delete'))) {
|
||||
const whitelist = true;
|
||||
this.props.removeFilter(url, whitelist);
|
||||
}
|
||||
};
|
||||
|
||||
toggleFilter = (url, data) => {
|
||||
const whitelist = true;
|
||||
this.props.toggleFilterStatus(url, data, whitelist);
|
||||
};
|
||||
|
||||
handleRefresh = () => {
|
||||
this.props.refreshFilters({ whitelist: true });
|
||||
};
|
||||
|
||||
render() {
|
||||
const {
|
||||
t,
|
||||
toggleFilteringModal,
|
||||
addFilter,
|
||||
toggleFilterStatus,
|
||||
filtering: {
|
||||
whitelistFilters,
|
||||
isModalOpen,
|
||||
isFilterAdded,
|
||||
processingRefreshFilters,
|
||||
processingRemoveFilter,
|
||||
processingAddFilter,
|
||||
processingConfigFilter,
|
||||
processingFilters,
|
||||
modalType,
|
||||
modalFilterUrl,
|
||||
},
|
||||
} = this.props;
|
||||
const currentFilterData = getCurrentFilter(modalFilterUrl, whitelistFilters);
|
||||
const loading = processingFilters
|
||||
|| processingAddFilter
|
||||
|| processingRemoveFilter
|
||||
|| processingRefreshFilters;
|
||||
const whitelist = true;
|
||||
|
||||
return (
|
||||
<Fragment>
|
||||
<PageTitle
|
||||
title={t('dns_allowlists')}
|
||||
subtitle={t('dns_allowlists_desc')}
|
||||
/>
|
||||
<div className="content">
|
||||
<div className="row">
|
||||
<div className="col-md-12">
|
||||
<Card subtitle={t('filters_and_hosts_hint')}>
|
||||
<Table
|
||||
filters={whitelistFilters}
|
||||
loading={loading}
|
||||
processingConfigFilter={processingConfigFilter}
|
||||
toggleFilteringModal={toggleFilteringModal}
|
||||
toggleFilterStatus={toggleFilterStatus}
|
||||
handleDelete={this.handleDelete}
|
||||
toggleFilter={this.toggleFilter}
|
||||
whitelist={whitelist}
|
||||
/>
|
||||
<Actions
|
||||
handleAdd={() => toggleFilteringModal({ type: MODAL_TYPE.ADD })}
|
||||
handleRefresh={this.handleRefresh}
|
||||
processingRefreshFilters={processingRefreshFilters}
|
||||
whitelist={whitelist}
|
||||
/>
|
||||
</Card>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<Modal
|
||||
isOpen={isModalOpen}
|
||||
toggleModal={toggleFilteringModal}
|
||||
addFilter={addFilter}
|
||||
isFilterAdded={isFilterAdded}
|
||||
processingAddFilter={processingAddFilter}
|
||||
processingConfigFilter={processingConfigFilter}
|
||||
handleSubmit={this.handleSubmit}
|
||||
modalType={modalType}
|
||||
currentFilterData={currentFilterData}
|
||||
whitelist={whitelist}
|
||||
/>
|
||||
</Fragment>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
DnsAllowlist.propTypes = {
|
||||
getFilteringStatus: PropTypes.func.isRequired,
|
||||
filtering: PropTypes.object.isRequired,
|
||||
removeFilter: PropTypes.func.isRequired,
|
||||
toggleFilterStatus: PropTypes.func.isRequired,
|
||||
addFilter: PropTypes.func.isRequired,
|
||||
toggleFilteringModal: PropTypes.func.isRequired,
|
||||
handleRulesChange: PropTypes.func.isRequired,
|
||||
refreshFilters: PropTypes.func.isRequired,
|
||||
editFilter: PropTypes.func.isRequired,
|
||||
t: PropTypes.func.isRequired,
|
||||
};
|
||||
|
||||
export default withNamespaces()(DnsAllowlist);
|
||||
124
client/src/components/Filters/DnsBlocklist.js
Normal file
124
client/src/components/Filters/DnsBlocklist.js
Normal file
@@ -0,0 +1,124 @@
|
||||
import React, { Component, Fragment } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { withNamespaces } from 'react-i18next';
|
||||
|
||||
import PageTitle from '../ui/PageTitle';
|
||||
import Card from '../ui/Card';
|
||||
import Modal from './Modal';
|
||||
import Actions from './Actions';
|
||||
import Table from './Table';
|
||||
|
||||
import { MODAL_TYPE } from '../../helpers/constants';
|
||||
import { getCurrentFilter } from '../../helpers/helpers';
|
||||
|
||||
class DnsBlocklist extends Component {
|
||||
componentDidMount() {
|
||||
this.props.getFilteringStatus();
|
||||
}
|
||||
|
||||
handleSubmit = (values) => {
|
||||
const { name, url } = values;
|
||||
const { filtering } = this.props;
|
||||
|
||||
if (filtering.modalType === MODAL_TYPE.EDIT) {
|
||||
this.props.editFilter(filtering.modalFilterUrl, values);
|
||||
} else {
|
||||
this.props.addFilter(url, name);
|
||||
}
|
||||
};
|
||||
|
||||
handleDelete = (url) => {
|
||||
if (window.confirm(this.props.t('list_confirm_delete'))) {
|
||||
this.props.removeFilter(url);
|
||||
}
|
||||
};
|
||||
|
||||
toggleFilter = (url, data) => {
|
||||
this.props.toggleFilterStatus(url, data);
|
||||
};
|
||||
|
||||
handleRefresh = () => {
|
||||
this.props.refreshFilters({ whitelist: false });
|
||||
};
|
||||
|
||||
render() {
|
||||
const {
|
||||
t,
|
||||
toggleFilteringModal,
|
||||
addFilter,
|
||||
filtering: {
|
||||
filters,
|
||||
isModalOpen,
|
||||
isFilterAdded,
|
||||
processingRefreshFilters,
|
||||
processingRemoveFilter,
|
||||
processingAddFilter,
|
||||
processingConfigFilter,
|
||||
processingFilters,
|
||||
modalType,
|
||||
modalFilterUrl,
|
||||
},
|
||||
} = this.props;
|
||||
const currentFilterData = getCurrentFilter(modalFilterUrl, filters);
|
||||
const loading = processingFilters
|
||||
|| processingAddFilter
|
||||
|| processingRemoveFilter
|
||||
|| processingRefreshFilters;
|
||||
|
||||
return (
|
||||
<Fragment>
|
||||
<PageTitle
|
||||
title={t('dns_blocklists')}
|
||||
subtitle={t('dns_blocklists_desc')}
|
||||
/>
|
||||
<div className="content">
|
||||
<div className="row">
|
||||
<div className="col-md-12">
|
||||
<Card subtitle={t('filters_and_hosts_hint')}>
|
||||
<Table
|
||||
filters={filters}
|
||||
loading={loading}
|
||||
processingConfigFilter={processingConfigFilter}
|
||||
toggleFilteringModal={toggleFilteringModal}
|
||||
handleDelete={this.handleDelete}
|
||||
toggleFilter={this.toggleFilter}
|
||||
/>
|
||||
<Actions
|
||||
handleAdd={() => toggleFilteringModal({ type: MODAL_TYPE.ADD })}
|
||||
handleRefresh={this.handleRefresh}
|
||||
processingRefreshFilters={processingRefreshFilters}
|
||||
/>
|
||||
</Card>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<Modal
|
||||
isOpen={isModalOpen}
|
||||
toggleModal={toggleFilteringModal}
|
||||
addFilter={addFilter}
|
||||
isFilterAdded={isFilterAdded}
|
||||
processingAddFilter={processingAddFilter}
|
||||
processingConfigFilter={processingConfigFilter}
|
||||
handleSubmit={this.handleSubmit}
|
||||
modalType={modalType}
|
||||
currentFilterData={currentFilterData}
|
||||
/>
|
||||
</Fragment>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
DnsBlocklist.propTypes = {
|
||||
getFilteringStatus: PropTypes.func.isRequired,
|
||||
filtering: PropTypes.object.isRequired,
|
||||
removeFilter: PropTypes.func.isRequired,
|
||||
toggleFilterStatus: PropTypes.func.isRequired,
|
||||
addFilter: PropTypes.func.isRequired,
|
||||
toggleFilteringModal: PropTypes.func.isRequired,
|
||||
handleRulesChange: PropTypes.func.isRequired,
|
||||
refreshFilters: PropTypes.func.isRequired,
|
||||
editFilter: PropTypes.func.isRequired,
|
||||
t: PropTypes.func.isRequired,
|
||||
};
|
||||
|
||||
export default withNamespaces()(DnsBlocklist);
|
||||
54
client/src/components/Filters/Examples.js
Normal file
54
client/src/components/Filters/Examples.js
Normal file
@@ -0,0 +1,54 @@
|
||||
import React, { Fragment } from 'react';
|
||||
import { withNamespaces, Trans } from 'react-i18next';
|
||||
|
||||
const Examples = () => (
|
||||
<Fragment>
|
||||
<div className="list leading-loose">
|
||||
<Trans>examples_title</Trans>:
|
||||
<ol className="leading-loose">
|
||||
<li>
|
||||
<code>||example.org^</code> –
|
||||
<Trans>example_meaning_filter_block</Trans>
|
||||
</li>
|
||||
<li>
|
||||
<code> @@||example.org^</code> –
|
||||
<Trans>example_meaning_filter_whitelist</Trans>
|
||||
</li>
|
||||
<li>
|
||||
<code>127.0.0.1 example.org</code> –
|
||||
<Trans>example_meaning_host_block</Trans>
|
||||
</li>
|
||||
<li>
|
||||
<code><Trans>example_comment</Trans></code> –
|
||||
<Trans>example_comment_meaning</Trans>
|
||||
</li>
|
||||
<li>
|
||||
<code><Trans>example_comment_hash</Trans></code> –
|
||||
<Trans>example_comment_meaning</Trans>
|
||||
</li>
|
||||
<li>
|
||||
<code>/REGEX/</code> –
|
||||
<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>
|
||||
</Fragment>
|
||||
);
|
||||
|
||||
export default withNamespaces()(Examples);
|
||||
86
client/src/components/Filters/Form.js
Normal file
86
client/src/components/Filters/Form.js
Normal file
@@ -0,0 +1,86 @@
|
||||
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 { renderInputField, required, isValidUrl } from '../../helpers/form';
|
||||
|
||||
const Form = (props) => {
|
||||
const {
|
||||
t,
|
||||
closeModal,
|
||||
handleSubmit,
|
||||
processingAddFilter,
|
||||
processingConfigFilter,
|
||||
whitelist,
|
||||
} = props;
|
||||
|
||||
return (
|
||||
<form onSubmit={handleSubmit}>
|
||||
<div className="modal-body">
|
||||
<div className="form__group">
|
||||
<Field
|
||||
id="name"
|
||||
name="name"
|
||||
type="text"
|
||||
component={renderInputField}
|
||||
className="form-control"
|
||||
placeholder={t('enter_name_hint')}
|
||||
validate={[required]}
|
||||
/>
|
||||
</div>
|
||||
<div className="form__group">
|
||||
<Field
|
||||
id="url"
|
||||
name="url"
|
||||
type="text"
|
||||
component={renderInputField}
|
||||
className="form-control"
|
||||
placeholder={t('enter_url_hint')}
|
||||
validate={[required, isValidUrl]}
|
||||
/>
|
||||
</div>
|
||||
<div className="form__description">
|
||||
{whitelist ? (
|
||||
<Trans>enter_valid_allowlist</Trans>
|
||||
) : (
|
||||
<Trans>enter_valid_blocklist</Trans>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
<div className="modal-footer">
|
||||
<button
|
||||
type="button"
|
||||
className="btn btn-secondary"
|
||||
onClick={closeModal}
|
||||
>
|
||||
<Trans>cancel_btn</Trans>
|
||||
</button>
|
||||
<button
|
||||
type="submit"
|
||||
className="btn btn-success"
|
||||
disabled={processingAddFilter || processingConfigFilter}
|
||||
>
|
||||
<Trans>save_btn</Trans>
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
);
|
||||
};
|
||||
|
||||
Form.propTypes = {
|
||||
t: PropTypes.func.isRequired,
|
||||
closeModal: PropTypes.func.isRequired,
|
||||
handleSubmit: PropTypes.func.isRequired,
|
||||
processingAddFilter: PropTypes.bool.isRequired,
|
||||
processingConfigFilter: PropTypes.bool.isRequired,
|
||||
whitelist: PropTypes.bool,
|
||||
};
|
||||
|
||||
export default flow([
|
||||
withNamespaces(),
|
||||
reduxForm({
|
||||
form: 'filterForm',
|
||||
}),
|
||||
])(Form);
|
||||
@@ -1,52 +1,41 @@
|
||||
import React, { Component } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import ReactModal from 'react-modal';
|
||||
import classnames from 'classnames';
|
||||
import { Trans, withNamespaces } from 'react-i18next';
|
||||
import { R_URL_REQUIRES_PROTOCOL } from '../../helpers/constants';
|
||||
|
||||
import { MODAL_TYPE } from '../../helpers/constants';
|
||||
import Form from './Form';
|
||||
import '../ui/Modal.css';
|
||||
|
||||
ReactModal.setAppElement('#root');
|
||||
|
||||
const initialState = {
|
||||
url: '',
|
||||
name: '',
|
||||
isUrlValid: false,
|
||||
};
|
||||
|
||||
class Modal extends Component {
|
||||
state = initialState;
|
||||
|
||||
isUrlValid = url => R_URL_REQUIRES_PROTOCOL.test(url);
|
||||
|
||||
handleUrlChange = async (e) => {
|
||||
const { value: url } = e.currentTarget;
|
||||
this.setState(...this.state, { url, isUrlValid: this.isUrlValid(url) });
|
||||
};
|
||||
|
||||
handleNameChange = (e) => {
|
||||
const { value: name } = e.currentTarget;
|
||||
this.setState({ ...this.state, name });
|
||||
};
|
||||
|
||||
closeModal = () => {
|
||||
this.props.toggleModal();
|
||||
this.setState({ ...this.state, ...initialState });
|
||||
};
|
||||
|
||||
render() {
|
||||
const { isOpen, processingAddFilter } = this.props;
|
||||
const { isUrlValid, url, name } = this.state;
|
||||
const inputUrlClass = classnames({
|
||||
'form-control mb-2': true,
|
||||
'is-invalid': url.length > 0 && !isUrlValid,
|
||||
'is-valid': url.length > 0 && isUrlValid,
|
||||
});
|
||||
const inputNameClass = classnames({
|
||||
'form-control mb-2': true,
|
||||
'is-valid': name.length > 0,
|
||||
});
|
||||
const isValidForSubmit = url.length > 0 && isUrlValid && name.length > 0;
|
||||
const {
|
||||
isOpen,
|
||||
processingAddFilter,
|
||||
processingConfigFilter,
|
||||
handleSubmit,
|
||||
modalType,
|
||||
currentFilterData,
|
||||
whitelist,
|
||||
} = this.props;
|
||||
|
||||
const newListTitle = whitelist ? (
|
||||
<Trans>new_allowlist</Trans>
|
||||
) : (
|
||||
<Trans>new_blocklist</Trans>
|
||||
);
|
||||
|
||||
const editListTitle = whitelist ? (
|
||||
<Trans>edit_allowlist</Trans>
|
||||
) : (
|
||||
<Trans>edit_blocklist</Trans>
|
||||
);
|
||||
|
||||
return (
|
||||
<ReactModal
|
||||
@@ -58,46 +47,24 @@ class Modal extends Component {
|
||||
<div className="modal-content">
|
||||
<div className="modal-header">
|
||||
<h4 className="modal-title">
|
||||
<Trans>new_filter_btn</Trans>
|
||||
{modalType === MODAL_TYPE.EDIT ? (
|
||||
editListTitle
|
||||
) : (
|
||||
newListTitle
|
||||
)}
|
||||
</h4>
|
||||
<button type="button" className="close" onClick={this.closeModal}>
|
||||
<span className="sr-only">Close</span>
|
||||
</button>
|
||||
</div>
|
||||
<div className="modal-body">
|
||||
<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>
|
||||
<Form
|
||||
initialValues={{ ...currentFilterData }}
|
||||
onSubmit={handleSubmit}
|
||||
processingAddFilter={processingAddFilter}
|
||||
processingConfigFilter={processingConfigFilter}
|
||||
closeModal={this.closeModal}
|
||||
whitelist={whitelist}
|
||||
/>
|
||||
</div>
|
||||
</ReactModal>
|
||||
);
|
||||
@@ -110,7 +77,12 @@ Modal.propTypes = {
|
||||
addFilter: PropTypes.func.isRequired,
|
||||
isFilterAdded: PropTypes.bool.isRequired,
|
||||
processingAddFilter: PropTypes.bool.isRequired,
|
||||
processingConfigFilter: PropTypes.bool.isRequired,
|
||||
handleSubmit: PropTypes.func.isRequired,
|
||||
modalType: PropTypes.string.isRequired,
|
||||
currentFilterData: PropTypes.object.isRequired,
|
||||
t: PropTypes.func.isRequired,
|
||||
whitelist: PropTypes.bool,
|
||||
};
|
||||
|
||||
export default withNamespaces()(Modal);
|
||||
|
||||
@@ -4,7 +4,7 @@ import { Field, reduxForm } from 'redux-form';
|
||||
import { Trans, withNamespaces } from 'react-i18next';
|
||||
import flow from 'lodash/flow';
|
||||
|
||||
import { renderInputField, required, domain, answer } from '../../../../helpers/form';
|
||||
import { renderInputField, required, domain, answer } from '../../../helpers/form';
|
||||
|
||||
const Form = (props) => {
|
||||
const {
|
||||
92
client/src/components/Filters/Rewrites/index.js
Normal file
92
client/src/components/Filters/Rewrites/index.js
Normal file
@@ -0,0 +1,92 @@
|
||||
import React, { Component, Fragment } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { Trans, withNamespaces } from 'react-i18next';
|
||||
|
||||
import Table from './Table';
|
||||
import Modal from './Modal';
|
||||
import Card from '../../ui/Card';
|
||||
import PageTitle from '../../ui/PageTitle';
|
||||
|
||||
class Rewrites extends Component {
|
||||
componentDidMount() {
|
||||
this.props.getRewritesList();
|
||||
}
|
||||
|
||||
handleSubmit = (values) => {
|
||||
this.props.addRewrite(values);
|
||||
};
|
||||
|
||||
handleDelete = (values) => {
|
||||
// eslint-disable-next-line no-alert
|
||||
if (window.confirm(this.props.t('rewrite_confirm_delete', { key: values.domain }))) {
|
||||
this.props.deleteRewrite(values);
|
||||
}
|
||||
};
|
||||
|
||||
render() {
|
||||
const {
|
||||
t,
|
||||
rewrites,
|
||||
toggleRewritesModal,
|
||||
} = this.props;
|
||||
|
||||
const {
|
||||
list,
|
||||
isModalOpen,
|
||||
processing,
|
||||
processingAdd,
|
||||
processingDelete,
|
||||
} = rewrites;
|
||||
|
||||
return (
|
||||
<Fragment>
|
||||
<PageTitle
|
||||
title={t('dns_rewrites')}
|
||||
subtitle={t('rewrite_desc')}
|
||||
/>
|
||||
<Card
|
||||
id="rewrites"
|
||||
bodyType="card-body box-body--settings"
|
||||
>
|
||||
<Fragment>
|
||||
<Table
|
||||
list={list}
|
||||
processing={processing}
|
||||
processingAdd={processingAdd}
|
||||
processingDelete={processingDelete}
|
||||
handleDelete={this.handleDelete}
|
||||
/>
|
||||
|
||||
<button
|
||||
type="button"
|
||||
className="btn btn-success btn-standard mt-3"
|
||||
onClick={() => toggleRewritesModal()}
|
||||
disabled={processingAdd}
|
||||
>
|
||||
<Trans>rewrite_add</Trans>
|
||||
</button>
|
||||
|
||||
<Modal
|
||||
isModalOpen={isModalOpen}
|
||||
toggleRewritesModal={toggleRewritesModal}
|
||||
handleSubmit={this.handleSubmit}
|
||||
processingAdd={processingAdd}
|
||||
processingDelete={processingDelete}
|
||||
/>
|
||||
</Fragment>
|
||||
</Card>
|
||||
</Fragment>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Rewrites.propTypes = {
|
||||
t: PropTypes.func.isRequired,
|
||||
getRewritesList: PropTypes.func.isRequired,
|
||||
toggleRewritesModal: PropTypes.func.isRequired,
|
||||
addRewrite: PropTypes.func.isRequired,
|
||||
deleteRewrite: PropTypes.func.isRequired,
|
||||
rewrites: PropTypes.object.isRequired,
|
||||
};
|
||||
|
||||
export default withNamespaces()(Rewrites);
|
||||
157
client/src/components/Filters/Table.js
Normal file
157
client/src/components/Filters/Table.js
Normal file
@@ -0,0 +1,157 @@
|
||||
import React, { Component } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import ReactTable from 'react-table';
|
||||
import { withNamespaces, Trans } from 'react-i18next';
|
||||
|
||||
import CellWrap from '../ui/CellWrap';
|
||||
|
||||
import { MODAL_TYPE } from '../../helpers/constants';
|
||||
import { formatDetailedDateTime } from '../../helpers/helpers';
|
||||
|
||||
class Table extends Component {
|
||||
getDateCell = row => CellWrap(row, formatDetailedDateTime);
|
||||
|
||||
renderCheckbox = ({ original }) => {
|
||||
const { processingConfigFilter, toggleFilter } = this.props;
|
||||
const { url, name, enabled } = original;
|
||||
const data = { name, url, enabled: !enabled };
|
||||
|
||||
return (
|
||||
<label className="checkbox">
|
||||
<input
|
||||
type="checkbox"
|
||||
className="checkbox__input"
|
||||
onChange={() => toggleFilter(url, data)}
|
||||
checked={enabled}
|
||||
disabled={processingConfigFilter}
|
||||
/>
|
||||
<span className="checkbox__label" />
|
||||
</label>
|
||||
);
|
||||
};
|
||||
|
||||
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>list_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: this.getDateCell,
|
||||
},
|
||||
{
|
||||
Header: <Trans>actions_table_header</Trans>,
|
||||
accessor: 'url',
|
||||
className: 'text-center',
|
||||
width: 100,
|
||||
sortable: false,
|
||||
Cell: (row) => {
|
||||
const { value } = row;
|
||||
const { t, toggleFilteringModal, handleDelete } = this.props;
|
||||
|
||||
return (
|
||||
<div className="logs__row logs__row--center">
|
||||
<button
|
||||
type="button"
|
||||
className="btn btn-icon btn-outline-primary btn-sm mr-2"
|
||||
title={t('edit_table_action')}
|
||||
onClick={() =>
|
||||
toggleFilteringModal({
|
||||
type: MODAL_TYPE.EDIT,
|
||||
url: value,
|
||||
})
|
||||
}
|
||||
>
|
||||
<svg className="icons">
|
||||
<use xlinkHref="#edit" />
|
||||
</svg>
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
className="btn btn-icon btn-outline-secondary btn-sm"
|
||||
onClick={() => handleDelete(value)}
|
||||
title={t('delete_table_action')}
|
||||
>
|
||||
<svg className="icons">
|
||||
<use xlinkHref="#delete" />
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
);
|
||||
},
|
||||
},
|
||||
];
|
||||
|
||||
render() {
|
||||
const {
|
||||
loading, filters, t, whitelist,
|
||||
} = this.props;
|
||||
|
||||
return (
|
||||
<ReactTable
|
||||
data={filters}
|
||||
columns={this.columns}
|
||||
showPagination={true}
|
||||
defaultPageSize={10}
|
||||
loading={loading}
|
||||
minRows={6}
|
||||
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={whitelist ? t('no_whitelist_added') : t('no_blocklist_added')}
|
||||
/>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Table.propTypes = {
|
||||
filters: PropTypes.array.isRequired,
|
||||
loading: PropTypes.bool.isRequired,
|
||||
processingConfigFilter: PropTypes.bool.isRequired,
|
||||
toggleFilteringModal: PropTypes.func.isRequired,
|
||||
handleDelete: PropTypes.func.isRequired,
|
||||
toggleFilter: PropTypes.func.isRequired,
|
||||
t: PropTypes.func.isRequired,
|
||||
whitelist: PropTypes.bool,
|
||||
};
|
||||
|
||||
export default withNamespaces()(Table);
|
||||
@@ -1,95 +0,0 @@
|
||||
import React, { Component } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { Trans, withNamespaces } from 'react-i18next';
|
||||
import Card from '../ui/Card';
|
||||
|
||||
class UserRules extends Component {
|
||||
handleChange = (e) => {
|
||||
const { value } = e.currentTarget;
|
||||
this.props.handleRulesChange(value);
|
||||
};
|
||||
|
||||
handleSubmit = (e) => {
|
||||
e.preventDefault();
|
||||
this.props.handleRulesSubmit();
|
||||
};
|
||||
|
||||
render() {
|
||||
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={userRules}
|
||||
onChange={this.handleChange}
|
||||
/>
|
||||
<div className="card-actions">
|
||||
<button
|
||||
className="btn btn-success btn-standard"
|
||||
type="submit"
|
||||
onClick={this.handleSubmit}
|
||||
>
|
||||
<Trans>apply_btn</Trans>
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
<hr />
|
||||
<div className="list leading-loose">
|
||||
<Trans>examples_title</Trans>:
|
||||
<ol className="leading-loose">
|
||||
<li>
|
||||
<code>||example.org^</code> –
|
||||
<Trans>example_meaning_filter_block</Trans>
|
||||
</li>
|
||||
<li>
|
||||
<code> @@||example.org^</code> –
|
||||
<Trans>example_meaning_filter_whitelist</Trans>
|
||||
</li>
|
||||
<li>
|
||||
<code>127.0.0.1 example.org</code> –
|
||||
<Trans>example_meaning_host_block</Trans>
|
||||
</li>
|
||||
<li>
|
||||
<code><Trans>example_comment</Trans></code> –
|
||||
<Trans>example_comment_meaning</Trans>
|
||||
</li>
|
||||
<li>
|
||||
<code><Trans>example_comment_hash</Trans></code> –
|
||||
<Trans>example_comment_meaning</Trans>
|
||||
</li>
|
||||
<li>
|
||||
<code>/REGEX/</code> –
|
||||
<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.isRequired,
|
||||
handleRulesChange: PropTypes.func.isRequired,
|
||||
handleRulesSubmit: PropTypes.func.isRequired,
|
||||
t: PropTypes.func.isRequired,
|
||||
};
|
||||
|
||||
export default withNamespaces()(UserRules);
|
||||
@@ -1,223 +0,0 @@
|
||||
import React, { Component, Fragment } from 'react';
|
||||
import ReactTable from 'react-table';
|
||||
import PropTypes from 'prop-types';
|
||||
import { Trans, withNamespaces } from 'react-i18next';
|
||||
|
||||
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() {
|
||||
this.props.getFilteringStatus();
|
||||
}
|
||||
|
||||
handleRulesChange = (value) => {
|
||||
this.props.handleRulesChange({ userRules: value });
|
||||
};
|
||||
|
||||
handleRulesSubmit = () => {
|
||||
this.props.setRules(this.props.filtering.userRules);
|
||||
};
|
||||
|
||||
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(url, enabled)}
|
||||
checked={enabled}
|
||||
disabled={processingConfigFilter}
|
||||
/>
|
||||
<span className="checkbox__label" />
|
||||
</label>
|
||||
);
|
||||
};
|
||||
|
||||
handleDelete = (url) => {
|
||||
// eslint-disable-next-line no-alert
|
||||
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',
|
||||
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 {
|
||||
filtering, t, toggleFilteringModal, refreshFilters, addFilter,
|
||||
} = this.props;
|
||||
const {
|
||||
filters,
|
||||
userRules,
|
||||
isModalOpen,
|
||||
isFilterAdded,
|
||||
processingRefreshFilters,
|
||||
processingRemoveFilter,
|
||||
processingAddFilter,
|
||||
processingFilters,
|
||||
} = filtering;
|
||||
|
||||
return (
|
||||
<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')}
|
||||
>
|
||||
<ReactTable
|
||||
data={filters}
|
||||
columns={this.columns}
|
||||
showPagination={true}
|
||||
defaultPageSize={10}
|
||||
loading={
|
||||
processingFilters ||
|
||||
processingAddFilter ||
|
||||
processingRemoveFilter ||
|
||||
processingRefreshFilters
|
||||
}
|
||||
minRows={4}
|
||||
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={toggleFilteringModal}
|
||||
>
|
||||
<Trans>add_filter_btn</Trans>
|
||||
</button>
|
||||
<button
|
||||
className="btn btn-primary btn-standard"
|
||||
type="submit"
|
||||
onClick={refreshFilters}
|
||||
disabled={processingRefreshFilters}
|
||||
>
|
||||
<Trans>check_updates_btn</Trans>
|
||||
</button>
|
||||
</div>
|
||||
</Card>
|
||||
</div>
|
||||
<div className="col-md-12">
|
||||
<UserRules
|
||||
userRules={userRules}
|
||||
handleRulesChange={this.handleRulesChange}
|
||||
handleRulesSubmit={this.handleRulesSubmit}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<Modal
|
||||
isOpen={isModalOpen}
|
||||
toggleModal={toggleFilteringModal}
|
||||
addFilter={addFilter}
|
||||
isFilterAdded={isFilterAdded}
|
||||
processingAddFilter={processingAddFilter}
|
||||
/>
|
||||
</Fragment>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Filters.propTypes = {
|
||||
setRules: PropTypes.func,
|
||||
getFilteringStatus: PropTypes.func.isRequired,
|
||||
filtering: PropTypes.shape({
|
||||
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,
|
||||
addFilter: PropTypes.func.isRequired,
|
||||
toggleFilteringModal: PropTypes.func.isRequired,
|
||||
handleRulesChange: PropTypes.func.isRequired,
|
||||
refreshFilters: PropTypes.func.isRequired,
|
||||
t: PropTypes.func.isRequired,
|
||||
};
|
||||
|
||||
export default withNamespaces()(Filters);
|
||||
@@ -5,101 +5,126 @@ import enhanceWithClickOutside from 'react-click-outside';
|
||||
import classnames from 'classnames';
|
||||
import { Trans, withNamespaces } from 'react-i18next';
|
||||
|
||||
import { SETTINGS_URLS } from '../../helpers/constants';
|
||||
import { SETTINGS_URLS, FILTERS_URLS, MENU_URLS } from '../../helpers/constants';
|
||||
import Dropdown from '../ui/Dropdown';
|
||||
|
||||
const MENU_ITEMS = [
|
||||
{
|
||||
route: MENU_URLS.root, exact: true, icon: 'dashboard', text: 'dashboard', order: 0,
|
||||
},
|
||||
|
||||
// Settings dropdown should have visual order 1
|
||||
|
||||
// Filters dropdown should have visual order 2
|
||||
|
||||
{
|
||||
route: MENU_URLS.logs, icon: 'log', text: 'query_log', order: 3,
|
||||
},
|
||||
{
|
||||
route: MENU_URLS.guide, icon: 'setup', text: 'setup_guide', order: 4,
|
||||
},
|
||||
];
|
||||
|
||||
const SETTINGS_ITEMS = [
|
||||
{ route: SETTINGS_URLS.settings, text: 'general_settings' },
|
||||
{ route: SETTINGS_URLS.dns, text: 'dns_settings' },
|
||||
{ route: SETTINGS_URLS.encryption, text: 'encryption_settings' },
|
||||
{ route: SETTINGS_URLS.clients, text: 'client_settings' },
|
||||
{ route: SETTINGS_URLS.dhcp, text: 'dhcp_settings' },
|
||||
];
|
||||
|
||||
const FILTERS_ITEMS = [
|
||||
{ route: FILTERS_URLS.dns_blocklists, text: 'dns_blocklists' },
|
||||
{ route: FILTERS_URLS.dns_allowlists, text: 'dns_allowlists' },
|
||||
{ route: FILTERS_URLS.dns_rewrites, text: 'dns_rewrites' },
|
||||
{ route: FILTERS_URLS.custom_rules, text: 'custom_filtering_rules' },
|
||||
];
|
||||
|
||||
class Menu extends Component {
|
||||
handleClickOutside = () => {
|
||||
this.props.closeMenu();
|
||||
};
|
||||
|
||||
toggleMenu = () => {
|
||||
this.props.toggleMenuOpen();
|
||||
closeMenu = () => {
|
||||
this.props.closeMenu();
|
||||
};
|
||||
|
||||
getActiveClassForSettings = () => {
|
||||
getActiveClassForDropdown = (URLS) => {
|
||||
const { pathname } = this.props.location;
|
||||
const isSettingsPage = SETTINGS_URLS.some(item => item === pathname);
|
||||
const isActivePage = Object.values(URLS).some(item => item === pathname);
|
||||
|
||||
return isSettingsPage ? 'active' : '';
|
||||
return isActivePage ? 'active' : '';
|
||||
};
|
||||
|
||||
getNavLink = ({
|
||||
route, exact, text, order, className, icon,
|
||||
}) => (
|
||||
<NavLink
|
||||
to={route}
|
||||
key={route}
|
||||
exact={exact || false}
|
||||
className={`order-${order} ${className}`}
|
||||
onClick={this.closeMenu}
|
||||
>
|
||||
{icon && (
|
||||
<svg className="nav-icon">
|
||||
<use xlinkHref={`#${icon}`} />
|
||||
</svg>
|
||||
)}
|
||||
<Trans>{text}</Trans>
|
||||
</NavLink>
|
||||
);
|
||||
|
||||
getDropdown = ({
|
||||
label, order, URLS, icon, ITEMS,
|
||||
}) =>
|
||||
(
|
||||
<Dropdown
|
||||
label={this.props.t(label)}
|
||||
baseClassName={`dropdown nav-item order-${order}`}
|
||||
controlClassName={`nav-link ${this.getActiveClassForDropdown(URLS)}`}
|
||||
icon={icon}>
|
||||
{ITEMS.map(item => (
|
||||
this.getNavLink({
|
||||
...item,
|
||||
order,
|
||||
className: 'dropdown-item',
|
||||
})))}
|
||||
</Dropdown>
|
||||
);
|
||||
|
||||
render() {
|
||||
const menuClass = classnames({
|
||||
'header__column mobile-menu': true,
|
||||
'mobile-menu--active': this.props.isMenuOpen,
|
||||
});
|
||||
|
||||
const dropdownControlClass = `nav-link ${this.getActiveClassForSettings()}`;
|
||||
|
||||
return (
|
||||
<Fragment>
|
||||
<div className={menuClass}>
|
||||
<ul className="nav nav-tabs border-0 flex-column flex-lg-row flex-nowrap">
|
||||
<li className="nav-item border-bottom d-lg-none" onClick={this.toggleMenu}>
|
||||
<div className="nav-link nav-link--back">
|
||||
<svg className="nav-icon">
|
||||
<use xlinkHref="#back" />
|
||||
</svg>
|
||||
<Trans>back</Trans>
|
||||
</div>
|
||||
</li>
|
||||
<li className="nav-item">
|
||||
<NavLink to="/" exact={true} className="nav-link">
|
||||
<svg className="nav-icon">
|
||||
<use xlinkHref="#dashboard" />
|
||||
</svg>
|
||||
<Trans>dashboard</Trans>
|
||||
</NavLink>
|
||||
</li>
|
||||
<Dropdown
|
||||
label={this.props.t('settings')}
|
||||
baseClassName="dropdown nav-item"
|
||||
controlClassName={dropdownControlClass}
|
||||
icon="settings"
|
||||
>
|
||||
<Fragment>
|
||||
<NavLink to="/settings" className="dropdown-item">
|
||||
<Trans>general_settings</Trans>
|
||||
</NavLink>
|
||||
<NavLink to="/dns" className="dropdown-item">
|
||||
<Trans>dns_settings</Trans>
|
||||
</NavLink>
|
||||
<NavLink to="/encryption" className="dropdown-item">
|
||||
<Trans>encryption_settings</Trans>
|
||||
</NavLink>
|
||||
<NavLink to="/clients" className="dropdown-item">
|
||||
<Trans>client_settings</Trans>
|
||||
</NavLink>
|
||||
<NavLink to="/dhcp" className="dropdown-item">
|
||||
<Trans>dhcp_settings</Trans>
|
||||
</NavLink>
|
||||
</Fragment>
|
||||
</Dropdown>
|
||||
<li className="nav-item">
|
||||
<NavLink to="/filters" className="nav-link">
|
||||
<svg className="nav-icon">
|
||||
<use xlinkHref="#filters" />
|
||||
</svg>
|
||||
<Trans>filters</Trans>
|
||||
</NavLink>
|
||||
</li>
|
||||
<li className="nav-item">
|
||||
<NavLink to="/logs" className="nav-link">
|
||||
<svg className="nav-icon">
|
||||
<use xlinkHref="#log" />
|
||||
</svg>
|
||||
<Trans>query_log</Trans>
|
||||
</NavLink>
|
||||
</li>
|
||||
<li className="nav-item">
|
||||
<NavLink to="/guide" className="nav-link">
|
||||
<svg className="nav-icon">
|
||||
<use xlinkHref="#setup" />
|
||||
</svg>
|
||||
<Trans>setup_guide</Trans>
|
||||
</NavLink>
|
||||
</li>
|
||||
{MENU_ITEMS.map(item => (
|
||||
<li
|
||||
className={`nav-item order-${item.order}`}
|
||||
key={item.text}
|
||||
onClick={this.closeMenu}
|
||||
>
|
||||
{this.getNavLink({ ...item, className: 'nav-link' })}
|
||||
</li>
|
||||
))}
|
||||
{this.getDropdown({
|
||||
order: 1,
|
||||
label: 'settings',
|
||||
icon: 'settings',
|
||||
URLS: SETTINGS_URLS,
|
||||
ITEMS: SETTINGS_ITEMS,
|
||||
})}
|
||||
{this.getDropdown({
|
||||
order: 2,
|
||||
label: 'filters',
|
||||
icon: 'filters',
|
||||
URLS: FILTERS_URLS,
|
||||
ITEMS: FILTERS_ITEMS,
|
||||
})}
|
||||
</ul>
|
||||
</div>
|
||||
</Fragment>
|
||||
@@ -110,7 +135,6 @@ class Menu extends Component {
|
||||
Menu.propTypes = {
|
||||
isMenuOpen: PropTypes.bool,
|
||||
closeMenu: PropTypes.func,
|
||||
toggleMenuOpen: PropTypes.func,
|
||||
location: PropTypes.object,
|
||||
t: PropTypes.func,
|
||||
};
|
||||
|
||||
@@ -38,14 +38,14 @@ class Header extends Component {
|
||||
className="header-toggler d-lg-none ml-lg-0 collapsed"
|
||||
onClick={this.toggleMenuOpen}
|
||||
>
|
||||
<span className="header-toggler-icon"></span>
|
||||
<span className="header-toggler-icon" />
|
||||
</div>
|
||||
<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.processing && dashboard.isCoreRunning && (
|
||||
<span className={badgeClass}>
|
||||
<Trans>{dashboard.protectionEnabled ? 'on' : 'off'}</Trans>
|
||||
</span>
|
||||
@@ -55,13 +55,12 @@ class Header extends Component {
|
||||
<Menu
|
||||
location={location}
|
||||
isMenuOpen={isMenuOpen}
|
||||
toggleMenuOpen={this.toggleMenuOpen}
|
||||
closeMenu={this.closeMenu}
|
||||
/>
|
||||
<div className="header__column">
|
||||
<div className="header__right">
|
||||
{!dashboard.processingProfile && dashboard.name &&
|
||||
<a href="/control/logout" className="btn btn-sm btn-outline-secondary">
|
||||
<a href="control/logout" className="btn btn-sm btn-outline-secondary">
|
||||
<Trans>sign_out</Trans>
|
||||
</a>
|
||||
}
|
||||
|
||||
@@ -61,9 +61,10 @@
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
.logs__action {
|
||||
.logs__action,
|
||||
.table__action {
|
||||
position: absolute;
|
||||
top: 10px;
|
||||
top: 11px;
|
||||
right: 15px;
|
||||
background-color: #fff;
|
||||
border-radius: 4px;
|
||||
@@ -72,11 +73,13 @@
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.logs__table .rt-td {
|
||||
.logs__table .rt-td,
|
||||
.clients__table .rt-td {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.logs__table .rt-tr:hover .logs__action {
|
||||
.logs__table .rt-tr:hover .logs__action,
|
||||
.clients__table .rt-tr:hover .table__action {
|
||||
visibility: visible;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
@@ -9,8 +9,14 @@ import { HashLink as Link } from 'react-router-hash-link';
|
||||
import {
|
||||
formatTime,
|
||||
formatDateTime,
|
||||
isToday,
|
||||
checkFiltered,
|
||||
checkRewrite,
|
||||
checkWhiteList,
|
||||
checkBlackList,
|
||||
checkBlockedService,
|
||||
} from '../../helpers/helpers';
|
||||
import { SERVICES, FILTERED_STATUS, TABLE_DEFAULT_PAGE_SIZE } from '../../helpers/constants';
|
||||
import { SERVICES, TABLE_DEFAULT_PAGE_SIZE, CUSTOM_FILTERING_RULES_ID, FILTERED } from '../../helpers/constants';
|
||||
import { getTrackerData } from '../../helpers/trackers/trackers';
|
||||
import { formatClientCell } from '../../helpers/formatClientCell';
|
||||
|
||||
@@ -21,10 +27,11 @@ import Loading from '../ui/Loading';
|
||||
import PopoverFiltered from '../ui/PopoverFilter';
|
||||
import Popover from '../ui/Popover';
|
||||
import './Logs.css';
|
||||
import CellWrap from '../ui/CellWrap';
|
||||
|
||||
const TABLE_FIRST_PAGE = 0;
|
||||
const INITIAL_REQUEST_DATA = ['', TABLE_FIRST_PAGE, TABLE_DEFAULT_PAGE_SIZE];
|
||||
const FILTERED_REASON = 'Filtered';
|
||||
const INITIAL_REQUEST = true;
|
||||
const INITIAL_REQUEST_DATA = ['', TABLE_FIRST_PAGE, INITIAL_REQUEST];
|
||||
|
||||
class Logs extends Component {
|
||||
componentDidMount() {
|
||||
@@ -34,10 +41,10 @@ class Logs extends Component {
|
||||
this.props.getLogsConfig();
|
||||
}
|
||||
|
||||
getLogs = (older_than, page) => {
|
||||
getLogs = (older_than, page, initial) => {
|
||||
if (this.props.queryLogs.enabled) {
|
||||
this.props.getLogs({
|
||||
older_than, page, pageSize: TABLE_DEFAULT_PAGE_SIZE,
|
||||
older_than, page, pageSize: TABLE_DEFAULT_PAGE_SIZE, initial,
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -108,18 +115,10 @@ class Logs extends Component {
|
||||
);
|
||||
}
|
||||
|
||||
checkFiltered = reason => reason.indexOf(FILTERED_REASON) === 0;
|
||||
|
||||
checkRewrite = reason => reason === FILTERED_STATUS.REWRITE;
|
||||
|
||||
checkWhiteList = reason => reason === FILTERED_STATUS.NOT_FILTERED_WHITE_LIST;
|
||||
|
||||
getTimeCell = ({ value }) => (
|
||||
<div className="logs__row">
|
||||
<span className="logs__text" title={formatDateTime(value)}>
|
||||
{formatTime(value)}
|
||||
</span>
|
||||
</div>
|
||||
getDateCell = row => CellWrap(
|
||||
row,
|
||||
(isToday(row.value) ? formatTime : formatDateTime),
|
||||
formatDateTime,
|
||||
);
|
||||
|
||||
getDomainCell = (row) => {
|
||||
@@ -141,51 +140,79 @@ class Logs extends Component {
|
||||
})
|
||||
);
|
||||
|
||||
getFilterName = (filters, whitelistFilters, filterId, t) => {
|
||||
if (filterId === CUSTOM_FILTERING_RULES_ID) {
|
||||
return t('custom_filter_rules');
|
||||
}
|
||||
|
||||
const filter = filters.find(filter => filter.id === filterId)
|
||||
|| whitelistFilters.find(filter => filter.id === filterId);
|
||||
let filterName = '';
|
||||
|
||||
if (filter) {
|
||||
filterName = filter.name;
|
||||
}
|
||||
|
||||
if (!filterName) {
|
||||
filterName = t('unknown_filter', { filterId });
|
||||
}
|
||||
|
||||
return filterName;
|
||||
}
|
||||
|
||||
getResponseCell = ({ value: responses, original }) => {
|
||||
const {
|
||||
reason, filterId, rule, status, originalAnswer,
|
||||
} = original;
|
||||
const { t, filtering } = this.props;
|
||||
const { filters } = filtering;
|
||||
const { filters, whitelistFilters } = filtering;
|
||||
|
||||
const isFiltered = this.checkFiltered(reason);
|
||||
const filterKey = reason.replace(FILTERED_REASON, '');
|
||||
const isFiltered = checkFiltered(reason);
|
||||
const isBlackList = checkBlackList(reason);
|
||||
const isRewrite = checkRewrite(reason);
|
||||
const isWhiteList = checkWhiteList(reason);
|
||||
const isBlockedService = checkBlockedService(reason);
|
||||
const isBlockedCnameIp = originalAnswer;
|
||||
|
||||
const filterKey = reason.replace(FILTERED, '');
|
||||
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 = '';
|
||||
const filterName = this.getFilterName(filters, whitelistFilters, filterId, t);
|
||||
|
||||
if (filterId === 0) {
|
||||
filterName = t('custom_filter_rules');
|
||||
} else {
|
||||
const filterItem = Object.keys(filters).filter(key => filters[key].id === filterId)[0];
|
||||
if (isBlockedCnameIp) {
|
||||
const normalizedAnswer = this.normalizeResponse(originalAnswer);
|
||||
|
||||
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">
|
||||
<span className="logs__text">
|
||||
<Trans>blocked_by_response</Trans>
|
||||
</span>
|
||||
{this.renderTooltip(isFiltered, rule, filterName)}
|
||||
</div>
|
||||
<div className="logs__list-wrap">
|
||||
{this.renderResponseList(normalizedAnswer, status)}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
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) && (
|
||||
{(isFiltered || isBlockedService) && !isBlackList && (
|
||||
<span className="logs__text" title={parsedFilteredReason}>
|
||||
{parsedFilteredReason}
|
||||
</span>
|
||||
)}
|
||||
{isBlackList && (
|
||||
<span className="logs__text">
|
||||
<Trans values={{ filter: filterName }}>
|
||||
query_log_filtered
|
||||
</Trans>
|
||||
</span>
|
||||
)}
|
||||
{isBlockedService
|
||||
? this.renderTooltip(isFiltered, '', '', serviceName)
|
||||
: this.renderTooltip(isFiltered, rule, filterName)}
|
||||
@@ -196,10 +223,7 @@ class Logs extends Component {
|
||||
)}
|
||||
</div>
|
||||
<div className="logs__list-wrap">
|
||||
{originalAnswer
|
||||
? this.renderResponseList(normalizedAnswer, status)
|
||||
: this.renderResponseList(responses, status)
|
||||
}
|
||||
{this.renderResponseList(responses, status)}
|
||||
{isWhiteList && this.renderTooltip(isWhiteList, rule, filterName)}
|
||||
</div>
|
||||
</div>
|
||||
@@ -210,8 +234,8 @@ class Logs extends Component {
|
||||
const { original } = row;
|
||||
const { t } = this.props;
|
||||
const { reason, domain } = original;
|
||||
const isFiltered = this.checkFiltered(reason);
|
||||
const isRewrite = this.checkRewrite(reason);
|
||||
const isFiltered = checkFiltered(reason);
|
||||
const isRewrite = checkRewrite(reason);
|
||||
|
||||
return (
|
||||
<Fragment>
|
||||
@@ -220,7 +244,7 @@ class Logs extends Component {
|
||||
</div>
|
||||
{isRewrite ? (
|
||||
<div className="logs__action">
|
||||
<Link to="/dns#rewrites" className="btn btn-sm btn-outline-primary">
|
||||
<Link to="/dns_rewrites" className="btn btn-sm btn-outline-primary">
|
||||
<Trans>configure</Trans>
|
||||
</Link>
|
||||
</div>
|
||||
@@ -257,8 +281,8 @@ class Logs extends Component {
|
||||
{
|
||||
Header: t('time_table_header'),
|
||||
accessor: 'time',
|
||||
maxWidth: 100,
|
||||
Cell: this.getTimeCell,
|
||||
minWidth: 105,
|
||||
Cell: this.getDateCell,
|
||||
},
|
||||
{
|
||||
Header: t('domain_name_table_header'),
|
||||
@@ -332,15 +356,15 @@ class Logs extends Component {
|
||||
|
||||
const { reason } = rowInfo.original;
|
||||
|
||||
if (this.checkFiltered(reason)) {
|
||||
if (checkFiltered(reason)) {
|
||||
return {
|
||||
className: 'red',
|
||||
};
|
||||
} else if (this.checkWhiteList(reason)) {
|
||||
} else if (checkWhiteList(reason)) {
|
||||
return {
|
||||
className: 'green',
|
||||
};
|
||||
} else if (this.checkRewrite(reason)) {
|
||||
} else if (checkRewrite(reason)) {
|
||||
return {
|
||||
className: 'blue',
|
||||
};
|
||||
|
||||
@@ -4,7 +4,7 @@ import { withNamespaces } from 'react-i18next';
|
||||
import ReactTable from 'react-table';
|
||||
|
||||
import Card from '../../ui/Card';
|
||||
import WrapCell from './WrapCell';
|
||||
import CellWrap from '../../ui/CellWrap';
|
||||
|
||||
import whoisCell from './whoisCell';
|
||||
|
||||
@@ -16,19 +16,19 @@ class AutoClients extends Component {
|
||||
Header: this.props.t('table_client'),
|
||||
accessor: 'ip',
|
||||
minWidth: COLUMN_MIN_WIDTH,
|
||||
Cell: WrapCell,
|
||||
Cell: CellWrap,
|
||||
},
|
||||
{
|
||||
Header: this.props.t('table_name'),
|
||||
accessor: 'name',
|
||||
minWidth: COLUMN_MIN_WIDTH,
|
||||
Cell: WrapCell,
|
||||
Cell: CellWrap,
|
||||
},
|
||||
{
|
||||
Header: this.props.t('source_label'),
|
||||
accessor: 'source',
|
||||
minWidth: COLUMN_MIN_WIDTH,
|
||||
Cell: WrapCell,
|
||||
Cell: CellWrap,
|
||||
},
|
||||
{
|
||||
Header: this.props.t('whois'),
|
||||
@@ -38,7 +38,7 @@ class AutoClients extends Component {
|
||||
},
|
||||
{
|
||||
Header: this.props.t('requests_count'),
|
||||
accessor: row => this.props.normalizedTopClients[row.ip] || 0,
|
||||
accessor: row => this.props.normalizedTopClients.auto[row.ip] || 0,
|
||||
sortMethod: (a, b) => b - a,
|
||||
id: 'statistics',
|
||||
minWidth: COLUMN_MIN_WIDTH,
|
||||
|
||||
@@ -7,7 +7,7 @@ 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 CellWrap from '../../ui/CellWrap';
|
||||
|
||||
class ClientsTable extends Component {
|
||||
handleFormAdd = (values) => {
|
||||
@@ -33,6 +33,12 @@ class ClientsTable extends Component {
|
||||
} else {
|
||||
config.upstreams = [];
|
||||
}
|
||||
|
||||
if (values.tags) {
|
||||
config.tags = values.tags.map(tag => tag.value);
|
||||
} else {
|
||||
config.tags = [];
|
||||
}
|
||||
}
|
||||
|
||||
if (this.props.modalType === MODAL_TYPE.EDIT) {
|
||||
@@ -42,19 +48,27 @@ class ClientsTable extends Component {
|
||||
}
|
||||
};
|
||||
|
||||
getOptionsWithLabels = options => (
|
||||
options.map(option => ({ value: option, label: option }))
|
||||
);
|
||||
|
||||
getClient = (name, clients) => {
|
||||
const client = clients.find(item => name === item.name);
|
||||
|
||||
if (client) {
|
||||
const { upstreams, whois_info, ...values } = client;
|
||||
const {
|
||||
upstreams, tags, whois_info, ...values
|
||||
} = client;
|
||||
return {
|
||||
upstreams: (upstreams && upstreams.join('\n')) || '',
|
||||
tags: (tags && this.getOptionsWithLabels(tags)) || [],
|
||||
...values,
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
ids: [''],
|
||||
tags: [],
|
||||
use_global_settings: true,
|
||||
use_global_blocked_services: true,
|
||||
};
|
||||
@@ -64,6 +78,7 @@ class ClientsTable extends Component {
|
||||
// eslint-disable-next-line no-alert
|
||||
if (window.confirm(this.props.t('client_confirm_delete', { key: data.name }))) {
|
||||
this.props.deleteClient(data);
|
||||
this.props.getStats();
|
||||
}
|
||||
};
|
||||
|
||||
@@ -92,7 +107,7 @@ class ClientsTable extends Component {
|
||||
Header: this.props.t('table_name'),
|
||||
accessor: 'name',
|
||||
minWidth: 120,
|
||||
Cell: WrapCell,
|
||||
Cell: CellWrap,
|
||||
},
|
||||
{
|
||||
Header: this.props.t('settings'),
|
||||
@@ -159,27 +174,37 @@ class ClientsTable extends Component {
|
||||
},
|
||||
},
|
||||
{
|
||||
Header: this.props.t('requests_count'),
|
||||
id: 'statistics',
|
||||
accessor: row => this.props.normalizedTopClients[row.name] || 0,
|
||||
sortMethod: (a, b) => b - a,
|
||||
minWidth: 120,
|
||||
Header: this.props.t('tags_title'),
|
||||
accessor: 'tags',
|
||||
minWidth: 140,
|
||||
Cell: (row) => {
|
||||
const { value: clientStats } = row;
|
||||
const { value } = row;
|
||||
|
||||
if (clientStats) {
|
||||
return (
|
||||
<div className="logs__row">
|
||||
<div className="logs__text" title={clientStats}>
|
||||
{clientStats}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
if (!value || value.length < 1) {
|
||||
return '–';
|
||||
}
|
||||
|
||||
return '–';
|
||||
return (
|
||||
<div className="logs__row logs__row--overflow">
|
||||
<span className="logs__text">
|
||||
{value.map(tag => (
|
||||
<div key={tag} title={tag} className="small">
|
||||
{tag}
|
||||
</div>
|
||||
))}
|
||||
</span>
|
||||
</div>
|
||||
);
|
||||
},
|
||||
},
|
||||
{
|
||||
Header: this.props.t('requests_count'),
|
||||
id: 'statistics',
|
||||
accessor: row => this.props.normalizedTopClients.configured[row.name] || 0,
|
||||
sortMethod: (a, b) => b - a,
|
||||
minWidth: 120,
|
||||
Cell: CellWrap,
|
||||
},
|
||||
{
|
||||
Header: this.props.t('actions_table_header'),
|
||||
accessor: 'actions',
|
||||
@@ -235,9 +260,11 @@ class ClientsTable extends Component {
|
||||
toggleClientModal,
|
||||
processingAdding,
|
||||
processingUpdating,
|
||||
supportedTags,
|
||||
} = this.props;
|
||||
|
||||
const currentClientData = this.getClient(modalClientName, clients);
|
||||
const tagsOptions = this.getOptionsWithLabels(supportedTags);
|
||||
|
||||
return (
|
||||
<Card
|
||||
@@ -284,6 +311,7 @@ class ClientsTable extends Component {
|
||||
handleSubmit={this.handleSubmit}
|
||||
processingAdding={processingAdding}
|
||||
processingUpdating={processingUpdating}
|
||||
tagsOptions={tagsOptions}
|
||||
/>
|
||||
</Fragment>
|
||||
</Card>
|
||||
@@ -305,6 +333,8 @@ ClientsTable.propTypes = {
|
||||
processingAdding: PropTypes.bool.isRequired,
|
||||
processingDeleting: PropTypes.bool.isRequired,
|
||||
processingUpdating: PropTypes.bool.isRequired,
|
||||
getStats: PropTypes.func.isRequired,
|
||||
supportedTags: PropTypes.array.isRequired,
|
||||
};
|
||||
|
||||
export default withNamespaces()(ClientsTable);
|
||||
|
||||
@@ -4,6 +4,7 @@ import PropTypes from 'prop-types';
|
||||
import { Field, FieldArray, reduxForm, formValueSelector } from 'redux-form';
|
||||
import { Trans, withNamespaces } from 'react-i18next';
|
||||
import flow from 'lodash/flow';
|
||||
import Select from 'react-select';
|
||||
|
||||
import i18n from '../../../i18n';
|
||||
import Tabs from '../../ui/Tabs';
|
||||
@@ -78,7 +79,7 @@ const renderFieldsWrapper = (placeholder, buttonTitle) =>
|
||||
placeholder={placeholder}
|
||||
isActionAvailable={index !== 0}
|
||||
removeField={() => fields.remove(index)}
|
||||
normalize={data => data && data.trim()}
|
||||
normalizeOnBlur={data => data.trim()}
|
||||
/>
|
||||
</div>
|
||||
))}
|
||||
@@ -99,6 +100,23 @@ const renderFieldsWrapper = (placeholder, buttonTitle) =>
|
||||
// Should create function outside of component to prevent component re-renders
|
||||
const renderFields = renderFieldsWrapper(i18n.t('form_enter_id'), i18n.t('form_add_id'));
|
||||
|
||||
const renderMultiselect = (props) => {
|
||||
const { input, placeholder, options } = props;
|
||||
|
||||
return (
|
||||
<Select
|
||||
{...input}
|
||||
options={options}
|
||||
className="basic-multi-select"
|
||||
classNamePrefix="select"
|
||||
onChange={value => input.onChange(value)}
|
||||
onBlur={() => input.onBlur(input.value)}
|
||||
placeholder={placeholder}
|
||||
isMulti
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
let Form = (props) => {
|
||||
const {
|
||||
t,
|
||||
@@ -113,6 +131,7 @@ let Form = (props) => {
|
||||
processingAdding,
|
||||
processingUpdating,
|
||||
invalid,
|
||||
tagsOptions,
|
||||
} = props;
|
||||
|
||||
return (
|
||||
@@ -127,7 +146,28 @@ let Form = (props) => {
|
||||
type="text"
|
||||
className="form-control"
|
||||
placeholder={t('form_client_name')}
|
||||
normalize={data => data && data.trim()}
|
||||
normalizeOnBlur={data => data.trim()}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="form__group mb-4">
|
||||
<div className="form__label">
|
||||
<strong className="mr-3">
|
||||
<Trans>tags_title</Trans>
|
||||
</strong>
|
||||
</div>
|
||||
<div className="form__desc mt-0 mb-2">
|
||||
<Trans components={[
|
||||
<a href="https://github.com/AdguardTeam/AdGuardHome/wiki/Hosts-Blocklists#ctag" key="0">link</a>,
|
||||
]}>
|
||||
tags_desc
|
||||
</Trans>
|
||||
</div>
|
||||
<Field
|
||||
name="tags"
|
||||
component={renderMultiselect}
|
||||
placeholder={t('form_select_tags')}
|
||||
options={tagsOptions}
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -286,6 +326,7 @@ Form.propTypes = {
|
||||
processingAdding: PropTypes.bool.isRequired,
|
||||
processingUpdating: PropTypes.bool.isRequired,
|
||||
invalid: PropTypes.bool.isRequired,
|
||||
tagsOptions: PropTypes.array.isRequired,
|
||||
};
|
||||
|
||||
const selector = formValueSelector('clientForm');
|
||||
|
||||
@@ -33,6 +33,7 @@ const Modal = (props) => {
|
||||
toggleClientModal,
|
||||
processingAdding,
|
||||
processingUpdating,
|
||||
tagsOptions,
|
||||
} = props;
|
||||
const initialData = getInitialData(currentClientData);
|
||||
|
||||
@@ -62,6 +63,7 @@ const Modal = (props) => {
|
||||
toggleClientModal={toggleClientModal}
|
||||
processingAdding={processingAdding}
|
||||
processingUpdating={processingUpdating}
|
||||
tagsOptions={tagsOptions}
|
||||
/>
|
||||
</div>
|
||||
</ReactModal>
|
||||
@@ -76,6 +78,7 @@ Modal.propTypes = {
|
||||
toggleClientModal: PropTypes.func.isRequired,
|
||||
processingAdding: PropTypes.bool.isRequired,
|
||||
processingUpdating: PropTypes.bool.isRequired,
|
||||
tagsOptions: PropTypes.array.isRequired,
|
||||
};
|
||||
|
||||
export default withNamespaces()(Modal);
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
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;
|
||||
@@ -23,6 +23,7 @@ class Clients extends Component {
|
||||
updateClient,
|
||||
deleteClient,
|
||||
toggleClientModal,
|
||||
getStats,
|
||||
} = this.props;
|
||||
|
||||
return (
|
||||
@@ -44,6 +45,8 @@ class Clients extends Component {
|
||||
processingAdding={clients.processingAdding}
|
||||
processingDeleting={clients.processingDeleting}
|
||||
processingUpdating={clients.processingUpdating}
|
||||
getStats={getStats}
|
||||
supportedTags={dashboard.supportedTags}
|
||||
/>
|
||||
<AutoClients
|
||||
autoClients={dashboard.autoClients}
|
||||
|
||||
@@ -65,13 +65,29 @@ let Form = ({
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div className="col-12">
|
||||
<div className="form__group form__group--settings">
|
||||
<Field
|
||||
name="disable_ipv6"
|
||||
type="checkbox"
|
||||
component={renderSelectField}
|
||||
placeholder={t('disable_ipv6')}
|
||||
disabled={processing}
|
||||
subtitle={t('disable_ipv6_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>
|
||||
{Object.values(BLOCKING_MODES).map(mode => (
|
||||
<li key={mode}>
|
||||
<Trans >{`blocking_mode_${mode}`}</Trans>
|
||||
</li>
|
||||
))}
|
||||
</div>
|
||||
<div className="custom-controls-stacked">
|
||||
{getFields(processing, t)}
|
||||
|
||||
@@ -16,6 +16,7 @@ const Config = ({ t, dnsConfig, setDnsConfig }) => {
|
||||
blocking_ipv4,
|
||||
blocking_ipv6,
|
||||
edns_cs_enabled,
|
||||
disable_ipv6,
|
||||
processingSetConfig,
|
||||
} = dnsConfig;
|
||||
|
||||
@@ -33,6 +34,7 @@ const Config = ({ t, dnsConfig, setDnsConfig }) => {
|
||||
blocking_ipv4,
|
||||
blocking_ipv6,
|
||||
edns_cs_enabled,
|
||||
disable_ipv6,
|
||||
}}
|
||||
onSubmit={handleFormSubmit}
|
||||
processing={processingSetConfig}
|
||||
|
||||
@@ -1,83 +0,0 @@
|
||||
import React, { Component, Fragment } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { Trans, withNamespaces } from 'react-i18next';
|
||||
|
||||
import Table from './Table';
|
||||
import Modal from './Modal';
|
||||
import Card from '../../../ui/Card';
|
||||
|
||||
class Rewrites extends Component {
|
||||
handleSubmit = (values) => {
|
||||
this.props.addRewrite(values);
|
||||
};
|
||||
|
||||
handleDelete = (values) => {
|
||||
// eslint-disable-next-line no-alert
|
||||
if (window.confirm(this.props.t('rewrite_confirm_delete', { key: values.domain }))) {
|
||||
this.props.deleteRewrite(values);
|
||||
}
|
||||
};
|
||||
|
||||
render() {
|
||||
const {
|
||||
t,
|
||||
rewrites,
|
||||
toggleRewritesModal,
|
||||
} = this.props;
|
||||
|
||||
const {
|
||||
list,
|
||||
isModalOpen,
|
||||
processing,
|
||||
processingAdd,
|
||||
processingDelete,
|
||||
} = rewrites;
|
||||
|
||||
return (
|
||||
<Card
|
||||
id="rewrites"
|
||||
title={t('dns_rewrites')}
|
||||
subtitle={t('rewrite_desc')}
|
||||
bodyType="card-body box-body--settings"
|
||||
>
|
||||
<Fragment>
|
||||
<Table
|
||||
list={list}
|
||||
processing={processing}
|
||||
processingAdd={processingAdd}
|
||||
processingDelete={processingDelete}
|
||||
handleDelete={this.handleDelete}
|
||||
/>
|
||||
|
||||
<button
|
||||
type="button"
|
||||
className="btn btn-success btn-standard mt-3"
|
||||
onClick={() => toggleRewritesModal()}
|
||||
disabled={processingAdd}
|
||||
>
|
||||
<Trans>rewrite_add</Trans>
|
||||
</button>
|
||||
|
||||
<Modal
|
||||
isModalOpen={isModalOpen}
|
||||
toggleRewritesModal={toggleRewritesModal}
|
||||
handleSubmit={this.handleSubmit}
|
||||
processingAdd={processingAdd}
|
||||
processingDelete={processingDelete}
|
||||
/>
|
||||
</Fragment>
|
||||
</Card>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Rewrites.propTypes = {
|
||||
t: PropTypes.func.isRequired,
|
||||
getRewritesList: PropTypes.func.isRequired,
|
||||
toggleRewritesModal: PropTypes.func.isRequired,
|
||||
addRewrite: PropTypes.func.isRequired,
|
||||
deleteRewrite: PropTypes.func.isRequired,
|
||||
rewrites: PropTypes.object.isRequired,
|
||||
};
|
||||
|
||||
export default withNamespaces()(Rewrites);
|
||||
@@ -4,7 +4,6 @@ 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';
|
||||
@@ -13,7 +12,6 @@ class Dns extends Component {
|
||||
componentDidMount() {
|
||||
this.props.getDnsSettings();
|
||||
this.props.getAccessList();
|
||||
this.props.getRewritesList();
|
||||
this.props.getDnsConfig();
|
||||
}
|
||||
|
||||
@@ -23,25 +21,18 @@ class Dns extends Component {
|
||||
dashboard,
|
||||
settings,
|
||||
access,
|
||||
rewrites,
|
||||
setAccessList,
|
||||
testUpstream,
|
||||
setUpstream,
|
||||
getRewritesList,
|
||||
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 (
|
||||
@@ -64,13 +55,6 @@ class Dns extends Component {
|
||||
testUpstream={testUpstream}
|
||||
/>
|
||||
<Access access={access} setAccessList={setAccessList} />
|
||||
<Rewrites
|
||||
rewrites={rewrites}
|
||||
getRewritesList={getRewritesList}
|
||||
addRewrite={addRewrite}
|
||||
deleteRewrite={deleteRewrite}
|
||||
toggleRewritesModal={toggleRewritesModal}
|
||||
/>
|
||||
</Fragment>
|
||||
)}
|
||||
</Fragment>
|
||||
@@ -86,11 +70,6 @@ Dns.propTypes = {
|
||||
getAccessList: PropTypes.func.isRequired,
|
||||
setAccessList: PropTypes.func.isRequired,
|
||||
access: PropTypes.object.isRequired,
|
||||
rewrites: PropTypes.object.isRequired,
|
||||
getRewritesList: PropTypes.func.isRequired,
|
||||
addRewrite: PropTypes.func.isRequired,
|
||||
deleteRewrite: PropTypes.func.isRequired,
|
||||
toggleRewritesModal: PropTypes.func.isRequired,
|
||||
getDnsSettings: PropTypes.func.isRequired,
|
||||
dnsConfig: PropTypes.object.isRequired,
|
||||
setDnsConfig: PropTypes.func.isRequired,
|
||||
|
||||
@@ -112,3 +112,15 @@
|
||||
font-size: 14px;
|
||||
}
|
||||
}
|
||||
|
||||
.card .red {
|
||||
background-color: #fff4f2;
|
||||
}
|
||||
|
||||
.card .green {
|
||||
background-color: #f1faf3;
|
||||
}
|
||||
|
||||
.card .blue {
|
||||
background-color: #ecf7ff;
|
||||
}
|
||||
|
||||
@@ -3,28 +3,36 @@ import PropTypes from 'prop-types';
|
||||
|
||||
import './Card.css';
|
||||
|
||||
const Card = props => (
|
||||
<div className={props.type ? `card ${props.type}` : 'card'} id={props.id ? props.id : ''}>
|
||||
{props.title &&
|
||||
<div className="card-header with-border">
|
||||
<div className="card-inner">
|
||||
<div className="card-title">
|
||||
{props.title}
|
||||
const Card = ({
|
||||
type, id, title, subtitle, refresh, bodyType, children,
|
||||
}) => (
|
||||
<div className={type ? `card ${type}` : 'card'} id={id || ''}>
|
||||
{(title || subtitle) && (
|
||||
<div className="card-header with-border">
|
||||
<div className="card-inner">
|
||||
{title && (
|
||||
<div className="card-title">
|
||||
{title}
|
||||
</div>
|
||||
)}
|
||||
|
||||
{subtitle && (
|
||||
<div
|
||||
className="card-subtitle"
|
||||
dangerouslySetInnerHTML={{ __html: subtitle }}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{props.subtitle &&
|
||||
<div className="card-subtitle" dangerouslySetInnerHTML={{ __html: props.subtitle }} />
|
||||
}
|
||||
{refresh && (
|
||||
<div className="card-options">
|
||||
{refresh}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{props.refresh &&
|
||||
<div className="card-options">
|
||||
{props.refresh}
|
||||
</div>
|
||||
}
|
||||
</div>}
|
||||
<div className={props.bodyType ? props.bodyType : 'card-body'}>
|
||||
{props.children}
|
||||
)}
|
||||
<div className={bodyType || 'card-body'}>
|
||||
{children}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
@@ -1,19 +1,29 @@
|
||||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
|
||||
const CellWrap = ({ value }) => (
|
||||
<div className="logs__row logs__row--overflow">
|
||||
<span className="logs__text logs__text--full" title={value}>
|
||||
{value}
|
||||
</span>
|
||||
</div>
|
||||
);
|
||||
const CellWrap = ({ value }, formatValue, formatTitle = formatValue) => {
|
||||
if (!value) {
|
||||
return '–';
|
||||
}
|
||||
const cellValue = typeof formatValue === 'function' ? formatValue(value) : value;
|
||||
const cellTitle = typeof formatTitle === 'function' ? formatTitle(value) : value;
|
||||
|
||||
return (
|
||||
<div className="logs__row logs__row--overflow">
|
||||
<span className="logs__text logs__text--full" title={cellTitle}>
|
||||
{cellValue}
|
||||
</span>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
CellWrap.propTypes = {
|
||||
value: PropTypes.oneOfType([
|
||||
PropTypes.string,
|
||||
PropTypes.number,
|
||||
]),
|
||||
formatValue: PropTypes.func,
|
||||
formatTitle: PropTypes.func,
|
||||
};
|
||||
|
||||
export default CellWrap;
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
import React, { Component, Fragment } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { Trans, withNamespaces } from 'react-i18next';
|
||||
import { REPOSITORY, LANGUAGES, PRIVACY_POLICY_LINK } from '../../helpers/constants';
|
||||
|
||||
import { REPOSITORY, PRIVACY_POLICY_LINK } from '../../helpers/constants';
|
||||
import { LANGUAGES } from '../../helpers/twosky';
|
||||
import i18n from '../../i18n';
|
||||
|
||||
import Version from './Version';
|
||||
@@ -68,9 +70,9 @@ class Footer extends Component {
|
||||
value={i18n.language}
|
||||
onChange={this.changeLanguage}
|
||||
>
|
||||
{LANGUAGES.map(language => (
|
||||
<option key={language.key} value={language.key}>
|
||||
{language.name}
|
||||
{Object.keys(LANGUAGES).map(lang => (
|
||||
<option key={lang} value={lang}>
|
||||
{LANGUAGES[lang]}
|
||||
</option>
|
||||
))}
|
||||
</select>
|
||||
|
||||
@@ -1,8 +1,17 @@
|
||||
.page-header {
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
.page-subtitle {
|
||||
margin-left: 0.7rem;
|
||||
margin-left: 0;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
.page-title {
|
||||
line-height: 2.2rem;
|
||||
}
|
||||
|
||||
.page-title__actions {
|
||||
display: block;
|
||||
}
|
||||
|
||||
@@ -7,9 +7,13 @@ const PageTitle = props => (
|
||||
<div className="page-header">
|
||||
<h1 className="page-title">
|
||||
{props.title}
|
||||
{props.subtitle && <span className="page-subtitle">{props.subtitle}</span>}
|
||||
{props.children}
|
||||
</h1>
|
||||
{props.subtitle && (
|
||||
<div className="page-subtitle">
|
||||
{props.subtitle}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ class PopoverFilter extends Component {
|
||||
)}
|
||||
{filter && (
|
||||
<div className="popover__list-item popover__list-item--nowrap">
|
||||
<Trans>filter_label</Trans>: <strong>{filter}</strong>
|
||||
<Trans>list_label</Trans>: <strong>{filter}</strong>
|
||||
</div>
|
||||
)}
|
||||
{service && (
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
height: 45px;
|
||||
padding: 0 32px 2px 33px;
|
||||
outline: 0;
|
||||
border-color: rgba(0, 40, 100, 0.12);
|
||||
border-color: rgba(69, 79, 94, 0.12);
|
||||
background-image: url("./svg/globe.svg"), url("./svg/chevron-down.svg");
|
||||
background-repeat: no-repeat, no-repeat;
|
||||
background-position: left 11px center, right 9px center;
|
||||
@@ -14,3 +14,26 @@
|
||||
.select--language::-ms-expand {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.basic-multi-select .select__control {
|
||||
border: 1px solid rgba(0, 40, 100, 0.12);
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.basic-multi-select .select__control:hover {
|
||||
border: 1px solid rgba(0, 40, 100, 0.12);
|
||||
}
|
||||
|
||||
.basic-multi-select .select__control--is-focused,
|
||||
.basic-multi-select .select__control--is-focused:hover {
|
||||
border-color: #1991eb;
|
||||
box-shadow: 0 0 0 2px rgba(70, 127, 207, 0.25);
|
||||
}
|
||||
|
||||
.basic-multi-select .select__placeholder {
|
||||
color: #adb5bd;
|
||||
}
|
||||
|
||||
.basic-multi-select .select__menu {
|
||||
z-index: 3;
|
||||
}
|
||||
|
||||
@@ -10143,6 +10143,7 @@ body.fixed-header .page {
|
||||
display: flex;
|
||||
-ms-flex-align: center;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
margin: 1.5rem 0 1.5rem;
|
||||
-ms-flex-wrap: wrap;
|
||||
flex-wrap: wrap;
|
||||
|
||||
26
client/src/containers/CustomRules.js
Normal file
26
client/src/containers/CustomRules.js
Normal file
@@ -0,0 +1,26 @@
|
||||
import { connect } from 'react-redux';
|
||||
import {
|
||||
setRules,
|
||||
getFilteringStatus,
|
||||
handleRulesChange,
|
||||
checkHost,
|
||||
} from '../actions/filtering';
|
||||
import CustomRules from '../components/Filters/CustomRules';
|
||||
|
||||
const mapStateToProps = (state) => {
|
||||
const { filtering } = state;
|
||||
const props = { filtering };
|
||||
return props;
|
||||
};
|
||||
|
||||
const mapDispatchToProps = {
|
||||
setRules,
|
||||
getFilteringStatus,
|
||||
handleRulesChange,
|
||||
checkHost,
|
||||
};
|
||||
|
||||
export default connect(
|
||||
mapStateToProps,
|
||||
mapDispatchToProps,
|
||||
)(CustomRules);
|
||||
@@ -1,11 +1,12 @@
|
||||
import { connect } from 'react-redux';
|
||||
import { toggleProtection, getClients } from '../actions';
|
||||
import { getStats, getStatsConfig, setStatsConfig } from '../actions/stats';
|
||||
import { toggleClientBlock, getAccessList } from '../actions/access';
|
||||
import Dashboard from '../components/Dashboard';
|
||||
|
||||
const mapStateToProps = (state) => {
|
||||
const { dashboard, stats } = state;
|
||||
const props = { dashboard, stats };
|
||||
const { dashboard, stats, access } = state;
|
||||
const props = { dashboard, stats, access };
|
||||
return props;
|
||||
};
|
||||
|
||||
@@ -15,6 +16,8 @@ const mapDispatchToProps = {
|
||||
getStats,
|
||||
getStatsConfig,
|
||||
setStatsConfig,
|
||||
toggleClientBlock,
|
||||
getAccessList,
|
||||
};
|
||||
|
||||
export default connect(
|
||||
|
||||
@@ -8,8 +8,9 @@ import {
|
||||
toggleFilteringModal,
|
||||
refreshFilters,
|
||||
handleRulesChange,
|
||||
editFilter,
|
||||
} from '../actions/filtering';
|
||||
import Filters from '../components/Filters';
|
||||
import DnsAllowlist from '../components/Filters/DnsAllowlist';
|
||||
|
||||
const mapStateToProps = (state) => {
|
||||
const { filtering } = state;
|
||||
@@ -26,9 +27,10 @@ const mapDispatchToProps = {
|
||||
toggleFilteringModal,
|
||||
refreshFilters,
|
||||
handleRulesChange,
|
||||
editFilter,
|
||||
};
|
||||
|
||||
export default connect(
|
||||
mapStateToProps,
|
||||
mapDispatchToProps,
|
||||
)(Filters);
|
||||
)(DnsAllowlist);
|
||||
36
client/src/containers/DnsBlocklist.js
Normal file
36
client/src/containers/DnsBlocklist.js
Normal file
@@ -0,0 +1,36 @@
|
||||
import { connect } from 'react-redux';
|
||||
import {
|
||||
setRules,
|
||||
getFilteringStatus,
|
||||
addFilter,
|
||||
removeFilter,
|
||||
toggleFilterStatus,
|
||||
toggleFilteringModal,
|
||||
refreshFilters,
|
||||
handleRulesChange,
|
||||
editFilter,
|
||||
} from '../actions/filtering';
|
||||
import DnsBlocklist from '../components/Filters/DnsBlocklist';
|
||||
|
||||
const mapStateToProps = (state) => {
|
||||
const { filtering } = state;
|
||||
const props = { filtering };
|
||||
return props;
|
||||
};
|
||||
|
||||
const mapDispatchToProps = {
|
||||
setRules,
|
||||
getFilteringStatus,
|
||||
addFilter,
|
||||
removeFilter,
|
||||
toggleFilterStatus,
|
||||
toggleFilteringModal,
|
||||
refreshFilters,
|
||||
handleRulesChange,
|
||||
editFilter,
|
||||
};
|
||||
|
||||
export default connect(
|
||||
mapStateToProps,
|
||||
mapDispatchToProps,
|
||||
)(DnsBlocklist);
|
||||
26
client/src/containers/DnsRewrites.js
Normal file
26
client/src/containers/DnsRewrites.js
Normal file
@@ -0,0 +1,26 @@
|
||||
import { connect } from 'react-redux';
|
||||
import {
|
||||
getRewritesList,
|
||||
addRewrite,
|
||||
deleteRewrite,
|
||||
toggleRewritesModal,
|
||||
} from '../actions/rewrites';
|
||||
import Rewrites from '../components/Filters/Rewrites';
|
||||
|
||||
const mapStateToProps = (state) => {
|
||||
const { rewrites } = state;
|
||||
const props = { rewrites };
|
||||
return props;
|
||||
};
|
||||
|
||||
const mapDispatchToProps = {
|
||||
getRewritesList,
|
||||
addRewrite,
|
||||
deleteRewrite,
|
||||
toggleRewritesModal,
|
||||
};
|
||||
|
||||
export default connect(
|
||||
mapStateToProps,
|
||||
mapDispatchToProps,
|
||||
)(Rewrites);
|
||||
@@ -4,6 +4,7 @@ export const R_IPV4 = /^(?:(?:^|\.)(?:2(?:5[0-5]|[0-4]\d)|1?\d?\d)){4}$/;
|
||||
export const R_IPV6 = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;
|
||||
export const R_CIDR = /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))$/;
|
||||
export const R_MAC = /^((([a-fA-F0-9][a-fA-F0-9]+[-]){5}|([a-fA-F0-9][a-fA-F0-9]+[:]){5})([a-fA-F0-9][a-fA-F0-9])$)|(^([a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9]+[.]){2}([a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9]))$/;
|
||||
export const R_PATH_LAST_PART = /\/[^/]*$/;
|
||||
|
||||
export const STATS_NAMES = {
|
||||
avg_processing_time: 'average_processing_time',
|
||||
@@ -30,117 +31,6 @@ export const REPOSITORY = {
|
||||
|
||||
export const PRIVACY_POLICY_LINK = 'https://adguard.com/privacy/home.html';
|
||||
|
||||
export const LANGUAGES = [
|
||||
{
|
||||
key: 'da',
|
||||
name: 'Dansk',
|
||||
},
|
||||
{
|
||||
key: 'de',
|
||||
name: 'Deutsch',
|
||||
},
|
||||
{
|
||||
key: 'nl',
|
||||
name: 'Dutch',
|
||||
},
|
||||
{
|
||||
key: 'en',
|
||||
name: 'English',
|
||||
},
|
||||
{
|
||||
key: 'es',
|
||||
name: 'Español',
|
||||
},
|
||||
{
|
||||
key: 'fr',
|
||||
name: 'Français',
|
||||
},
|
||||
{
|
||||
key: 'id',
|
||||
name: 'Indonesian',
|
||||
},
|
||||
{
|
||||
key: 'it',
|
||||
name: 'Italiano',
|
||||
},
|
||||
{
|
||||
key: 'pl',
|
||||
name: 'Polski',
|
||||
},
|
||||
{
|
||||
key: 'pt-br',
|
||||
name: 'Portuguese (BR)',
|
||||
},
|
||||
{
|
||||
key: 'pt-pt',
|
||||
name: 'Portuguese (PT)',
|
||||
},
|
||||
{
|
||||
key: 'sk',
|
||||
name: 'Slovenčina',
|
||||
},
|
||||
{
|
||||
key: 'sl',
|
||||
name: 'Slovenščina',
|
||||
},
|
||||
{
|
||||
key: 'sv',
|
||||
name: 'Svenska',
|
||||
},
|
||||
{
|
||||
key: 'vi',
|
||||
name: 'Tiếng Việt',
|
||||
},
|
||||
{
|
||||
key: 'tr',
|
||||
name: 'Türkçe',
|
||||
},
|
||||
{
|
||||
key: 'cs',
|
||||
name: 'Český',
|
||||
},
|
||||
{
|
||||
key: 'bg',
|
||||
name: 'Български',
|
||||
},
|
||||
{
|
||||
key: 'ru',
|
||||
name: 'Русский',
|
||||
},
|
||||
{
|
||||
key: 'ja',
|
||||
name: '日本語',
|
||||
},
|
||||
{
|
||||
key: 'zh-tw',
|
||||
name: '正體中文',
|
||||
},
|
||||
{
|
||||
key: 'zh-cn',
|
||||
name: '简体中文',
|
||||
},
|
||||
{
|
||||
key: 'no',
|
||||
name: 'Norsk',
|
||||
},
|
||||
{
|
||||
key: 'sr-cs',
|
||||
name: 'Srpski',
|
||||
},
|
||||
{
|
||||
key: 'hr',
|
||||
name: 'Hrvatski',
|
||||
},
|
||||
{
|
||||
key: 'fa',
|
||||
name: 'فارسی',
|
||||
},
|
||||
{
|
||||
key: 'ko',
|
||||
name: '한국어',
|
||||
},
|
||||
];
|
||||
|
||||
export const INSTALL_FIRST_STEP = 1;
|
||||
export const INSTALL_TOTAL_STEPS = 5;
|
||||
|
||||
@@ -247,7 +137,26 @@ export const CLIENT_ID = {
|
||||
IP: 'ip',
|
||||
};
|
||||
|
||||
export const SETTINGS_URLS = ['/encryption', '/dhcp', '/dns', '/settings', '/clients'];
|
||||
export const MENU_URLS = {
|
||||
root: '/',
|
||||
logs: '/logs',
|
||||
guide: '/guide',
|
||||
};
|
||||
|
||||
export const SETTINGS_URLS = {
|
||||
encryption: '/encryption',
|
||||
dhcp: '/dhcp',
|
||||
dns: '/dns',
|
||||
settings: '/settings',
|
||||
clients: '/clients',
|
||||
};
|
||||
|
||||
export const FILTERS_URLS = {
|
||||
dns_blocklists: '/filters',
|
||||
dns_allowlists: '/dns_allowlists',
|
||||
dns_rewrites: '/dns_rewrites',
|
||||
custom_rules: '/custom_rules',
|
||||
};
|
||||
|
||||
export const SERVICES = [
|
||||
{
|
||||
@@ -348,10 +257,17 @@ export const ENCRYPTION_SOURCE = {
|
||||
export const FILTERED_STATUS = {
|
||||
FILTERED_BLACK_LIST: 'FilteredBlackList',
|
||||
NOT_FILTERED_WHITE_LIST: 'NotFilteredWhiteList',
|
||||
NOT_FILTERED_NOT_FOUND: 'NotFilteredNotFound',
|
||||
FILTERED_BLOCKED_SERVICE: 'FilteredBlockedService',
|
||||
REWRITE: 'Rewrite',
|
||||
FILTERED_SAFE_SEARCH: 'FilteredSafeSearch',
|
||||
FILTERED_SAFE_BROWSING: 'FilteredSafeBrowsing',
|
||||
FILTERED_PARENTAL: 'FilteredParental',
|
||||
};
|
||||
|
||||
export const FILTERED = 'Filtered';
|
||||
export const NOT_FILTERED = 'NotFiltered';
|
||||
|
||||
export const STATS_INTERVALS_DAYS = [1, 7, 30, 90];
|
||||
|
||||
export const QUERY_LOG_INTERVALS_DAYS = [1, 7, 30, 90];
|
||||
@@ -359,6 +275,7 @@ export const QUERY_LOG_INTERVALS_DAYS = [1, 7, 30, 90];
|
||||
export const FILTERS_INTERVALS_HOURS = [0, 1, 12, 24, 72, 168];
|
||||
|
||||
export const BLOCKING_MODES = {
|
||||
default: 'default',
|
||||
nxdomain: 'nxdomain',
|
||||
null_ip: 'null_ip',
|
||||
custom_ip: 'custom_ip',
|
||||
@@ -432,3 +349,26 @@ export const RESPONSE_FILTER = {
|
||||
ALL: 'all',
|
||||
FILTERED: 'filtered',
|
||||
};
|
||||
|
||||
export const DEFAULT_TIME_FORMAT = 'HH:mm:ss';
|
||||
|
||||
export const DEFAULT_DATE_FORMAT_OPTIONS = {
|
||||
year: 'numeric',
|
||||
month: 'numeric',
|
||||
day: 'numeric',
|
||||
hour: 'numeric',
|
||||
minute: 'numeric',
|
||||
hour12: false,
|
||||
};
|
||||
|
||||
export const DETAILED_DATE_FORMAT_OPTIONS = {
|
||||
...DEFAULT_DATE_FORMAT_OPTIONS,
|
||||
month: 'long',
|
||||
};
|
||||
|
||||
export const CUSTOM_FILTERING_RULES_ID = 0;
|
||||
|
||||
export const ACTION = {
|
||||
block: 'block',
|
||||
unblock: 'unblock',
|
||||
};
|
||||
|
||||
@@ -1,14 +1,17 @@
|
||||
import React, { Fragment } from 'react';
|
||||
import { Trans } from 'react-i18next';
|
||||
import PropTypes from 'prop-types';
|
||||
import { R_IPV4, R_MAC, R_HOST, R_IPV6, R_CIDR, UNSAFE_PORTS } from '../helpers/constants';
|
||||
import { R_IPV4, R_MAC, R_HOST, R_IPV6, R_CIDR, UNSAFE_PORTS, R_URL_REQUIRES_PROTOCOL } from '../helpers/constants';
|
||||
import { createOnBlurHandler } from './helpers';
|
||||
|
||||
export const renderField = (props, elementType) => {
|
||||
const {
|
||||
input, id, className, placeholder, type, disabled,
|
||||
input, id, className, placeholder, type, disabled, normalizeOnBlur,
|
||||
autoComplete, meta: { touched, error },
|
||||
} = props;
|
||||
|
||||
const onBlur = event => createOnBlurHandler(event, input, normalizeOnBlur);
|
||||
|
||||
const element = React.createElement(elementType, {
|
||||
...input,
|
||||
id,
|
||||
@@ -17,6 +20,7 @@ export const renderField = (props, elementType) => {
|
||||
autoComplete,
|
||||
disabled,
|
||||
type,
|
||||
onBlur,
|
||||
});
|
||||
return (
|
||||
<Fragment>
|
||||
@@ -35,6 +39,7 @@ renderField.propTypes = {
|
||||
type: PropTypes.string,
|
||||
disabled: PropTypes.bool,
|
||||
autoComplete: PropTypes.bool,
|
||||
normalizeOnBlur: PropTypes.func,
|
||||
};
|
||||
|
||||
export const renderTextareaField = props => renderField(props, 'textarea');
|
||||
@@ -52,37 +57,43 @@ export const renderGroupField = ({
|
||||
isActionAvailable,
|
||||
removeField,
|
||||
meta: { touched, error },
|
||||
}) => (
|
||||
<Fragment>
|
||||
<div className="input-group">
|
||||
<input
|
||||
{...input}
|
||||
id={id}
|
||||
placeholder={placeholder}
|
||||
type={type}
|
||||
className={className}
|
||||
disabled={disabled}
|
||||
autoComplete={autoComplete}
|
||||
/>
|
||||
{isActionAvailable &&
|
||||
<span className="input-group-append">
|
||||
<button
|
||||
type="button"
|
||||
className="btn btn-secondary btn-icon"
|
||||
onClick={removeField}
|
||||
>
|
||||
<svg className="icon icon--close">
|
||||
<use xlinkHref="#cross" />
|
||||
</svg>
|
||||
</button>
|
||||
</span>
|
||||
}
|
||||
</div>
|
||||
{!disabled &&
|
||||
touched &&
|
||||
(error && <span className="form__message form__message--error">{error}</span>)}
|
||||
</Fragment>
|
||||
);
|
||||
normalizeOnBlur,
|
||||
}) => {
|
||||
const onBlur = event => createOnBlurHandler(event, input, normalizeOnBlur);
|
||||
|
||||
return (
|
||||
<Fragment>
|
||||
<div className="input-group">
|
||||
<input
|
||||
{...input}
|
||||
id={id}
|
||||
placeholder={placeholder}
|
||||
type={type}
|
||||
className={className}
|
||||
disabled={disabled}
|
||||
autoComplete={autoComplete}
|
||||
onBlur={onBlur}
|
||||
/>
|
||||
{isActionAvailable &&
|
||||
<span className="input-group-append">
|
||||
<button
|
||||
type="button"
|
||||
className="btn btn-secondary btn-icon"
|
||||
onClick={removeField}
|
||||
>
|
||||
<svg className="icon icon--close">
|
||||
<use xlinkHref="#cross" />
|
||||
</svg>
|
||||
</button>
|
||||
</span>
|
||||
}
|
||||
</div>
|
||||
{!disabled &&
|
||||
touched &&
|
||||
(error && <span className="form__message form__message--error">{error}</span>)}
|
||||
</Fragment>
|
||||
);
|
||||
};
|
||||
|
||||
export const renderRadioField = ({
|
||||
input, placeholder, disabled, meta: { touched, error },
|
||||
@@ -229,6 +240,13 @@ export const port = (value) => {
|
||||
return undefined;
|
||||
};
|
||||
|
||||
export const validInstallPort = (value) => {
|
||||
if (value < 1 || value > 65535) {
|
||||
return <Trans>form_error_port</Trans>;
|
||||
}
|
||||
return undefined;
|
||||
};
|
||||
|
||||
export const portTLS = (value) => {
|
||||
if (value === 0) {
|
||||
return undefined;
|
||||
@@ -259,4 +277,11 @@ export const answer = (value) => {
|
||||
return undefined;
|
||||
};
|
||||
|
||||
export const isValidUrl = (value) => {
|
||||
if (value && !R_URL_REQUIRES_PROTOCOL.test(value)) {
|
||||
return <Trans>form_error_url_format</Trans>;
|
||||
}
|
||||
return undefined;
|
||||
};
|
||||
|
||||
export const toNumber = value => value && parseInt(value, 10);
|
||||
|
||||
@@ -5,6 +5,7 @@ import subHours from 'date-fns/sub_hours';
|
||||
import addHours from 'date-fns/add_hours';
|
||||
import addDays from 'date-fns/add_days';
|
||||
import subDays from 'date-fns/sub_days';
|
||||
import isSameDay from 'date-fns/is_same_day';
|
||||
import round from 'lodash/round';
|
||||
import axios from 'axios';
|
||||
import i18n from 'i18next';
|
||||
@@ -17,28 +18,43 @@ import {
|
||||
STANDARD_HTTPS_PORT,
|
||||
CHECK_TIMEOUT,
|
||||
DNS_RECORD_TYPES,
|
||||
DEFAULT_TIME_FORMAT,
|
||||
DEFAULT_DATE_FORMAT_OPTIONS,
|
||||
DETAILED_DATE_FORMAT_OPTIONS,
|
||||
DEFAULT_LANGUAGE,
|
||||
FILTERED_STATUS,
|
||||
FILTERED,
|
||||
} from './constants';
|
||||
|
||||
/**
|
||||
* @param string The time to format
|
||||
* @returns string Returns the time in the format HH:mm:ss
|
||||
*/
|
||||
export const formatTime = (time) => {
|
||||
const parsedTime = dateParse(time);
|
||||
return dateFormat(parsedTime, 'HH:mm:ss');
|
||||
return dateFormat(parsedTime, DEFAULT_TIME_FORMAT);
|
||||
};
|
||||
|
||||
export const formatDateTime = (dateTime) => {
|
||||
const currentLanguage = i18n.languages[0] || 'en';
|
||||
/**
|
||||
* @param string The date to format
|
||||
* @returns string Returns the date and time in the format DD/MM/YYYY, HH:mm
|
||||
*/
|
||||
export const formatDateTime = (dateTime, options = DEFAULT_DATE_FORMAT_OPTIONS) => {
|
||||
const currentLanguage = i18n.languages[0] || DEFAULT_LANGUAGE;
|
||||
const parsedTime = dateParse(dateTime);
|
||||
const options = {
|
||||
year: 'numeric',
|
||||
month: 'numeric',
|
||||
day: 'numeric',
|
||||
hour: 'numeric',
|
||||
minute: 'numeric',
|
||||
hour12: false,
|
||||
};
|
||||
|
||||
return parsedTime.toLocaleString(currentLanguage, options);
|
||||
};
|
||||
|
||||
export const formatDetailedDateTime = dateTime =>
|
||||
formatDateTime(dateTime, DETAILED_DATE_FORMAT_OPTIONS);
|
||||
|
||||
/**
|
||||
* @param string
|
||||
* @returns boolean
|
||||
*/
|
||||
export const isToday = date => isSameDay(new Date(date), new Date());
|
||||
|
||||
export const normalizeLogs = logs => logs.map((log) => {
|
||||
const {
|
||||
time,
|
||||
@@ -106,37 +122,39 @@ export const addClientInfo = (data, clients, param) => (
|
||||
})
|
||||
);
|
||||
|
||||
export const normalizeFilters = filters => (
|
||||
filters ? filters.map((filter) => {
|
||||
const {
|
||||
id,
|
||||
url,
|
||||
enabled,
|
||||
last_updated,
|
||||
name = 'Default name',
|
||||
rules_count: rules_count = 0,
|
||||
} = filter;
|
||||
|
||||
return {
|
||||
id,
|
||||
url,
|
||||
enabled,
|
||||
lastUpdated: last_updated,
|
||||
name,
|
||||
rulesCount: rules_count,
|
||||
};
|
||||
}) : []
|
||||
);
|
||||
|
||||
export const normalizeFilteringStatus = (filteringStatus) => {
|
||||
const {
|
||||
enabled, filters, user_rules: userRules, interval,
|
||||
enabled, filters, user_rules: userRules, interval, whitelist_filters,
|
||||
} = filteringStatus;
|
||||
const newFilters = filters
|
||||
? filters.map((filter) => {
|
||||
const {
|
||||
id,
|
||||
url,
|
||||
enabled,
|
||||
last_updated,
|
||||
name = 'Default name',
|
||||
rules_count: rules_count = 0,
|
||||
} = filter;
|
||||
|
||||
return {
|
||||
id,
|
||||
url,
|
||||
enabled,
|
||||
lastUpdated: last_updated ? formatDateTime(last_updated) : '–',
|
||||
name,
|
||||
rulesCount: rules_count,
|
||||
};
|
||||
})
|
||||
: [];
|
||||
const newUserRules = Array.isArray(userRules) ? userRules.join('\n') : '';
|
||||
|
||||
return {
|
||||
enabled,
|
||||
userRules: newUserRules,
|
||||
filters: newFilters,
|
||||
filters: normalizeFilters(filters),
|
||||
whitelistFilters: normalizeFilters(whitelist_filters),
|
||||
interval,
|
||||
};
|
||||
};
|
||||
@@ -259,14 +277,35 @@ export const redirectToCurrentProtocol = (values, httpPort = 80) => {
|
||||
}
|
||||
};
|
||||
|
||||
export const normalizeTextarea = text => text && text.replace(/[;, ]/g, '\n').split('\n').filter(n => n);
|
||||
export const normalizeTextarea = (text) => {
|
||||
if (!text) {
|
||||
return [];
|
||||
}
|
||||
|
||||
export const normalizeTopClients = clients => clients.reduce((accumulator, clientObj) => {
|
||||
const { name, count } = clientObj;
|
||||
return text.replace(/[;, ]/g, '\n').split('\n').filter(n => n);
|
||||
};
|
||||
|
||||
/**
|
||||
* Normalizes the topClients array
|
||||
*
|
||||
* @param {Object[]} topClients
|
||||
* @param {string} topClients.name
|
||||
* @param {number} topClients.count
|
||||
* @param {Object} topClients.info
|
||||
* @param {string} topClients.info.name
|
||||
* @returns {Object} normalizedTopClients
|
||||
* @returns {Object.<string, number>} normalizedTopClients.auto - auto clients
|
||||
* @returns {Object.<string, number>} normalizedTopClients.configured - configured clients
|
||||
*/
|
||||
|
||||
export const normalizeTopClients = topClients => topClients.reduce((nameToCountMap, clientObj) => {
|
||||
const { name, count, info: { name: infoName } } = clientObj;
|
||||
// eslint-disable-next-line no-param-reassign
|
||||
accumulator[name] = count;
|
||||
return accumulator;
|
||||
}, {});
|
||||
nameToCountMap.auto[name] = count;
|
||||
// eslint-disable-next-line no-param-reassign
|
||||
nameToCountMap.configured[infoName] = count;
|
||||
return nameToCountMap;
|
||||
}, { auto: {}, configured: {} });
|
||||
|
||||
export const getClientInfo = (clients, ip) => {
|
||||
const client = clients
|
||||
@@ -373,3 +412,40 @@ export const getParamsForClientsSearch = (data, param) => {
|
||||
return acc;
|
||||
}, {});
|
||||
};
|
||||
|
||||
/**
|
||||
* Creates onBlur handler that can normalize input if normalization function is specified
|
||||
*
|
||||
* @param {Object} event
|
||||
* @param {Object} event.target
|
||||
* @param {string} event.target.value
|
||||
* @param {Object} input
|
||||
* @param {function} input.onBlur
|
||||
* @param {function} [normalizeOnBlur]
|
||||
* @returns {function}
|
||||
*/
|
||||
export const createOnBlurHandler = (event, input, normalizeOnBlur) => (
|
||||
normalizeOnBlur
|
||||
? input.onBlur(normalizeOnBlur(event.target.value))
|
||||
: input.onBlur());
|
||||
|
||||
export const checkFiltered = reason => reason.indexOf(FILTERED) === 0;
|
||||
export const checkRewrite = reason => reason === FILTERED_STATUS.REWRITE;
|
||||
export const checkBlackList = reason => reason === FILTERED_STATUS.FILTERED_BLACK_LIST;
|
||||
export const checkWhiteList = reason => reason === FILTERED_STATUS.NOT_FILTERED_WHITE_LIST;
|
||||
export const checkNotFilteredNotFound = reason => reason === FILTERED_STATUS.NOT_FILTERED_NOT_FOUND;
|
||||
export const checkSafeSearch = reason => reason === FILTERED_STATUS.FILTERED_SAFE_SEARCH;
|
||||
export const checkSafeBrowsing = reason => reason === FILTERED_STATUS.FILTERED_SAFE_BROWSING;
|
||||
export const checkParental = reason => reason === FILTERED_STATUS.FILTERED_PARENTAL;
|
||||
export const checkBlockedService = reason => reason === FILTERED_STATUS.FILTERED_BLOCKED_SERVICE;
|
||||
|
||||
export const getCurrentFilter = (url, filters) => {
|
||||
const filter = filters && filters.find(item => url === item.url);
|
||||
|
||||
if (filter) {
|
||||
const { enabled, name, url } = filter;
|
||||
return { enabled, name, url };
|
||||
}
|
||||
|
||||
return { name: '', url: '' };
|
||||
};
|
||||
|
||||
@@ -17,6 +17,21 @@
|
||||
"101": "mobile_analytics"
|
||||
},
|
||||
"trackers": {
|
||||
"akamai_technologies": {
|
||||
"name": "Akamai Technologies",
|
||||
"categoryId": 9,
|
||||
"url": "https://www.akamai.com/"
|
||||
},
|
||||
"apple": {
|
||||
"name": "Apple",
|
||||
"categoryId": 8,
|
||||
"url": "https://www.apple.com/"
|
||||
},
|
||||
"apple_ads": {
|
||||
"name": "Apple Search Ads",
|
||||
"categoryId": 4,
|
||||
"url": "https://searchads.apple.com/"
|
||||
},
|
||||
"facebook_audience": {
|
||||
"name": "Facebook Audience Network",
|
||||
"categoryId": 4,
|
||||
@@ -62,13 +77,41 @@
|
||||
"categoryId": 101,
|
||||
"url": "https://branch.io/"
|
||||
},
|
||||
"adocean": {
|
||||
"name": "Gemius Adocean",
|
||||
"markmonitor": {
|
||||
"name": "MarkMonitor",
|
||||
"categoryId": 4,
|
||||
"url": "https://adocean-global.com/"
|
||||
"url": "https://www.markmonitor.com/"
|
||||
},
|
||||
"appcenter": {
|
||||
"name": "Microsoft App Center",
|
||||
"categoryId": 5,
|
||||
"url": "https://appcenter.ms/"
|
||||
},
|
||||
"unity_ads": {
|
||||
"name": "Unity Ads",
|
||||
"categoryId": 4,
|
||||
"url": "https://unity.com/solutions/mobile-business/monetize-your-game"
|
||||
},
|
||||
"azure": {
|
||||
"name": "Microsoft Azure",
|
||||
"categoryId": 10,
|
||||
"url": "https://azure.microsoft.com/"
|
||||
},
|
||||
"button": {
|
||||
"name": "Button",
|
||||
"categoryId": 4,
|
||||
"url": "https://www.usebutton.com/"
|
||||
}
|
||||
},
|
||||
"trackerDomains": {
|
||||
"akadns.net": "akamai_technologies",
|
||||
"akamaiedge.net": "akamai_technologies",
|
||||
"apple.com": "apple",
|
||||
"apple-dns.net": "apple",
|
||||
"aaplimg.com": "apple",
|
||||
"icloud.com": "apple",
|
||||
"mzstatic.com": "apple",
|
||||
"iadsdk.apple.com": "apple_ads",
|
||||
"graph.facebook.com": "facebook_audience",
|
||||
"crashlytics.com": "crashlytics",
|
||||
"flurry.com": "flurry",
|
||||
@@ -78,6 +121,10 @@
|
||||
"appmetrica.yandex.com": "yandex_appmetrica",
|
||||
"adjust.com": "adjust",
|
||||
"mobileapptracking.com": "branch",
|
||||
"adocean.cz": "adocean"
|
||||
"edgecastcdn.net": "markmonitor",
|
||||
"appcenter.ms": "appcenter",
|
||||
"unityads.unity3d.com": "unity_ads",
|
||||
"azure.com": "azure",
|
||||
"bttn.io": "button"
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
6
client/src/helpers/twosky.js
Normal file
6
client/src/helpers/twosky.js
Normal file
@@ -0,0 +1,6 @@
|
||||
import twosky from 'MainRoot/.twosky.json';
|
||||
|
||||
export const {
|
||||
languages: LANGUAGES,
|
||||
base_locale: BASE_LOCALE,
|
||||
} = twosky[0];
|
||||
@@ -3,7 +3,7 @@ import { reactI18nextModule } from 'react-i18next';
|
||||
import { initReactI18n } from 'react-i18next/hooks';
|
||||
import langDetect from 'i18next-browser-languagedetector';
|
||||
|
||||
import { DEFAULT_LANGUAGE } from './helpers/constants';
|
||||
import { LANGUAGES, BASE_LOCALE } from './helpers/twosky';
|
||||
|
||||
import vi from './__locales/vi.json';
|
||||
import en from './__locales/en.json';
|
||||
@@ -117,7 +117,7 @@ const resources = {
|
||||
},
|
||||
};
|
||||
|
||||
const availableLanguages = Object.keys(resources);
|
||||
const availableLanguages = Object.keys(LANGUAGES);
|
||||
|
||||
i18n
|
||||
.use(langDetect)
|
||||
@@ -126,7 +126,7 @@ i18n
|
||||
.init({
|
||||
resources,
|
||||
lowerCaseLng: true,
|
||||
fallbackLng: DEFAULT_LANGUAGE,
|
||||
fallbackLng: BASE_LOCALE,
|
||||
keySeparator: false,
|
||||
nsSeparator: false,
|
||||
returnEmptyString: false,
|
||||
@@ -136,9 +136,10 @@ i18n
|
||||
react: {
|
||||
wait: true,
|
||||
},
|
||||
whitelist: availableLanguages,
|
||||
}, () => {
|
||||
if (!availableLanguages.includes(i18n.language)) {
|
||||
i18n.changeLanguage(DEFAULT_LANGUAGE);
|
||||
i18n.changeLanguage(BASE_LOCALE);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -7,26 +7,17 @@ import flow from 'lodash/flow';
|
||||
|
||||
import Controls from './Controls';
|
||||
import AddressList from './AddressList';
|
||||
|
||||
import { getInterfaceIp } from '../../helpers/helpers';
|
||||
import { ALL_INTERFACES_IP } from '../../helpers/constants';
|
||||
import { renderInputField } from '../../helpers/form';
|
||||
import { renderInputField, required, validInstallPort, toNumber } from '../../helpers/form';
|
||||
|
||||
const required = (value) => {
|
||||
if (value || value === 0) {
|
||||
return false;
|
||||
}
|
||||
return <Trans>form_error_required</Trans>;
|
||||
const STATIC_STATUS = {
|
||||
ENABLED: 'yes',
|
||||
DISABLED: 'no',
|
||||
ERROR: 'error',
|
||||
};
|
||||
|
||||
const port = (value) => {
|
||||
if (value < 1 || value > 65535) {
|
||||
return <Trans>form_error_port</Trans>;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
const toNumber = value => value && parseInt(value, 10);
|
||||
|
||||
const renderInterfaces = (interfaces => (
|
||||
Object.keys(interfaces).map((item) => {
|
||||
const option = interfaces[item];
|
||||
@@ -79,11 +70,91 @@ class Settings extends Component {
|
||||
});
|
||||
}
|
||||
|
||||
getStaticIpMessage = (staticIp) => {
|
||||
const { static: status, ip } = staticIp;
|
||||
|
||||
if (!status) {
|
||||
return '';
|
||||
}
|
||||
|
||||
return (
|
||||
<Fragment>
|
||||
{status === STATIC_STATUS.DISABLED && (
|
||||
<Fragment>
|
||||
<div className="mb-2">
|
||||
<Trans values={{ ip }} components={[<strong key="0">text</strong>]}>
|
||||
install_static_configure
|
||||
</Trans>
|
||||
</div>
|
||||
<button
|
||||
type="button"
|
||||
className="btn btn-outline-primary btn-sm"
|
||||
onClick={() => this.handleStaticIp(ip)}
|
||||
>
|
||||
<Trans>set_static_ip</Trans>
|
||||
</button>
|
||||
</Fragment>
|
||||
)}
|
||||
{status === STATIC_STATUS.ERROR && (
|
||||
<div className="text-danger">
|
||||
<Trans>install_static_error</Trans>
|
||||
</div>
|
||||
)}
|
||||
{status === STATIC_STATUS.ENABLED && (
|
||||
<div className="text-success">
|
||||
<Trans>
|
||||
install_static_ok
|
||||
</Trans>
|
||||
</div>
|
||||
)}
|
||||
</Fragment>
|
||||
);
|
||||
};
|
||||
|
||||
handleAutofix = (type) => {
|
||||
const {
|
||||
webIp,
|
||||
webPort,
|
||||
dnsIp,
|
||||
dnsPort,
|
||||
handleFix,
|
||||
} = this.props;
|
||||
|
||||
const web = { ip: webIp, port: webPort, autofix: false };
|
||||
const dns = { ip: dnsIp, port: dnsPort, autofix: false };
|
||||
const set_static_ip = false;
|
||||
|
||||
if (type === 'web') {
|
||||
web.autofix = true;
|
||||
} else {
|
||||
dns.autofix = true;
|
||||
}
|
||||
|
||||
handleFix(web, dns, set_static_ip);
|
||||
};
|
||||
|
||||
handleStaticIp = (ip) => {
|
||||
const {
|
||||
webIp,
|
||||
webPort,
|
||||
dnsIp,
|
||||
dnsPort,
|
||||
handleFix,
|
||||
} = this.props;
|
||||
|
||||
const web = { ip: webIp, port: webPort, autofix: false };
|
||||
const dns = { ip: dnsIp, port: dnsPort, autofix: false };
|
||||
const set_static_ip = true;
|
||||
|
||||
if (window.confirm(this.props.t('confirm_static_ip', { ip }))) {
|
||||
handleFix(web, dns, set_static_ip);
|
||||
}
|
||||
};
|
||||
|
||||
render() {
|
||||
const {
|
||||
handleSubmit,
|
||||
handleChange,
|
||||
handleAutofix,
|
||||
webIp,
|
||||
webPort,
|
||||
dnsIp,
|
||||
@@ -100,6 +171,7 @@ class Settings extends Component {
|
||||
status: dnsStatus,
|
||||
can_autofix: isDnsFixAvailable,
|
||||
} = config.dns;
|
||||
const { staticIp } = config;
|
||||
|
||||
return (
|
||||
<form className="setup__step" onSubmit={handleSubmit}>
|
||||
@@ -137,7 +209,7 @@ class Settings extends Component {
|
||||
type="number"
|
||||
className="form-control"
|
||||
placeholder="80"
|
||||
validate={[port, required]}
|
||||
validate={[validInstallPort, required]}
|
||||
normalize={toNumber}
|
||||
onChange={handleChange}
|
||||
/>
|
||||
@@ -151,11 +223,12 @@ class Settings extends Component {
|
||||
<button
|
||||
type="button"
|
||||
className="btn btn-secondary btn-sm ml-2"
|
||||
onClick={() => handleAutofix('web', webIp, webPort)}
|
||||
onClick={() => this.handleAutofix('web')}
|
||||
>
|
||||
<Trans>fix</Trans>
|
||||
</button>
|
||||
}
|
||||
<hr className="divider--small" />
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
@@ -171,6 +244,7 @@ class Settings extends Component {
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="setup__group">
|
||||
<div className="setup__subtitle">
|
||||
<Trans>install_settings_dns</Trans>
|
||||
@@ -205,7 +279,7 @@ class Settings extends Component {
|
||||
type="number"
|
||||
className="form-control"
|
||||
placeholder="80"
|
||||
validate={[port, required]}
|
||||
validate={[validInstallPort, required]}
|
||||
normalize={toNumber}
|
||||
onChange={handleChange}
|
||||
/>
|
||||
@@ -213,18 +287,32 @@ class Settings extends Component {
|
||||
</div>
|
||||
<div className="col-12">
|
||||
{dnsStatus &&
|
||||
<div className="setup__error text-danger">
|
||||
{dnsStatus}
|
||||
{isDnsFixAvailable &&
|
||||
<button
|
||||
type="button"
|
||||
className="btn btn-secondary btn-sm ml-2"
|
||||
onClick={() => handleAutofix('dns', dnsIp, dnsPort)}
|
||||
>
|
||||
<Trans>fix</Trans>
|
||||
</button>
|
||||
}
|
||||
</div>
|
||||
<Fragment>
|
||||
<div className="setup__error text-danger">
|
||||
{dnsStatus}
|
||||
{isDnsFixAvailable &&
|
||||
<button
|
||||
type="button"
|
||||
className="btn btn-secondary btn-sm ml-2"
|
||||
onClick={() => this.handleAutofix('dns')}
|
||||
>
|
||||
<Trans>fix</Trans>
|
||||
</button>
|
||||
}
|
||||
</div>
|
||||
<div className="text-muted mb-2">
|
||||
<p className="mb-1">
|
||||
<Trans>autofix_warning_text</Trans>
|
||||
</p>
|
||||
<Trans components={[<li key="0">text</li>]}>
|
||||
autofix_warning_list
|
||||
</Trans>
|
||||
<p className="mb-1">
|
||||
<Trans>autofix_warning_result</Trans>
|
||||
</p>
|
||||
</div>
|
||||
<hr className="divider--small" />
|
||||
</Fragment>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
@@ -240,6 +328,19 @@ class Settings extends Component {
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="setup__group">
|
||||
<div className="setup__subtitle">
|
||||
<Trans>static_ip</Trans>
|
||||
</div>
|
||||
|
||||
<div className="mb-2">
|
||||
<Trans>static_ip_desc</Trans>
|
||||
</div>
|
||||
|
||||
{this.getStaticIpMessage(staticIp)}
|
||||
</div>
|
||||
|
||||
<Controls invalid={invalid} />
|
||||
</form>
|
||||
);
|
||||
@@ -249,7 +350,7 @@ class Settings extends Component {
|
||||
Settings.propTypes = {
|
||||
handleSubmit: PropTypes.func.isRequired,
|
||||
handleChange: PropTypes.func,
|
||||
handleAutofix: PropTypes.func,
|
||||
handleFix: PropTypes.func.isRequired,
|
||||
validateForm: PropTypes.func,
|
||||
webIp: PropTypes.string.isRequired,
|
||||
dnsIp: PropTypes.string.isRequired,
|
||||
@@ -265,6 +366,7 @@ Settings.propTypes = {
|
||||
interfaces: PropTypes.object.isRequired,
|
||||
invalid: PropTypes.bool.isRequired,
|
||||
initialValues: PropTypes.object,
|
||||
t: PropTypes.func.isRequired,
|
||||
};
|
||||
|
||||
const selector = formValueSelector('install');
|
||||
|
||||
@@ -119,3 +119,8 @@
|
||||
.setup__error {
|
||||
margin: -5px 0 5px;
|
||||
}
|
||||
|
||||
.divider--small {
|
||||
margin-top: 1rem;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user