Compare commits
436 Commits
v0.107.26
...
2499-rewri
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c1be2bab4d | ||
|
|
53cd9b7a1a | ||
|
|
d8d7a5c335 | ||
|
|
18a6066df5 | ||
|
|
18392943fa | ||
|
|
c2abedec70 | ||
|
|
bbdcc673a2 | ||
|
|
d3bf5fcb05 | ||
|
|
5a794411d9 | ||
|
|
8e058b8042 | ||
|
|
d76834f843 | ||
|
|
e7fc61a997 | ||
|
|
97af23b0af | ||
|
|
5480bed1f7 | ||
|
|
c5fb7e6b0d | ||
|
|
9efc381224 | ||
|
|
e481922d91 | ||
|
|
defde7d0fe | ||
|
|
0c03063c8a | ||
|
|
0ddd8e3dcc | ||
|
|
48cbc7bdf0 | ||
|
|
299371e0fd | ||
|
|
12f52f07c5 | ||
|
|
de08ef0077 | ||
|
|
cfab157146 | ||
|
|
ec05ee16fe | ||
|
|
c1b537c14b | ||
|
|
990311c9e0 | ||
|
|
526c358697 | ||
|
|
d77b743c7b | ||
|
|
e657899c32 | ||
|
|
fb3602853a | ||
|
|
2cf171f21e | ||
|
|
e56f465ad8 | ||
|
|
a8e80bc583 | ||
|
|
9a186d0a8a | ||
|
|
2d29455d7f | ||
|
|
8d453e75a4 | ||
|
|
de9f9e9eb8 | ||
|
|
fa49d74aa8 | ||
|
|
f0cf6cce9a | ||
|
|
55a0dec144 | ||
|
|
6d1adf74b1 | ||
|
|
6b607e982b | ||
|
|
01652e6ab2 | ||
|
|
09f88cf21d | ||
|
|
e6f8aeeebe | ||
|
|
fafd7a1e82 | ||
|
|
53a366ed46 | ||
|
|
9c4bed31e7 | ||
|
|
23c16a13aa | ||
|
|
36d90b152e | ||
|
|
08282dc4d9 | ||
|
|
93882d6860 | ||
|
|
167b112511 | ||
|
|
98af0e000e | ||
|
|
2bfdcbbc10 | ||
|
|
8fdbcc005c | ||
|
|
464fbf0b54 | ||
|
|
a7d02fa935 | ||
|
|
af8f64ac00 | ||
|
|
c139287787 | ||
|
|
fa0fd90ddd | ||
|
|
c5565a9e4e | ||
|
|
ac7634da37 | ||
|
|
746e9df727 | ||
|
|
3dd7393b3f | ||
|
|
9c9d6b48e3 | ||
|
|
9951d861d1 | ||
|
|
8a935d4ffb | ||
|
|
bf10f157ab | ||
|
|
15f5876e33 | ||
|
|
04c8e3b288 | ||
|
|
cebbb69a4c | ||
|
|
a272b61ed6 | ||
|
|
b86250737e | ||
|
|
a149d816d9 | ||
|
|
67d89660ca | ||
|
|
2a85d7dd7e | ||
|
|
68d13fcc2b | ||
|
|
2de42284a5 | ||
|
|
d2a09e49ff | ||
|
|
e0080ffa3a | ||
|
|
8dba4ecd01 | ||
|
|
aaaa56fce3 | ||
|
|
ab79168b13 | ||
|
|
5ae826d8a9 | ||
|
|
a736f67205 | ||
|
|
fee81b31ec | ||
|
|
a1acfbbae4 | ||
|
|
4582b1c919 | ||
|
|
893358ea71 | ||
|
|
f109fb17a4 | ||
|
|
5604e33574 | ||
|
|
67da002391 | ||
|
|
d42d1a7ea4 | ||
|
|
e4a42bf233 | ||
|
|
0eba31ca03 | ||
|
|
f5602d9c46 | ||
|
|
f1dd33346a | ||
|
|
960a7a75ed | ||
|
|
a126f514ff | ||
|
|
c0c9d8adb0 | ||
|
|
7cac010573 | ||
|
|
51f426736c | ||
|
|
0c0340d63e | ||
|
|
330ac30324 | ||
|
|
2e0f6e5468 | ||
|
|
b7e815483e | ||
|
|
15b19ff726 | ||
|
|
f557339ca0 | ||
|
|
fe8be3701f | ||
|
|
c26ab190e7 | ||
|
|
6a62f704e2 | ||
|
|
24eb3476db | ||
|
|
8a924cb4ed | ||
|
|
6e7964c9e7 | ||
|
|
9d59be4269 | ||
|
|
bf792b83f6 | ||
|
|
0cce420261 | ||
|
|
61bd217eb3 | ||
|
|
739e0098ec | ||
|
|
27032ef79e | ||
|
|
5e626306d1 | ||
|
|
2ffea605cf | ||
|
|
4d404b887f | ||
|
|
7b48863041 | ||
|
|
756b14a61d | ||
|
|
b71a5d86de | ||
|
|
d45fa5801e | ||
|
|
47c9c946a3 | ||
|
|
690deb1c05 | ||
|
|
59d18c6598 | ||
|
|
91bbb744dc | ||
|
|
11e4f09165 | ||
|
|
c45c02de29 | ||
|
|
fe0c53ec43 | ||
|
|
4fc045de11 | ||
|
|
cc2388e0c8 | ||
|
|
ab6da05b51 | ||
|
|
8e89cc129c | ||
|
|
9ffe078703 | ||
|
|
27b0251b5b | ||
|
|
ed209daf8a | ||
|
|
95771c7aba | ||
|
|
42bd0615c2 | ||
|
|
3a88ef3be2 | ||
|
|
572fed9f35 | ||
|
|
663f0643f2 | ||
|
|
fc62796e2d | ||
|
|
b9e39c8cca | ||
|
|
fffa656758 | ||
|
|
b74b92fc27 | ||
|
|
bc1503af57 | ||
|
|
b79c08316f | ||
|
|
08799e9d0a | ||
|
|
bedfb47a9f | ||
|
|
53e2c1f7cd | ||
|
|
88812f05f5 | ||
|
|
10a8f79644 | ||
|
|
ccc4f1a2da | ||
|
|
451fd7c445 | ||
|
|
782de99a0a | ||
|
|
d4afd60b08 | ||
|
|
c8ace868d4 | ||
|
|
2b4158e5c9 | ||
|
|
53209bc42c | ||
|
|
da1ae33805 | ||
|
|
ab02c829ea | ||
|
|
3c0d2a9253 | ||
|
|
58512c3af9 | ||
|
|
78389e518e | ||
|
|
9c9169ac12 | ||
|
|
e545f3bdb7 | ||
|
|
c000d9f232 | ||
|
|
1fb043768e | ||
|
|
3660b4810e | ||
|
|
a9127c4a45 | ||
|
|
c098960b39 | ||
|
|
5cc2a2cd0c | ||
|
|
8733f55c2c | ||
|
|
a3750ffff1 | ||
|
|
9e0d3eb6e7 | ||
|
|
e0a57d2912 | ||
|
|
53e77cb2c0 | ||
|
|
8ecfef16eb | ||
|
|
d51110acb5 | ||
|
|
2348b8fafa | ||
|
|
7f0b16d074 | ||
|
|
a0c8aee3f7 | ||
|
|
d519929988 | ||
|
|
cb83f8b531 | ||
|
|
45bcc2c09a | ||
|
|
2410639123 | ||
|
|
d1525cf09d | ||
|
|
35c1d84b42 | ||
|
|
986124948a | ||
|
|
fa76ad2a3c | ||
|
|
57c0b1203e | ||
|
|
be1bc76cfa | ||
|
|
6913ebb29f | ||
|
|
e35eeacd74 | ||
|
|
bdcf345155 | ||
|
|
307654f648 | ||
|
|
970b6cf698 | ||
|
|
eccfbf6a6d | ||
|
|
1a1a48482a | ||
|
|
1afd73ad0b | ||
|
|
6856a80380 | ||
|
|
cf3a8991ea | ||
|
|
e3624ec588 | ||
|
|
64df882c5e | ||
|
|
06e4658da9 | ||
|
|
4a7b4d03a1 | ||
|
|
257d167002 | ||
|
|
e6ebb8efef | ||
|
|
7e80980ae4 | ||
|
|
50476cda31 | ||
|
|
ea5d165a70 | ||
|
|
2830f396c6 | ||
|
|
620ad13490 | ||
|
|
f54a2dc1da | ||
|
|
63f6844318 | ||
|
|
12edc05ab0 | ||
|
|
71b8e75138 | ||
|
|
0bcc6699e1 | ||
|
|
385a873b0f | ||
|
|
0daa6a107b | ||
|
|
72098d2255 | ||
|
|
572d2794e2 | ||
|
|
d4c3a43bcb | ||
|
|
6e63757fc7 | ||
|
|
721397cee3 | ||
|
|
fd1c841810 | ||
|
|
f58265ec98 | ||
|
|
14fd995ae9 | ||
|
|
50565bed3b | ||
|
|
70f85fca21 | ||
|
|
4293cf5945 | ||
|
|
4c6377c5cb | ||
|
|
9b3adac145 | ||
|
|
73f935f3f3 | ||
|
|
a481ff4c51 | ||
|
|
bbccd61614 | ||
|
|
8a3d5f046c | ||
|
|
eb8e8166c8 | ||
|
|
3420becce3 | ||
|
|
9ed8699c75 | ||
|
|
b59b82474a | ||
|
|
cce0e593c5 | ||
|
|
da32079516 | ||
|
|
ccf268baf4 | ||
|
|
053bb72a00 | ||
|
|
41f081d8da | ||
|
|
e0f2c3d170 | ||
|
|
f32da12a86 | ||
|
|
f5959a0dc6 | ||
|
|
0a5888f27a | ||
|
|
07d48af10c | ||
|
|
e58a415d10 | ||
|
|
ae43ca0605 | ||
|
|
9acb1f364b | ||
|
|
84cd528103 | ||
|
|
56519548f1 | ||
|
|
bdcd17a41a | ||
|
|
1eafb4e7cf | ||
|
|
bf024fb985 | ||
|
|
a832987f7c | ||
|
|
77e5e27d75 | ||
|
|
3505ce8739 | ||
|
|
14d8f58592 | ||
|
|
006cd98869 | ||
|
|
ce1b2bc4f1 | ||
|
|
8f4acce44a | ||
|
|
b04d1ed6c8 | ||
|
|
f987c25598 | ||
|
|
b9b93f1286 | ||
|
|
a7a5e50620 | ||
|
|
0edf71a4af | ||
|
|
5956b97e7f | ||
|
|
d3f39b0aa1 | ||
|
|
e738508d7a | ||
|
|
302faca32f | ||
|
|
1c1ca1c6e3 | ||
|
|
a497dc09ca | ||
|
|
3ce04f48ca | ||
|
|
368a98fb29 | ||
|
|
cbe32c5a73 | ||
|
|
f46c9f74d5 | ||
|
|
4b884ace62 | ||
|
|
7ce7e90865 | ||
|
|
756c932e37 | ||
|
|
c3d5fcc669 | ||
|
|
65a33a1215 | ||
|
|
1a49d2f0c9 | ||
|
|
549b20bdea | ||
|
|
75f01d51f7 | ||
|
|
a82ec09afd | ||
|
|
c0ac82be6a | ||
|
|
24d7dc8e8a | ||
|
|
79d85a24e9 | ||
|
|
f289f4b1b6 | ||
|
|
b7eedb3feb | ||
|
|
58515fce43 | ||
|
|
21905d9869 | ||
|
|
56f78edb97 | ||
|
|
a580149ad6 | ||
|
|
6dc9e73ce4 | ||
|
|
5d52e68d26 | ||
|
|
c4ff80fd3a | ||
|
|
ed449c6186 | ||
|
|
1c89394aef | ||
|
|
235316e050 | ||
|
|
0a1ff65b4a | ||
|
|
2a1ad532f4 | ||
|
|
9d144ecb0a | ||
|
|
9b7fe74086 | ||
|
|
0f2a9f262e | ||
|
|
82af43039c | ||
|
|
12ee287d0b | ||
|
|
57171f0a61 | ||
|
|
21a1187ed2 | ||
|
|
2c2c0d445b | ||
|
|
9f0fdc5e78 | ||
|
|
96594a3433 | ||
|
|
4c5b38a447 | ||
|
|
0e608fda13 | ||
|
|
8bb95469d9 | ||
|
|
e9e0b7c4f9 | ||
|
|
c70f941bf8 | ||
|
|
a79b61aac3 | ||
|
|
5e71f5df6a | ||
|
|
047970e5ee | ||
|
|
f31ffcc5d1 | ||
|
|
0d562a7b1f | ||
|
|
3603b1fcab | ||
|
|
82505566f8 | ||
|
|
9ce2a0fb34 | ||
|
|
5cba78a8d5 | ||
|
|
2c33ab6a92 | ||
|
|
beb674ecbc | ||
|
|
b16b1d1d24 | ||
|
|
f8e45c13f3 | ||
|
|
b9790f663a | ||
|
|
778585865e | ||
|
|
cd8206ad9b | ||
|
|
573cbafe3f | ||
|
|
c346216424 | ||
|
|
e7b3c9969b | ||
|
|
dc0d081b47 | ||
|
|
ded9842cd7 | ||
|
|
89d9b03dfe | ||
|
|
f1d05a49f0 | ||
|
|
9a764b9b82 | ||
|
|
e0b557eda2 | ||
|
|
ea6e033dae | ||
|
|
3afe7c3daf | ||
|
|
afbc7a72e3 | ||
|
|
ff1e108bfe | ||
|
|
b29f320fd4 | ||
|
|
773b80a969 | ||
|
|
975995a9c7 | ||
|
|
f131067278 | ||
|
|
b43aa86cae | ||
|
|
6824eec308 | ||
|
|
18079ca1bb | ||
|
|
a1f29c31b9 | ||
|
|
0ef8344178 | ||
|
|
f53f48cc33 | ||
|
|
2a5b5f1927 | ||
|
|
b290eddc70 | ||
|
|
6d0a43aad6 | ||
|
|
1bc2186c2d | ||
|
|
6584c300b8 | ||
|
|
dc480ae70f | ||
|
|
e783564084 | ||
|
|
0ee34534c6 | ||
|
|
9146df5493 | ||
|
|
76fa60498e | ||
|
|
8455940b59 | ||
|
|
2d46aa7121 | ||
|
|
bf9b35b9c6 | ||
|
|
f9aa5ae86a | ||
|
|
642d68c482 | ||
|
|
5ff7cdbac8 | ||
|
|
504c54ab0e | ||
|
|
90c17c79de | ||
|
|
0b72bcc5a1 | ||
|
|
dc14f89c9f | ||
|
|
2263adbbe0 | ||
|
|
e29261516f | ||
|
|
f12eaf29a2 | ||
|
|
3e2ab87293 | ||
|
|
41e8db4221 | ||
|
|
3f5605c42e | ||
|
|
f7ff02f3b1 | ||
|
|
5ec4a4dab8 | ||
|
|
13871977f9 | ||
|
|
2fdda8a22c | ||
|
|
d82b290251 | ||
|
|
eb15304ff4 | ||
|
|
1a3bf5ebda | ||
|
|
15956f4511 | ||
|
|
09d0ce4578 | ||
|
|
9735a35123 | ||
|
|
813a06d09a | ||
|
|
061136508e | ||
|
|
008f58c863 | ||
|
|
0e4ffd339f | ||
|
|
1458600c37 | ||
|
|
34c95f99f8 | ||
|
|
e9c59b098e | ||
|
|
a0bb5ce8a4 | ||
|
|
01947bedb4 | ||
|
|
a6ca824064 | ||
|
|
380cff07f2 | ||
|
|
d2ce06e1ca | ||
|
|
2ed1f939b5 | ||
|
|
dea8a585f8 | ||
|
|
313555b10c | ||
|
|
661f4ece48 | ||
|
|
52f36f201e | ||
|
|
46cd974e2a | ||
|
|
201ef10de6 | ||
|
|
d9df7c13be | ||
|
|
64e751e579 | ||
|
|
e6e5958595 | ||
|
|
ff3df0ec33 | ||
|
|
ebe86ce00e | ||
|
|
d317e19291 | ||
|
|
39c4999d2d | ||
|
|
7f55bd8461 | ||
|
|
2968a65f14 | ||
|
|
779fbe79b8 | ||
|
|
da0d1cb754 | ||
|
|
ef80c07075 |
2
.github/workflows/build.yml
vendored
2
.github/workflows/build.yml
vendored
@@ -1,7 +1,7 @@
|
|||||||
'name': 'build'
|
'name': 'build'
|
||||||
|
|
||||||
'env':
|
'env':
|
||||||
'GO_VERSION': '1.19.7'
|
'GO_VERSION': '1.18.9'
|
||||||
'NODE_VERSION': '14'
|
'NODE_VERSION': '14'
|
||||||
|
|
||||||
'on':
|
'on':
|
||||||
|
|||||||
2
.github/workflows/lint.yml
vendored
2
.github/workflows/lint.yml
vendored
@@ -1,7 +1,7 @@
|
|||||||
'name': 'lint'
|
'name': 'lint'
|
||||||
|
|
||||||
'env':
|
'env':
|
||||||
'GO_VERSION': '1.19.7'
|
'GO_VERSION': '1.18.9'
|
||||||
|
|
||||||
'on':
|
'on':
|
||||||
'push':
|
'push':
|
||||||
|
|||||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -12,6 +12,7 @@
|
|||||||
/agh-backup/
|
/agh-backup/
|
||||||
/bin/
|
/bin/
|
||||||
/build/*
|
/build/*
|
||||||
|
/build2/*
|
||||||
/data/
|
/data/
|
||||||
/dist/
|
/dist/
|
||||||
/filtering/tests/filtering.TestLotsOfRules*.pprof
|
/filtering/tests/filtering.TestLotsOfRules*.pprof
|
||||||
@@ -25,3 +26,4 @@ leases.db
|
|||||||
node_modules/
|
node_modules/
|
||||||
|
|
||||||
!/build/gitkeep
|
!/build/gitkeep
|
||||||
|
!/build2/gitkeep
|
||||||
|
|||||||
283
CHANGELOG.md
283
CHANGELOG.md
@@ -13,275 +13,21 @@ and this project adheres to
|
|||||||
|
|
||||||
<!--
|
<!--
|
||||||
## [v0.108.0] - TBA
|
## [v0.108.0] - TBA
|
||||||
|
|
||||||
## [v0.107.27] - 2023-03-29 (APPROX.)
|
|
||||||
|
|
||||||
See also the [v0.107.27 GitHub milestone][ms-v0.107.27].
|
|
||||||
|
|
||||||
[ms-v0.107.27]: https://github.com/AdguardTeam/AdGuardHome/milestone/63?closed=1
|
|
||||||
|
|
||||||
NOTE: Add new changes BELOW THIS COMMENT.
|
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## [v0.107.26] - 2023-03-09
|
|
||||||
|
|
||||||
See also the [v0.107.26 GitHub milestone][ms-v0.107.26].
|
|
||||||
|
|
||||||
### Security
|
|
||||||
|
|
||||||
- Go version has been updated to prevent the possibility of exploiting the
|
|
||||||
CVE-2023-24532 Go vulnerability fixed in [Go 1.19.7][go-1.19.7].
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- The ability to set custom IP for EDNS Client Subnet by using the new
|
|
||||||
`dns.edns_client_subnet.use_custom` and `dns.edns_client_subnet.custom_ip`
|
|
||||||
fields ([#1472]). The UI changes are coming in the upcoming releases.
|
|
||||||
- The ability to use `dnstype` rules in the disallowed domains list ([#5468]).
|
|
||||||
This allows dropping requests based on their question types.
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
#### Configuration Changes
|
|
||||||
|
|
||||||
In this release, the schema version has changed from 16 to 17.
|
|
||||||
|
|
||||||
- Property `edns_client_subnet`, which in schema versions 16 and earlier used
|
|
||||||
to be a part of the `dns` object, is now part of the `dns.edns_client_subnet`
|
|
||||||
object:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
# BEFORE:
|
|
||||||
'dns':
|
|
||||||
# …
|
|
||||||
'edns_client_subnet': false
|
|
||||||
|
|
||||||
# AFTER:
|
|
||||||
'dns':
|
|
||||||
# …
|
|
||||||
'edns_client_subnet':
|
|
||||||
'enabled': false
|
|
||||||
'use_custom': false
|
|
||||||
'custom_ip': ''
|
|
||||||
```
|
|
||||||
|
|
||||||
To rollback this change, move the value of `dns.edns_client_subnet.enabled`
|
|
||||||
into the `dns.edns_client_subnet`, remove the fields
|
|
||||||
`dns.edns_client_subnet.enabled`, `dns.edns_client_subnet.use_custom`,
|
|
||||||
`dns.edns_client_subnet.custom_ip`, and change the `schema_version` back to
|
|
||||||
`16`.
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Obsolete value of the Interface MTU DHCP option is now omitted ([#5281]).
|
|
||||||
- Various dark theme bugs ([#5439], [#5441], [#5442], [#5515]).
|
|
||||||
- Automatic update on MIPS64 and little-endian 32-bit MIPS architectures
|
|
||||||
([#5270], [#5373]).
|
|
||||||
- Requirements to domain names in domain-specific upstream configurations have
|
|
||||||
been relaxed to meet those from [RFC 3696][rfc3696] ([#4884]).
|
|
||||||
- Failing service installation via script on FreeBSD ([#5431]).
|
|
||||||
|
|
||||||
[#1472]: https://github.com/AdguardTeam/AdGuardHome/issues/1472
|
|
||||||
[#4884]: https://github.com/AdguardTeam/AdGuardHome/issues/4884
|
|
||||||
[#5270]: https://github.com/AdguardTeam/AdGuardHome/issues/5270
|
|
||||||
[#5281]: https://github.com/AdguardTeam/AdGuardHome/issues/5281
|
|
||||||
[#5373]: https://github.com/AdguardTeam/AdGuardHome/issues/5373
|
|
||||||
[#5431]: https://github.com/AdguardTeam/AdGuardHome/issues/5431
|
|
||||||
[#5439]: https://github.com/AdguardTeam/AdGuardHome/issues/5439
|
|
||||||
[#5441]: https://github.com/AdguardTeam/AdGuardHome/issues/5441
|
|
||||||
[#5442]: https://github.com/AdguardTeam/AdGuardHome/issues/5442
|
|
||||||
[#5468]: https://github.com/AdguardTeam/AdGuardHome/issues/5468
|
|
||||||
[#5515]: https://github.com/AdguardTeam/AdGuardHome/issues/5515
|
|
||||||
|
|
||||||
[go-1.19.7]: https://groups.google.com/g/golang-announce/c/3-TpUx48iQY
|
|
||||||
[ms-v0.107.26]: https://github.com/AdguardTeam/AdGuardHome/milestone/62?closed=1
|
|
||||||
[rfc3696]: https://datatracker.ietf.org/doc/html/rfc3696
|
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
NOTE: Add new changes ABOVE THIS COMMENT.
|
## [v0.107.22] - 2222-12-28 (APPROX.)
|
||||||
-->
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## [v0.107.25] - 2023-02-21
|
|
||||||
|
|
||||||
See also the [v0.107.25 GitHub milestone][ms-v0.107.25].
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Panic when using unencrypted DNS-over-HTTPS ([#5518]).
|
|
||||||
|
|
||||||
[#5518]: https://github.com/AdguardTeam/AdGuardHome/issues/5518
|
|
||||||
|
|
||||||
[ms-v0.107.25]: https://github.com/AdguardTeam/AdGuardHome/milestone/61?closed=1
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## [v0.107.24] - 2023-02-15
|
|
||||||
|
|
||||||
See also the [v0.107.24 GitHub milestone][ms-v0.107.24].
|
|
||||||
|
|
||||||
### Security
|
|
||||||
|
|
||||||
- Go version has been updated, both because Go 1.18 has reached end of life an
|
|
||||||
to prevent the possibility of exploiting the Go vulnerabilities fixed in [Go
|
|
||||||
1.19.6][go-1.19.6].
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- The ability to disable statistics by using the new `statistics.enabled`
|
|
||||||
field. Previously it was necessary to set the `statistics_interval` to 0,
|
|
||||||
losing the previous value ([#1717], [#4299]).
|
|
||||||
- The ability to exclude domain names from the query log or statistics by using
|
|
||||||
the new `querylog.ignored` or `statistics.ignored` fields ([#1717], [#4299]).
|
|
||||||
The UI changes are coming in the upcoming releases.
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
#### Configuration Changes
|
|
||||||
|
|
||||||
In this release, the schema version has changed from 14 to 16.
|
|
||||||
|
|
||||||
- Property `statistics_interval`, which in schema versions 15 and earlier used
|
|
||||||
to be a part of the `dns` object, is now a part of the `statistics` object:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
# BEFORE:
|
|
||||||
'dns':
|
|
||||||
# …
|
|
||||||
'statistics_interval': 1
|
|
||||||
|
|
||||||
# AFTER:
|
|
||||||
'statistics':
|
|
||||||
# …
|
|
||||||
'interval': 1
|
|
||||||
```
|
|
||||||
|
|
||||||
To rollback this change, move the property back into the `dns` object and
|
|
||||||
change the `schema_version` back to `15`.
|
|
||||||
- The fields `dns.querylog_enabled`, `dns.querylog_file_enabled`,
|
|
||||||
`dns.querylog_interval`, and `dns.querylog_size_memory` have been moved to the
|
|
||||||
new `querylog` object.
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
# BEFORE:
|
|
||||||
'dns':
|
|
||||||
'querylog_enabled': true
|
|
||||||
'querylog_file_enabled': true
|
|
||||||
'querylog_interval': '2160h'
|
|
||||||
'querylog_size_memory': 1000
|
|
||||||
|
|
||||||
# AFTER:
|
|
||||||
'querylog':
|
|
||||||
'enabled': true
|
|
||||||
'file_enabled': true
|
|
||||||
'interval': '2160h'
|
|
||||||
'size_memory': 1000
|
|
||||||
'ignored': []
|
|
||||||
```
|
|
||||||
|
|
||||||
To rollback this change, rename and move properties back into the `dns`
|
|
||||||
object, remove `querylog` object and `querylog.ignored` property, and change
|
|
||||||
the `schema_version` back to `14`.
|
|
||||||
|
|
||||||
### Deprecated
|
|
||||||
|
|
||||||
- Go 1.19 support. Future versions will require at least Go 1.20 to build.
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Setting the AD (Authenticated Data) flag on responses that have the DO (DNSSEC
|
|
||||||
OK) flag set but not the AD flag ([#5479]).
|
|
||||||
- Client names resolved via reverse DNS not being updated ([#4939]).
|
|
||||||
- The icon for League Of Legends on the Blocked services page ([#5433]).
|
|
||||||
|
|
||||||
### Removed
|
|
||||||
|
|
||||||
- Go 1.18 support, as it has reached end of life.
|
|
||||||
|
|
||||||
[#1717]: https://github.com/AdguardTeam/AdGuardHome/issues/1717
|
|
||||||
[#4299]: https://github.com/AdguardTeam/AdGuardHome/issues/4299
|
|
||||||
[#4939]: https://github.com/AdguardTeam/AdGuardHome/issues/4939
|
|
||||||
[#5433]: https://github.com/AdguardTeam/AdGuardHome/issues/5433
|
|
||||||
[#5479]: https://github.com/AdguardTeam/AdGuardHome/issues/5479
|
|
||||||
|
|
||||||
[go-1.19.6]: https://groups.google.com/g/golang-announce/c/V0aBFqaFs_E
|
|
||||||
[ms-v0.107.24]: https://github.com/AdguardTeam/AdGuardHome/milestone/60?closed=1
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## [v0.107.23] - 2023-02-01
|
|
||||||
|
|
||||||
See also the [v0.107.23 GitHub milestone][ms-v0.107.23].
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- DNS64 support ([#5117]). The function may be enabled with new `use_dns64`
|
|
||||||
field under `dns` object in the configuration along with `dns64_prefixes`, the
|
|
||||||
set of exclusion prefixes to filter AAAA responses. The Well-Known Prefix
|
|
||||||
(`64:ff9b::/96`) is used if no custom prefixes are specified.
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Filtering rules with `*` as the hostname not working properly ([#5245]).
|
|
||||||
- Various dark theme bugs ([#5375]).
|
|
||||||
|
|
||||||
### Removed
|
|
||||||
|
|
||||||
- The “beta frontend” and the corresponding APIs. They never quite worked
|
|
||||||
properly, and the future new version of AdGuard Home API will probably be
|
|
||||||
different.
|
|
||||||
|
|
||||||
Correspondingly, the configuration parameter `beta_bind_port` has been removed
|
|
||||||
as well.
|
|
||||||
|
|
||||||
[#5117]: https://github.com/AdguardTeam/AdGuardHome/issues/5117
|
|
||||||
[#5245]: https://github.com/AdguardTeam/AdGuardHome/issues/5245
|
|
||||||
[#5375]: https://github.com/AdguardTeam/AdGuardHome/issues/5375
|
|
||||||
|
|
||||||
[ms-v0.107.23]: https://github.com/AdguardTeam/AdGuardHome/milestone/59?closed=1
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## [v0.107.22] - 2023-01-19
|
|
||||||
|
|
||||||
See also the [v0.107.22 GitHub milestone][ms-v0.107.22].
|
See also the [v0.107.22 GitHub milestone][ms-v0.107.22].
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Experimental Dark UI theme ([#613]).
|
|
||||||
- The new HTTP API `PUT /control/profile/update`, that updates current user
|
|
||||||
language and UI theme. The format of request body is described in
|
|
||||||
`openapi/openapi.yaml`.
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- The HTTP API `GET /control/profile` now returns enhanced object with
|
|
||||||
current user's name, language, and UI theme. The format of response body is
|
|
||||||
described in `openapi/openapi.yaml` and `openapi/CHANGELOG.md`.
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- `AdGuardHome --update` freezing when another instance of AdGuard Home is
|
|
||||||
running ([#4223], [#5191]).
|
|
||||||
- The `--update` flag performing an update even when there is no version change.
|
|
||||||
- Failing HTTPS redirection on saving the encryption settings ([#4898]).
|
|
||||||
- Zeroing rules counter of erroneously edited filtering rule lists ([#5290]).
|
|
||||||
- Filters updating strategy, which could sometimes lead to use of broken or
|
|
||||||
incompletely downloaded lists ([#5258]).
|
|
||||||
|
|
||||||
[#613]: https://github.com/AdguardTeam/AdGuardHome/issues/613
|
|
||||||
[#5191]: https://github.com/AdguardTeam/AdGuardHome/issues/5191
|
|
||||||
[#5290]: https://github.com/AdguardTeam/AdGuardHome/issues/5290
|
|
||||||
[#5258]: https://github.com/AdguardTeam/AdGuardHome/issues/5258
|
|
||||||
|
|
||||||
[ms-v0.107.22]: https://github.com/AdguardTeam/AdGuardHome/milestone/58?closed=1
|
[ms-v0.107.22]: https://github.com/AdguardTeam/AdGuardHome/milestone/58?closed=1
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## [v0.107.21] - 2022-12-15
|
## [v0.107.21] - 2122-12-15
|
||||||
|
|
||||||
See also the [v0.107.21 GitHub milestone][ms-v0.107.21].
|
See also the [v0.107.21 GitHub milestone][ms-v0.107.21].
|
||||||
|
|
||||||
@@ -296,11 +42,22 @@ See also the [v0.107.21 GitHub milestone][ms-v0.107.21].
|
|||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
|
- `AdGuardHome --update` freezing when another instance of AdGuard Home is
|
||||||
|
running ([#4223], [#5191]).
|
||||||
|
- The `--update` flag performing an update even with the same version.
|
||||||
|
- Failing HTTPS redirection on saving the encryption settings ([#4898]).
|
||||||
|
- Zeroing rules counter of erroneusly edited filtering rule lists ([#5290]).
|
||||||
|
- Filters updating strategy, which could sometimes lead to use of broken or
|
||||||
|
incompletely downloaded lists ([#5258]).
|
||||||
- Errors popping up during updates of settings, which could sometimes cause the
|
- Errors popping up during updates of settings, which could sometimes cause the
|
||||||
server to stop responding ([#5251]).
|
server to stop responding ([#5251]).
|
||||||
|
|
||||||
|
[#4898]: https://github.com/AdguardTeam/AdGuardHome/issues/4898
|
||||||
|
[#5191]: https://github.com/AdguardTeam/AdGuardHome/issues/5191
|
||||||
[#5238]: https://github.com/AdguardTeam/AdGuardHome/issues/5238
|
[#5238]: https://github.com/AdguardTeam/AdGuardHome/issues/5238
|
||||||
[#5251]: https://github.com/AdguardTeam/AdGuardHome/issues/5251
|
[#5251]: https://github.com/AdguardTeam/AdGuardHome/issues/5251
|
||||||
|
[#5258]: https://github.com/AdguardTeam/AdGuardHome/issues/5258
|
||||||
|
[#5290]: https://github.com/AdguardTeam/AdGuardHome/issues/5290
|
||||||
|
|
||||||
[ms-v0.107.21]: https://github.com/AdguardTeam/AdGuardHome/milestone/57?closed=1
|
[ms-v0.107.21]: https://github.com/AdguardTeam/AdGuardHome/milestone/57?closed=1
|
||||||
|
|
||||||
@@ -1214,6 +971,7 @@ In this release, the schema version has changed from 10 to 12.
|
|||||||
|
|
||||||
To rollback this change, convert the property back into days and change the
|
To rollback this change, convert the property back into days and change the
|
||||||
`schema_version` back to `11`.
|
`schema_version` back to `11`.
|
||||||
|
|
||||||
- Property `rlimit_nofile`, which in schema versions 10 and earlier used to be
|
- Property `rlimit_nofile`, which in schema versions 10 and earlier used to be
|
||||||
on the top level, is now moved to the new `os` object:
|
on the top level, is now moved to the new `os` object:
|
||||||
|
|
||||||
@@ -1760,16 +1518,11 @@ See also the [v0.104.2 GitHub milestone][ms-v0.104.2].
|
|||||||
|
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
[Unreleased]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.27...HEAD
|
[Unreleased]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.22...HEAD
|
||||||
[v0.107.27]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.26...v0.107.27
|
[v0.107.22]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.21...v0.107.22
|
||||||
-->
|
-->
|
||||||
|
|
||||||
[Unreleased]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.26...HEAD
|
[Unreleased]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.21...HEAD
|
||||||
[v0.107.26]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.25...v0.107.26
|
|
||||||
[v0.107.25]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.24...v0.107.25
|
|
||||||
[v0.107.24]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.23...v0.107.24
|
|
||||||
[v0.107.23]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.22...v0.107.23
|
|
||||||
[v0.107.22]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.21...v0.107.22
|
|
||||||
[v0.107.21]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.20...v0.107.21
|
[v0.107.21]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.20...v0.107.21
|
||||||
[v0.107.20]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.19...v0.107.20
|
[v0.107.20]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.19...v0.107.20
|
||||||
[v0.107.19]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.18...v0.107.19
|
[v0.107.19]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.18...v0.107.19
|
||||||
|
|||||||
44
Makefile
44
Makefile
@@ -4,26 +4,18 @@
|
|||||||
# See https://pubs.opengroup.org/onlinepubs/9699919799/utilities/make.html.
|
# See https://pubs.opengroup.org/onlinepubs/9699919799/utilities/make.html.
|
||||||
.POSIX:
|
.POSIX:
|
||||||
|
|
||||||
# This comment is used to simplify checking local copies of the
|
|
||||||
# Makefile. Bump this number every time a significant change is made to
|
|
||||||
# this Makefile.
|
|
||||||
#
|
|
||||||
# AdGuard-Project-Version: 2
|
|
||||||
|
|
||||||
# Don't name these macros "GO" etc., because GNU Make apparently makes
|
|
||||||
# them exported environment variables with the literal value of
|
|
||||||
# "${GO:-go}" and so on, which is not what we need. Use a dot in the
|
|
||||||
# name to make sure that users don't have an environment variable with
|
|
||||||
# the same name.
|
|
||||||
#
|
|
||||||
# See https://unix.stackexchange.com/q/646255/105635.
|
|
||||||
GO.MACRO = $${GO:-go}
|
|
||||||
VERBOSE.MACRO = $${VERBOSE:-0}
|
|
||||||
|
|
||||||
CHANNEL = development
|
CHANNEL = development
|
||||||
|
CLIENT_BETA_DIR = client2
|
||||||
CLIENT_DIR = client
|
CLIENT_DIR = client
|
||||||
COMMIT = $$( git rev-parse --short HEAD )
|
COMMIT = $$( git rev-parse --short HEAD )
|
||||||
DIST_DIR = dist
|
DIST_DIR = dist
|
||||||
|
# Don't name this macro "GO", because GNU Make apparenly makes it an
|
||||||
|
# exported environment variable with the literal value of "${GO:-go}",
|
||||||
|
# which is not what we need. Use a dot in the name to make sure that
|
||||||
|
# users don't have an environment variable with the same name.
|
||||||
|
#
|
||||||
|
# See https://unix.stackexchange.com/q/646255/105635.
|
||||||
|
GO.MACRO = $${GO:-go}
|
||||||
GOPROXY = https://goproxy.cn|https://proxy.golang.org|direct
|
GOPROXY = https://goproxy.cn|https://proxy.golang.org|direct
|
||||||
GOSUMDB = sum.golang.google.cn
|
GOSUMDB = sum.golang.google.cn
|
||||||
GPG_KEY = devteam@adguard.com
|
GPG_KEY = devteam@adguard.com
|
||||||
@@ -34,8 +26,15 @@ NPM_INSTALL_FLAGS = $(NPM_FLAGS) --quiet --no-progress --ignore-engines\
|
|||||||
--ignore-optional --ignore-platform --ignore-scripts
|
--ignore-optional --ignore-platform --ignore-scripts
|
||||||
RACE = 0
|
RACE = 0
|
||||||
SIGN = 1
|
SIGN = 1
|
||||||
|
VERBOSE = 0
|
||||||
VERSION = v0.0.0
|
VERSION = v0.0.0
|
||||||
YARN = yarn
|
YARN = yarn
|
||||||
|
YARN_FLAGS = --cwd $(CLIENT_BETA_DIR)
|
||||||
|
YARN_INSTALL_FLAGS = $(YARN_FLAGS) --network-timeout 120000 --silent\
|
||||||
|
--ignore-engines --ignore-optional --ignore-platform\
|
||||||
|
--ignore-scripts
|
||||||
|
|
||||||
|
NEXTAPI = 0
|
||||||
|
|
||||||
# Macros for the build-release target. If FRONTEND_PREBUILT is 0, the
|
# Macros for the build-release target. If FRONTEND_PREBUILT is 0, the
|
||||||
# default, the macro $(BUILD_RELEASE_DEPS_$(FRONTEND_PREBUILT)) expands
|
# default, the macro $(BUILD_RELEASE_DEPS_$(FRONTEND_PREBUILT)) expands
|
||||||
@@ -64,13 +63,14 @@ ENV = env\
|
|||||||
PATH="$${PWD}/bin:$$( "$(GO.MACRO)" env GOPATH )/bin:$${PATH}"\
|
PATH="$${PWD}/bin:$$( "$(GO.MACRO)" env GOPATH )/bin:$${PATH}"\
|
||||||
RACE='$(RACE)'\
|
RACE='$(RACE)'\
|
||||||
SIGN='$(SIGN)'\
|
SIGN='$(SIGN)'\
|
||||||
VERBOSE="$(VERBOSE.MACRO)"\
|
NEXTAPI='$(NEXTAPI)'\
|
||||||
|
VERBOSE='$(VERBOSE)'\
|
||||||
VERSION='$(VERSION)'\
|
VERSION='$(VERSION)'\
|
||||||
|
|
||||||
# Keep the line above blank.
|
# Keep the line above blank.
|
||||||
|
|
||||||
# Keep this target first, so that a naked make invocation triggers a
|
# Keep this target first, so that a naked make invocation triggers
|
||||||
# full build.
|
# a full build.
|
||||||
build: deps quick-build
|
build: deps quick-build
|
||||||
|
|
||||||
quick-build: js-build go-build
|
quick-build: js-build go-build
|
||||||
@@ -93,13 +93,17 @@ init: ; git config core.hooksPath ./scripts/hooks
|
|||||||
|
|
||||||
js-build:
|
js-build:
|
||||||
$(NPM) $(NPM_FLAGS) run build-prod
|
$(NPM) $(NPM_FLAGS) run build-prod
|
||||||
|
$(YARN) $(YARN_FLAGS) build
|
||||||
js-deps:
|
js-deps:
|
||||||
$(NPM) $(NPM_INSTALL_FLAGS) ci
|
$(NPM) $(NPM_INSTALL_FLAGS) ci
|
||||||
|
$(YARN) $(YARN_INSTALL_FLAGS) install
|
||||||
|
|
||||||
# TODO(a.garipov): Remove the legacy client tasks support once the new
|
# TODO(a.garipov): Remove the legacy client tasks support once the new
|
||||||
# client is done and the old one is removed.
|
# client is done and the old one is removed.
|
||||||
js-lint: ; $(NPM) $(NPM_FLAGS) run lint
|
js-lint: ; $(NPM) $(NPM_FLAGS) run lint
|
||||||
js-test: ; $(NPM) $(NPM_FLAGS) run test
|
js-test: ; $(NPM) $(NPM_FLAGS) run test
|
||||||
|
js-beta-lint: ; $(YARN) $(YARN_FLAGS) lint
|
||||||
|
js-beta-test: ; # TODO(v.abdulmyanov): Add tests for the new client.
|
||||||
|
|
||||||
go-build: ; $(ENV) "$(SHELL)" ./scripts/make/go-build.sh
|
go-build: ; $(ENV) "$(SHELL)" ./scripts/make/go-build.sh
|
||||||
go-deps: ; $(ENV) "$(SHELL)" ./scripts/make/go-deps.sh
|
go-deps: ; $(ENV) "$(SHELL)" ./scripts/make/go-deps.sh
|
||||||
@@ -124,4 +128,4 @@ go-os-check:
|
|||||||
openapi-lint: ; cd ./openapi/ && $(YARN) test
|
openapi-lint: ; cd ./openapi/ && $(YARN) test
|
||||||
openapi-show: ; cd ./openapi/ && $(YARN) start
|
openapi-show: ; cd ./openapi/ && $(YARN) start
|
||||||
|
|
||||||
txt-lint: ; $(ENV) "$(SHELL)" ./scripts/make/txt-lint.sh
|
txt-lint: ; $(ENV) "$(SHELL)" ./scripts/make/txt-lint.sh
|
||||||
|
|||||||
16
README.md
16
README.md
@@ -81,24 +81,12 @@ code.
|
|||||||
|
|
||||||
### <a href="#automated-install-linux-and-mac" id="automated-install-linux-and-mac" name="automated-install-linux-and-mac">Automated install (Unix)</a>
|
### <a href="#automated-install-linux-and-mac" id="automated-install-linux-and-mac" name="automated-install-linux-and-mac">Automated install (Unix)</a>
|
||||||
|
|
||||||
To install with `curl` run the following command:
|
Run the following command in your terminal:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
curl -s -S -L https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v
|
curl -s -S -L https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v
|
||||||
```
|
```
|
||||||
|
|
||||||
To install with `wget` run the following command:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
wget --no-verbose -O - https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v
|
|
||||||
```
|
|
||||||
|
|
||||||
To install with `fetch` run the following command:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
fetch -o - https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v
|
|
||||||
```
|
|
||||||
|
|
||||||
The script also accepts some options:
|
The script also accepts some options:
|
||||||
|
|
||||||
* `-c <channel>` to use specified channel;
|
* `-c <channel>` to use specified channel;
|
||||||
@@ -261,7 +249,7 @@ Run `make init` to prepare the development environment.
|
|||||||
|
|
||||||
You will need this to build AdGuard Home:
|
You will need this to build AdGuard Home:
|
||||||
|
|
||||||
* [Go](https://golang.org/dl/) v1.19 or later;
|
* [Go](https://golang.org/dl/) v1.18 or later;
|
||||||
* [Node.js](https://nodejs.org/en/download/) v10.16.2 or later;
|
* [Node.js](https://nodejs.org/en/download/) v10.16.2 or later;
|
||||||
* [npm](https://www.npmjs.com/) v6.14 or later;
|
* [npm](https://www.npmjs.com/) v6.14 or later;
|
||||||
* [yarn](https://yarnpkg.com/) v1.22.5 or later.
|
* [yarn](https://yarnpkg.com/) v1.22.5 or later.
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
# Make sure to sync any changes with the branch overrides below.
|
# Make sure to sync any changes with the branch overrides below.
|
||||||
'variables':
|
'variables':
|
||||||
'channel': 'edge'
|
'channel': 'edge'
|
||||||
'dockerGo': 'adguard/golang-ubuntu:6.2'
|
'dockerGo': 'adguard/golang-ubuntu:5.4'
|
||||||
|
|
||||||
'stages':
|
'stages':
|
||||||
- 'Build frontend':
|
- 'Build frontend':
|
||||||
@@ -109,8 +109,7 @@
|
|||||||
CHANNEL=${bamboo.channel}\
|
CHANNEL=${bamboo.channel}\
|
||||||
GPG_KEY_PASSPHRASE=${bamboo.gpgPassword}\
|
GPG_KEY_PASSPHRASE=${bamboo.gpgPassword}\
|
||||||
FRONTEND_PREBUILT=1\
|
FRONTEND_PREBUILT=1\
|
||||||
PARALLELISM=1\
|
VERBOSE=1\
|
||||||
VERBOSE=2\
|
|
||||||
build-release
|
build-release
|
||||||
# TODO(a.garipov): Use more fine-grained artifact rules.
|
# TODO(a.garipov): Use more fine-grained artifact rules.
|
||||||
'artifacts':
|
'artifacts':
|
||||||
@@ -136,12 +135,8 @@
|
|||||||
|
|
||||||
set -e -f -u -x
|
set -e -f -u -x
|
||||||
|
|
||||||
COMMIT="${bamboo.repository.revision.number}"
|
|
||||||
export COMMIT
|
|
||||||
readonly COMMIT
|
|
||||||
|
|
||||||
# Explicitly checkout the revision that we need.
|
# Explicitly checkout the revision that we need.
|
||||||
git checkout "$COMMIT"
|
git checkout "${bamboo.repository.revision.number}"
|
||||||
|
|
||||||
# Install Qemu, create builder.
|
# Install Qemu, create builder.
|
||||||
docker version -f '{{ .Server.Experimental }}'
|
docker version -f '{{ .Server.Experimental }}'
|
||||||
@@ -161,13 +156,12 @@
|
|||||||
docker info
|
docker info
|
||||||
|
|
||||||
# Prepare and push the build.
|
# Prepare and push the build.
|
||||||
env\
|
make\
|
||||||
CHANNEL="${bamboo.channel}"\
|
CHANNEL="${bamboo.channel}"\
|
||||||
DIST_DIR='dist'\
|
|
||||||
DOCKER_IMAGE_NAME='adguard/adguardhome'\
|
DOCKER_IMAGE_NAME='adguard/adguardhome'\
|
||||||
DOCKER_OUTPUT="type=image,name=adguard/adguardhome,push=true"\
|
DOCKER_OUTPUT="type=image,name=adguard/adguardhome,push=true"\
|
||||||
VERBOSE='1'\
|
VERBOSE='1'\
|
||||||
sh ./scripts/make/build-docker.sh
|
build-docker
|
||||||
'environment':
|
'environment':
|
||||||
DOCKER_CLI_EXPERIMENTAL=enabled
|
DOCKER_CLI_EXPERIMENTAL=enabled
|
||||||
'final-tasks':
|
'final-tasks':
|
||||||
@@ -228,7 +222,6 @@
|
|||||||
|
|
||||||
channel="${bamboo.channel}"
|
channel="${bamboo.channel}"
|
||||||
readonly channel
|
readonly channel
|
||||||
|
|
||||||
case "$channel"
|
case "$channel"
|
||||||
in
|
in
|
||||||
('release')
|
('release')
|
||||||
@@ -275,10 +268,8 @@
|
|||||||
|
|
||||||
set -e -f -u -x
|
set -e -f -u -x
|
||||||
|
|
||||||
channel="${bamboo.channel}"
|
export CHANNEL="${bamboo.channel}"
|
||||||
readonly channel
|
if [ "$CHANNEL" != 'release' ] && [ "${CHANNEL}" != 'beta' ]
|
||||||
|
|
||||||
if [ "$channel" != 'release' ] && [ "${channel}" != 'beta' ]
|
|
||||||
then
|
then
|
||||||
echo "don't publish to GitHub Releases for this channel"
|
echo "don't publish to GitHub Releases for this channel"
|
||||||
|
|
||||||
@@ -331,7 +322,7 @@
|
|||||||
# need to build a few of these.
|
# need to build a few of these.
|
||||||
'variables':
|
'variables':
|
||||||
'channel': 'beta'
|
'channel': 'beta'
|
||||||
'dockerGo': 'adguard/golang-ubuntu:6.2'
|
'dockerGo': 'adguard/golang-ubuntu:5.4'
|
||||||
# release-vX.Y.Z branches are the branches from which the actual final release
|
# release-vX.Y.Z branches are the branches from which the actual final release
|
||||||
# is built.
|
# is built.
|
||||||
- '^release-v[0-9]+\.[0-9]+\.[0-9]+':
|
- '^release-v[0-9]+\.[0-9]+\.[0-9]+':
|
||||||
@@ -346,4 +337,4 @@
|
|||||||
# are the ones that actually get released.
|
# are the ones that actually get released.
|
||||||
'variables':
|
'variables':
|
||||||
'channel': 'release'
|
'channel': 'release'
|
||||||
'dockerGo': 'adguard/golang-ubuntu:6.2'
|
'dockerGo': 'adguard/golang-ubuntu:5.4'
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
'key': 'AHBRTSPECS'
|
'key': 'AHBRTSPECS'
|
||||||
'name': 'AdGuard Home - Build and run tests'
|
'name': 'AdGuard Home - Build and run tests'
|
||||||
'variables':
|
'variables':
|
||||||
'dockerGo': 'adguard/golang-ubuntu:6.2'
|
'dockerGo': 'adguard/golang-ubuntu:5.4'
|
||||||
|
|
||||||
'stages':
|
'stages':
|
||||||
- 'Tests':
|
- 'Tests':
|
||||||
|
|||||||
1
build2/gitkeep
Normal file
1
build2/gitkeep
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Keep this file non-hidden for Go's embedding to work.
|
||||||
@@ -37,6 +37,8 @@
|
|||||||
"dhcp_ipv6_settings": "DHCP IPv6 إعدادات",
|
"dhcp_ipv6_settings": "DHCP IPv6 إعدادات",
|
||||||
"form_error_required": "الحقل مطلوب",
|
"form_error_required": "الحقل مطلوب",
|
||||||
"form_error_ip4_format": "عنوان IPv4 غير صالح",
|
"form_error_ip4_format": "عنوان IPv4 غير صالح",
|
||||||
|
"form_error_ip4_range_start_format": "عناوين البداية لـIPv4 غير صالحة للنطاق",
|
||||||
|
"form_error_ip4_range_end_format": "عناوين IPv4 غير صالحة لنطاق النهاية",
|
||||||
"form_error_ip4_gateway_format": "عنوان IPv4 غير صالح للبوابة",
|
"form_error_ip4_gateway_format": "عنوان IPv4 غير صالح للبوابة",
|
||||||
"form_error_ip6_format": "عنوان IPv6 غير صالح",
|
"form_error_ip6_format": "عنوان IPv6 غير صالح",
|
||||||
"form_error_ip_format": "عنوان IP غير صحيح",
|
"form_error_ip_format": "عنوان IP غير صحيح",
|
||||||
@@ -49,6 +51,7 @@
|
|||||||
"out_of_range_error": "يجب أن يكون خارج النطاق \"{{start}}\" - \"{{end}}\"",
|
"out_of_range_error": "يجب أن يكون خارج النطاق \"{{start}}\" - \"{{end}}\"",
|
||||||
"lower_range_start_error": "يجب أن يكون أقل من نطاق البداية",
|
"lower_range_start_error": "يجب أن يكون أقل من نطاق البداية",
|
||||||
"greater_range_start_error": "يجب أن يكون أكبر من نطاق البداية",
|
"greater_range_start_error": "يجب أن يكون أكبر من نطاق البداية",
|
||||||
|
"greater_range_end_error": "يجب أن يكون أكبر من نطاق النهاية",
|
||||||
"subnet_error": "يجب أن تكون العناوين في شبكة فرعية واحدة",
|
"subnet_error": "يجب أن تكون العناوين في شبكة فرعية واحدة",
|
||||||
"gateway_or_subnet_invalid": "قناع الشبكة الفرعية غير صالح",
|
"gateway_or_subnet_invalid": "قناع الشبكة الفرعية غير صالح",
|
||||||
"dhcp_form_gateway_input": "IP البوابة",
|
"dhcp_form_gateway_input": "IP البوابة",
|
||||||
@@ -297,8 +300,6 @@
|
|||||||
"blocking_mode_nxdomain": "NXDOMAIN: الرد باستخدام رمز NXDOMAIN",
|
"blocking_mode_nxdomain": "NXDOMAIN: الرد باستخدام رمز NXDOMAIN",
|
||||||
"blocking_mode_null_ip": "IP Null: الاستجابة بعنوان IP صفري (0.0.0.0 لـ A ؛ :: لـ AAAA)",
|
"blocking_mode_null_ip": "IP Null: الاستجابة بعنوان IP صفري (0.0.0.0 لـ A ؛ :: لـ AAAA)",
|
||||||
"blocking_mode_custom_ip": "استجابة IP مخصصة بعنوان IP تم تعيينه يدويًا",
|
"blocking_mode_custom_ip": "استجابة IP مخصصة بعنوان IP تم تعيينه يدويًا",
|
||||||
"theme_light": "فاتح",
|
|
||||||
"theme_dark": "ليلي",
|
|
||||||
"upstream_dns_client_desc": "إذا احتفظت بهذا الحقل فارغًا ، فسيستخدم AdGuard Home الخوادم التي تم تكوينها في<0>DNS إعدادات</0>.",
|
"upstream_dns_client_desc": "إذا احتفظت بهذا الحقل فارغًا ، فسيستخدم AdGuard Home الخوادم التي تم تكوينها في<0>DNS إعدادات</0>.",
|
||||||
"tracker_source": "مصدر المتعقب",
|
"tracker_source": "مصدر المتعقب",
|
||||||
"source_label": "المصدر",
|
"source_label": "المصدر",
|
||||||
|
|||||||
@@ -261,7 +261,7 @@
|
|||||||
"query_log_configuration": "Налада часопіса",
|
"query_log_configuration": "Налада часопіса",
|
||||||
"query_log_disabled": "Часопіс запытаў выключаны, яго можна ўключыць у <0>наладах</0>",
|
"query_log_disabled": "Часопіс запытаў выключаны, яго можна ўключыць у <0>наладах</0>",
|
||||||
"query_log_strict_search": "Ужывайце падвойныя двукоссі для строгага пошуку",
|
"query_log_strict_search": "Ужывайце падвойныя двукоссі для строгага пошуку",
|
||||||
"query_log_retention_confirm": "Вы ўпэўнены, што хочаце змяніць тэрмін захоўвання запытаў? Пры памяншэнні інтэрвалу, некаторыя даныя могуць быць страчаны",
|
"query_log_retention_confirm": "Вы ўпэўнены, што хочаце змяніць тэрмін захоўвання запытаў? Пры скарачэнні інтэрвалу дадзеныя могуць быць згублены",
|
||||||
"anonymize_client_ip": "Ананімізацыя IP-адрасы кліента",
|
"anonymize_client_ip": "Ананімізацыя IP-адрасы кліента",
|
||||||
"anonymize_client_ip_desc": "Не захоўвайце поўныя IP-адрасы гэтых удзельнікаў у часопісах або статыстыцы",
|
"anonymize_client_ip_desc": "Не захоўвайце поўныя IP-адрасы гэтых удзельнікаў у часопісах або статыстыцы",
|
||||||
"dns_config": "Налады DNS-сервера",
|
"dns_config": "Налады DNS-сервера",
|
||||||
@@ -298,9 +298,6 @@
|
|||||||
"blocking_mode_nxdomain": "NXDOMAIN: Адказвае з кодам NXDOMAIN\n",
|
"blocking_mode_nxdomain": "NXDOMAIN: Адказвае з кодам NXDOMAIN\n",
|
||||||
"blocking_mode_null_ip": "Нулёвы IP: Адказвае з нулёвым IP-адрасам (0.0.0.0 для A; :: для AAAA)",
|
"blocking_mode_null_ip": "Нулёвы IP: Адказвае з нулёвым IP-адрасам (0.0.0.0 для A; :: для AAAA)",
|
||||||
"blocking_mode_custom_ip": "Карыстацкі IP: Адказвае з ручна наладжаным IP-адрасам",
|
"blocking_mode_custom_ip": "Карыстацкі IP: Адказвае з ручна наладжаным IP-адрасам",
|
||||||
"theme_auto": "Аўто",
|
|
||||||
"theme_light": "Светлая",
|
|
||||||
"theme_dark": "Цёмная",
|
|
||||||
"upstream_dns_client_desc": "Калі пакінуць поле пустым, AdGuard Home будзе звяртацца да сервераў, паказаных у <0>наладах DNS</0>.",
|
"upstream_dns_client_desc": "Калі пакінуць поле пустым, AdGuard Home будзе звяртацца да сервераў, паказаных у <0>наладах DNS</0>.",
|
||||||
"tracker_source": "Крыніца трэкінгу",
|
"tracker_source": "Крыніца трэкінгу",
|
||||||
"source_label": "Крыніца",
|
"source_label": "Крыніца",
|
||||||
@@ -356,7 +353,7 @@
|
|||||||
"install_devices_android_list_5": "Зараз можна змяніць палі «DNS 1» і «DNS 2». Увядзіце ў іх адрасы AdGuard Home.",
|
"install_devices_android_list_5": "Зараз можна змяніць палі «DNS 1» і «DNS 2». Увядзіце ў іх адрасы AdGuard Home.",
|
||||||
"install_devices_ios_list_1": "Увайдзіце ў меню налад прылады.",
|
"install_devices_ios_list_1": "Увайдзіце ў меню налад прылады.",
|
||||||
"install_devices_ios_list_2": "Абярыце пункт «Wi-Fi» (для мабільных сетак ручная наладка DNS немагчыма).",
|
"install_devices_ios_list_2": "Абярыце пункт «Wi-Fi» (для мабільных сетак ручная наладка DNS немагчыма).",
|
||||||
"install_devices_ios_list_3": "Націсніце на назву актыўнай у дадзены момант сеткі.",
|
"install_devices_ios_list_3": "Націсніце на назву сетцы, да якой прылада падлучана ў дадзены момант.",
|
||||||
"install_devices_ios_list_4": "У поле «DNS» увядзіце ўвядзіце адрасы AdGuard Home.",
|
"install_devices_ios_list_4": "У поле «DNS» увядзіце ўвядзіце адрасы AdGuard Home.",
|
||||||
"get_started": "Паехалі",
|
"get_started": "Паехалі",
|
||||||
"next": "Далей",
|
"next": "Далей",
|
||||||
@@ -454,7 +451,6 @@
|
|||||||
"updates_checked": "Даступная новая версія AdGuard Home",
|
"updates_checked": "Даступная новая версія AdGuard Home",
|
||||||
"updates_version_equal": "Версія AdGuard Home актуальная",
|
"updates_version_equal": "Версія AdGuard Home актуальная",
|
||||||
"check_updates_now": "Праверыць абнаўленні",
|
"check_updates_now": "Праверыць абнаўленні",
|
||||||
"version_request_error": "Памылка пры праверцы наяўнасці абнаўленняў. Праверце ваша інтэрнэт-злучэнне.",
|
|
||||||
"dns_privacy": "Зашыфраваны DNS",
|
"dns_privacy": "Зашыфраваны DNS",
|
||||||
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> Ужывайце радок <1>{{address}}</1>.",
|
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> Ужывайце радок <1>{{address}}</1>.",
|
||||||
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> Ужывайце радок <1>{{address}}</1>.",
|
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> Ужывайце радок <1>{{address}}</1>.",
|
||||||
@@ -517,10 +513,10 @@
|
|||||||
"filter_updated": "Спіс паспяхова абноўлены",
|
"filter_updated": "Спіс паспяхова абноўлены",
|
||||||
"statistics_configuration": "Канфігурацыя статыстыкі",
|
"statistics_configuration": "Канфігурацыя статыстыкі",
|
||||||
"statistics_retention": "Захаванне статыстыкі",
|
"statistics_retention": "Захаванне статыстыкі",
|
||||||
"statistics_retention_desc": "Калі вы паменшыце значэнне інтэрвалу, некаторыя даныя могуць быць страчаны",
|
"statistics_retention_desc": "Калі вы зменшыце значэнне інтэрвалу, некаторыя дадзеныя могуць быць згублены",
|
||||||
"statistics_clear": "Ачысціць статыстыку",
|
"statistics_clear": "Ачысціць статыстыку",
|
||||||
"statistics_clear_confirm": "Вы ўпэўнены, што хочаце ачысціць статыстыку?",
|
"statistics_clear_confirm": "Вы ўпэўнены, што хочаце ачысціць статыстыку?",
|
||||||
"statistics_retention_confirm": "Вы ўпэўнены, што хочаце змяніць тэрмін захоўвання статыстыкі? Пры памяншэнні інтэрвалу, некаторыя даныя могуць быць страчаны",
|
"statistics_retention_confirm": "Вы ўпэўнены, што хочаце змяніць тэрмін захоўвання статыстыкі? Пры скарачэнні інтэрвалу дадзеныя могуць быць згублены",
|
||||||
"statistics_cleared": "Статыстыка паспяхова вычышчана",
|
"statistics_cleared": "Статыстыка паспяхова вычышчана",
|
||||||
"statistics_enable": "Уключыць статыстыку",
|
"statistics_enable": "Уключыць статыстыку",
|
||||||
"interval_hours": "{{count}} гадзіна",
|
"interval_hours": "{{count}} гадзіна",
|
||||||
@@ -598,7 +594,7 @@
|
|||||||
"show_blocked_responses": "Заблакавана",
|
"show_blocked_responses": "Заблакавана",
|
||||||
"show_whitelisted_responses": "Белы спіс",
|
"show_whitelisted_responses": "Белы спіс",
|
||||||
"show_processed_responses": "Апрацавана",
|
"show_processed_responses": "Апрацавана",
|
||||||
"blocked_safebrowsing": "Заблакіравана згодна з базай даных Safe Browsing",
|
"blocked_safebrowsing": "Заблакавана згодна базе дадзеных Safe Browsing",
|
||||||
"blocked_adult_websites": "Заблакавана Бацькоўскім кантролем",
|
"blocked_adult_websites": "Заблакавана Бацькоўскім кантролем",
|
||||||
"blocked_threats": "Заблакавана пагроз",
|
"blocked_threats": "Заблакавана пагроз",
|
||||||
"allowed": "Дазволены",
|
"allowed": "Дазволены",
|
||||||
@@ -639,7 +635,7 @@
|
|||||||
"safe_browsing": "Бяспечны інтэрнэт",
|
"safe_browsing": "Бяспечны інтэрнэт",
|
||||||
"served_from_cache": "{{value}} <i>(атрымана з кэша)</i>",
|
"served_from_cache": "{{value}} <i>(атрымана з кэша)</i>",
|
||||||
"form_error_password_length": "Пароль павінен быць не менш за {{value}} сімвалаў",
|
"form_error_password_length": "Пароль павінен быць не менш за {{value}} сімвалаў",
|
||||||
"anonymizer_notification": "<0>Заўвага:</0> Ананімізацыя IP уключана. Вы можаце адключыць яе ў <1>Агульных наладах</1>.",
|
"anonymizer_notification": "<0>Заўвага:</0> Ананімізацыя IP уключана. Вы можаце адключыць яго ў <1>Агульных наладах</1> .",
|
||||||
"confirm_dns_cache_clear": "Вы ўпэўнены, што хочаце ачысціць кэш DNS?",
|
"confirm_dns_cache_clear": "Вы ўпэўнены, што хочаце ачысціць кэш DNS?",
|
||||||
"cache_cleared": "Кэш DNS паспяхова ачышчаны",
|
"cache_cleared": "Кэш DNS паспяхова ачышчаны",
|
||||||
"clear_cache": "Ачысціць кэш"
|
"clear_cache": "Ачысціць кэш"
|
||||||
|
|||||||
@@ -165,8 +165,8 @@
|
|||||||
"enabled_safe_browsing_toast": "Zapnuté bezpečné prohlížení",
|
"enabled_safe_browsing_toast": "Zapnuté bezpečné prohlížení",
|
||||||
"disabled_parental_toast": "Vypnutá Rodičovská kontrola",
|
"disabled_parental_toast": "Vypnutá Rodičovská kontrola",
|
||||||
"enabled_parental_toast": "Zapnutá Rodičovská kontrola",
|
"enabled_parental_toast": "Zapnutá Rodičovská kontrola",
|
||||||
"disabled_safe_search_toast": "Vypnuté bezpečné vyhledávání",
|
"disabled_safe_search_toast": "Zapnuté bezpečné vyhledávání",
|
||||||
"enabled_save_search_toast": "Zapnuté bezpečné vyhledávání",
|
"enabled_save_search_toast": "Vypnuté bezpečné vyhledávání",
|
||||||
"enabled_table_header": "Zapnuto",
|
"enabled_table_header": "Zapnuto",
|
||||||
"name_table_header": "Název",
|
"name_table_header": "Název",
|
||||||
"list_url_table_header": "Seznam URL",
|
"list_url_table_header": "Seznam URL",
|
||||||
@@ -298,9 +298,6 @@
|
|||||||
"blocking_mode_nxdomain": "NXDOMAIN: Odezva s kódem NXDOMAIN",
|
"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_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",
|
"blocking_mode_custom_ip": "Vlastní IP. odezva s ručně nastavenou IP adresou",
|
||||||
"theme_auto": "Autom.",
|
|
||||||
"theme_light": "Světlý",
|
|
||||||
"theme_dark": "Tmavý",
|
|
||||||
"upstream_dns_client_desc": "Pokud toto pole ponecháte prázdné, AdGuard Home použije servery nakonfigurované v<0>DNS nastavení</0>.",
|
"upstream_dns_client_desc": "Pokud toto pole ponecháte prázdné, AdGuard Home použije servery nakonfigurované v<0>DNS nastavení</0>.",
|
||||||
"tracker_source": "Zdroj slídiče",
|
"tracker_source": "Zdroj slídiče",
|
||||||
"source_label": "Zdroj",
|
"source_label": "Zdroj",
|
||||||
@@ -454,7 +451,6 @@
|
|||||||
"updates_checked": "Nová verze AdGuard Home je k dispozici\n",
|
"updates_checked": "Nová verze AdGuard Home je k dispozici\n",
|
||||||
"updates_version_equal": "AdGuard Home je aktuální",
|
"updates_version_equal": "AdGuard Home je aktuální",
|
||||||
"check_updates_now": "Zkontrolovat aktualizace nyní",
|
"check_updates_now": "Zkontrolovat aktualizace nyní",
|
||||||
"version_request_error": "Kontrola aktualizace se nezdařila. Zkontrolujte prosím připojení k Internetu.",
|
|
||||||
"dns_privacy": "Soukromí DNS",
|
"dns_privacy": "Soukromí DNS",
|
||||||
"setup_dns_privacy_1": "<0>DNS skrze TLS:</0> Použít <1>{{address}}</1> řetězec.",
|
"setup_dns_privacy_1": "<0>DNS skrze TLS:</0> Použít <1>{{address}}</1> řetězec.",
|
||||||
"setup_dns_privacy_2": "<0>DNS skrze HTTPS:</0> Použít <1>{{address}}</1> řetězec.",
|
"setup_dns_privacy_2": "<0>DNS skrze HTTPS:</0> Použít <1>{{address}}</1> řetězec.",
|
||||||
|
|||||||
@@ -298,9 +298,6 @@
|
|||||||
"blocking_mode_nxdomain": "NXDOMAIN: Svar med NXDOMAIN-kode",
|
"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_null_ip": "Null IP: Svar med nul IP-adresse (0.0.0.0 for A; :: for AAAA)",
|
||||||
"blocking_mode_custom_ip": "Tilpasset IP: Svar med en manuelt indstillet IP-adresse",
|
"blocking_mode_custom_ip": "Tilpasset IP: Svar med en manuelt indstillet IP-adresse",
|
||||||
"theme_auto": "Auto",
|
|
||||||
"theme_light": "Lyst",
|
|
||||||
"theme_dark": "Mørkt",
|
|
||||||
"upstream_dns_client_desc": "Holdes dette felt tomt, bruger AdGuard Home de i <0>DNS-indstillingerne</0> opsatte servere.",
|
"upstream_dns_client_desc": "Holdes dette felt tomt, bruger AdGuard Home de i <0>DNS-indstillingerne</0> opsatte servere.",
|
||||||
"tracker_source": "Tracker-kilde",
|
"tracker_source": "Tracker-kilde",
|
||||||
"source_label": "Kilde",
|
"source_label": "Kilde",
|
||||||
@@ -454,7 +451,6 @@
|
|||||||
"updates_checked": "En ny version af AdGuard Home er tilgængelig\n",
|
"updates_checked": "En ny version af AdGuard Home er tilgængelig\n",
|
||||||
"updates_version_equal": "AdGuard Home er opdateret",
|
"updates_version_equal": "AdGuard Home er opdateret",
|
||||||
"check_updates_now": "Søg efter opdateringer nu",
|
"check_updates_now": "Søg efter opdateringer nu",
|
||||||
"version_request_error": "Opdateringstjek mislykkedes. Tjek internetforbindelsen.",
|
|
||||||
"dns_privacy": "DNS-fortrolighed",
|
"dns_privacy": "DNS-fortrolighed",
|
||||||
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> Brug <1>{{address}}</1> streng.",
|
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> Brug <1>{{address}}</1> streng.",
|
||||||
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> Brug <1>{{address}}</1> streng.",
|
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> Brug <1>{{address}}</1> streng.",
|
||||||
|
|||||||
@@ -298,9 +298,6 @@
|
|||||||
"blocking_mode_nxdomain": "NXDOMAIN: Mit NXDOMAIN-Code antworten",
|
"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_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",
|
"blocking_mode_custom_ip": "Benutzerdefinierte IP: Mit einer manuell eingestellten IP-Adresse antworten",
|
||||||
"theme_auto": "Auto",
|
|
||||||
"theme_light": "Hell",
|
|
||||||
"theme_dark": "Dunkel",
|
|
||||||
"upstream_dns_client_desc": "Wenn Sie dieses Feld leer lassen, verwendet AdGuard Home die Server, die in den <0>DNS-Einstellungen</0> konfiguriert sind.",
|
"upstream_dns_client_desc": "Wenn Sie dieses Feld leer lassen, verwendet AdGuard Home die Server, die in den <0>DNS-Einstellungen</0> konfiguriert sind.",
|
||||||
"tracker_source": "Tracker-Quelle",
|
"tracker_source": "Tracker-Quelle",
|
||||||
"source_label": "Quelle",
|
"source_label": "Quelle",
|
||||||
@@ -454,7 +451,6 @@
|
|||||||
"updates_checked": "Neue Version von AdGuard Home ist jetzt verfügbar",
|
"updates_checked": "Neue Version von AdGuard Home ist jetzt verfügbar",
|
||||||
"updates_version_equal": "AdGuard Home ist aktuell",
|
"updates_version_equal": "AdGuard Home ist aktuell",
|
||||||
"check_updates_now": "Jetzt nach Aktualisierungen suchen",
|
"check_updates_now": "Jetzt nach Aktualisierungen suchen",
|
||||||
"version_request_error": "Aktualisierungsprüfung fehlgeschlagen. Bitte überprüfen Sie Ihre Internetverbindung.",
|
|
||||||
"dns_privacy": "DNS-Datenschutz",
|
"dns_privacy": "DNS-Datenschutz",
|
||||||
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> Zeichenkette <1>{{address}}</1> verwenden.",
|
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> Zeichenkette <1>{{address}}</1> verwenden.",
|
||||||
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> Zeichenkette <1>{{address}}</1> verwenden.",
|
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> Zeichenkette <1>{{address}}</1> verwenden.",
|
||||||
|
|||||||
@@ -298,9 +298,6 @@
|
|||||||
"blocking_mode_nxdomain": "NXDOMAIN: Respond with NXDOMAIN code",
|
"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_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",
|
"blocking_mode_custom_ip": "Custom IP: Respond with a manually set IP address",
|
||||||
"theme_auto": "Auto",
|
|
||||||
"theme_light": "Light",
|
|
||||||
"theme_dark": "Dark",
|
|
||||||
"upstream_dns_client_desc": "If you keep this field empty, AdGuard Home will use the servers configured in the <0>DNS settings</0>.",
|
"upstream_dns_client_desc": "If you keep this field empty, AdGuard Home will use the servers configured in the <0>DNS settings</0>.",
|
||||||
"tracker_source": "Tracker source",
|
"tracker_source": "Tracker source",
|
||||||
"source_label": "Source",
|
"source_label": "Source",
|
||||||
@@ -454,7 +451,6 @@
|
|||||||
"updates_checked": "A new version of AdGuard Home is available",
|
"updates_checked": "A new version of AdGuard Home is available",
|
||||||
"updates_version_equal": "AdGuard Home is up-to-date",
|
"updates_version_equal": "AdGuard Home is up-to-date",
|
||||||
"check_updates_now": "Check for updates now",
|
"check_updates_now": "Check for updates now",
|
||||||
"version_request_error": "Update check failed. Please check your Internet connection.",
|
|
||||||
"dns_privacy": "DNS Privacy",
|
"dns_privacy": "DNS Privacy",
|
||||||
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> Use <1>{{address}}</1> string.",
|
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> Use <1>{{address}}</1> string.",
|
||||||
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> Use <1>{{address}}</1> string.",
|
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> Use <1>{{address}}</1> string.",
|
||||||
|
|||||||
@@ -298,9 +298,6 @@
|
|||||||
"blocking_mode_nxdomain": "NXDOMAIN: Responde con el código NXDOMAIN",
|
"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_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",
|
"blocking_mode_custom_ip": "IP personalizada: Responde con una dirección IP establecida manualmente",
|
||||||
"theme_auto": "Auto",
|
|
||||||
"theme_light": "Claro",
|
|
||||||
"theme_dark": "Oscuro",
|
|
||||||
"upstream_dns_client_desc": "Si se mantiene este campo vacío, AdGuard Home utilizará los servidores configurados en la <0>configuración del DNS</0>.",
|
"upstream_dns_client_desc": "Si se mantiene este campo vacío, AdGuard Home utilizará los servidores configurados en la <0>configuración del DNS</0>.",
|
||||||
"tracker_source": "Fuente del rastreador",
|
"tracker_source": "Fuente del rastreador",
|
||||||
"source_label": "Fuente",
|
"source_label": "Fuente",
|
||||||
@@ -454,7 +451,6 @@
|
|||||||
"updates_checked": "La nueva versión de AdGuard Home está disponible",
|
"updates_checked": "La nueva versión de AdGuard Home está disponible",
|
||||||
"updates_version_equal": "AdGuard Home está actualizado",
|
"updates_version_equal": "AdGuard Home está actualizado",
|
||||||
"check_updates_now": "Buscar actualizaciones ahora",
|
"check_updates_now": "Buscar actualizaciones ahora",
|
||||||
"version_request_error": "Error buscar la actualización. Comprueba tu conexión a Internet.",
|
|
||||||
"dns_privacy": "DNS cifrado",
|
"dns_privacy": "DNS cifrado",
|
||||||
"setup_dns_privacy_1": "<0>DNS mediante TLS:</0> Utiliza la cadena <1>{{address}}</1>.",
|
"setup_dns_privacy_1": "<0>DNS mediante TLS:</0> Utiliza la cadena <1>{{address}}</1>.",
|
||||||
"setup_dns_privacy_2": "<0>DNS mediante HTTPS:</0> Utiliza la cadena <1>{{address}}</1>.",
|
"setup_dns_privacy_2": "<0>DNS mediante HTTPS:</0> Utiliza la cadena <1>{{address}}</1>.",
|
||||||
@@ -640,7 +636,7 @@
|
|||||||
"served_from_cache": "{{value}} <i>(servido desde la caché)</i>",
|
"served_from_cache": "{{value}} <i>(servido desde la caché)</i>",
|
||||||
"form_error_password_length": "La contraseña debe tener al menos {{value}} caracteres",
|
"form_error_password_length": "La contraseña debe tener al menos {{value}} caracteres",
|
||||||
"anonymizer_notification": "<0>Nota:</0> La anonimización de IP está habilitada. Puedes deshabilitarla en <1>Configuración general</1>.",
|
"anonymizer_notification": "<0>Nota:</0> La anonimización de IP está habilitada. Puedes deshabilitarla en <1>Configuración general</1>.",
|
||||||
"confirm_dns_cache_clear": "¿Estás seguro de que deseas borrar la caché DNS?",
|
"confirm_dns_cache_clear": "¿Estás seguro de que deseas borrar la caché de DNS?",
|
||||||
"cache_cleared": "Caché DNS borrado correctamente",
|
"cache_cleared": "Caché DNS borrado con éxito",
|
||||||
"clear_cache": "Borrar caché"
|
"clear_cache": "Borrar caché"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,6 +32,8 @@
|
|||||||
"dhcp_config_saved": "پیکربندی سرور DHCP ذخیره شده است",
|
"dhcp_config_saved": "پیکربندی سرور DHCP ذخیره شده است",
|
||||||
"form_error_required": "فیلد مورد نیاز",
|
"form_error_required": "فیلد مورد نیاز",
|
||||||
"form_error_ip4_format": "فرمت نامعتبر IPv4",
|
"form_error_ip4_format": "فرمت نامعتبر IPv4",
|
||||||
|
"form_error_ip4_range_start_format": "قالب IPv4 شروع دامنه نامعتبر است",
|
||||||
|
"form_error_ip4_range_end_format": "قالب IPv4 پایان دامنه نامعتبر است",
|
||||||
"form_error_ip4_gateway_format": "قالب IPv4 درگاه نامعتبر است",
|
"form_error_ip4_gateway_format": "قالب IPv4 درگاه نامعتبر است",
|
||||||
"form_error_ip6_format": "فرمت نامعتبر IPv6",
|
"form_error_ip6_format": "فرمت نامعتبر IPv6",
|
||||||
"form_error_ip_format": "فرمت IPv4 نامعتبر است",
|
"form_error_ip_format": "فرمت IPv4 نامعتبر است",
|
||||||
@@ -42,6 +44,7 @@
|
|||||||
"out_of_range_error": "باید خارج از دامنه باشد\"{{start}}\"-\"{{end}}\"",
|
"out_of_range_error": "باید خارج از دامنه باشد\"{{start}}\"-\"{{end}}\"",
|
||||||
"lower_range_start_error": "باید کمتر از شروع دامنه باشد",
|
"lower_range_start_error": "باید کمتر از شروع دامنه باشد",
|
||||||
"greater_range_start_error": "باید بیشتر از شروع دامنه باشد",
|
"greater_range_start_error": "باید بیشتر از شروع دامنه باشد",
|
||||||
|
"greater_range_end_error": "باید بیشتر از پایان دامنه باشد",
|
||||||
"subnet_error": "آدرس ها باید در یک زیرشبکه باشند",
|
"subnet_error": "آدرس ها باید در یک زیرشبکه باشند",
|
||||||
"gateway_or_subnet_invalid": "پوشش زیرشبکه نامعتبر است",
|
"gateway_or_subnet_invalid": "پوشش زیرشبکه نامعتبر است",
|
||||||
"dhcp_form_gateway_input": "آی پی دروازه",
|
"dhcp_form_gateway_input": "آی پی دروازه",
|
||||||
@@ -419,7 +422,6 @@
|
|||||||
"updates_checked": "نسخه جدیدی از AdGuard Home در دسترس است",
|
"updates_checked": "نسخه جدیدی از AdGuard Home در دسترس است",
|
||||||
"updates_version_equal": "AdGuard Home بروز است",
|
"updates_version_equal": "AdGuard Home بروز است",
|
||||||
"check_updates_now": "حالا بررسی برای بروز رسانی",
|
"check_updates_now": "حالا بررسی برای بروز رسانی",
|
||||||
"version_request_error": "بررسی بروزرسانی موفق نشد.لطفا ارتباط اینترنتی خود را بررسی کنید",
|
|
||||||
"dns_privacy": "حریم خصوصی DNS",
|
"dns_privacy": "حریم خصوصی DNS",
|
||||||
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> استفاده از<1>{{address}}</1> .",
|
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> استفاده از<1>{{address}}</1> .",
|
||||||
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> استفاده از <1>{{address}}</1> .",
|
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> استفاده از <1>{{address}}</1> .",
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
"unavailable_dhcp": "DHCP ei ole käytettävissä",
|
"unavailable_dhcp": "DHCP ei ole käytettävissä",
|
||||||
"unavailable_dhcp_desc": "AdGuard Home ei voi suorittaa DHCP-palvelinta käyttöjärjestelmässäsi",
|
"unavailable_dhcp_desc": "AdGuard Home ei voi suorittaa DHCP-palvelinta käyttöjärjestelmässäsi",
|
||||||
"dhcp_title": "DHCP-palvelin (kokeellinen!)",
|
"dhcp_title": "DHCP-palvelin (kokeellinen!)",
|
||||||
"dhcp_description": "Jollei reitittimesi tarjoa DHCP-asetuksia, voit käyttää AdGuard Homen omaa sisäänrakennettua DHCP-palvelinta.",
|
"dhcp_description": "Jos reitittimessäsi ei ole DHCP-asetuksia, voit käyttää AdGuard Homen omaa sisäänrakennettua DHCP-palvelinta.",
|
||||||
"dhcp_enable": "Ota DHCP-palvelin käyttöön",
|
"dhcp_enable": "Ota DHCP-palvelin käyttöön",
|
||||||
"dhcp_disable": "Poista DHCP-palvelin käytöstä",
|
"dhcp_disable": "Poista DHCP-palvelin käytöstä",
|
||||||
"dhcp_not_found": "On turvallista ottaa sisäänrakennettu DHCP-palvelin käyttöön, koska AdGuard Home ei havainnut verkossa muita aktiivisia DHCP-palvelimia. Suosittelemme, että varmistat tämän vielä itse, koska automaattinen tunnistus ei ole 100% varma.",
|
"dhcp_not_found": "On turvallista ottaa sisäänrakennettu DHCP-palvelin käyttöön, koska AdGuard Home ei havainnut verkossa muita aktiivisia DHCP-palvelimia. Suosittelemme, että varmistat tämän vielä itse, koska automaattinen tunnistus ei ole 100% varma.",
|
||||||
@@ -272,7 +272,7 @@
|
|||||||
"nxdomain": "NXDOMAIN",
|
"nxdomain": "NXDOMAIN",
|
||||||
"refused": "REFUSED",
|
"refused": "REFUSED",
|
||||||
"null_ip": "Tyhjä IP",
|
"null_ip": "Tyhjä IP",
|
||||||
"custom_ip": "Mukautettu IP-osoite",
|
"custom_ip": "Oma IP-osoite",
|
||||||
"blocking_ipv4": "IPv4-esto",
|
"blocking_ipv4": "IPv4-esto",
|
||||||
"blocking_ipv6": "IPv6-esto",
|
"blocking_ipv6": "IPv6-esto",
|
||||||
"dnscrypt": "DNSCrypt",
|
"dnscrypt": "DNSCrypt",
|
||||||
@@ -297,10 +297,7 @@
|
|||||||
"blocking_mode_refused": "REFUSED: Vastaa REFUSED-koodilla",
|
"blocking_mode_refused": "REFUSED: Vastaa REFUSED-koodilla",
|
||||||
"blocking_mode_nxdomain": "NXDOMAIN: Vastaa NXDOMAIN-koodilla",
|
"blocking_mode_nxdomain": "NXDOMAIN: Vastaa NXDOMAIN-koodilla",
|
||||||
"blocking_mode_null_ip": "Tyhjä IP: Vastaa IP-nollaosoitteella (0.0.0.0 korvaa A; :: korvaa AAAA)",
|
"blocking_mode_null_ip": "Tyhjä IP: Vastaa IP-nollaosoitteella (0.0.0.0 korvaa A; :: korvaa AAAA)",
|
||||||
"blocking_mode_custom_ip": "Mukautettu IP: Vastaa manuaalisesti määritetyllä IP-osoitteella",
|
"blocking_mode_custom_ip": "Oma IP: Vastaa itse määritetyllä IP-osoitteella",
|
||||||
"theme_auto": "Automaattinen",
|
|
||||||
"theme_light": "Vaalea",
|
|
||||||
"theme_dark": "Tumma",
|
|
||||||
"upstream_dns_client_desc": "Jos tämä on tyhjä, käyttää AdGuard Home <0>DNS-asetuksissa</0> määritettyjä palvelimia.",
|
"upstream_dns_client_desc": "Jos tämä on tyhjä, käyttää AdGuard Home <0>DNS-asetuksissa</0> määritettyjä palvelimia.",
|
||||||
"tracker_source": "Seurannan lähde",
|
"tracker_source": "Seurannan lähde",
|
||||||
"source_label": "Lähde",
|
"source_label": "Lähde",
|
||||||
@@ -454,7 +451,6 @@
|
|||||||
"updates_checked": "Uusi versio AdGuard Home -ohjelmasta on saatavana\n",
|
"updates_checked": "Uusi versio AdGuard Home -ohjelmasta on saatavana\n",
|
||||||
"updates_version_equal": "AdGuard Home on ajan tasalla",
|
"updates_version_equal": "AdGuard Home on ajan tasalla",
|
||||||
"check_updates_now": "Tarkista päivitykset nyt",
|
"check_updates_now": "Tarkista päivitykset nyt",
|
||||||
"version_request_error": "Päivitystarkistus epäonnistui. Tarkista Internet-yhteytesi.",
|
|
||||||
"dns_privacy": "DNS-tietosuoja",
|
"dns_privacy": "DNS-tietosuoja",
|
||||||
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> Käytä merkkijonoa <1>{{address}}</1>.",
|
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> Käytä merkkijonoa <1>{{address}}</1>.",
|
||||||
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> Käytä merkkijonoa <1>{{address}}</1>.",
|
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> Käytä merkkijonoa <1>{{address}}</1>.",
|
||||||
@@ -618,7 +614,7 @@
|
|||||||
"cache_ttl_max_override_desc": "Määritä DNS-välimuistin kohteiden enimmäiselinaika (sekunteina).",
|
"cache_ttl_max_override_desc": "Määritä DNS-välimuistin kohteiden enimmäiselinaika (sekunteina).",
|
||||||
"ttl_cache_validation": "Välimuistin vähimmäiselinajan on oltava pienempi tai sama kuin enimmäiselinajan",
|
"ttl_cache_validation": "Välimuistin vähimmäiselinajan on oltava pienempi tai sama kuin enimmäiselinajan",
|
||||||
"cache_optimistic": "Optimistinen välimuisti",
|
"cache_optimistic": "Optimistinen välimuisti",
|
||||||
"cache_optimistic_desc": "Pakota AdGuard Home vastaamaan välimuistista vaikka tiedot olisivat vanhentuneet. Pyri samalla myös päivittämään tiedot.",
|
"cache_optimistic_desc": "Pakota AdGuard Home vastaamaan välimuistista vaikka sen tiedot olisivat vanhentuneet. Pyri samalla myös päivittämään tiedot.",
|
||||||
"filter_category_general": "Yleiset",
|
"filter_category_general": "Yleiset",
|
||||||
"filter_category_security": "Turvallisuus",
|
"filter_category_security": "Turvallisuus",
|
||||||
"filter_category_regional": "Alueelliset",
|
"filter_category_regional": "Alueelliset",
|
||||||
|
|||||||
@@ -222,7 +222,7 @@
|
|||||||
"updated_upstream_dns_toast": "Serveurs en amont enregistrés",
|
"updated_upstream_dns_toast": "Serveurs en amont enregistrés",
|
||||||
"dns_test_ok_toast": "Les serveurs DNS spécifiés fonctionnent correctement",
|
"dns_test_ok_toast": "Les serveurs DNS spécifiés fonctionnent correctement",
|
||||||
"dns_test_not_ok_toast": "Impossible d'utiliser le serveur « {{key}} »: veuillez vérifier si le nom saisi est bien correct",
|
"dns_test_not_ok_toast": "Impossible d'utiliser le serveur « {{key}} »: veuillez vérifier si le nom saisi est bien correct",
|
||||||
"dns_test_warning_toast": "L'amont « {{key}} » ne répond pas aux demandes de test et peut ne pas fonctionner correctement",
|
"dns_test_warning_toast": "L'amont «{{key}}» ne répond pas aux demandes de test et peut ne pas fonctionner correctement",
|
||||||
"unblock": "Débloquer",
|
"unblock": "Débloquer",
|
||||||
"block": "Bloquer",
|
"block": "Bloquer",
|
||||||
"disallow_this_client": "Interdire ce client",
|
"disallow_this_client": "Interdire ce client",
|
||||||
@@ -298,9 +298,6 @@
|
|||||||
"blocking_mode_nxdomain": "NXDOMAIN : Répondre avec le code NXDOMAIN",
|
"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_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",
|
"blocking_mode_custom_ip": "IP personnalisée : Répondre avec une adresse IP définie manuellement",
|
||||||
"theme_auto": "Auto",
|
|
||||||
"theme_light": "Thème clair",
|
|
||||||
"theme_dark": "Thème sombre",
|
|
||||||
"upstream_dns_client_desc": "Si vous laissez ce champ vide, AdGuard Home utilisera les serveurs configurés dans les <0>paramètres DNS</0>.",
|
"upstream_dns_client_desc": "Si vous laissez ce champ vide, AdGuard Home utilisera les serveurs configurés dans les <0>paramètres DNS</0>.",
|
||||||
"tracker_source": "Source du traceur",
|
"tracker_source": "Source du traceur",
|
||||||
"source_label": "Source",
|
"source_label": "Source",
|
||||||
@@ -454,7 +451,6 @@
|
|||||||
"updates_checked": "Une nouvelle version de AdGuard Home est disponible",
|
"updates_checked": "Une nouvelle version de AdGuard Home est disponible",
|
||||||
"updates_version_equal": "AdGuard Home est à jour",
|
"updates_version_equal": "AdGuard Home est à jour",
|
||||||
"check_updates_now": "Vérifier les mises à jour",
|
"check_updates_now": "Vérifier les mises à jour",
|
||||||
"version_request_error": "Impossible de vérifier les mises à jour. Veuillez vérifier votre connexion internet.",
|
|
||||||
"dns_privacy": "Confidentialité DNS",
|
"dns_privacy": "Confidentialité DNS",
|
||||||
"setup_dns_privacy_1": "<0>DNS-over-TLS :</0> Utiliser le string <1>{{address}}</1>.",
|
"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_2": "<0>DNS-over-HTTPS :</0> Utiliser le string <1>{{address}}</1>.",
|
||||||
|
|||||||
@@ -298,9 +298,6 @@
|
|||||||
"blocking_mode_nxdomain": "NXDOMAIN: Odgovor s NXDOMAIN kôdom",
|
"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_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",
|
"blocking_mode_custom_ip": "Prilagođeni IP: Odgovor s ručno postavljenom IP adresom",
|
||||||
"theme_auto": "Auto",
|
|
||||||
"theme_light": "Svijetla",
|
|
||||||
"theme_dark": "Tamna",
|
|
||||||
"upstream_dns_client_desc": "Ako ovo polje ostane prazno, AdGuard Home će upotrijebiti poslužitelje postavljene u <0>DNS postavkama</0>.",
|
"upstream_dns_client_desc": "Ako ovo polje ostane prazno, AdGuard Home će upotrijebiti poslužitelje postavljene u <0>DNS postavkama</0>.",
|
||||||
"tracker_source": "Izvor pratitelja",
|
"tracker_source": "Izvor pratitelja",
|
||||||
"source_label": "Izvor",
|
"source_label": "Izvor",
|
||||||
@@ -454,7 +451,6 @@
|
|||||||
"updates_checked": "Dostupna je nova verzija AdGuard Home-a",
|
"updates_checked": "Dostupna je nova verzija AdGuard Home-a",
|
||||||
"updates_version_equal": "AdGuard Home je ažuriran",
|
"updates_version_equal": "AdGuard Home je ažuriran",
|
||||||
"check_updates_now": "Provjeri ažuriranja sada",
|
"check_updates_now": "Provjeri ažuriranja sada",
|
||||||
"version_request_error": "Ne uspješna provjera ažuriranja. Provjerite vašu Internetsku vezu.",
|
|
||||||
"dns_privacy": "DNS privatnost",
|
"dns_privacy": "DNS privatnost",
|
||||||
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> Koristite <1>{{address}}</1>.",
|
"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_2": "<0>DNS-over-HTTPS:</0> Koristite <1>{{address}}</1>.",
|
||||||
|
|||||||
@@ -298,9 +298,6 @@
|
|||||||
"blocking_mode_nxdomain": "NXDOMAIN: Az NXDOMAIN kóddal fog válaszolni",
|
"blocking_mode_nxdomain": "NXDOMAIN: Az NXDOMAIN kóddal fog válaszolni",
|
||||||
"blocking_mode_null_ip": "Null IP: Nullákból álló IP-címmel válaszol (0.0.0.0 for A; :: for AAAA)",
|
"blocking_mode_null_ip": "Null IP: Nullákból álló IP-címmel válaszol (0.0.0.0 for A; :: for AAAA)",
|
||||||
"blocking_mode_custom_ip": "Egyedi IP: Válasz egy kézzel beállított IP címmel",
|
"blocking_mode_custom_ip": "Egyedi IP: Válasz egy kézzel beállított IP címmel",
|
||||||
"theme_auto": "Auto",
|
|
||||||
"theme_light": "Világos",
|
|
||||||
"theme_dark": "Sötét",
|
|
||||||
"upstream_dns_client_desc": "Ha üresen hagyja ezt a mezőt, az AdGuard Home azokat a szervereket fogja használni, amik a <0>DNS beállításokban</0> vannak beállítva.",
|
"upstream_dns_client_desc": "Ha üresen hagyja ezt a mezőt, az AdGuard Home azokat a szervereket fogja használni, amik a <0>DNS beállításokban</0> vannak beállítva.",
|
||||||
"tracker_source": "Követő forrása",
|
"tracker_source": "Követő forrása",
|
||||||
"source_label": "Forrás",
|
"source_label": "Forrás",
|
||||||
@@ -454,7 +451,6 @@
|
|||||||
"updates_checked": "Elérhető az AdGuard Home új verziója",
|
"updates_checked": "Elérhető az AdGuard Home új verziója",
|
||||||
"updates_version_equal": "Az AdGuard Home naprakész",
|
"updates_version_equal": "Az AdGuard Home naprakész",
|
||||||
"check_updates_now": "Frissítések ellenőrzése most",
|
"check_updates_now": "Frissítések ellenőrzése most",
|
||||||
"version_request_error": "A frissítések ellenőrzése sikertelen. Ellenőrizze az internetkapcsolatot.",
|
|
||||||
"dns_privacy": "DNS Adatvédelem",
|
"dns_privacy": "DNS Adatvédelem",
|
||||||
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> Használja a(z) <1>{{address}}</1> szöveget.",
|
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> Használja a(z) <1>{{address}}</1> szöveget.",
|
||||||
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> Használja a(z) <1>{{address}}</1> szöveget.",
|
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> Használja a(z) <1>{{address}}</1> szöveget.",
|
||||||
|
|||||||
@@ -298,9 +298,6 @@
|
|||||||
"blocking_mode_nxdomain": "NXDOMAIN: Respon pakai kode NXDOMAIN",
|
"blocking_mode_nxdomain": "NXDOMAIN: Respon pakai kode NXDOMAIN",
|
||||||
"blocking_mode_null_ip": "Null IP: Respon pakai alamat IP kosong (0.0.0.0 untuk A; :: untuk AAAA)",
|
"blocking_mode_null_ip": "Null IP: Respon pakai alamat IP kosong (0.0.0.0 untuk A; :: untuk AAAA)",
|
||||||
"blocking_mode_custom_ip": "IP kustom: respon dengan alamat IP yang diset secara manual",
|
"blocking_mode_custom_ip": "IP kustom: respon dengan alamat IP yang diset secara manual",
|
||||||
"theme_auto": "Auto",
|
|
||||||
"theme_light": "Terang",
|
|
||||||
"theme_dark": "Gelap",
|
|
||||||
"upstream_dns_client_desc": "Jika Anda biarkan bidang ini kosong, AdGuard Home akan memakai server yang dikonfigurasi di<0>Pengaturan DNS</0>.",
|
"upstream_dns_client_desc": "Jika Anda biarkan bidang ini kosong, AdGuard Home akan memakai server yang dikonfigurasi di<0>Pengaturan DNS</0>.",
|
||||||
"tracker_source": "Sumber pelacak",
|
"tracker_source": "Sumber pelacak",
|
||||||
"source_label": "Sumber",
|
"source_label": "Sumber",
|
||||||
|
|||||||
@@ -298,9 +298,6 @@
|
|||||||
"blocking_mode_nxdomain": "NXDOMAIN: Rispondi con il codice NXDOMAIN",
|
"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_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",
|
"blocking_mode_custom_ip": "IP personalizzato: Rispondi con un indirizzo IP impostato manualmente",
|
||||||
"theme_auto": "Auto",
|
|
||||||
"theme_light": "Chiaro",
|
|
||||||
"theme_dark": "Scuro",
|
|
||||||
"upstream_dns_client_desc": "Se lasci questo spazio vuoto, AdGuard Home utilizzerà i server configurati nelle <0>impostazioni DNS</0>.",
|
"upstream_dns_client_desc": "Se lasci questo spazio vuoto, AdGuard Home utilizzerà i server configurati nelle <0>impostazioni DNS</0>.",
|
||||||
"tracker_source": "Origine del tracciatore",
|
"tracker_source": "Origine del tracciatore",
|
||||||
"source_label": "Fonte",
|
"source_label": "Fonte",
|
||||||
@@ -454,7 +451,6 @@
|
|||||||
"updates_checked": "Nuova versione di AdGuard Home è disponibile",
|
"updates_checked": "Nuova versione di AdGuard Home è disponibile",
|
||||||
"updates_version_equal": "AdGuard Home è aggiornato",
|
"updates_version_equal": "AdGuard Home è aggiornato",
|
||||||
"check_updates_now": "Ricerca aggiornamenti ora",
|
"check_updates_now": "Ricerca aggiornamenti ora",
|
||||||
"version_request_error": "Ricerca aggiornamenti non riuscita. Per favore controlla la tua connessione internet.",
|
|
||||||
"dns_privacy": "Privacy DNS",
|
"dns_privacy": "Privacy DNS",
|
||||||
"setup_dns_privacy_1": "<0>DNS su TLS:</0> Utilizza la stringa <1>{{address}}</1>.",
|
"setup_dns_privacy_1": "<0>DNS su TLS:</0> Utilizza la stringa <1>{{address}}</1>.",
|
||||||
"setup_dns_privacy_2": "<0>DNS su HTTPS:</0> Utilizza la stringa <1>{{address}}</1>.",
|
"setup_dns_privacy_2": "<0>DNS su HTTPS:</0> Utilizza la stringa <1>{{address}}</1>.",
|
||||||
|
|||||||
@@ -298,9 +298,6 @@
|
|||||||
"blocking_mode_nxdomain": "NXDOMAIN:NXDOMAINコードで応答します",
|
"blocking_mode_nxdomain": "NXDOMAIN:NXDOMAINコードで応答します",
|
||||||
"blocking_mode_null_ip": "Null IP:ゼロのIPアドレスで応答します(Aの場合は0.0.0.0; AAAAの場合は::)",
|
"blocking_mode_null_ip": "Null IP:ゼロのIPアドレスで応答します(Aの場合は0.0.0.0; AAAAの場合は::)",
|
||||||
"blocking_mode_custom_ip": "カスタムIP:手動で設定されたIPアドレスで応答します",
|
"blocking_mode_custom_ip": "カスタムIP:手動で設定されたIPアドレスで応答します",
|
||||||
"theme_auto": "自動",
|
|
||||||
"theme_light": "ライト",
|
|
||||||
"theme_dark": "ダーク",
|
|
||||||
"upstream_dns_client_desc": "このフィールドを未入力のままにすると、AdGuard Homeは<0>DNS設定</0>で構成されたサーバを使用します。",
|
"upstream_dns_client_desc": "このフィールドを未入力のままにすると、AdGuard Homeは<0>DNS設定</0>で構成されたサーバを使用します。",
|
||||||
"tracker_source": "追跡元",
|
"tracker_source": "追跡元",
|
||||||
"source_label": "ソース",
|
"source_label": "ソース",
|
||||||
@@ -454,7 +451,6 @@
|
|||||||
"updates_checked": "AdGuard Homeの新バージョンが利用可能です。",
|
"updates_checked": "AdGuard Homeの新バージョンが利用可能です。",
|
||||||
"updates_version_equal": "AdGuard Homeは既に最新です",
|
"updates_version_equal": "AdGuard Homeは既に最新です",
|
||||||
"check_updates_now": "今すぐアップデートを確認する",
|
"check_updates_now": "今すぐアップデートを確認する",
|
||||||
"version_request_error": "アップデート確認に失敗しました。インターネット接続を確認してください。",
|
|
||||||
"dns_privacy": "DNSプライバシー",
|
"dns_privacy": "DNSプライバシー",
|
||||||
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> <1>{{address}}</1>という文字列を使用してください。",
|
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> <1>{{address}}</1>という文字列を使用してください。",
|
||||||
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> <1>{{address}}</1>という文字列を使用してください。",
|
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> <1>{{address}}</1>という文字列を使用してください。",
|
||||||
|
|||||||
@@ -298,9 +298,6 @@
|
|||||||
"blocking_mode_nxdomain": "NXDOMAIN: NXDOMAIN 코드로 응답",
|
"blocking_mode_nxdomain": "NXDOMAIN: NXDOMAIN 코드로 응답",
|
||||||
"blocking_mode_null_ip": "Null IP: 제로 IP 주소 (A는 0.0.0.0; AAAA는 ::) 로 응답합니다",
|
"blocking_mode_null_ip": "Null IP: 제로 IP 주소 (A는 0.0.0.0; AAAA는 ::) 로 응답합니다",
|
||||||
"blocking_mode_custom_ip": "커스텀 IP: 직접 설정한 IP 주소로 응답합니다",
|
"blocking_mode_custom_ip": "커스텀 IP: 직접 설정한 IP 주소로 응답합니다",
|
||||||
"theme_auto": "자동",
|
|
||||||
"theme_light": "라이트 테마",
|
|
||||||
"theme_dark": "다크 테마",
|
|
||||||
"upstream_dns_client_desc": "이 값을 비워둔다면 AdGuard Home은 <0>DNS 설정</0>에 설정되어 있는 값을 사용합니다.",
|
"upstream_dns_client_desc": "이 값을 비워둔다면 AdGuard Home은 <0>DNS 설정</0>에 설정되어 있는 값을 사용합니다.",
|
||||||
"tracker_source": "추적기 소스",
|
"tracker_source": "추적기 소스",
|
||||||
"source_label": "소스",
|
"source_label": "소스",
|
||||||
@@ -454,7 +451,6 @@
|
|||||||
"updates_checked": "AdGuard Home의 새 버전을 사용할 수 있습니다",
|
"updates_checked": "AdGuard Home의 새 버전을 사용할 수 있습니다",
|
||||||
"updates_version_equal": "AdGuard Home 최신 상태입니다.",
|
"updates_version_equal": "AdGuard Home 최신 상태입니다.",
|
||||||
"check_updates_now": "지금 업데이트 확인",
|
"check_updates_now": "지금 업데이트 확인",
|
||||||
"version_request_error": "업데이트 체크에 실패했습니다. 인터넷 연결 상태를 확인해주세요.",
|
|
||||||
"dns_privacy": "DNS 프라이버시",
|
"dns_privacy": "DNS 프라이버시",
|
||||||
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> <1>{{address}}</1> 사용하세요.",
|
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> <1>{{address}}</1> 사용하세요.",
|
||||||
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> <1>{{address}}</1> 사용하세요.",
|
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> <1>{{address}}</1> 사용하세요.",
|
||||||
|
|||||||
@@ -298,9 +298,6 @@
|
|||||||
"blocking_mode_nxdomain": "NXDOMAIN: Reageer met NXDOMAIN code",
|
"blocking_mode_nxdomain": "NXDOMAIN: Reageer met NXDOMAIN code",
|
||||||
"blocking_mode_null_ip": "Nul IP: Reageer met een nul IP address (0.0.0.0 voor A; :: voor AAAA)",
|
"blocking_mode_null_ip": "Nul IP: Reageer met een nul IP address (0.0.0.0 voor A; :: voor AAAA)",
|
||||||
"blocking_mode_custom_ip": "Aangepast IP: Reageer met een handmatige ingesteld IP adres",
|
"blocking_mode_custom_ip": "Aangepast IP: Reageer met een handmatige ingesteld IP adres",
|
||||||
"theme_auto": "Automatisch",
|
|
||||||
"theme_light": "Licht",
|
|
||||||
"theme_dark": "Donker",
|
|
||||||
"upstream_dns_client_desc": "Indien je dit veld leeglaat zal AdGuard Home de servers welke zijn ingesteld in de <0>DNS instellingen</0> gebruiken.",
|
"upstream_dns_client_desc": "Indien je dit veld leeglaat zal AdGuard Home de servers welke zijn ingesteld in de <0>DNS instellingen</0> gebruiken.",
|
||||||
"tracker_source": "Bron volger",
|
"tracker_source": "Bron volger",
|
||||||
"source_label": "Bron",
|
"source_label": "Bron",
|
||||||
@@ -454,7 +451,6 @@
|
|||||||
"updates_checked": "Een nieuwe versie van AdGuard Home is beschikbaar\n",
|
"updates_checked": "Een nieuwe versie van AdGuard Home is beschikbaar\n",
|
||||||
"updates_version_equal": "AdGuard Home is actueel",
|
"updates_version_equal": "AdGuard Home is actueel",
|
||||||
"check_updates_now": "Controleer op updates",
|
"check_updates_now": "Controleer op updates",
|
||||||
"version_request_error": "Updatecontrole mislukt. Controleer je internetverbinding.",
|
|
||||||
"dns_privacy": "DNS Privacy",
|
"dns_privacy": "DNS Privacy",
|
||||||
"setup_dns_privacy_1": "<0>DNS-via-TLS:</0> Gebruik <1>{{address}}</1> string.",
|
"setup_dns_privacy_1": "<0>DNS-via-TLS:</0> Gebruik <1>{{address}}</1> string.",
|
||||||
"setup_dns_privacy_2": "<0>DNS-via-HTTPS:</0> Gebruik <1>{{address}}</1> string.",
|
"setup_dns_privacy_2": "<0>DNS-via-HTTPS:</0> Gebruik <1>{{address}}</1> string.",
|
||||||
|
|||||||
@@ -281,7 +281,6 @@
|
|||||||
"blocking_mode_nxdomain": "NXDOMAIN: Svar med NXDOMAIN-koden",
|
"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_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",
|
"blocking_mode_custom_ip": "Tilpasset IP: Svar med en manuelt valgt IP-adresse",
|
||||||
"theme_auto": "Auto",
|
|
||||||
"upstream_dns_client_desc": "Hvis dette feltet holdes tomt, vil AdGuard Home bruke tjenerne som er satt opp i <0>DNS-innstillingene</0>.",
|
"upstream_dns_client_desc": "Hvis dette feltet holdes tomt, vil AdGuard Home bruke tjenerne som er satt opp i <0>DNS-innstillingene</0>.",
|
||||||
"tracker_source": "Sporerkilde",
|
"tracker_source": "Sporerkilde",
|
||||||
"source_label": "Kilde",
|
"source_label": "Kilde",
|
||||||
@@ -434,7 +433,6 @@
|
|||||||
"updates_checked": "En ny versjon av AdGuard Home er tilgjengelig",
|
"updates_checked": "En ny versjon av AdGuard Home er tilgjengelig",
|
||||||
"updates_version_equal": "AdGuard Home er fullt oppdatert",
|
"updates_version_equal": "AdGuard Home er fullt oppdatert",
|
||||||
"check_updates_now": "Se etter oppdateringer nå",
|
"check_updates_now": "Se etter oppdateringer nå",
|
||||||
"version_request_error": "Oppdateringssjekken mislyktes. Vennligst sjekk internettforbindelsen din.",
|
|
||||||
"dns_privacy": "DNS-privatliv",
|
"dns_privacy": "DNS-privatliv",
|
||||||
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> Benytt <1>{{address}}</1>-strengen.",
|
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> Benytt <1>{{address}}</1>-strengen.",
|
||||||
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> Benytt <1>{{address}}</1>-strengen.",
|
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> Benytt <1>{{address}}</1>-strengen.",
|
||||||
|
|||||||
@@ -298,9 +298,6 @@
|
|||||||
"blocking_mode_nxdomain": "NXDOMAIN: Odpowiedz kodem NXDOMAIN",
|
"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_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",
|
"blocking_mode_custom_ip": "Niestandardowy adres IP: Odpowiedz ręcznie ustawionym adresem IP",
|
||||||
"theme_auto": "Auto",
|
|
||||||
"theme_light": "Jasny",
|
|
||||||
"theme_dark": "Ciemny",
|
|
||||||
"upstream_dns_client_desc": "Jeśli to pole pozostanie puste, AdGuard Home użyje serwerów skonfigurowanych w <0>Ustawieniach DNS</0>.",
|
"upstream_dns_client_desc": "Jeśli to pole pozostanie puste, AdGuard Home użyje serwerów skonfigurowanych w <0>Ustawieniach DNS</0>.",
|
||||||
"tracker_source": "Źródło skryptu śledzącego",
|
"tracker_source": "Źródło skryptu śledzącego",
|
||||||
"source_label": "Źródło",
|
"source_label": "Źródło",
|
||||||
@@ -454,7 +451,6 @@
|
|||||||
"updates_checked": "Dostępna jest nowa wersja programu AdGuard Home\n",
|
"updates_checked": "Dostępna jest nowa wersja programu AdGuard Home\n",
|
||||||
"updates_version_equal": "AdGuard Home jest aktualny",
|
"updates_version_equal": "AdGuard Home jest aktualny",
|
||||||
"check_updates_now": "Sprawdź aktualizacje teraz",
|
"check_updates_now": "Sprawdź aktualizacje teraz",
|
||||||
"version_request_error": "Sprawdzanie aktualizacji zakończone niepowodzeniem. Sprawdź swoje połączenie z internetem.",
|
|
||||||
"dns_privacy": "Prywatny DNS",
|
"dns_privacy": "Prywatny DNS",
|
||||||
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> Skorzystaj z adresu <1>{{address}}</1>.",
|
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> Skorzystaj z adresu <1>{{address}}</1>.",
|
||||||
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> Skorzystaj z adresu <1>{{address}}</1>.",
|
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> Skorzystaj z adresu <1>{{address}}</1>.",
|
||||||
|
|||||||
@@ -298,9 +298,6 @@
|
|||||||
"blocking_mode_nxdomain": "NXDOMAIN: Responder com o código NXDOMAIN",
|
"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_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",
|
"blocking_mode_custom_ip": "IP personalizado: Responder com um endereço IP definido manualmente",
|
||||||
"theme_auto": "Automático",
|
|
||||||
"theme_light": "Claro",
|
|
||||||
"theme_dark": "Escuro",
|
|
||||||
"upstream_dns_client_desc": "Se você mantiver este campo vazio, o AdGuard Home usará os servidores configurados nas configurações <0>DNS</0>.",
|
"upstream_dns_client_desc": "Se você mantiver este campo vazio, o AdGuard Home usará os servidores configurados nas configurações <0>DNS</0>.",
|
||||||
"tracker_source": "Fonte do rastreador",
|
"tracker_source": "Fonte do rastreador",
|
||||||
"source_label": "Fonte",
|
"source_label": "Fonte",
|
||||||
@@ -454,7 +451,6 @@
|
|||||||
"updates_checked": "Uma nova versão do AdGuard Home está disponível\n",
|
"updates_checked": "Uma nova versão do AdGuard Home está disponível\n",
|
||||||
"updates_version_equal": "O AdGuard Home está atualizado.",
|
"updates_version_equal": "O AdGuard Home está atualizado.",
|
||||||
"check_updates_now": "Verificar atualizações",
|
"check_updates_now": "Verificar atualizações",
|
||||||
"version_request_error": "A verificação de atualização falhou. Por favor, verifique sua conexão com a internet.",
|
|
||||||
"dns_privacy": "Privacidade de DNS",
|
"dns_privacy": "Privacidade de DNS",
|
||||||
"setup_dns_privacy_1": "<0>DNS-sobre-TLS:</0> Use <1>{{address}}</1> string.",
|
"setup_dns_privacy_1": "<0>DNS-sobre-TLS:</0> Use <1>{{address}}</1> string.",
|
||||||
"setup_dns_privacy_2": "<0>DNS-sobre-HTTPS:</0> Use <1>{{address}}</1> string.",
|
"setup_dns_privacy_2": "<0>DNS-sobre-HTTPS:</0> Use <1>{{address}}</1> string.",
|
||||||
|
|||||||
@@ -49,7 +49,7 @@
|
|||||||
"out_of_range_error": "Deve estar fora do intervalo \"{{start}}\"-\"{{end}}\"",
|
"out_of_range_error": "Deve estar fora do intervalo \"{{start}}\"-\"{{end}}\"",
|
||||||
"lower_range_start_error": "Deve ser inferior ao início do intervalo",
|
"lower_range_start_error": "Deve ser inferior ao início do intervalo",
|
||||||
"greater_range_start_error": "Deve ser maior que o início do intervalo",
|
"greater_range_start_error": "Deve ser maior que o início do intervalo",
|
||||||
"subnet_error": "Os endereços devem estar numa sub-rede",
|
"subnet_error": "Os endereços devem estar em uma sub-rede",
|
||||||
"gateway_or_subnet_invalid": "Máscara de sub-rede inválida",
|
"gateway_or_subnet_invalid": "Máscara de sub-rede inválida",
|
||||||
"dhcp_form_gateway_input": "IP do gateway",
|
"dhcp_form_gateway_input": "IP do gateway",
|
||||||
"dhcp_form_subnet_input": "Máscara de sub-rede",
|
"dhcp_form_subnet_input": "Máscara de sub-rede",
|
||||||
@@ -298,9 +298,6 @@
|
|||||||
"blocking_mode_nxdomain": "NXDOMAIN: Responder com o código NXDOMAIN",
|
"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_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",
|
"blocking_mode_custom_ip": "IP personalizado: Responder com um endereço IP definido manualmente",
|
||||||
"theme_auto": "Automático",
|
|
||||||
"theme_light": "Claro",
|
|
||||||
"theme_dark": "Escuro",
|
|
||||||
"upstream_dns_client_desc": "Se mantiver esse campo vazio, o AdGuard Home usará os servidores configurados nas <0>Definições de DNS</0>.",
|
"upstream_dns_client_desc": "Se mantiver esse campo vazio, o AdGuard Home usará os servidores configurados nas <0>Definições de DNS</0>.",
|
||||||
"tracker_source": "Fonte do rastreador",
|
"tracker_source": "Fonte do rastreador",
|
||||||
"source_label": "Fonte",
|
"source_label": "Fonte",
|
||||||
@@ -335,10 +332,10 @@
|
|||||||
"install_devices_router": "Router",
|
"install_devices_router": "Router",
|
||||||
"install_devices_router_desc": "Esta configuração cobre automaticamente todos os dispositivos conectados ao seu router doméstico, sem a necessidade de configurar cada um deles manualmente.",
|
"install_devices_router_desc": "Esta configuração cobre automaticamente todos os dispositivos conectados ao seu router doméstico, sem a necessidade de configurar cada um deles manualmente.",
|
||||||
"install_devices_address": "O servidor de DNS do AdGuard Home está a capturar os seguintes endereços",
|
"install_devices_address": "O servidor de DNS do AdGuard Home está a capturar os seguintes endereços",
|
||||||
"install_devices_router_list_1": "Abra as preferências do seu router. Normalmente, tu podes acessá-lo de teu navegador por meio de um URL, como http://192.168.0.1/ ou http://192.168.1.1/. Tu podes ser solicitado a inserir uma palavra-passe. Se tu não se lembrar, muitas vezes tu podes repor a palavra-passe pressionando um botão no próprio roteador, mas esteja ciente de que se esse procedimento for escolhido, tu provavelmente perderás toda a definição do router. Se o teu router requer uma aplicação para configurá-lo, instale a aplicação no seu telefone ou PC e use-o para acessar as definições do router.",
|
"install_devices_router_list_1": "Abra as preferências do seu roteador. Normalmente, tu podes acessá-lo de teu navegador por meio de um URL, como http://192.168.0.1/ ou http://192.168.1.1/. Tu podes ser solicitado a inserir uma palavra-passe. Se tu não se lembrar, muitas vezes tu podes repor a palavra-passe pressionando um botão no próprio roteador, mas esteja ciente de que se esse procedimento for escolhido, tu provavelmente perderás toda a definição do roteador. Se o teu roteador requer uma aplicação para configurá-lo, instale a aplicação no seu telefone ou PC e use-o para acessar as definições do roteador.",
|
||||||
"install_devices_router_list_2": "Encontre as configurações de DNS. Procure as letras DNS ao lado de um campo que permite dois ou três conjuntos de números, cada um dividido em quatro grupos de um a três números.",
|
"install_devices_router_list_2": "Encontre as configurações de DNS. Procure as letras DNS ao lado de um campo que permite dois ou três conjuntos de números, cada um dividido em quatro grupos de um a três números.",
|
||||||
"install_devices_router_list_3": "Insira aqui seu servidor do AdGuard Home.",
|
"install_devices_router_list_3": "Insira aqui seu servidor do AdGuard Home.",
|
||||||
"install_devices_router_list_4": "Em alguns tipos de router, um servidor DNS personalizado não pode ser configurado. Nesse caso, configurar o AdGuard Home como um <0>Servidor DHCP</0> pode ajudar. Caso contrário, tu deves verificar o manual do router sobre como personalizar os servidores DNS no seu modelo de router específico.",
|
"install_devices_router_list_4": "Em alguns tipos de roteador, um servidor DNS personalizado não pode ser configurado. Nesse caso, configurar o AdGuard Home como um <0>Servidor DHCP</0> pode ajudar. Caso contrário, tu deve verificar o manual do router sobre como personalizar os servidores DNS em seu modelo de router específico.",
|
||||||
"install_devices_windows_list_1": "Abra o Painel de Controlo através do Menu Iniciar ou pela Pesquisa do Windows.",
|
"install_devices_windows_list_1": "Abra o Painel de Controlo através do Menu Iniciar ou pela Pesquisa do Windows.",
|
||||||
"install_devices_windows_list_2": "Entre na categoria Rede e Internet e depois clique em Central de Rede e Partilha.",
|
"install_devices_windows_list_2": "Entre na categoria Rede e Internet e depois clique em Central de Rede e Partilha.",
|
||||||
"install_devices_windows_list_3": "No painel esquerdo, clique em \"Alterar configurações do adaptador\".",
|
"install_devices_windows_list_3": "No painel esquerdo, clique em \"Alterar configurações do adaptador\".",
|
||||||
@@ -454,7 +451,6 @@
|
|||||||
"updates_checked": "Uma nova versão do AdGuard Home está disponível\n",
|
"updates_checked": "Uma nova versão do AdGuard Home está disponível\n",
|
||||||
"updates_version_equal": "O AdGuard Home está atualizado",
|
"updates_version_equal": "O AdGuard Home está atualizado",
|
||||||
"check_updates_now": "Verificar atualizações",
|
"check_updates_now": "Verificar atualizações",
|
||||||
"version_request_error": "A verificação de atualização falhou. Verifique a sua ligação à internet.",
|
|
||||||
"dns_privacy": "Privacidade de DNS",
|
"dns_privacy": "Privacidade de DNS",
|
||||||
"setup_dns_privacy_1": "<0>DNS-sobre-TLS:</0> Use <1>{{address}}</1> string.",
|
"setup_dns_privacy_1": "<0>DNS-sobre-TLS:</0> Use <1>{{address}}</1> string.",
|
||||||
"setup_dns_privacy_2": "<0>DNS-sobre-HTTPS:</0> Use <1>{{address}}</1> string.",
|
"setup_dns_privacy_2": "<0>DNS-sobre-HTTPS:</0> Use <1>{{address}}</1> string.",
|
||||||
@@ -583,7 +579,7 @@
|
|||||||
"client_blocked": "Cliente \"{{ip}}\" foi bloqueado com sucesso",
|
"client_blocked": "Cliente \"{{ip}}\" foi bloqueado com sucesso",
|
||||||
"client_unblocked": "Cliente \"{{ip}}\" foi desbloqueado com sucesso",
|
"client_unblocked": "Cliente \"{{ip}}\" foi desbloqueado com sucesso",
|
||||||
"static_ip": "Endereço de IP estático",
|
"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 router poderá atribuir um novo endereço de IP neste dispositivo.",
|
"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",
|
"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_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_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.",
|
||||||
|
|||||||
@@ -298,9 +298,6 @@
|
|||||||
"blocking_mode_nxdomain": "NXDOMAIN: Răspunde cu codul NXDOMAIN",
|
"blocking_mode_nxdomain": "NXDOMAIN: Răspunde cu codul NXDOMAIN",
|
||||||
"blocking_mode_null_ip": "IP nul: răspunde cu o adresă IP zero (0.0.0.0 pentru A; :: pentru AAAA)",
|
"blocking_mode_null_ip": "IP nul: răspunde cu o adresă IP zero (0.0.0.0 pentru A; :: pentru AAAA)",
|
||||||
"blocking_mode_custom_ip": "IP personalizat: răspunde cu o adresă IP setată manual",
|
"blocking_mode_custom_ip": "IP personalizat: răspunde cu o adresă IP setată manual",
|
||||||
"theme_auto": "Auto",
|
|
||||||
"theme_light": "Luminoasă",
|
|
||||||
"theme_dark": "Sombră",
|
|
||||||
"upstream_dns_client_desc": "Dacă mențineți acest câmp gol, AdGuard Home va folosi serverele configurate în <0>setările DNS</0>.",
|
"upstream_dns_client_desc": "Dacă mențineți acest câmp gol, AdGuard Home va folosi serverele configurate în <0>setările DNS</0>.",
|
||||||
"tracker_source": "Sursă tracker",
|
"tracker_source": "Sursă tracker",
|
||||||
"source_label": "Sursă",
|
"source_label": "Sursă",
|
||||||
@@ -454,7 +451,6 @@
|
|||||||
"updates_checked": "Este disponibilă o nouă versiune de AdGuard Home\n",
|
"updates_checked": "Este disponibilă o nouă versiune de AdGuard Home\n",
|
||||||
"updates_version_equal": "AdGuard Home este la zi",
|
"updates_version_equal": "AdGuard Home este la zi",
|
||||||
"check_updates_now": "Verificați actualizările acum",
|
"check_updates_now": "Verificați actualizările acum",
|
||||||
"version_request_error": "Verificarea actualizării nu a reușit. Verificați conexiunea internet.",
|
|
||||||
"dns_privacy": "Confidențialitate DNS",
|
"dns_privacy": "Confidențialitate DNS",
|
||||||
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> Folosiți stringul <1>{{address}}</1>.",
|
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> Folosiți stringul <1>{{address}}</1>.",
|
||||||
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> Folosiți stringul <1>{{address}}</1>.",
|
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> Folosiți stringul <1>{{address}}</1>.",
|
||||||
|
|||||||
@@ -298,9 +298,6 @@
|
|||||||
"blocking_mode_nxdomain": "NXDOMAIN: Отвечает с кодом NXDOMAIN\n",
|
"blocking_mode_nxdomain": "NXDOMAIN: Отвечает с кодом NXDOMAIN\n",
|
||||||
"blocking_mode_null_ip": "Нулевой IP: Отвечает с нулевым IP-адресом (0.0.0.0 для A; :: для AAAA)",
|
"blocking_mode_null_ip": "Нулевой IP: Отвечает с нулевым IP-адресом (0.0.0.0 для A; :: для AAAA)",
|
||||||
"blocking_mode_custom_ip": "Пользовательский IP: Отвечает с вручную настроенным IP-адресом",
|
"blocking_mode_custom_ip": "Пользовательский IP: Отвечает с вручную настроенным IP-адресом",
|
||||||
"theme_auto": "Авто",
|
|
||||||
"theme_light": "Светлая",
|
|
||||||
"theme_dark": "Тёмная",
|
|
||||||
"upstream_dns_client_desc": "Если оставить поле пустым, AdGuard Home будет обращаться к серверам, указанным в <0>настройках DNS</0>.",
|
"upstream_dns_client_desc": "Если оставить поле пустым, AdGuard Home будет обращаться к серверам, указанным в <0>настройках DNS</0>.",
|
||||||
"tracker_source": "Источник трекинга",
|
"tracker_source": "Источник трекинга",
|
||||||
"source_label": "Источник",
|
"source_label": "Источник",
|
||||||
@@ -454,7 +451,6 @@
|
|||||||
"updates_checked": "Доступна новая версия AdGuard Home",
|
"updates_checked": "Доступна новая версия AdGuard Home",
|
||||||
"updates_version_equal": "Версия AdGuard Home актуальна",
|
"updates_version_equal": "Версия AdGuard Home актуальна",
|
||||||
"check_updates_now": "Проверить обновления",
|
"check_updates_now": "Проверить обновления",
|
||||||
"version_request_error": "Ошибка при проверке наличия обновлений. Проверьте ваше интернет-соединение.",
|
|
||||||
"dns_privacy": "Зашифрованный DNS",
|
"dns_privacy": "Зашифрованный DNS",
|
||||||
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> Используйте строку <1>{{address}}</1>.",
|
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> Используйте строку <1>{{address}}</1>.",
|
||||||
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> Используйте строку <1>{{address}}</1>.",
|
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> Используйте строку <1>{{address}}</1>.",
|
||||||
|
|||||||
@@ -30,6 +30,8 @@
|
|||||||
"dhcp_ipv6_settings": "ග.ධා.වි.කෙ. අ.ජා.කෙ. 6 සැකසුම්",
|
"dhcp_ipv6_settings": "ග.ධා.වි.කෙ. අ.ජා.කෙ. 6 සැකසුම්",
|
||||||
"form_error_required": "ඇවැසි ක්ෂේත්රයකි",
|
"form_error_required": "ඇවැසි ක්ෂේත්රයකි",
|
||||||
"form_error_ip4_format": "IPv4 ලිපිනය වලංගු නොවේ",
|
"form_error_ip4_format": "IPv4 ලිපිනය වලංගු නොවේ",
|
||||||
|
"form_error_ip4_range_start_format": "පරාසය ආරම්භයේ වලංගු නොවන අ.ජා.කෙ.4 ලිපිනයකි",
|
||||||
|
"form_error_ip4_range_end_format": "පරාසය අවසානයේ වලංගු නොවන අ.ජා.කෙ.4 ලිපිනයකි",
|
||||||
"form_error_ip6_format": "වලංගු නොවන අ.ජා.කෙ.6 ලිපිනයකි",
|
"form_error_ip6_format": "වලංගු නොවන අ.ජා.කෙ.6 ලිපිනයකි",
|
||||||
"form_error_ip_format": "අ.ජා.කෙ. (IP) ලිපිනය වලංගු නොවේ",
|
"form_error_ip_format": "අ.ජා.කෙ. (IP) ලිපිනය වලංගු නොවේ",
|
||||||
"form_error_mac_format": "මා.ප්ර.පා. ලිපිනය වලංගු නොවේ",
|
"form_error_mac_format": "මා.ප්ර.පා. ලිපිනය වලංගු නොවේ",
|
||||||
@@ -40,6 +42,7 @@
|
|||||||
"out_of_range_error": "\"{{start}}\"-\"{{end}}\" පරාසයෙන් පිට විය යුතුය",
|
"out_of_range_error": "\"{{start}}\"-\"{{end}}\" පරාසයෙන් පිට විය යුතුය",
|
||||||
"lower_range_start_error": "පරාසය ආරම්භයට වඩා අඩු විය යුතුය",
|
"lower_range_start_error": "පරාසය ආරම්භයට වඩා අඩු විය යුතුය",
|
||||||
"greater_range_start_error": "පරාසය ආරම්භයට වඩා වැඩි විය යුතුය",
|
"greater_range_start_error": "පරාසය ආරම්භයට වඩා වැඩි විය යුතුය",
|
||||||
|
"greater_range_end_error": "පරාසය අවසානයට වඩා වැඩි විය යුතුය",
|
||||||
"subnet_error": "ලිපින එක් අනුජාලයක තිබිය යුතුය",
|
"subnet_error": "ලිපින එක් අනුජාලයක තිබිය යුතුය",
|
||||||
"dhcp_form_range_title": "අ.ජා. කෙ. (IP) ලිපින පරාසය",
|
"dhcp_form_range_title": "අ.ජා. කෙ. (IP) ලිපින පරාසය",
|
||||||
"dhcp_form_range_start": "පරාසය ආරම්භය",
|
"dhcp_form_range_start": "පරාසය ආරම්භය",
|
||||||
|
|||||||
@@ -298,9 +298,6 @@
|
|||||||
"blocking_mode_nxdomain": "NXDOMAIN: Odpovedať kódom NXDOMAIN",
|
"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_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",
|
"blocking_mode_custom_ip": "Vlastná IP adresa: Odpovedzte s manuálne nastavenou IP adresou",
|
||||||
"theme_auto": "Auto",
|
|
||||||
"theme_light": "Svetlá",
|
|
||||||
"theme_dark": "Tmavá",
|
|
||||||
"upstream_dns_client_desc": "Ak ponecháte toto pole prázdne, AdGuard Home použije servery nakonfigurované v <0>nastaveniach DNS</0>.",
|
"upstream_dns_client_desc": "Ak ponecháte toto pole prázdne, AdGuard Home použije servery nakonfigurované v <0>nastaveniach DNS</0>.",
|
||||||
"tracker_source": "Zdroj sledovania",
|
"tracker_source": "Zdroj sledovania",
|
||||||
"source_label": "Zdroj",
|
"source_label": "Zdroj",
|
||||||
@@ -454,7 +451,6 @@
|
|||||||
"updates_checked": "K dispozícii je nová verzia aplikácie AdGuard Home\n",
|
"updates_checked": "K dispozícii je nová verzia aplikácie AdGuard Home\n",
|
||||||
"updates_version_equal": "AdGuard Home je aktuálny",
|
"updates_version_equal": "AdGuard Home je aktuálny",
|
||||||
"check_updates_now": "Skontrolovať aktualizácie teraz",
|
"check_updates_now": "Skontrolovať aktualizácie teraz",
|
||||||
"version_request_error": "Kontrola aktualizácie zlyhala. Skontrolujte svoje internetové pripojenie.",
|
|
||||||
"dns_privacy": "DNS súkromie",
|
"dns_privacy": "DNS súkromie",
|
||||||
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> Použiť <1>{{address}}</1> reťazec.",
|
"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_2": "<0>DNS-over-HTTPS:</0> Použiť <1>{{address}}</1> reťazec.",
|
||||||
|
|||||||
@@ -298,9 +298,6 @@
|
|||||||
"blocking_mode_nxdomain": "NXDOMAIN: Odziv s kodo NXDOMAIN",
|
"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_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",
|
"blocking_mode_custom_ip": "IP po meri: Odziv z ročno nastavljenim naslovom IP",
|
||||||
"theme_auto": "Auto",
|
|
||||||
"theme_light": "Svetla tema",
|
|
||||||
"theme_dark": "Temna tema",
|
|
||||||
"upstream_dns_client_desc": "Če pustite to polje prazno, bo AdGuard Home uporabil strežnike, konfigurirane v <0>nastavitvah DNS</0>.",
|
"upstream_dns_client_desc": "Če pustite to polje prazno, bo AdGuard Home uporabil strežnike, konfigurirane v <0>nastavitvah DNS</0>.",
|
||||||
"tracker_source": "Vir sledilca",
|
"tracker_source": "Vir sledilca",
|
||||||
"source_label": "Vir",
|
"source_label": "Vir",
|
||||||
@@ -454,7 +451,6 @@
|
|||||||
"updates_checked": "Na voljo je nova različica programa AdGuard Home\n",
|
"updates_checked": "Na voljo je nova različica programa AdGuard Home\n",
|
||||||
"updates_version_equal": "AdGuard Home je posodobljen",
|
"updates_version_equal": "AdGuard Home je posodobljen",
|
||||||
"check_updates_now": "Preveri obstoj posodobitev zdaj",
|
"check_updates_now": "Preveri obstoj posodobitev zdaj",
|
||||||
"version_request_error": "Posodobitev ni uspela. Preverite vašo internetno povezavo.",
|
|
||||||
"dns_privacy": "Zasebnost DNS",
|
"dns_privacy": "Zasebnost DNS",
|
||||||
"setup_dns_privacy_1": "<0>DNS-prek-TLS:</0> Uporabite niz <1>{{address}}</1>.",
|
"setup_dns_privacy_1": "<0>DNS-prek-TLS:</0> Uporabite niz <1>{{address}}</1>.",
|
||||||
"setup_dns_privacy_2": "<0>DNS-prek-HTTPS:</0> Uporabite niz <1>{{address}}</1>.",
|
"setup_dns_privacy_2": "<0>DNS-prek-HTTPS:</0> Uporabite niz <1>{{address}}</1>.",
|
||||||
|
|||||||
@@ -298,9 +298,6 @@
|
|||||||
"blocking_mode_nxdomain": "NXDOMAIN: Odgovara sa NXDOMAIN kodom",
|
"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_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",
|
"blocking_mode_custom_ip": "Prilagođeni IP: Odgovara sa ručno podešenom IP adresom",
|
||||||
"theme_auto": "Auto",
|
|
||||||
"theme_light": "Svetla tema",
|
|
||||||
"theme_dark": "Tamna tema",
|
|
||||||
"upstream_dns_client_desc": "AKo ovo polje ostavite prazno, AdGuard Home će koristiti servere konfigurisane u <0>DNS postavkama</0>.",
|
"upstream_dns_client_desc": "AKo ovo polje ostavite prazno, AdGuard Home će koristiti servere konfigurisane u <0>DNS postavkama</0>.",
|
||||||
"tracker_source": "Izvor praćenja",
|
"tracker_source": "Izvor praćenja",
|
||||||
"source_label": "Izvor",
|
"source_label": "Izvor",
|
||||||
@@ -454,7 +451,6 @@
|
|||||||
"updates_checked": "Dostupna je nova verzija AdGuard Home-a",
|
"updates_checked": "Dostupna je nova verzija AdGuard Home-a",
|
||||||
"updates_version_equal": "AdGuard Home je ažuriran na najnoviju verziju",
|
"updates_version_equal": "AdGuard Home je ažuriran na najnoviju verziju",
|
||||||
"check_updates_now": "Proveri da li postoje ispravke",
|
"check_updates_now": "Proveri da li postoje ispravke",
|
||||||
"version_request_error": "Provera ažuriranja nije uspela. Proverite svoju vezu sa internetom.",
|
|
||||||
"dns_privacy": "DNS privatnost",
|
"dns_privacy": "DNS privatnost",
|
||||||
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> koristi <1>{{address}}</1> string.",
|
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> koristi <1>{{address}}</1> string.",
|
||||||
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> koristi <1>{{address}}</1> string.",
|
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> koristi <1>{{address}}</1> string.",
|
||||||
|
|||||||
@@ -298,9 +298,6 @@
|
|||||||
"blocking_mode_nxdomain": "NXDOMAIN: Svara med NXDOMAIN kod",
|
"blocking_mode_nxdomain": "NXDOMAIN: Svara med NXDOMAIN kod",
|
||||||
"blocking_mode_null_ip": "Null IP: Svara med noll IP adress (0.0.0.0 för A; :: för AAAA)",
|
"blocking_mode_null_ip": "Null IP: Svara med noll IP adress (0.0.0.0 för A; :: för AAAA)",
|
||||||
"blocking_mode_custom_ip": "Anpassad IP: Svara med en manuellt inställd IP adress",
|
"blocking_mode_custom_ip": "Anpassad IP: Svara med en manuellt inställd IP adress",
|
||||||
"theme_auto": "Auto",
|
|
||||||
"theme_light": "Ljust",
|
|
||||||
"theme_dark": "Mörkt",
|
|
||||||
"upstream_dns_client_desc": "Om detta fält är tomt kommer AdGuard Home att använda de servrar som konfigurerats i <0>DNS inställningarna</0>.",
|
"upstream_dns_client_desc": "Om detta fält är tomt kommer AdGuard Home att använda de servrar som konfigurerats i <0>DNS inställningarna</0>.",
|
||||||
"tracker_source": "Spårningskälla",
|
"tracker_source": "Spårningskälla",
|
||||||
"source_label": "Källa",
|
"source_label": "Källa",
|
||||||
@@ -454,7 +451,6 @@
|
|||||||
"updates_checked": "En ny version av AdGuard Home är tillgänglig\n",
|
"updates_checked": "En ny version av AdGuard Home är tillgänglig\n",
|
||||||
"updates_version_equal": "AdGuard Home är uppdaterat",
|
"updates_version_equal": "AdGuard Home är uppdaterat",
|
||||||
"check_updates_now": "Sök efter uppdateringar nu",
|
"check_updates_now": "Sök efter uppdateringar nu",
|
||||||
"version_request_error": "Uppdateringskontroll misslyckades. Kontrollera din internetanslutning.",
|
|
||||||
"dns_privacy": "DNS-Integritet",
|
"dns_privacy": "DNS-Integritet",
|
||||||
"setup_dns_privacy_1": "<0>DNS-över-TLS:</0> Använd: <1>{{address}}</1>",
|
"setup_dns_privacy_1": "<0>DNS-över-TLS:</0> Använd: <1>{{address}}</1>",
|
||||||
"setup_dns_privacy_2": "<0>DNS-över-HTTPS:</0> Använd: <1>{{address}}</1>",
|
"setup_dns_privacy_2": "<0>DNS-över-HTTPS:</0> Använd: <1>{{address}}</1>",
|
||||||
|
|||||||
@@ -128,14 +128,14 @@
|
|||||||
"number_of_dns_query_days": "Son {{count}} 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_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_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 engel listeleri tarafından engellenen DNS isteklerinin sayısı",
|
"number_of_dns_query_blocked_24_hours": "Reklam engelleme filtreleri ve ana makine engel listeleri tarafından engellenen DNS isteklerinin sayısı",
|
||||||
"number_of_dns_query_blocked_24_hours_by_sec": "AdGuard gezinti koruması modülü tarafından engellenen DNS isteklerinin sayısı",
|
"number_of_dns_query_blocked_24_hours_by_sec": "AdGuard gezinti koruması modülü tarafından engellenen DNS isteklerinin sayısı",
|
||||||
"number_of_dns_query_blocked_24_hours_adult": "Engellenen yetişkin içerikli sitelerin sayısı",
|
"number_of_dns_query_blocked_24_hours_adult": "Engellenen yetişkin içerikli sitelerin sayısı",
|
||||||
"enforced_save_search": "Uygulanan güvenli arama",
|
"enforced_save_search": "Uygulanan güvenli arama",
|
||||||
"number_of_dns_query_to_safe_search": "Güvenli Aramanın uygulandığı arama motorlarına gönderilen DNS isteklerinin sayısı",
|
"number_of_dns_query_to_safe_search": "Güvenli Aramanın uygulandığı arama motorlarına gönderilen DNS isteklerinin sayısı",
|
||||||
"average_processing_time": "Ortalama işlem süresi",
|
"average_processing_time": "Ortalama işlem süresi",
|
||||||
"average_processing_time_hint": "Bir DNS isteğinin milisaniye cinsinden ortalama işlem süresi",
|
"average_processing_time_hint": "Bir DNS isteğinin milisaniye cinsinden ortalama işlem süresi",
|
||||||
"block_domain_use_filters_and_hosts": "Filtre ve hosts dosyalarını kullanarak alan adlarını engelle",
|
"block_domain_use_filters_and_hosts": "Filtre ve ana makine listelerini kullanarak alan adlarını engelle",
|
||||||
"filters_block_toggle_hint": "<a>Filtreler</a> ayarlarında engelleme kuralları oluşturabilirsiniz.",
|
"filters_block_toggle_hint": "<a>Filtreler</a> ayarlarında engelleme kuralları oluşturabilirsiniz.",
|
||||||
"use_adguard_browsing_sec": "AdGuard gezinti koruması web hizmetini kullan",
|
"use_adguard_browsing_sec": "AdGuard gezinti koruması web hizmetini kullan",
|
||||||
"use_adguard_browsing_sec_hint": "AdGuard Home, alan adının gezinti koruması web hizmeti tarafından engellenip engellenmediğini kontrol eder. Kontrolü gerçekleştirmek için gizlilik dostu arama API'sini kullanır: sunucuya yalnızca SHA256 karma alan adının kısa bir ön eki gönderilir.",
|
"use_adguard_browsing_sec_hint": "AdGuard Home, alan adının gezinti koruması web hizmeti tarafından engellenip engellenmediğini kontrol eder. Kontrolü gerçekleştirmek için gizlilik dostu arama API'sini kullanır: sunucuya yalnızca SHA256 karma alan adının kısa bir ön eki gönderilir.",
|
||||||
@@ -177,7 +177,7 @@
|
|||||||
"edit_table_action": "Düzenle",
|
"edit_table_action": "Düzenle",
|
||||||
"delete_table_action": "Sil",
|
"delete_table_action": "Sil",
|
||||||
"elapsed": "Geçen süre",
|
"elapsed": "Geçen süre",
|
||||||
"filters_and_hosts_hint": "AdGuard Home, temel reklam engelleme kurallarını ve hosts dosyalarının söz dizimini anlar.",
|
"filters_and_hosts_hint": "AdGuard Home, temel reklam engelleme kurallarını ve ana makine dosyalarının söz dizimini anlar.",
|
||||||
"no_blocklist_added": "Engel listesi eklenmedi",
|
"no_blocklist_added": "Engel listesi eklenmedi",
|
||||||
"no_whitelist_added": "İzin listesi eklenmedi",
|
"no_whitelist_added": "İzin listesi eklenmedi",
|
||||||
"add_blocklist": "Engel listesi ekle",
|
"add_blocklist": "Engel listesi ekle",
|
||||||
@@ -197,8 +197,8 @@
|
|||||||
"form_error_url_format": "Geçersiz URL biçimi",
|
"form_error_url_format": "Geçersiz URL biçimi",
|
||||||
"form_error_url_or_path_format": "Geçersiz URL adresi veya dosya yolu",
|
"form_error_url_or_path_format": "Geçersiz URL adresi veya dosya yolu",
|
||||||
"custom_filter_rules": "Özel filtreleme kuralları",
|
"custom_filter_rules": "Özel filtreleme kuralları",
|
||||||
"custom_filter_rules_hint": "Her satıra bir kural girin. Reklam engelleme kuralı veya hosts dosyası söz dizimi kullanabilirsiniz.",
|
"custom_filter_rules_hint": "Her satıra bir kural girin. Reklam engelleme kuralı veya ana makine dosyası söz dizimi kullanabilirsiniz.",
|
||||||
"system_host_files": "Sistem hosts dosyaları",
|
"system_host_files": "Sistem ana makine dosyaları",
|
||||||
"examples_title": "Örnekler",
|
"examples_title": "Örnekler",
|
||||||
"example_meaning_filter_block": "example.org'a ve tüm alt alanlarına erişimi engeller;",
|
"example_meaning_filter_block": "example.org'a ve tüm alt alanlarına erişimi engeller;",
|
||||||
"example_meaning_filter_whitelist": "example.org'a ve tüm alt alanlarına erişimin engelini kaldırır;",
|
"example_meaning_filter_whitelist": "example.org'a ve tüm alt alanlarına erişimin engelini kaldırır;",
|
||||||
@@ -298,9 +298,6 @@
|
|||||||
"blocking_mode_nxdomain": "NXDOMAIN: NXDOMAIN koduyla yanıt verin",
|
"blocking_mode_nxdomain": "NXDOMAIN: NXDOMAIN koduyla yanıt verin",
|
||||||
"blocking_mode_null_ip": "Boş IP: Sıfır IP adresiyle yanıt verin (A için 0.0.0.0; :: AAAA için)",
|
"blocking_mode_null_ip": "Boş IP: Sıfır IP adresiyle yanıt verin (A için 0.0.0.0; :: AAAA için)",
|
||||||
"blocking_mode_custom_ip": "Özel IP: El ile ayarlanmış bir IP adresiyle yanıt verin",
|
"blocking_mode_custom_ip": "Özel IP: El ile ayarlanmış bir IP adresiyle yanıt verin",
|
||||||
"theme_auto": "Otomatik",
|
|
||||||
"theme_light": "Açık",
|
|
||||||
"theme_dark": "Koyu",
|
|
||||||
"upstream_dns_client_desc": "Bu alanı boş bırakırsanız, AdGuard Home, <0>DNS ayarlarında</0> yapılandırılan sunucuları kullanır.",
|
"upstream_dns_client_desc": "Bu alanı boş bırakırsanız, AdGuard Home, <0>DNS ayarlarında</0> yapılandırılan sunucuları kullanır.",
|
||||||
"tracker_source": "İzleyici kaynağı",
|
"tracker_source": "İzleyici kaynağı",
|
||||||
"source_label": "Kaynak",
|
"source_label": "Kaynak",
|
||||||
@@ -350,12 +347,12 @@
|
|||||||
"install_devices_macos_list_3": "Listedeki ilk bağlantıyı seçin ve Gelişmiş öğesine tıklayın.",
|
"install_devices_macos_list_3": "Listedeki ilk bağlantıyı seçin ve Gelişmiş öğesine tıklayın.",
|
||||||
"install_devices_macos_list_4": "DNS sekmesini seçin ve AdGuard Home sunucunuzun adreslerini girin.",
|
"install_devices_macos_list_4": "DNS sekmesini seçin ve AdGuard Home sunucunuzun adreslerini girin.",
|
||||||
"install_devices_android_list_1": "Android Menüsü ana ekranından Ayarlar'a dokunun.",
|
"install_devices_android_list_1": "Android Menüsü ana ekranından Ayarlar'a dokunun.",
|
||||||
"install_devices_android_list_2": "Menüde bulunan Wi-Fi öğesine dokunun. Mevcut tüm ağlar listelenecektir (telefon ağlar için özel DNS sunucusu ayarlanamaz).",
|
"install_devices_android_list_2": "Menüde bulunan Wi-Fi öğesine dokunun. Mevcut tüm ağlar listelenecektir (mobil ağlar için özel DNS sunucusu ayarlanamaz).",
|
||||||
"install_devices_android_list_3": "Bağlı olduğunuz ağın üzerine basılı tutun ve Ağı Değiştir'e dokunun.",
|
"install_devices_android_list_3": "Bağlı olduğunuz ağın üzerine basılı tutun ve Ağı Değiştir'e dokunun.",
|
||||||
"install_devices_android_list_4": "Bazı cihazlarda, diğer ayarları görmek için \"Gelişmiş\" seçeneğini seçmeniz gerekebilir. Android DNS ayarlarınızı yapmak için IP ayarlarını DHCP modundan Statik moda değiştirmeniz gerekir.",
|
"install_devices_android_list_4": "Bazı cihazlarda, diğer ayarları görmek için \"Gelişmiş\" seçeneğini seçmeniz gerekebilir. Android DNS ayarlarınızı yapmak için IP ayarlarını DHCP modundan Statik moda değiştirmeniz gerekir.",
|
||||||
"install_devices_android_list_5": "DNS 1 ve DNS 2 değerlerini AdGuard Home sunucunuzun adresleriyle değiştirin.",
|
"install_devices_android_list_5": "DNS 1 ve DNS 2 değerlerini AdGuard Home sunucunuzun adresleriyle değiştirin.",
|
||||||
"install_devices_ios_list_1": "Ana ekrandan Ayarlar'a dokunun.",
|
"install_devices_ios_list_1": "Ana ekrandan Ayarlar'a dokunun.",
|
||||||
"install_devices_ios_list_2": "Sol menüde bulunan Wi-Fi bölümüne girin (telefon ağlar için özel DNS sunucusu ayarlanamaz).",
|
"install_devices_ios_list_2": "Sol menüde bulunan Wi-Fi bölümüne girin (mobil ağlar için özel DNS sunucusu ayarlanamaz).",
|
||||||
"install_devices_ios_list_3": "O anda aktif olan ağın adına dokunun.",
|
"install_devices_ios_list_3": "O anda aktif olan ağın adına dokunun.",
|
||||||
"install_devices_ios_list_4": "DNS alanına AdGuard Home sunucunuzun adreslerini girin.",
|
"install_devices_ios_list_4": "DNS alanına AdGuard Home sunucunuzun adreslerini girin.",
|
||||||
"get_started": "Başlayın",
|
"get_started": "Başlayın",
|
||||||
@@ -449,12 +446,11 @@
|
|||||||
"access_disallowed_title": "İzin verilmeyen istemciler",
|
"access_disallowed_title": "İzin verilmeyen istemciler",
|
||||||
"access_disallowed_desc": "CIDR'lerin, IP adreslerinin veya <a>İstemci Kimliklerin</a> listesi. Bu listede girişler varsa, AdGuard Home bu istemcilerden gelen istekleri keser. İzin verilen istemcilerde girişler varsa, bu alan yok sayılır.",
|
"access_disallowed_desc": "CIDR'lerin, IP adreslerinin veya <a>İstemci Kimliklerin</a> listesi. Bu listede girişler varsa, AdGuard Home bu istemcilerden gelen istekleri keser. İzin verilen istemcilerde girişler varsa, bu alan yok sayılır.",
|
||||||
"access_blocked_title": "İzin verilmeyen alan adları",
|
"access_blocked_title": "İzin verilmeyen alan adları",
|
||||||
"access_blocked_desc": "Bu işlem filtrelerle ilgili değildir. AdGuard Home, bu alan adlarından gelen DNS sorgularını yanıtsız bırakır ve bu sorgular sorgu günlüğünde görünmez. Tam alan adlarını, joker karakterleri veya URL filtre kurallarını belirtebilirsiniz, örn. \"example.org\", \"*.example.org\" veya \"||example.org^\".",
|
"access_blocked_desc": "Bu işlem filtrelerle ilgili değildir. AdGuard Home, bu alan adlarından gelen DNS sorgularını yanıtsız bırakır ve bu sorgular sorgu günlüğünde görünmez. Tam alan adlarını, joker karakterleri veya URL filtre kurallarını belirtebilirsiniz, ör. \"example.org\", \"*.example.org\" veya \"||example.org^\".",
|
||||||
"access_settings_saved": "Erişim ayarları başarıyla kaydedildi!",
|
"access_settings_saved": "Erişim ayarları başarıyla kaydedildi!",
|
||||||
"updates_checked": "AdGuard Home'un yeni bir sürümü mevcut",
|
"updates_checked": "AdGuard Home'un yeni bir sürümü mevcut",
|
||||||
"updates_version_equal": "AdGuard Home yazılımı güncel durumda",
|
"updates_version_equal": "AdGuard Home yazılımı güncel durumda",
|
||||||
"check_updates_now": "Güncellemeleri şimdi denetle",
|
"check_updates_now": "Güncellemeleri şimdi denetle",
|
||||||
"version_request_error": "Güncelleme denetimi başarısız. Lütfen internet bağlantınızı kontrol edin.",
|
|
||||||
"dns_privacy": "DNS Gizliliği",
|
"dns_privacy": "DNS Gizliliği",
|
||||||
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> <1>{{address}}</1> dizesini kullan.",
|
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> <1>{{address}}</1> dizesini kullan.",
|
||||||
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> <1>{{address}}</1> dizesini kullan.",
|
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> <1>{{address}}</1> dizesini kullan.",
|
||||||
@@ -480,7 +476,7 @@
|
|||||||
"rewrite_confirm_delete": "\"{{key}}\" için DNS yeniden yazımını silmek istediğinize emin misiniz?",
|
"rewrite_confirm_delete": "\"{{key}}\" için DNS yeniden yazımını silmek istediğinize emin misiniz?",
|
||||||
"rewrite_desc": "Belirli bir alan adı için özel DNS yanıtını kolayca yapılandırmanızı sağlar.",
|
"rewrite_desc": "Belirli bir alan adı için özel DNS yanıtını kolayca yapılandırmanızı sağlar.",
|
||||||
"rewrite_applied": "Yeniden yazım kuralı uygulandı",
|
"rewrite_applied": "Yeniden yazım kuralı uygulandı",
|
||||||
"rewrite_hosts_applied": "Hosts dosyası kuralı tarafından yeniden yazıldı",
|
"rewrite_hosts_applied": "Ana makine dosyası kuralı tarafından yeniden yazıldı",
|
||||||
"dns_rewrites": "DNS yeniden yazımları",
|
"dns_rewrites": "DNS yeniden yazımları",
|
||||||
"form_domain": "Alan adı veya joker karakter girin",
|
"form_domain": "Alan adı veya joker karakter girin",
|
||||||
"form_answer": "IP adresi veya alan adı girin",
|
"form_answer": "IP adresi veya alan adı girin",
|
||||||
@@ -543,7 +539,7 @@
|
|||||||
"network": "Ağ",
|
"network": "Ağ",
|
||||||
"descr": "Açıklama",
|
"descr": "Açıklama",
|
||||||
"whois": "WHOIS",
|
"whois": "WHOIS",
|
||||||
"filtering_rules_learn_more": "Kendi hosts listelerinizi oluşturma hakkında <0>daha fazla bilgi edinin</0>.",
|
"filtering_rules_learn_more": "Kendi ana makine listelerinizi oluşturma hakkında <0>daha fazla bilgi edinin</0>.",
|
||||||
"blocked_by_response": "Yanıt olarak CNAME veya IP tarafından engellendi",
|
"blocked_by_response": "Yanıt olarak CNAME veya IP tarafından engellendi",
|
||||||
"blocked_by_cname_or_ip": "CNAME veya IP tarafından engellendi",
|
"blocked_by_cname_or_ip": "CNAME veya IP tarafından engellendi",
|
||||||
"try_again": "Tekrar dene",
|
"try_again": "Tekrar dene",
|
||||||
|
|||||||
@@ -298,9 +298,6 @@
|
|||||||
"blocking_mode_nxdomain": "NXDOMAIN: Відповісти з кодом NXDOMAIN",
|
"blocking_mode_nxdomain": "NXDOMAIN: Відповісти з кодом NXDOMAIN",
|
||||||
"blocking_mode_null_ip": "Нульовий IP: Відповісти з нульовою IP-адресою (0.0.0.0 для A; :: для AAAA)",
|
"blocking_mode_null_ip": "Нульовий IP: Відповісти з нульовою IP-адресою (0.0.0.0 для A; :: для AAAA)",
|
||||||
"blocking_mode_custom_ip": "Спеціальна IP-адреса: Відповісти із вручну встановленою IP-адресою",
|
"blocking_mode_custom_ip": "Спеціальна IP-адреса: Відповісти із вручну встановленою IP-адресою",
|
||||||
"theme_auto": "Авто",
|
|
||||||
"theme_light": "Світла",
|
|
||||||
"theme_dark": "Темна",
|
|
||||||
"upstream_dns_client_desc": "Якщо це поле залишатиметься порожнім, AdGuard Home використовуватиме сервери, вказані в <0>налаштуваннях DNS</0>.",
|
"upstream_dns_client_desc": "Якщо це поле залишатиметься порожнім, AdGuard Home використовуватиме сервери, вказані в <0>налаштуваннях DNS</0>.",
|
||||||
"tracker_source": "Джерело відстежувача",
|
"tracker_source": "Джерело відстежувача",
|
||||||
"source_label": "Джерело",
|
"source_label": "Джерело",
|
||||||
@@ -454,7 +451,6 @@
|
|||||||
"updates_checked": "Доступна нова версія AdGuard Home",
|
"updates_checked": "Доступна нова версія AdGuard Home",
|
||||||
"updates_version_equal": "AdGuard Home останньої версії",
|
"updates_version_equal": "AdGuard Home останньої версії",
|
||||||
"check_updates_now": "Перевірити наявність оновлень",
|
"check_updates_now": "Перевірити наявність оновлень",
|
||||||
"version_request_error": "Не вдалося перевірити оновлення. Будь ласка, перевірте з'єднання з інтернетом.",
|
|
||||||
"dns_privacy": "Конфіденційність DNS",
|
"dns_privacy": "Конфіденційність DNS",
|
||||||
"setup_dns_privacy_1": "<0>DNS-over-TLS: </0>Використайте рядок <1>{{address}}</1>.",
|
"setup_dns_privacy_1": "<0>DNS-over-TLS: </0>Використайте рядок <1>{{address}}</1>.",
|
||||||
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> Використайте рядок <1>{{address}}</1>.",
|
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> Використайте рядок <1>{{address}}</1>.",
|
||||||
|
|||||||
@@ -298,9 +298,6 @@
|
|||||||
"blocking_mode_nxdomain": "NXDOMAIN: Phản hổi với mã NXDOMAIN",
|
"blocking_mode_nxdomain": "NXDOMAIN: Phản hổi với mã NXDOMAIN",
|
||||||
"blocking_mode_null_ip": "Null IP: Trả lời bằng không địa chỉ IP (0.0.0.0 cho A; :: cho AAAA)",
|
"blocking_mode_null_ip": "Null IP: Trả lời bằng không địa chỉ IP (0.0.0.0 cho A; :: cho AAAA)",
|
||||||
"blocking_mode_custom_ip": "IP tùy chỉnh: Phản hồi với địa chỉ IP đã được tiết lập",
|
"blocking_mode_custom_ip": "IP tùy chỉnh: Phản hồi với địa chỉ IP đã được tiết lập",
|
||||||
"theme_auto": "Tự động",
|
|
||||||
"theme_light": "Light theme",
|
|
||||||
"theme_dark": "Dark theme",
|
|
||||||
"upstream_dns_client_desc": "Nếu để trống trường này, AdGuardHome sẽ sử dụng nhũng máy chủ được cấu hình ở <0>Cấu hình DNS</0>.",
|
"upstream_dns_client_desc": "Nếu để trống trường này, AdGuardHome sẽ sử dụng nhũng máy chủ được cấu hình ở <0>Cấu hình DNS</0>.",
|
||||||
"tracker_source": "Nguồn theo dõi",
|
"tracker_source": "Nguồn theo dõi",
|
||||||
"source_label": "Nguồn",
|
"source_label": "Nguồn",
|
||||||
@@ -454,7 +451,6 @@
|
|||||||
"updates_checked": "Phiên bản mới của AdGuard Home có sẵn",
|
"updates_checked": "Phiên bản mới của AdGuard Home có sẵn",
|
||||||
"updates_version_equal": "AdGuard Home đã được 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ờ",
|
"check_updates_now": "Kiểm tra cập nhật ngay bây giờ",
|
||||||
"version_request_error": "Cập nhật không thành công. Hãy kiểm tra kết nối internet của bạn.",
|
|
||||||
"dns_privacy": "DNS Riêng Tư",
|
"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_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_2": "<0>DNS-over-HTTPS:</0> Sử dụng chuỗi <1>{{address}}</1>.",
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
"resolve_clients_title": "启用客户端的 IP 地址的反向解析",
|
"resolve_clients_title": "启用客户端的 IP 地址的反向解析",
|
||||||
"resolve_clients_desc": "通过发送 PTR 查询到对应的解析器 (本地客户端的私人 DNS 服务器,公共 IP 客户端的上游服务器) 将 IP 地址反向解析成其客户端主机名。",
|
"resolve_clients_desc": "通过发送 PTR 查询到对应的解析器 (本地客户端的私人 DNS 服务器,公共 IP 客户端的上游服务器) 将 IP 地址反向解析成其客户端主机名。",
|
||||||
"use_private_ptr_resolvers_title": "使用私人反向 DNS 解析器",
|
"use_private_ptr_resolvers_title": "使用私人反向 DNS 解析器",
|
||||||
"use_private_ptr_resolvers_desc": "使用这些上游服务器对本地服务的地址执行反向 DNS 查找。 如果禁用,则 AdGuard Home 会以 NXDOMAIN 响应所有此类 PTR 请求,从 DHCP、/etc/hosts 等获知的客户端除外。",
|
"use_private_ptr_resolvers_desc": "使用这些上游服务器对本地服务的地址执行反向 DNS 查找。 如果禁用,则 AdGuard Home会以 NXDOMAIN 响应所有此类PTR请求,从 DHCP、/ etc / hosts 等获知的客户端除外。",
|
||||||
"check_dhcp_servers": "检查 DHCP 服务器",
|
"check_dhcp_servers": "检查 DHCP 服务器",
|
||||||
"save_config": "保存配置",
|
"save_config": "保存配置",
|
||||||
"enabled_dhcp": "DHCP 服务器已启用",
|
"enabled_dhcp": "DHCP 服务器已启用",
|
||||||
@@ -128,7 +128,7 @@
|
|||||||
"number_of_dns_query_days": "过去 {{count}} 天内处理的 DNS 查询总数",
|
"number_of_dns_query_days": "过去 {{count}} 天内处理的 DNS 查询总数",
|
||||||
"number_of_dns_query_days_plural": "在过去的 {{count}} 天内处理了多少个 DNS 查询",
|
"number_of_dns_query_days_plural": "在过去的 {{count}} 天内处理了多少个 DNS 查询",
|
||||||
"number_of_dns_query_24_hours": "过去 24 小时内处理的 DNS 请求总数",
|
"number_of_dns_query_24_hours": "过去 24 小时内处理的 DNS 请求总数",
|
||||||
"number_of_dns_query_blocked_24_hours": "被广告过滤器和 Hosts 黑名单阻止的 DNS 请求总数",
|
"number_of_dns_query_blocked_24_hours": "被广告过滤器和 Hosts 拦截清单阻止的 DNS 请求总数",
|
||||||
"number_of_dns_query_blocked_24_hours_by_sec": "被 AdGuard 安全浏览模块阻止的 DNS 请求总数",
|
"number_of_dns_query_blocked_24_hours_by_sec": "被 AdGuard 安全浏览模块阻止的 DNS 请求总数",
|
||||||
"number_of_dns_query_blocked_24_hours_adult": "被阻止的成人网站总数",
|
"number_of_dns_query_blocked_24_hours_adult": "被阻止的成人网站总数",
|
||||||
"enforced_save_search": "强制安全搜索",
|
"enforced_save_search": "强制安全搜索",
|
||||||
@@ -146,10 +146,10 @@
|
|||||||
"no_servers_specified": "未找到指定的服务器",
|
"no_servers_specified": "未找到指定的服务器",
|
||||||
"general_settings": "常规设置",
|
"general_settings": "常规设置",
|
||||||
"dns_settings": "DNS 设置",
|
"dns_settings": "DNS 设置",
|
||||||
"dns_blocklists": "DNS 黑名单",
|
"dns_blocklists": "DNS 拦截列表",
|
||||||
"dns_allowlists": "DNS 白名单",
|
"dns_allowlists": "DNS 允许列表",
|
||||||
"dns_blocklists_desc": "AdGuard Home将阻止匹配DNS拦截清单的域名",
|
"dns_blocklists_desc": "AdGuard Home将阻止匹配DNS拦截清单的域名",
|
||||||
"dns_allowlists_desc": "来自 DNS 白名单的域名将被允许,即使它们位于任意黑名单中也是如此。",
|
"dns_allowlists_desc": "来自DNS允许列表的域将被允许,即使它们位于任意阻止列表中也是如此",
|
||||||
"custom_filtering_rules": "自定义过滤规则",
|
"custom_filtering_rules": "自定义过滤规则",
|
||||||
"encryption_settings": "加密设置",
|
"encryption_settings": "加密设置",
|
||||||
"dhcp_settings": "DHCP 设置",
|
"dhcp_settings": "DHCP 设置",
|
||||||
@@ -172,28 +172,28 @@
|
|||||||
"list_url_table_header": "清单网址",
|
"list_url_table_header": "清单网址",
|
||||||
"rules_count_table_header": "规则数",
|
"rules_count_table_header": "规则数",
|
||||||
"last_time_updated_table_header": "上次更新时间",
|
"last_time_updated_table_header": "上次更新时间",
|
||||||
"actions_table_header": "操作",
|
"actions_table_header": "活跃状态",
|
||||||
"request_table_header": "请求",
|
"request_table_header": "请求",
|
||||||
"edit_table_action": "编辑",
|
"edit_table_action": "编辑",
|
||||||
"delete_table_action": "删除",
|
"delete_table_action": "删除",
|
||||||
"elapsed": "耗时",
|
"elapsed": "耗时",
|
||||||
"filters_and_hosts_hint": "AdGuard Home 可以解析基础的 adblock 规则和 Hosts 语法。",
|
"filters_and_hosts_hint": "AdGuard Home 可以解析基础的 adblock 规则和 Hosts 语法。",
|
||||||
"no_blocklist_added": "未添加黑名单",
|
"no_blocklist_added": "未添加阻止列表",
|
||||||
"no_whitelist_added": "未添加白名单",
|
"no_whitelist_added": "未添加允许列表",
|
||||||
"add_blocklist": "添加黑名单",
|
"add_blocklist": "添加阻止列表",
|
||||||
"add_allowlist": "添加白名单",
|
"add_allowlist": "添加允许列表",
|
||||||
"cancel_btn": "取消",
|
"cancel_btn": "取消",
|
||||||
"enter_name_hint": "输入名称",
|
"enter_name_hint": "输入名称",
|
||||||
"enter_url_or_path_hint": "请输入URL或列表的绝对路径",
|
"enter_url_or_path_hint": "请输入URL或列表的绝对路径",
|
||||||
"check_updates_btn": "检查更新",
|
"check_updates_btn": "检查更新",
|
||||||
"new_blocklist": "新封锁清单",
|
"new_blocklist": "新封锁清单",
|
||||||
"new_allowlist": "新增白名单",
|
"new_allowlist": "新的允许清单",
|
||||||
"edit_blocklist": "编辑黑名单",
|
"edit_blocklist": "编辑阻止列表",
|
||||||
"edit_allowlist": "编辑白名单",
|
"edit_allowlist": "编辑允许列表",
|
||||||
"choose_blocklist": "选择黑名单",
|
"choose_blocklist": "选择拦截列表",
|
||||||
"choose_allowlist": "选择白名单",
|
"choose_allowlist": "选择允许列表",
|
||||||
"enter_valid_blocklist": "输入有效的黑名单 URL",
|
"enter_valid_blocklist": "输入有效的阻止列表URL",
|
||||||
"enter_valid_allowlist": "输入有效的白名单 URL",
|
"enter_valid_allowlist": "输入有效的允许列表URL",
|
||||||
"form_error_url_format": "无效的 URL 格式",
|
"form_error_url_format": "无效的 URL 格式",
|
||||||
"form_error_url_or_path_format": "无效的 URL 或列表的绝对路径",
|
"form_error_url_or_path_format": "无效的 URL 或列表的绝对路径",
|
||||||
"custom_filter_rules": "自定义过滤器规则",
|
"custom_filter_rules": "自定义过滤器规则",
|
||||||
@@ -269,9 +269,9 @@
|
|||||||
"dns_cache_config_desc": "您可以在此处配置 DNS 缓存",
|
"dns_cache_config_desc": "您可以在此处配置 DNS 缓存",
|
||||||
"blocking_mode": "拦截模式",
|
"blocking_mode": "拦截模式",
|
||||||
"default": "默认",
|
"default": "默认",
|
||||||
"nxdomain": "NXDOMAIN",
|
"nxdomain": "无效域名",
|
||||||
"refused": "REFUSED",
|
"refused": "REFUSED",
|
||||||
"null_ip": "空 IP",
|
"null_ip": "无效 IP",
|
||||||
"custom_ip": "自定义 IP",
|
"custom_ip": "自定义 IP",
|
||||||
"blocking_ipv4": "拦截 IPv4",
|
"blocking_ipv4": "拦截 IPv4",
|
||||||
"blocking_ipv6": "拦截 IPv6",
|
"blocking_ipv6": "拦截 IPv6",
|
||||||
@@ -296,11 +296,8 @@
|
|||||||
"blocking_mode_default": "默认:被 Adblock 规则拦截时反应为零 IP 地址(A记录:0.0.0.0;AAAA记录:::);被/etc/hosts 规则拦截时反应为规则中指定 IP 地址",
|
"blocking_mode_default": "默认:被 Adblock 规则拦截时反应为零 IP 地址(A记录:0.0.0.0;AAAA记录:::);被/etc/hosts 规则拦截时反应为规则中指定 IP 地址",
|
||||||
"blocking_mode_refused": "REFUSED:以 REFUSED 码响应请求",
|
"blocking_mode_refused": "REFUSED:以 REFUSED 码响应请求",
|
||||||
"blocking_mode_nxdomain": "NXDOMAIN:以NXDOMAIN码响应",
|
"blocking_mode_nxdomain": "NXDOMAIN:以NXDOMAIN码响应",
|
||||||
"blocking_mode_null_ip": "空 IP:以零 IP 地址响应(A 记录 0.0.0.0;AAAA 记录 ::)",
|
"blocking_mode_null_ip": "空IP:以零IP地址响应(A记录 0.0.0.0;AAAA记录 ::)",
|
||||||
"blocking_mode_custom_ip": "自定IP:以手动设置的IP地址响应",
|
"blocking_mode_custom_ip": "自定IP:以手动设置的IP地址响应",
|
||||||
"theme_auto": "自动",
|
|
||||||
"theme_light": "浅色主题",
|
|
||||||
"theme_dark": "深色主题",
|
|
||||||
"upstream_dns_client_desc": "如果将此字段留空,AdGuard Home 将使用在<0>DNS设置</0>中配置的服务器。",
|
"upstream_dns_client_desc": "如果将此字段留空,AdGuard Home 将使用在<0>DNS设置</0>中配置的服务器。",
|
||||||
"tracker_source": "追踪器来源",
|
"tracker_source": "追踪器来源",
|
||||||
"source_label": "源",
|
"source_label": "源",
|
||||||
@@ -454,7 +451,6 @@
|
|||||||
"updates_checked": "AdGuard Home 的新版本现在可用",
|
"updates_checked": "AdGuard Home 的新版本现在可用",
|
||||||
"updates_version_equal": "AdGuard Home已经是最新版本",
|
"updates_version_equal": "AdGuard Home已经是最新版本",
|
||||||
"check_updates_now": "立即检查更新",
|
"check_updates_now": "立即检查更新",
|
||||||
"version_request_error": "检查更新失败。请检查您的因特网连接。",
|
|
||||||
"dns_privacy": "DNS 隐私",
|
"dns_privacy": "DNS 隐私",
|
||||||
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> 使用 <1>{{address}}</1> 字符串。",
|
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> 使用 <1>{{address}}</1> 字符串。",
|
||||||
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> 使用 <1>{{address}}</1> 字符串。",
|
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> 使用 <1>{{address}}</1> 字符串。",
|
||||||
@@ -605,7 +601,7 @@
|
|||||||
"filtered": "已过滤",
|
"filtered": "已过滤",
|
||||||
"rewritten": "重写项",
|
"rewritten": "重写项",
|
||||||
"safe_search": "安全搜索",
|
"safe_search": "安全搜索",
|
||||||
"blocklist": "黑名单",
|
"blocklist": "拦截列表",
|
||||||
"milliseconds_abbreviation": "毫秒",
|
"milliseconds_abbreviation": "毫秒",
|
||||||
"cache_size": "缓存大小",
|
"cache_size": "缓存大小",
|
||||||
"cache_size_desc": "DNS 缓存大小(单位:字节)。要关闭缓存,请留空。",
|
"cache_size_desc": "DNS 缓存大小(单位:字节)。要关闭缓存,请留空。",
|
||||||
@@ -626,7 +622,7 @@
|
|||||||
"filter_category_general_desc": "在大多数设备上阻止跟踪和广告的列表",
|
"filter_category_general_desc": "在大多数设备上阻止跟踪和广告的列表",
|
||||||
"filter_category_security_desc": "专用于拦截恶意软件、钓鱼或欺诈域名的列表",
|
"filter_category_security_desc": "专用于拦截恶意软件、钓鱼或欺诈域名的列表",
|
||||||
"filter_category_regional_desc": "专注于区域广告和跟踪服务器的列表",
|
"filter_category_regional_desc": "专注于区域广告和跟踪服务器的列表",
|
||||||
"filter_category_other_desc": "其他黑名单",
|
"filter_category_other_desc": "其他阻止列表",
|
||||||
"setup_config_to_enable_dhcp_server": "设置配置以启用 DHCP 服务器",
|
"setup_config_to_enable_dhcp_server": "设置配置以启用 DHCP 服务器",
|
||||||
"original_response": "原始响应",
|
"original_response": "原始响应",
|
||||||
"click_to_view_queries": "点击查看查询",
|
"click_to_view_queries": "点击查看查询",
|
||||||
|
|||||||
@@ -38,6 +38,8 @@
|
|||||||
"form_error_required": "必要欄位",
|
"form_error_required": "必要欄位",
|
||||||
"form_error_ip4_format": "無效的 IPv4 格式",
|
"form_error_ip4_format": "無效的 IPv4 格式",
|
||||||
"form_error_ip6_format": "無效的 IPv6 格式",
|
"form_error_ip6_format": "無效的 IPv6 格式",
|
||||||
|
"form_error_ip4_range_start_format": "無效的 IPv4 範圍起始位址",
|
||||||
|
"form_error_ip4_range_end_format": "無效的 IPv4 範圍結束位址",
|
||||||
"form_error_ip4_gateway_format": "閘道的 IPv4 位址無效",
|
"form_error_ip4_gateway_format": "閘道的 IPv4 位址無效",
|
||||||
"form_error_ip_format": "無效的 IP 位址",
|
"form_error_ip_format": "無效的 IP 位址",
|
||||||
"form_error_mac_format": "無效的 「MAC 位址」格式",
|
"form_error_mac_format": "無效的 「MAC 位址」格式",
|
||||||
|
|||||||
@@ -298,9 +298,6 @@
|
|||||||
"blocking_mode_nxdomain": "不存在的網域(NXDOMAIN):以 NXDOMAIN 碼回覆",
|
"blocking_mode_nxdomain": "不存在的網域(NXDOMAIN):以 NXDOMAIN 碼回覆",
|
||||||
"blocking_mode_null_ip": "無效的 IP:以零值 IP 位址(0.0.0.0 供 A;:: 供 AAAA)回覆",
|
"blocking_mode_null_ip": "無效的 IP:以零值 IP 位址(0.0.0.0 供 A;:: 供 AAAA)回覆",
|
||||||
"blocking_mode_custom_ip": "自訂的 IP:以一組手動地被設定的 IP 位址回覆",
|
"blocking_mode_custom_ip": "自訂的 IP:以一組手動地被設定的 IP 位址回覆",
|
||||||
"theme_auto": "自動",
|
|
||||||
"theme_light": "淺色",
|
|
||||||
"theme_dark": "深色",
|
|
||||||
"upstream_dns_client_desc": "如果您將此欄位留空,AdGuard Home 將使用在 <0>DNS 設定</0>中被配置的伺服器。",
|
"upstream_dns_client_desc": "如果您將此欄位留空,AdGuard Home 將使用在 <0>DNS 設定</0>中被配置的伺服器。",
|
||||||
"tracker_source": "追蹤器來源",
|
"tracker_source": "追蹤器來源",
|
||||||
"source_label": "來源",
|
"source_label": "來源",
|
||||||
@@ -454,7 +451,6 @@
|
|||||||
"updates_checked": "AdGuard Home 的新版本為可用的",
|
"updates_checked": "AdGuard Home 的新版本為可用的",
|
||||||
"updates_version_equal": "AdGuard Home 為最新的",
|
"updates_version_equal": "AdGuard Home 為最新的",
|
||||||
"check_updates_now": "立即檢查更新",
|
"check_updates_now": "立即檢查更新",
|
||||||
"version_request_error": "更新檢查已失敗。請檢查您的網際網路連線。",
|
|
||||||
"dns_privacy": "DNS 隱私",
|
"dns_privacy": "DNS 隱私",
|
||||||
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0>使用 <1>{{address}}</1> 字串。",
|
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0>使用 <1>{{address}}</1> 字串。",
|
||||||
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0>使用 <1>{{address}}</1> 字串。",
|
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0>使用 <1>{{address}}</1> 字串。",
|
||||||
|
|||||||
@@ -141,7 +141,7 @@ export const getVersion = (recheck = false) => async (dispatch, getState) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
dispatch(addErrorToast({ error: 'version_request_error' }));
|
dispatch(addErrorToast({ error }));
|
||||||
dispatch(getVersionFailure());
|
dispatch(getVersionFailure());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -363,18 +363,18 @@ export const changeLanguage = (lang) => async (dispatch) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export const changeThemeRequest = createAction('CHANGE_THEME_REQUEST');
|
export const getLanguageRequest = createAction('GET_LANGUAGE_REQUEST');
|
||||||
export const changeThemeFailure = createAction('CHANGE_THEME_FAILURE');
|
export const getLanguageFailure = createAction('GET_LANGUAGE_FAILURE');
|
||||||
export const changeThemeSuccess = createAction('CHANGE_THEME_SUCCESS');
|
export const getLanguageSuccess = createAction('GET_LANGUAGE_SUCCESS');
|
||||||
|
|
||||||
export const changeTheme = (theme) => async (dispatch) => {
|
export const getLanguage = () => async (dispatch) => {
|
||||||
dispatch(changeThemeRequest());
|
dispatch(getLanguageRequest());
|
||||||
try {
|
try {
|
||||||
await apiClient.changeTheme({ theme });
|
const langSettings = await apiClient.getCurrentLanguage();
|
||||||
dispatch(changeThemeSuccess({ theme }));
|
dispatch(getLanguageSuccess(langSettings.language));
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
dispatch(addErrorToast({ error }));
|
dispatch(addErrorToast({ error }));
|
||||||
dispatch(changeThemeFailure());
|
dispatch(getLanguageFailure());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,8 @@
|
|||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
|
|
||||||
import { getPathWithQueryString } from '../helpers/helpers';
|
import { getPathWithQueryString } from '../helpers/helpers';
|
||||||
import {
|
import { QUERY_LOGS_PAGE_LIMIT, HTML_PAGES, R_PATH_LAST_PART } from '../helpers/constants';
|
||||||
QUERY_LOGS_PAGE_LIMIT, HTML_PAGES, R_PATH_LAST_PART, THEMES,
|
|
||||||
} from '../helpers/constants';
|
|
||||||
import { BASE_URL } from '../../constants';
|
import { BASE_URL } from '../../constants';
|
||||||
import i18n from '../i18n';
|
|
||||||
import { LANGUAGES } from '../helpers/twosky';
|
|
||||||
|
|
||||||
class Api {
|
class Api {
|
||||||
baseUrl = BASE_URL;
|
baseUrl = BASE_URL;
|
||||||
@@ -228,21 +224,21 @@ class Api {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Language
|
// Language
|
||||||
|
CURRENT_LANGUAGE = { path: 'i18n/current_language', method: 'GET' };
|
||||||
|
|
||||||
async changeLanguage(config) {
|
CHANGE_LANGUAGE = { path: 'i18n/change_language', method: 'POST' };
|
||||||
const profile = await this.getProfile();
|
|
||||||
profile.language = config.language;
|
|
||||||
|
|
||||||
return this.setProfile(profile);
|
getCurrentLanguage() {
|
||||||
|
const { path, method } = this.CURRENT_LANGUAGE;
|
||||||
|
return this.makeRequest(path, method);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Theme
|
changeLanguage(config) {
|
||||||
|
const { path, method } = this.CHANGE_LANGUAGE;
|
||||||
async changeTheme(config) {
|
const parameters = {
|
||||||
const profile = await this.getProfile();
|
data: config,
|
||||||
profile.theme = config.theme;
|
};
|
||||||
|
return this.makeRequest(path, method, parameters);
|
||||||
return this.setProfile(profile);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// DHCP
|
// DHCP
|
||||||
@@ -575,24 +571,11 @@ class Api {
|
|||||||
// Profile
|
// Profile
|
||||||
GET_PROFILE = { path: 'profile', method: 'GET' };
|
GET_PROFILE = { path: 'profile', method: 'GET' };
|
||||||
|
|
||||||
UPDATE_PROFILE = { path: 'profile/update', method: 'PUT' };
|
|
||||||
|
|
||||||
getProfile() {
|
getProfile() {
|
||||||
const { path, method } = this.GET_PROFILE;
|
const { path, method } = this.GET_PROFILE;
|
||||||
return this.makeRequest(path, method);
|
return this.makeRequest(path, method);
|
||||||
}
|
}
|
||||||
|
|
||||||
setProfile(data) {
|
|
||||||
const theme = data.theme ? data.theme : THEMES.auto;
|
|
||||||
const defaultLanguage = i18n.language ? i18n.language : LANGUAGES.en;
|
|
||||||
const language = data.language ? data.language : defaultLanguage;
|
|
||||||
|
|
||||||
const { path, method } = this.UPDATE_PROFILE;
|
|
||||||
const config = { data: { theme, language } };
|
|
||||||
|
|
||||||
return this.makeRequest(path, method, config);
|
|
||||||
}
|
|
||||||
|
|
||||||
// DNS config
|
// DNS config
|
||||||
GET_DNS_CONFIG = { path: 'dns_info', method: 'GET' };
|
GET_DNS_CONFIG = { path: 'dns_info', method: 'GET' };
|
||||||
|
|
||||||
|
|||||||
@@ -1,74 +1,11 @@
|
|||||||
:root {
|
:root {
|
||||||
--black: #131313;
|
|
||||||
--bgcolor: #f5f7fb;
|
|
||||||
--mcolor: #495057;
|
|
||||||
--scolor: rgba(74, 74, 74, 0.7);
|
|
||||||
--border-color: rgba(0, 40, 100, 0.12);
|
|
||||||
--header-bgcolor: #fff;
|
|
||||||
--card-bgcolor: #fff;
|
|
||||||
--card-border-color: rgba(0, 40, 100, 0.12);
|
|
||||||
--ctrl-bgcolor: #fff;
|
|
||||||
--ctrl-select-bgcolor: rgba(69, 79, 94, 0.12);
|
|
||||||
--ctrl-dropdown-color: #212529;
|
|
||||||
--ctrl-dropdown-bgcolor-focus: #f8f9fa;
|
|
||||||
--ctrl-dropdown-color-focus: #16181b;
|
|
||||||
--btn-success-bgcolor: #5eba00;
|
|
||||||
--form-disabled-bgcolor: #f8f9fa;
|
|
||||||
--form-disabled-color: #495057;
|
|
||||||
--rt-nodata-bgcolor: rgba(255,255,255,0.8);
|
|
||||||
--rt-nodata-color: rgba(0,0,0,0.5);
|
|
||||||
--modal-overlay-bgcolor: rgba(255, 255, 255, 0.75);
|
|
||||||
--logs__table-bgcolor: #fff;
|
|
||||||
--logs__row--blue-bgcolor: #e5effd;
|
|
||||||
--logs__row--white-bgcolor: #fff;
|
|
||||||
--detailed-info-color: #888888;
|
|
||||||
--yellow-pale: rgba(247, 181, 0, 0.1);
|
--yellow-pale: rgba(247, 181, 0, 0.1);
|
||||||
--green79: #67b279;
|
--green79: #67b279;
|
||||||
--gray-a5: #a5a5a5;
|
--gray-a5: #a5a5a5;
|
||||||
--gray-d8: #d8d8d8;
|
--gray-d8: #d8d8d8;
|
||||||
--gray-f3: #f3f3f3;
|
--gray-f3: #f3f3f3;
|
||||||
--loading-bg: rgba(255, 255, 255, 0.48);
|
|
||||||
--font-family-monospace: Monaco, Menlo, "Ubuntu Mono", Consolas, source-code-pro, monospace;
|
--font-family-monospace: Monaco, Menlo, "Ubuntu Mono", Consolas, source-code-pro, monospace;
|
||||||
--font-size-disable-autozoom: 1rem;
|
--font-size-disable-autozoom: 1rem;
|
||||||
--alert-message-color: #24426c;
|
|
||||||
--alert-message-border: #cbdbf2;
|
|
||||||
--alert-message-bg: #dae5f5;
|
|
||||||
--checkbox-bg: #e2e2e2;
|
|
||||||
--radio-bg: #ffffff;
|
|
||||||
}
|
|
||||||
|
|
||||||
[data-theme="dark"] {
|
|
||||||
--black: #ffffff;
|
|
||||||
--bgcolor: #131313;
|
|
||||||
--mcolor: #e6e6e6;
|
|
||||||
--scolor: #a5a5a5;
|
|
||||||
--header-bgcolor: #131313;
|
|
||||||
--border-color: #222;
|
|
||||||
--card-bgcolor: #1c1c1c;
|
|
||||||
--card-border-color: #3d3d3d;
|
|
||||||
--ctrl-bgcolor: #1c1c1c;
|
|
||||||
--ctrl-select-bgcolor: #3d3d3d;
|
|
||||||
--ctrl-dropdown-color: #fff;
|
|
||||||
--ctrl-dropdown-bgcolor-focus: #000;
|
|
||||||
--ctrl-dropdown-color-focus: #fff;
|
|
||||||
--btn-success-bgcolor: #67b279;
|
|
||||||
--form-disabled-bgcolor: #2d2d2d;
|
|
||||||
--form-disabled-color: #a5a5a5;
|
|
||||||
--logs__text-color: #f3f3f3;
|
|
||||||
--rt-nodata-bgcolor: #1c1c1c;
|
|
||||||
--rt-nodata-color: #fff;
|
|
||||||
--modal-overlay-bgcolor: rgba(19, 19, 19, 0.75);
|
|
||||||
--logs__table-bgcolor: #3d3d3d;
|
|
||||||
--logs__row--blue-bgcolor: #467fcf;
|
|
||||||
--logs__row--white-bgcolor: #1c1c1c;
|
|
||||||
--detailed-info-color: #fff;
|
|
||||||
--gray300: #f3f3f3;
|
|
||||||
--loading-bg: #131313;
|
|
||||||
--alert-message-color: #e6e6e6;
|
|
||||||
--alert-message-border: #363648;
|
|
||||||
--alert-message-bg: #363648;
|
|
||||||
--checkbox-bg: #a4a4a4;
|
|
||||||
--radio-bg: #a4a4a4;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
|
|||||||
@@ -20,13 +20,8 @@ import EncryptionTopline from '../ui/EncryptionTopline';
|
|||||||
import Icons from '../ui/Icons';
|
import Icons from '../ui/Icons';
|
||||||
import i18n from '../../i18n';
|
import i18n from '../../i18n';
|
||||||
import Loading from '../ui/Loading';
|
import Loading from '../ui/Loading';
|
||||||
import {
|
import { FILTERS_URLS, MENU_URLS, SETTINGS_URLS } from '../../helpers/constants';
|
||||||
FILTERS_URLS,
|
import { getLogsUrlParams, setHtmlLangAttr } from '../../helpers/helpers';
|
||||||
MENU_URLS,
|
|
||||||
SETTINGS_URLS,
|
|
||||||
THEMES,
|
|
||||||
} from '../../helpers/constants';
|
|
||||||
import { getLogsUrlParams, setHtmlLangAttr, setUITheme } from '../../helpers/helpers';
|
|
||||||
import Header from '../Header';
|
import Header from '../Header';
|
||||||
import { changeLanguage, getDnsStatus } from '../../actions';
|
import { changeLanguage, getDnsStatus } from '../../actions';
|
||||||
|
|
||||||
@@ -114,7 +109,6 @@ const App = () => {
|
|||||||
isCoreRunning,
|
isCoreRunning,
|
||||||
isUpdateAvailable,
|
isUpdateAvailable,
|
||||||
processing,
|
processing,
|
||||||
theme,
|
|
||||||
} = useSelector((state) => state.dashboard, shallowEqual);
|
} = useSelector((state) => state.dashboard, shallowEqual);
|
||||||
|
|
||||||
const { processing: processingEncryption } = useSelector((
|
const { processing: processingEncryption } = useSelector((
|
||||||
@@ -144,41 +138,6 @@ const App = () => {
|
|||||||
setLanguage();
|
setLanguage();
|
||||||
}, [language]);
|
}, [language]);
|
||||||
|
|
||||||
const handleAutoTheme = (e, accountTheme) => {
|
|
||||||
if (accountTheme !== THEMES.auto) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (e.matches) {
|
|
||||||
setUITheme(THEMES.dark);
|
|
||||||
} else {
|
|
||||||
setUITheme(THEMES.light);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (theme !== THEMES.auto) {
|
|
||||||
setUITheme(theme);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const colorSchemeMedia = window.matchMedia('(prefers-color-scheme: dark)');
|
|
||||||
const prefersDark = colorSchemeMedia.matches;
|
|
||||||
setUITheme(prefersDark ? THEMES.dark : THEMES.light);
|
|
||||||
|
|
||||||
if (colorSchemeMedia.addEventListener !== undefined) {
|
|
||||||
colorSchemeMedia.addEventListener('change', (e) => {
|
|
||||||
handleAutoTheme(e, theme);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
// Deprecated addListener for older versions of Safari.
|
|
||||||
colorSchemeMedia.addListener((e) => {
|
|
||||||
handleAutoTheme(e, theme);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, [theme]);
|
|
||||||
|
|
||||||
const reloadPage = () => {
|
const reloadPage = () => {
|
||||||
window.location.reload();
|
window.location.reload();
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -54,7 +54,7 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
border-top: 1px solid var(--card-border-color);
|
border-top: 1px solid #dee2e6;
|
||||||
padding: 0.75rem 1.5rem;
|
padding: 0.75rem 1.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ const Dashboard = ({
|
|||||||
title={t('refresh_btn')}
|
title={t('refresh_btn')}
|
||||||
onClick={() => getAllStats()}
|
onClick={() => getAllStats()}
|
||||||
>
|
>
|
||||||
<svg className="icons icon12">
|
<svg className="icons">
|
||||||
<use xlinkHref="#refresh" />
|
<use xlinkHref="#refresh" />
|
||||||
</svg>
|
</svg>
|
||||||
</button>;
|
</button>;
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ class Table extends Component {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<svg className="icons icon12">
|
<svg className="icons">
|
||||||
<use xlinkHref="#edit" />
|
<use xlinkHref="#edit" />
|
||||||
</svg>
|
</svg>
|
||||||
</button>
|
</button>
|
||||||
@@ -110,7 +110,7 @@ class Table extends Component {
|
|||||||
onClick={() => handleDelete(url)}
|
onClick={() => handleDelete(url)}
|
||||||
title={t('delete_table_action')}
|
title={t('delete_table_action')}
|
||||||
>
|
>
|
||||||
<svg className="icons icon12">
|
<svg className="icons">
|
||||||
<use xlinkHref="#delete" />
|
<use xlinkHref="#delete" />
|
||||||
</svg>
|
</svg>
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
.nav-tabs .nav-link.active {
|
.nav-tabs .nav-link.active {
|
||||||
border-color: var(--btn-success-bgcolor);
|
border-color: var(--green-74);
|
||||||
color: var(--btn-success-bgcolor);
|
color: var(--green-74);
|
||||||
background: transparent;
|
background: transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-tabs .nav-link.active:hover {
|
.nav-tabs .nav-link.active:hover {
|
||||||
border-color: #4b9400;
|
border-color: #58a273;
|
||||||
color: #4b9400;
|
color: #58a273;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-icon {
|
.nav-icon {
|
||||||
@@ -47,7 +47,7 @@
|
|||||||
width: 250px;
|
width: 250px;
|
||||||
height: 100vh;
|
height: 100vh;
|
||||||
transition: transform 0.3s ease;
|
transition: transform 0.3s ease;
|
||||||
background-color: var(--header-bgcolor);
|
background-color: #fff;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -162,7 +162,7 @@ const ClientCell = ({
|
|||||||
{content && (
|
{content && (
|
||||||
<button className={buttonArrowClass} disabled={processingRules}>
|
<button className={buttonArrowClass} disabled={processingRules}>
|
||||||
<IconTooltip
|
<IconTooltip
|
||||||
className="icon24"
|
className="h-100"
|
||||||
tooltipClass="button-action--arrow-option-container"
|
tooltipClass="button-action--arrow-option-container"
|
||||||
xlinkHref="chevron-down"
|
xlinkHref="chevron-down"
|
||||||
triggerClass="button-action--icon"
|
triggerClass="button-action--icon"
|
||||||
|
|||||||
@@ -4,8 +4,7 @@
|
|||||||
box-shadow: 2px 4px 8px rgba(0, 0, 0, 0.2);
|
box-shadow: 2px 4px 8px rgba(0, 0, 0, 0.2);
|
||||||
border-radius: 4px !important;
|
border-radius: 4px !important;
|
||||||
pointer-events: auto !important;
|
pointer-events: auto !important;
|
||||||
background-color: var(--ctrl-bgcolor);
|
background-color: var(--white);
|
||||||
color: var(--mcolor);
|
|
||||||
z-index: 102;
|
z-index: 102;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
max-height: 100%;
|
max-height: 100%;
|
||||||
|
|||||||
@@ -129,6 +129,7 @@ const Form = (props) => {
|
|||||||
|
|
||||||
const onInputClear = async () => {
|
const onInputClear = async () => {
|
||||||
setIsLoading(true);
|
setIsLoading(true);
|
||||||
|
setDebouncedSearch(DEFAULT_LOGS_FILTER[FORM_NAMES.search]);
|
||||||
change(FORM_NAMES.search, DEFAULT_LOGS_FILTER[FORM_NAMES.search]);
|
change(FORM_NAMES.search, DEFAULT_LOGS_FILTER[FORM_NAMES.search]);
|
||||||
setIsLoading(false);
|
setIsLoading(false);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -24,12 +24,6 @@
|
|||||||
--option-border-radius: 4px;
|
--option-border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
[data-theme="dark"] {
|
|
||||||
--red: rgba(223, 56, 18, 0.25);
|
|
||||||
--green-pale: rgba(103, 178, 121, 0.25);
|
|
||||||
--yellow: rgba(247, 181, 0, 0.2);
|
|
||||||
}
|
|
||||||
|
|
||||||
.logs__text {
|
.logs__text {
|
||||||
padding: 0 1px;
|
padding: 0 1px;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
@@ -37,19 +31,11 @@
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
font-size: 1rem;
|
font-size: 1rem;
|
||||||
font-family: var(--font-family-sans-serif);
|
font-family: var(--font-family-sans-serif);
|
||||||
color: var(--logs__text-color);
|
color: var(--gray-4d);
|
||||||
letter-spacing: 0;
|
letter-spacing: 0;
|
||||||
line-height: 1.5rem;
|
line-height: 1.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
[data-theme="dark"] .logs__text a {
|
|
||||||
color: var(--gray-f3);
|
|
||||||
}
|
|
||||||
|
|
||||||
[data-theme="dark"] .logs__text a:hover {
|
|
||||||
color: var(--gray-f3);
|
|
||||||
}
|
|
||||||
|
|
||||||
.logs__text--bold {
|
.logs__text--bold {
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
}
|
}
|
||||||
@@ -62,7 +48,7 @@
|
|||||||
.detailed-info {
|
.detailed-info {
|
||||||
font-size: 0.8rem;
|
font-size: 0.8rem;
|
||||||
line-height: 1.4;
|
line-height: 1.4;
|
||||||
color: var(--detailed-info-color);
|
color: #888888;
|
||||||
}
|
}
|
||||||
|
|
||||||
.logs__text--link {
|
.logs__text--link {
|
||||||
@@ -80,10 +66,6 @@
|
|||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
[data-theme=dark] .icon--selected {
|
|
||||||
opacity: 0.75;
|
|
||||||
}
|
|
||||||
|
|
||||||
.text-pre {
|
.text-pre {
|
||||||
white-space: pre-wrap !important;
|
white-space: pre-wrap !important;
|
||||||
overflow-wrap: break-word;
|
overflow-wrap: break-word;
|
||||||
@@ -106,16 +88,6 @@
|
|||||||
max-height: 100% !important;
|
max-height: 100% !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.icon24 {
|
|
||||||
width: 24px;
|
|
||||||
height: 24px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.icon12 {
|
|
||||||
width: 12px;
|
|
||||||
height: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cursor--pointer {
|
.cursor--pointer {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
@@ -140,10 +112,6 @@
|
|||||||
background-color: transparent !important;
|
background-color: transparent !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
[data-theme="dark"] .form-control--transparent option {
|
|
||||||
background-color: var(--card-bgcolor);
|
|
||||||
}
|
|
||||||
|
|
||||||
.input-group-search {
|
.input-group-search {
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
position: relative;
|
position: relative;
|
||||||
@@ -237,12 +205,6 @@
|
|||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media screen and (min-width: 1025px) {
|
|
||||||
.logs__cell--client {
|
|
||||||
width: 13rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.logs__cell--header__container > .logs__cell--header__item {
|
.logs__cell--header__container > .logs__cell--header__item {
|
||||||
border-right: 0;
|
border-right: 0;
|
||||||
font-size: 1rem;
|
font-size: 1rem;
|
||||||
@@ -321,6 +283,7 @@
|
|||||||
height: 100%;
|
height: 100%;
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.button-action:active {
|
.button-action:active {
|
||||||
@@ -377,10 +340,6 @@
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
[data-theme="dark"] .tooltip-custom__container .button-action--arrow-option:not(:disabled):hover {
|
|
||||||
background: var(--ctrl-dropdown-bgcolor-focus);
|
|
||||||
}
|
|
||||||
|
|
||||||
.button-action--arrow-option-container {
|
.button-action--arrow-option-container {
|
||||||
overflow: visible;
|
overflow: visible;
|
||||||
transform-origin: left;
|
transform-origin: left;
|
||||||
@@ -410,11 +369,7 @@
|
|||||||
|
|
||||||
/* QUERY_STATUS_COLORS */
|
/* QUERY_STATUS_COLORS */
|
||||||
.logs__row--blue {
|
.logs__row--blue {
|
||||||
background-color: var(--logs__row--blue-bgcolor);
|
background-color: var(--blue);
|
||||||
}
|
|
||||||
|
|
||||||
[data-theme="dark"] .logs__row--blue .logs__text--link {
|
|
||||||
color: var(--white);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.logs__row--green {
|
.logs__row--green {
|
||||||
@@ -426,7 +381,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.logs__row--white {
|
.logs__row--white {
|
||||||
background-color: var(--logs__row--white-bgcolor);
|
background-color: var(--white);
|
||||||
}
|
}
|
||||||
|
|
||||||
.logs__row--yellow {
|
.logs__row--yellow {
|
||||||
@@ -434,8 +389,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.logs__no-data {
|
.logs__no-data {
|
||||||
color: var(--mcolor);
|
color: var(--gray-4d);
|
||||||
background-color: var(--logs__table-bgcolor);
|
background-color: var(--white80);
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
@@ -448,7 +403,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.logs__table {
|
.logs__table {
|
||||||
background-color: var(--logs__table-bgcolor);
|
background-color: var(--white);
|
||||||
border: 0;
|
border: 0;
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
min-height: 43rem;
|
min-height: 43rem;
|
||||||
@@ -527,10 +482,6 @@
|
|||||||
color: var(--green79);
|
color: var(--green79);
|
||||||
}
|
}
|
||||||
|
|
||||||
[data-theme="dark"] .logs__question.icon--lightgray {
|
|
||||||
color: var(--gray-f3);
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 1024px) {
|
@media (max-width: 1024px) {
|
||||||
.logs__question {
|
.logs__question {
|
||||||
display: none;
|
display: none;
|
||||||
@@ -540,8 +491,3 @@
|
|||||||
.logs__modal {
|
.logs__modal {
|
||||||
max-width: 720px;
|
max-width: 720px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.logs__modal-wrap {
|
|
||||||
padding: 1rem 1.5rem;
|
|
||||||
background-color: var(--card-bgcolor);
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -195,11 +195,11 @@ const Logs = () => {
|
|||||||
onRequestClose={closeModal}
|
onRequestClose={closeModal}
|
||||||
style={{
|
style={{
|
||||||
content: {
|
content: {
|
||||||
width: 'calc(100% - 32px)',
|
width: '100%',
|
||||||
height: 'fit-content',
|
height: 'fit-content',
|
||||||
left: '50%',
|
left: '50%',
|
||||||
top: 47,
|
top: 47,
|
||||||
padding: '0',
|
padding: '1rem 1.5rem 1rem',
|
||||||
maxWidth: '720px',
|
maxWidth: '720px',
|
||||||
transform: 'translateX(-50%)',
|
transform: 'translateX(-50%)',
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -290,7 +290,7 @@ const ClientsTable = ({
|
|||||||
disabled={processingUpdating}
|
disabled={processingUpdating}
|
||||||
title={t('edit_table_action')}
|
title={t('edit_table_action')}
|
||||||
>
|
>
|
||||||
<svg className="icons icon12">
|
<svg className="icons">
|
||||||
<use xlinkHref="#edit" />
|
<use xlinkHref="#edit" />
|
||||||
</svg>
|
</svg>
|
||||||
</button>
|
</button>
|
||||||
@@ -301,7 +301,7 @@ const ClientsTable = ({
|
|||||||
disabled={processingDeleting}
|
disabled={processingDeleting}
|
||||||
title={t('delete_table_action')}
|
title={t('delete_table_action')}
|
||||||
>
|
>
|
||||||
<svg className="icons icon12">
|
<svg className="icons">
|
||||||
<use xlinkHref="#delete" />
|
<use xlinkHref="#delete" />
|
||||||
</svg>
|
</svg>
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
margin-bottom: 15px;
|
margin-bottom: 15px;
|
||||||
padding: 10px 15px;
|
padding: 10px 15px;
|
||||||
border: 1px solid var(--card-border-color);
|
border: 1px solid #eee;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
@@ -54,12 +54,6 @@
|
|||||||
color: #495057;
|
color: #495057;
|
||||||
}
|
}
|
||||||
|
|
||||||
.service__icon svg {
|
|
||||||
width: 20px;
|
|
||||||
height: 20px;
|
|
||||||
fill: #495057;
|
|
||||||
}
|
|
||||||
|
|
||||||
.service--global .service__icon {
|
.service--global .service__icon {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -77,7 +77,7 @@
|
|||||||
.form__desc {
|
.form__desc {
|
||||||
margin-top: 10px;
|
margin-top: 10px;
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
color: var(--scolor);
|
color: rgba(74, 74, 74, 0.7);
|
||||||
}
|
}
|
||||||
|
|
||||||
.form__desc--top {
|
.form__desc--top {
|
||||||
|
|||||||
@@ -48,7 +48,7 @@
|
|||||||
height: 20px;
|
height: 20px;
|
||||||
min-width: 20px;
|
min-width: 20px;
|
||||||
margin-right: 10px;
|
margin-right: 10px;
|
||||||
background-color: var(--checkbox-bg);
|
background-color: #e2e2e2;
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
background-position: center center;
|
background-position: center center;
|
||||||
background-size: 12px 10px;
|
background-size: 12px 10px;
|
||||||
@@ -107,5 +107,5 @@
|
|||||||
.checkbox__label-subtitle {
|
.checkbox__label-subtitle {
|
||||||
display: block;
|
display: block;
|
||||||
line-height: 1.5;
|
line-height: 1.5;
|
||||||
color: var(--scolor);
|
color: rgba(74, 74, 74, 0.7);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
.dropdown-item.active,
|
.dropdown-item.active,
|
||||||
.dropdown-item:active {
|
.dropdown-item:active {
|
||||||
background-color: var(--btn-success-bgcolor);
|
background-color: var(--green-74);
|
||||||
}
|
}
|
||||||
|
|
||||||
.dropdown-menu {
|
.dropdown-menu {
|
||||||
|
|||||||
@@ -18,11 +18,6 @@
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.footer__column--theme {
|
|
||||||
min-width: 220px;
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer__column--language {
|
.footer__column--language {
|
||||||
min-width: 220px;
|
min-width: 220px;
|
||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
@@ -54,11 +49,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.footer__column--language {
|
.footer__column--language {
|
||||||
min-width: initial;
|
|
||||||
margin-left: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer__column--theme {
|
|
||||||
min-width: initial;
|
min-width: initial;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,17 +1,15 @@
|
|||||||
import React, { useState, useEffect } from 'react';
|
import React from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import { useDispatch, useSelector } from 'react-redux';
|
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
|
|
||||||
import { REPOSITORY, PRIVACY_POLICY_LINK, THEMES } from '../../helpers/constants';
|
import { REPOSITORY, PRIVACY_POLICY_LINK } from '../../helpers/constants';
|
||||||
import { LANGUAGES } from '../../helpers/twosky';
|
import { LANGUAGES } from '../../helpers/twosky';
|
||||||
import i18n from '../../i18n';
|
import i18n from '../../i18n';
|
||||||
|
|
||||||
import Version from './Version';
|
import Version from './Version';
|
||||||
import './Footer.css';
|
import './Footer.css';
|
||||||
import './Select.css';
|
import './Select.css';
|
||||||
import { setHtmlLangAttr, setUITheme } from '../../helpers/helpers';
|
import { setHtmlLangAttr } from '../../helpers/helpers';
|
||||||
import { changeTheme } from '../../actions';
|
|
||||||
|
|
||||||
const linksData = [
|
const linksData = [
|
||||||
{
|
{
|
||||||
@@ -31,18 +29,6 @@ const linksData = [
|
|||||||
|
|
||||||
const Footer = () => {
|
const Footer = () => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const dispatch = useDispatch();
|
|
||||||
|
|
||||||
const currentTheme = useSelector((state) => (state.dashboard ? state.dashboard.theme : 'auto'));
|
|
||||||
const profileName = useSelector((state) => (state.dashboard ? state.dashboard.name : ''));
|
|
||||||
const isLoggedIn = profileName !== '';
|
|
||||||
const [currentThemeLocal, setCurrentThemeLocal] = useState('auto');
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (!isLoggedIn) {
|
|
||||||
setUITheme(window.matchMedia('(prefers-color-scheme: dark)').matches ? THEMES.dark : THEMES.light);
|
|
||||||
}
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
const getYear = () => {
|
const getYear = () => {
|
||||||
const today = new Date();
|
const today = new Date();
|
||||||
@@ -55,17 +41,6 @@ const Footer = () => {
|
|||||||
setHtmlLangAttr(value);
|
setHtmlLangAttr(value);
|
||||||
};
|
};
|
||||||
|
|
||||||
const onThemeChanged = (event) => {
|
|
||||||
const { value } = event.target;
|
|
||||||
dispatch(changeTheme(value));
|
|
||||||
};
|
|
||||||
|
|
||||||
const onThemeChangedLocal = (event) => {
|
|
||||||
const { value } = event.target;
|
|
||||||
setUITheme(value);
|
|
||||||
setCurrentThemeLocal(value);
|
|
||||||
};
|
|
||||||
|
|
||||||
const renderCopyright = () => <div className="footer__column">
|
const renderCopyright = () => <div className="footer__column">
|
||||||
<div className="footer__copyright">
|
<div className="footer__copyright">
|
||||||
{t('copyright')} © {getYear()}{' '}
|
{t('copyright')} © {getYear()}{' '}
|
||||||
@@ -83,35 +58,6 @@ const Footer = () => {
|
|||||||
{t(name)}
|
{t(name)}
|
||||||
</a>);
|
</a>);
|
||||||
|
|
||||||
const themeSelectOptions = () => (
|
|
||||||
Object.values(THEMES)
|
|
||||||
.map((theme) => (
|
|
||||||
<option key={theme} value={theme}>
|
|
||||||
{t(`theme_${theme}`)}
|
|
||||||
</option>
|
|
||||||
))
|
|
||||||
);
|
|
||||||
|
|
||||||
const renderThemeSelect = () => (
|
|
||||||
<select
|
|
||||||
className="form-control select select--theme"
|
|
||||||
value={currentTheme}
|
|
||||||
onChange={onThemeChanged}
|
|
||||||
>
|
|
||||||
{themeSelectOptions()}
|
|
||||||
</select>
|
|
||||||
);
|
|
||||||
|
|
||||||
const renderThemeSelectLocal = () => (
|
|
||||||
<select
|
|
||||||
className="form-control select select--theme"
|
|
||||||
value={currentThemeLocal}
|
|
||||||
onChange={onThemeChangedLocal}
|
|
||||||
>
|
|
||||||
{themeSelectOptions()}
|
|
||||||
</select>
|
|
||||||
);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<footer className="footer">
|
<footer className="footer">
|
||||||
@@ -120,9 +66,6 @@ const Footer = () => {
|
|||||||
<div className="footer__column footer__column--links">
|
<div className="footer__column footer__column--links">
|
||||||
{renderLinks(linksData)}
|
{renderLinks(linksData)}
|
||||||
</div>
|
</div>
|
||||||
<div className="footer__column footer__column--theme">
|
|
||||||
{isLoggedIn ? renderThemeSelect() : renderThemeSelectLocal()}
|
|
||||||
</div>
|
|
||||||
<div className="footer__column footer__column--language">
|
<div className="footer__column footer__column--language">
|
||||||
<select
|
<select
|
||||||
className="form-control select select--language"
|
className="form-control select select--language"
|
||||||
|
|||||||
@@ -86,10 +86,10 @@ const Icons = () => (
|
|||||||
d="m19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1 -2.83 0l-.06-.06a1.65 1.65 0 0 0 -1.82-.33 1.65 1.65 0 0 0 -1 1.51v.17a2 2 0 0 1 -2 2 2 2 0 0 1 -2-2v-.09a1.65 1.65 0 0 0 -1.08-1.51 1.65 1.65 0 0 0 -1.82.33l-.06.06a2 2 0 0 1 -2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0 -1.51-1h-.17a2 2 0 0 1 -2-2 2 2 0 0 1 2-2h.09a1.65 1.65 0 0 0 1.51-1.08 1.65 1.65 0 0 0 -.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33h.08a1.65 1.65 0 0 0 1-1.51v-.17a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0 -.33 1.82v.08a1.65 1.65 0 0 0 1.51 1h.17a2 2 0 0 1 2 2 2 2 0 0 1 -2 2h-.09a1.65 1.65 0 0 0 -1.51 1z" />
|
d="m19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1 -2.83 0l-.06-.06a1.65 1.65 0 0 0 -1.82-.33 1.65 1.65 0 0 0 -1 1.51v.17a2 2 0 0 1 -2 2 2 2 0 0 1 -2-2v-.09a1.65 1.65 0 0 0 -1.08-1.51 1.65 1.65 0 0 0 -1.82.33l-.06.06a2 2 0 0 1 -2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0 -1.51-1h-.17a2 2 0 0 1 -2-2 2 2 0 0 1 2-2h.09a1.65 1.65 0 0 0 1.51-1.08 1.65 1.65 0 0 0 -.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33h.08a1.65 1.65 0 0 0 1-1.51v-.17a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0 -.33 1.82v.08a1.65 1.65 0 0 0 1.51 1h.17a2 2 0 0 1 2 2 2 2 0 0 1 -2 2h-.09a1.65 1.65 0 0 0 -1.51 1z" />
|
||||||
</symbol>
|
</symbol>
|
||||||
|
|
||||||
<symbol id="refresh" viewBox="0 0 24 24" stroke="currentColor" fill="none" strokeLinecap="round" strokeLinejoin="round" strokeWidth="2">
|
<symbol id="refresh" viewBox="0 0 24 24" stroke="currentColor" fill="none"
|
||||||
<polyline points="23 4 23 10 17 10"></polyline>
|
strokeLinecap="round" strokeLinejoin="round" strokeWidth="2">
|
||||||
<polyline points="1 20 1 14 7 14"></polyline>
|
<path d="M23 4v6h-6M1 20v-6h6" />
|
||||||
<path d="M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15"></path>
|
<path d="M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15" />
|
||||||
</symbol>
|
</symbol>
|
||||||
|
|
||||||
<symbol id="dns_privacy" viewBox="0 0 30 30" stroke="none" fill="currentColor"
|
<symbol id="dns_privacy" viewBox="0 0 30 30" stroke="none" fill="currentColor"
|
||||||
@@ -198,7 +198,7 @@ const Icons = () => (
|
|||||||
</svg>
|
</svg>
|
||||||
</symbol>
|
</symbol>
|
||||||
|
|
||||||
<symbol id="chevron-down" width="24" height="24" viewBox="0 0 24 24">
|
<symbol id="chevron-down" viewBox="0 0 24 24">
|
||||||
<g fill="none" fillRule="evenodd">
|
<g fill="none" fillRule="evenodd">
|
||||||
<path d="M0 0h24v24H0z" fill="#878787" fillOpacity=".01" />
|
<path d="M0 0h24v24H0z" fill="#878787" fillOpacity=".01" />
|
||||||
<path stroke="currentColor" strokeWidth="1.5" strokeLinecap="round"
|
<path stroke="currentColor" strokeWidth="1.5" strokeLinecap="round"
|
||||||
|
|||||||
@@ -11,10 +11,6 @@
|
|||||||
font-size: 0.7rem;
|
font-size: 0.7rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.card-chart-bg {
|
|
||||||
color: var(--black);
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-chart-bg path[d^="M0,32"] {
|
.card-chart-bg path[d^="M0,32"] {
|
||||||
transform: translateY(32px);
|
transform: translateY(32px);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,9 +25,9 @@ const Line = ({
|
|||||||
theme={{
|
theme={{
|
||||||
crosshair: {
|
crosshair: {
|
||||||
line: {
|
line: {
|
||||||
stroke: 'currentColor',
|
stroke: 'black',
|
||||||
strokeWidth: 1,
|
strokeWidth: 1,
|
||||||
strokeOpacity: 0.5,
|
strokeOpacity: 0.35,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}}
|
}}
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
z-index: 100;
|
z-index: 100;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
background-color: var(--loading-bg);
|
background-color: rgba(255, 255, 255, 0.48);
|
||||||
}
|
}
|
||||||
|
|
||||||
.loading:after {
|
.loading:after {
|
||||||
|
|||||||
@@ -11,7 +11,6 @@
|
|||||||
.ReactModal__Overlay--after-open {
|
.ReactModal__Overlay--after-open {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
transition: opacity 150ms ease-out;
|
transition: opacity 150ms ease-out;
|
||||||
background-color: var(--modal-overlay-bgcolor) !important;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.ReactModal__Content {
|
.ReactModal__Content {
|
||||||
|
|||||||
@@ -13,41 +13,6 @@
|
|||||||
overflow: visible;
|
overflow: visible;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ReactTable .rt-noData {
|
|
||||||
color: var(--rt-nodata-color);
|
|
||||||
background-color: var(--rt-nodata-bgcolor);
|
|
||||||
}
|
|
||||||
|
|
||||||
.ReactTable .-loading {
|
|
||||||
color: var(--rt-nodata-color);
|
|
||||||
background-color: var(--rt-nodata-bgcolor);
|
|
||||||
}
|
|
||||||
|
|
||||||
.ReactTable .-loading .-loading-inner {
|
|
||||||
color: var(--gray300);
|
|
||||||
}
|
|
||||||
|
|
||||||
.ReactTable .-pagination input, .ReactTable .-pagination select {
|
|
||||||
color: var(--rt-nodata-color);
|
|
||||||
background-color: var(--rt-nodata-bgcolor);
|
|
||||||
}
|
|
||||||
|
|
||||||
[data-theme=dark] .ReactTable .rt-table::-webkit-scrollbar-track {
|
|
||||||
background-color: var(--card-bgcolor);
|
|
||||||
}
|
|
||||||
|
|
||||||
[data-theme=dark] .ReactTable .rt-table::-webkit-scrollbar-thumb {
|
|
||||||
background-color: #888888;
|
|
||||||
}
|
|
||||||
|
|
||||||
[data-theme=dark] .ReactTable .-pagination .-btn {
|
|
||||||
filter: invert(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
[data-theme=dark] .ReactTable .-pagination .-btn:disabled {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.rt-tr-group.logs__row--red {
|
.rt-tr-group.logs__row--red {
|
||||||
background-color: rgba(223, 56, 18, 0.05);
|
background-color: rgba(223, 56, 18, 0.05);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,25 +1,8 @@
|
|||||||
.select.select--theme {
|
|
||||||
height: 45px;
|
|
||||||
padding: 0 32px 2px 11px;
|
|
||||||
outline: 0;
|
|
||||||
border-color: var(--ctrl-select-bgcolor);
|
|
||||||
background-image: url("./svg/chevron-down.svg");
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
background-position: right 9px center;
|
|
||||||
background-size: 17px 20px;
|
|
||||||
appearance: none;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.select--theme::-ms-expand {
|
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.select.select--language {
|
.select.select--language {
|
||||||
height: 45px;
|
height: 45px;
|
||||||
padding: 0 32px 2px 33px;
|
padding: 0 32px 2px 33px;
|
||||||
outline: 0;
|
outline: 0;
|
||||||
border-color: var(--ctrl-select-bgcolor);
|
border-color: rgba(69, 79, 94, 0.12);
|
||||||
background-image: url("./svg/globe.svg"), url("./svg/chevron-down.svg");
|
background-image: url("./svg/globe.svg"), url("./svg/chevron-down.svg");
|
||||||
background-repeat: no-repeat, no-repeat;
|
background-repeat: no-repeat, no-repeat;
|
||||||
background-position: left 11px center, right 9px center;
|
background-position: left 11px center, right 9px center;
|
||||||
@@ -33,9 +16,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.basic-multi-select .select__control {
|
.basic-multi-select .select__control {
|
||||||
border: 1px solid var(--card-border-color);;
|
border: 1px solid rgba(0, 40, 100, 0.12);
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
background-color: var(--ctrl-bgcolor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.basic-multi-select .select__control:hover {
|
.basic-multi-select .select__control:hover {
|
||||||
@@ -54,16 +36,4 @@
|
|||||||
|
|
||||||
.basic-multi-select .select__menu {
|
.basic-multi-select .select__menu {
|
||||||
z-index: 3;
|
z-index: 3;
|
||||||
background-color: var(--ctrl-bgcolor);
|
|
||||||
}
|
|
||||||
|
|
||||||
[data-theme=dark] .basic-multi-select .select__option:hover,
|
|
||||||
[data-theme=dark] .basic-multi-select .select__option--is-focused,
|
|
||||||
[data-theme=dark] .basic-multi-select .select__option--is-focused:hover {
|
|
||||||
background-color: var(--ctrl-select-bgcolor);
|
|
||||||
color: var(--ctrl-dropdown-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
[data-theme=dark] .select__multi-value__remove svg {
|
|
||||||
filter: invert(1);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,9 +85,9 @@ body {
|
|||||||
font-size: 0.9375rem;
|
font-size: 0.9375rem;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
line-height: 1.5;
|
line-height: 1.5;
|
||||||
color: var(--mcolor);
|
color: #495057;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
background-color: var(--bgcolor);
|
background-color: #f5f7fb;
|
||||||
}
|
}
|
||||||
|
|
||||||
[tabindex="-1"]:focus {
|
[tabindex="-1"]:focus {
|
||||||
@@ -1943,10 +1943,10 @@ pre code {
|
|||||||
padding: 0.375rem 0.75rem;
|
padding: 0.375rem 0.75rem;
|
||||||
font-size: 0.9375rem;
|
font-size: 0.9375rem;
|
||||||
line-height: 1.6;
|
line-height: 1.6;
|
||||||
color: var(--mcolor);
|
color: #495057;
|
||||||
background-color: var(--card-bgcolor);
|
background-color: #fff;
|
||||||
background-clip: padding-box;
|
background-clip: padding-box;
|
||||||
border: 1px solid var(--card-border-color);
|
border: 1px solid rgba(0, 40, 100, 0.12);
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
|
transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
|
||||||
}
|
}
|
||||||
@@ -1957,8 +1957,8 @@ pre code {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.form-control:focus {
|
.form-control:focus {
|
||||||
color: var(--mcolor);
|
color: #495057;
|
||||||
background-color: var(--ctrl-bgcolor);
|
background-color: #fff;
|
||||||
border-color: #1991eb;
|
border-color: #1991eb;
|
||||||
outline: 0;
|
outline: 0;
|
||||||
box-shadow: 0 0 0 2px rgba(70, 127, 207, 0.25);
|
box-shadow: 0 0 0 2px rgba(70, 127, 207, 0.25);
|
||||||
@@ -1991,8 +1991,7 @@ pre code {
|
|||||||
|
|
||||||
.form-control:disabled,
|
.form-control:disabled,
|
||||||
.form-control[readonly] {
|
.form-control[readonly] {
|
||||||
background-color: var(--form-disabled-bgcolor);
|
background-color: #f8f9fa;
|
||||||
color: var(--form-disabled-color);
|
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2579,58 +2578,16 @@ fieldset:disabled a.btn {
|
|||||||
box-shadow: 0 0 0 2px rgba(134, 142, 150, 0.5);
|
box-shadow: 0 0 0 2px rgba(134, 142, 150, 0.5);
|
||||||
}
|
}
|
||||||
|
|
||||||
[data-theme=dark] .btn-secondary {
|
|
||||||
color: #868e96;
|
|
||||||
background-color: transparent;
|
|
||||||
background-image: none;
|
|
||||||
border-color: #868e96;
|
|
||||||
}
|
|
||||||
|
|
||||||
[data-theme=dark] .btn-secondary:hover {
|
|
||||||
color: #fff;
|
|
||||||
background-color: #868e96;
|
|
||||||
border-color: #868e96;
|
|
||||||
}
|
|
||||||
|
|
||||||
[data-theme=dark] .btn-secondary:focus,
|
|
||||||
[data-theme=dark] .btn-secondary.focus {
|
|
||||||
box-shadow: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
[data-theme=dark] .btn-secondary:focus-visible,
|
|
||||||
[data-theme=dark] .btn-secondary.focus {
|
|
||||||
box-shadow: 0 0 0 2px rgba(134, 142, 150, 0.5);
|
|
||||||
}
|
|
||||||
|
|
||||||
[data-theme=dark] .btn-secondary.disabled,
|
|
||||||
[data-theme=dark] .btn-secondary:disabled {
|
|
||||||
color: #868e96;
|
|
||||||
background-color: transparent;
|
|
||||||
border: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
[data-theme=dark] .btn-secondary:not(:disabled):not(.disabled):active,
|
|
||||||
[data-theme=dark] .btn-secondary:not(:disabled):not(.disabled).active {
|
|
||||||
color: #fff;
|
|
||||||
background-color: #868e96;
|
|
||||||
border-color: #868e96;
|
|
||||||
}
|
|
||||||
|
|
||||||
[data-theme=dark] .btn-secondary:not(:disabled):not(.disabled):active:focus,
|
|
||||||
[data-theme=dark] .btn-secondary:not(:disabled):not(.disabled).active:focus {
|
|
||||||
box-shadow: 0 0 0 2px rgba(134, 142, 150, 0.5);
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-success {
|
.btn-success {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
background-color: var(--btn-success-bgcolor);
|
background-color: #5eba00;
|
||||||
border-color: var(--btn-success-bgcolor);
|
border-color: #5eba00;
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn-success:hover {
|
.btn-success:hover {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
background-color: #4b9400;
|
background-color: #4b9400;
|
||||||
border-color: #4b9400;
|
border-color: #448700;
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn-success:focus,
|
.btn-success:focus,
|
||||||
@@ -2650,7 +2607,7 @@ fieldset:disabled a.btn {
|
|||||||
.show>.btn-success.dropdown-toggle {
|
.show>.btn-success.dropdown-toggle {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
background-color: #448700;
|
background-color: #448700;
|
||||||
border-color: #448700;
|
border-color: #3e7a00;
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn-success:not(:disabled):not(.disabled):active:focus,
|
.btn-success:not(:disabled):not(.disabled):active:focus,
|
||||||
@@ -3287,16 +3244,12 @@ tbody.collapse.show {
|
|||||||
color: #495057;
|
color: #495057;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
list-style: none;
|
list-style: none;
|
||||||
background-color: var(--ctrl-bgcolor);
|
background-color: #fff;
|
||||||
background-clip: padding-box;
|
background-clip: padding-box;
|
||||||
border: 1px solid rgba(0, 40, 100, 0.12);
|
border: 1px solid rgba(0, 40, 100, 0.12);
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
[data-theme=dark] .dropdown-menu {
|
|
||||||
border: 1px solid var(--card-border-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
.dropup .dropdown-menu {
|
.dropup .dropdown-menu {
|
||||||
margin-top: 0;
|
margin-top: 0;
|
||||||
margin-bottom: 0.125rem;
|
margin-bottom: 0.125rem;
|
||||||
@@ -3395,7 +3348,7 @@ tbody.collapse.show {
|
|||||||
padding: 0.25rem 1.5rem;
|
padding: 0.25rem 1.5rem;
|
||||||
clear: both;
|
clear: both;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
color: var(--ctrl-dropdown-color);
|
color: #212529;
|
||||||
text-align: inherit;
|
text-align: inherit;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
@@ -3404,9 +3357,9 @@ tbody.collapse.show {
|
|||||||
|
|
||||||
.dropdown-item:hover,
|
.dropdown-item:hover,
|
||||||
.dropdown-item:focus {
|
.dropdown-item:focus {
|
||||||
color: var(--ctrl-dropdown-color-focus);
|
color: #16181b;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
background-color: var(--ctrl-dropdown-bgcolor-focus);
|
background-color: #f8f9fa;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dropdown-item.active,
|
.dropdown-item.active,
|
||||||
@@ -3841,11 +3794,11 @@ tbody.collapse.show {
|
|||||||
height: 2.375rem;
|
height: 2.375rem;
|
||||||
padding: 0.5rem 1.75rem 0.5rem 0.75rem;
|
padding: 0.5rem 1.75rem 0.5rem 0.75rem;
|
||||||
line-height: 1.5;
|
line-height: 1.5;
|
||||||
color: var(--mcolor);
|
color: #495057;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
background: var(--card-bgcolor) url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAxMCA1Jz48cGF0aCBmaWxsPScjOTk5JyBkPSdNMCAwTDEwIDBMNSA1TDAgMCcvPjwvc3ZnPg==") no-repeat right 0.75rem center;
|
background: #fff url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAxMCA1Jz48cGF0aCBmaWxsPScjOTk5JyBkPSdNMCAwTDEwIDBMNSA1TDAgMCcvPjwvc3ZnPg==") no-repeat right 0.75rem center;
|
||||||
background-size: 8px 10px;
|
background-size: 8px 10px;
|
||||||
border: 1px solid var(--card-border-color);
|
border: 1px solid rgba(0, 40, 100, 0.12);
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
-webkit-appearance: none;
|
-webkit-appearance: none;
|
||||||
-moz-appearance: none;
|
-moz-appearance: none;
|
||||||
@@ -4516,9 +4469,9 @@ tbody.collapse.show {
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
min-width: 0;
|
min-width: 0;
|
||||||
word-wrap: break-word;
|
word-wrap: break-word;
|
||||||
background-color: var(--card-bgcolor);
|
background-color: #fff;
|
||||||
background-clip: border-box;
|
background-clip: border-box;
|
||||||
border: 1px solid var(--card-border-color);
|
border: 1px solid rgba(0, 40, 100, 0.12);
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5047,9 +5000,9 @@ tbody.collapse.show {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.alert-primary {
|
.alert-primary {
|
||||||
color: var(--alert-message-color);
|
color: #24426c;
|
||||||
background-color: var(--alert-message-bg);
|
background-color: #dae5f5;
|
||||||
border-color: var(--alert-message-border);
|
border-color: #cbdbf2;
|
||||||
}
|
}
|
||||||
|
|
||||||
.alert-primary hr {
|
.alert-primary hr {
|
||||||
@@ -5089,9 +5042,9 @@ tbody.collapse.show {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.alert-info {
|
.alert-info {
|
||||||
color: var(--alert-message-color);
|
color: #24587e;
|
||||||
background-color: var(--alert-message-bg);
|
background-color: #daeefc;
|
||||||
border-color: var(--alert-message-border);
|
border-color: #cbe7fb;
|
||||||
}
|
}
|
||||||
|
|
||||||
.alert-info hr {
|
.alert-info hr {
|
||||||
@@ -5522,9 +5475,9 @@ button.close {
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
pointer-events: auto;
|
pointer-events: auto;
|
||||||
background-color: var(--card-bgcolor);
|
background-color: #fff;
|
||||||
background-clip: padding-box;
|
background-clip: padding-box;
|
||||||
border: 1px solid var(--card-border-color);
|
border: 1px solid rgba(0, 0, 0, 0.2);
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
outline: 0;
|
outline: 0;
|
||||||
}
|
}
|
||||||
@@ -5555,7 +5508,7 @@ button.close {
|
|||||||
-ms-flex-pack: justify;
|
-ms-flex-pack: justify;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
padding: 1rem;
|
padding: 1rem;
|
||||||
border-bottom: 1px solid var(--card-border-color);
|
border-bottom: 1px solid #e9ecef;
|
||||||
border-top-left-radius: 3px;
|
border-top-left-radius: 3px;
|
||||||
border-top-right-radius: 3px;
|
border-top-right-radius: 3px;
|
||||||
}
|
}
|
||||||
@@ -5585,7 +5538,7 @@ button.close {
|
|||||||
-ms-flex-pack: end;
|
-ms-flex-pack: end;
|
||||||
justify-content: flex-end;
|
justify-content: flex-end;
|
||||||
padding: 1rem;
|
padding: 1rem;
|
||||||
border-top: 1px solid var(--card-border-color);
|
border-top: 1px solid #e9ecef;
|
||||||
}
|
}
|
||||||
|
|
||||||
.modal-footer> :not(:first-child) {
|
.modal-footer> :not(:first-child) {
|
||||||
@@ -10315,8 +10268,8 @@ body.fixed-header .page {
|
|||||||
.header {
|
.header {
|
||||||
padding-top: 0.75rem;
|
padding-top: 0.75rem;
|
||||||
padding-bottom: 0.75rem;
|
padding-bottom: 0.75rem;
|
||||||
background: var(--header-bgcolor);
|
background: #fff;
|
||||||
border-bottom: 1px solid var(--border-color);
|
border-bottom: 1px solid rgba(0, 40, 100, 0.12);
|
||||||
}
|
}
|
||||||
|
|
||||||
body.fixed-header .header {
|
body.fixed-header .header {
|
||||||
@@ -10372,10 +10325,6 @@ body.fixed-header .header {
|
|||||||
width: auto;
|
width: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
[data-theme=dark] .header-brand-img {
|
|
||||||
filter:invert(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
.header-avatar {
|
.header-avatar {
|
||||||
width: 2rem;
|
width: 2rem;
|
||||||
height: 2rem;
|
height: 2rem;
|
||||||
@@ -10433,8 +10382,8 @@ body.fixed-header .header {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.footer {
|
.footer {
|
||||||
background: var(--card-bgcolor);
|
background: #fff;
|
||||||
border-top: 1px solid var(--card-border-color);
|
border-top: 1px solid rgba(0, 40, 100, 0.12);
|
||||||
font-size: 0.875rem;
|
font-size: 0.875rem;
|
||||||
padding: 1.25rem 0;
|
padding: 1.25rem 0;
|
||||||
color: #9aa0ac;
|
color: #9aa0ac;
|
||||||
@@ -13725,10 +13674,6 @@ Card alert
|
|||||||
color: #6e7687;
|
color: #6e7687;
|
||||||
}
|
}
|
||||||
|
|
||||||
[data-theme=dark] .dropdown-item {
|
|
||||||
color: #ffffff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dropdown-menu-arrow:before {
|
.dropdown-menu-arrow:before {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: -6px;
|
top: -6px;
|
||||||
@@ -13741,25 +13686,17 @@ Card alert
|
|||||||
content: "";
|
content: "";
|
||||||
}
|
}
|
||||||
|
|
||||||
[data-theme=dark] .dropdown-menu-arrow:before {
|
|
||||||
border-bottom-color: var(--ctrl-bgcolor);
|
|
||||||
}
|
|
||||||
|
|
||||||
.dropdown-menu-arrow:after {
|
.dropdown-menu-arrow:after {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: -5px;
|
top: -5px;
|
||||||
left: 12px;
|
left: 12px;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
border-right: 5px solid transparent;
|
border-right: 5px solid transparent;
|
||||||
border-bottom: 5px solid var(--ctrl-bgcolor);
|
border-bottom: 5px solid #fff;
|
||||||
border-left: 5px solid transparent;
|
border-left: 5px solid transparent;
|
||||||
content: "";
|
content: "";
|
||||||
}
|
}
|
||||||
|
|
||||||
[data-theme=dark] .dropdown-menu-arrow:after {
|
|
||||||
border-bottom: 5px solid var(--card-border-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
.dropdown-menu-arrow.dropdown-menu-right:before,
|
.dropdown-menu-arrow.dropdown-menu-right:before,
|
||||||
.dropdown-menu-arrow.dropdown-menu-right:after {
|
.dropdown-menu-arrow.dropdown-menu-right:after {
|
||||||
left: auto;
|
left: auto;
|
||||||
@@ -14317,7 +14254,7 @@ textarea[cols] {
|
|||||||
|
|
||||||
.custom-control-label:before {
|
.custom-control-label:before {
|
||||||
border: 1px solid rgba(0, 40, 100, 0.12);
|
border: 1px solid rgba(0, 40, 100, 0.12);
|
||||||
background-color: var(--radio-bg);
|
background-color: #fff;
|
||||||
background-size: 0.5rem;
|
background-size: 0.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -15527,10 +15464,6 @@ a.tag-addon:hover {
|
|||||||
transition: 0.3s border-color, 0.3s background-color;
|
transition: 0.3s border-color, 0.3s background-color;
|
||||||
}
|
}
|
||||||
|
|
||||||
[data-theme=dark] .custom-switch-indicator {
|
|
||||||
opacity: 0.75;
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-switch-indicator:before {
|
.custom-switch-indicator:before {
|
||||||
content: "";
|
content: "";
|
||||||
position: absolute;
|
position: absolute;
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
margin-bottom: 15px;
|
margin-bottom: 15px;
|
||||||
padding: 10px 0;
|
padding: 10px 0;
|
||||||
border-bottom: 1px solid var(--card-border-color);
|
border-bottom: 1px solid #e8e8e8;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -40,10 +40,6 @@
|
|||||||
opacity: 0.6;
|
opacity: 0.6;
|
||||||
}
|
}
|
||||||
|
|
||||||
[data-theme=dark] .tab__control {
|
|
||||||
filter: invert(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (min-width: 768px) {
|
@media screen and (min-width: 768px) {
|
||||||
.tab__control {
|
.tab__control {
|
||||||
white-space: normal;
|
white-space: normal;
|
||||||
|
|||||||
@@ -4,11 +4,6 @@
|
|||||||
box-shadow: 1px 1px 6px rgba(0, 0, 0, 0.2);
|
box-shadow: 1px 1px 6px rgba(0, 0, 0, 0.2);
|
||||||
}
|
}
|
||||||
|
|
||||||
[data-theme=dark] .tooltip-container {
|
|
||||||
background-color: var(--ctrl-select-bgcolor);
|
|
||||||
color: var(--mcolor);
|
|
||||||
}
|
|
||||||
|
|
||||||
.tooltip-custom--narrow {
|
.tooltip-custom--narrow {
|
||||||
max-width: 14rem;
|
max-width: 14rem;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ const Version = () => {
|
|||||||
disabled={processingVersion}
|
disabled={processingVersion}
|
||||||
title={t('check_updates_now')}
|
title={t('check_updates_now')}
|
||||||
>
|
>
|
||||||
<svg className="icons icon12">
|
<svg className="icons">
|
||||||
<use xlinkHref="#refresh" />
|
<use xlinkHref="#refresh" />
|
||||||
</svg>
|
</svg>
|
||||||
</button>}
|
</button>}
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ export const STATUS_COLORS = {
|
|||||||
export const REPOSITORY = {
|
export const REPOSITORY = {
|
||||||
URL: 'https://github.com/AdguardTeam/AdGuardHome',
|
URL: 'https://github.com/AdguardTeam/AdGuardHome',
|
||||||
TRACKERS_DB:
|
TRACKERS_DB:
|
||||||
'https://github.com/AdguardTeam/AdGuardHome/tree/master/client/src/helpers/trackers/trackers.json',
|
'https://github.com/AdguardTeam/AdGuardHome/tree/master/client/src/helpers/trackers/adguard.json',
|
||||||
ISSUES: 'https://github.com/AdguardTeam/AdGuardHome/issues/new/choose',
|
ISSUES: 'https://github.com/AdguardTeam/AdGuardHome/issues/new/choose',
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -227,14 +227,6 @@ export const BLOCKING_MODES = {
|
|||||||
custom_ip: 'custom_ip',
|
custom_ip: 'custom_ip',
|
||||||
};
|
};
|
||||||
|
|
||||||
// Note that translation strings contain these modes (theme_CONSTANT)
|
|
||||||
// i.e. theme_auto, theme_light.
|
|
||||||
export const THEMES = {
|
|
||||||
auto: 'auto',
|
|
||||||
dark: 'dark',
|
|
||||||
light: 'light',
|
|
||||||
};
|
|
||||||
|
|
||||||
export const WHOIS_ICONS = {
|
export const WHOIS_ICONS = {
|
||||||
location: 'location',
|
location: 'location',
|
||||||
orgname: 'network',
|
orgname: 'network',
|
||||||
@@ -398,6 +390,7 @@ export const SPECIAL_FILTER_ID = {
|
|||||||
PARENTAL: -3,
|
PARENTAL: -3,
|
||||||
SAFE_BROWSING: -4,
|
SAFE_BROWSING: -4,
|
||||||
SAFE_SEARCH: -5,
|
SAFE_SEARCH: -5,
|
||||||
|
REWRITES: -6,
|
||||||
};
|
};
|
||||||
|
|
||||||
export const BLOCK_ACTIONS = {
|
export const BLOCK_ACTIONS = {
|
||||||
|
|||||||
@@ -101,7 +101,7 @@ export default {
|
|||||||
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_13.txt"
|
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_13.txt"
|
||||||
},
|
},
|
||||||
"POL_polish_filters_for_pi_hole": {
|
"POL_polish_filters_for_pi_hole": {
|
||||||
"name": "POL: Polish filters for Pi-hole",
|
"name": "POL: Polish filters for Pi hole",
|
||||||
"categoryId": "regional",
|
"categoryId": "regional",
|
||||||
"homepage": "https://www.certyficate.it/",
|
"homepage": "https://www.certyficate.it/",
|
||||||
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_14.txt"
|
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_14.txt"
|
||||||
@@ -160,6 +160,12 @@ export default {
|
|||||||
"homepage": "https://github.com/DandelionSprout/adfilt",
|
"homepage": "https://github.com/DandelionSprout/adfilt",
|
||||||
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_6.txt"
|
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_6.txt"
|
||||||
},
|
},
|
||||||
|
"energized_spark": {
|
||||||
|
"name": "Energized Spark",
|
||||||
|
"categoryId": "general",
|
||||||
|
"homepage": "https://energized.pro/",
|
||||||
|
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_28.txt"
|
||||||
|
},
|
||||||
"hagezi_personal": {
|
"hagezi_personal": {
|
||||||
"name": "HaGeZi Personal Black \u0026 White",
|
"name": "HaGeZi Personal Black \u0026 White",
|
||||||
"categoryId": "general",
|
"categoryId": "general",
|
||||||
@@ -235,7 +241,7 @@ export default {
|
|||||||
"urlhaus_filter_online": {
|
"urlhaus_filter_online": {
|
||||||
"name": "Malicious URL Blocklist (URLHaus)",
|
"name": "Malicious URL Blocklist (URLHaus)",
|
||||||
"categoryId": "security",
|
"categoryId": "security",
|
||||||
"homepage": "https://urlhaus.abuse.ch/",
|
"homepage": "https://gitlab.com/malware-filter/urlhaus-filter",
|
||||||
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_11.txt"
|
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_11.txt"
|
||||||
},
|
},
|
||||||
"windowsspyblocker_hosts_spy_rules": {
|
"windowsspyblocker_hosts_spy_rules": {
|
||||||
|
|||||||
@@ -670,15 +670,6 @@ export const setHtmlLangAttr = (language) => {
|
|||||||
window.document.documentElement.lang = language;
|
window.document.documentElement.lang = language;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets UI theme.
|
|
||||||
*
|
|
||||||
* @param theme
|
|
||||||
*/
|
|
||||||
export const setUITheme = (theme) => {
|
|
||||||
document.body.dataset.theme = theme;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param values {object}
|
* @param values {object}
|
||||||
* @returns {object}
|
* @returns {object}
|
||||||
|
|||||||
172
client/src/helpers/trackers/adguard.json
Normal file
172
client/src/helpers/trackers/adguard.json
Normal file
@@ -0,0 +1,172 @@
|
|||||||
|
{
|
||||||
|
"timeUpdated": "2021-12-15",
|
||||||
|
"categories": {
|
||||||
|
"0": "audio_video_player",
|
||||||
|
"1": "comments",
|
||||||
|
"2": "customer_interaction",
|
||||||
|
"3": "pornvertising",
|
||||||
|
"4": "advertising",
|
||||||
|
"5": "essential",
|
||||||
|
"6": "site_analytics",
|
||||||
|
"7": "social_media",
|
||||||
|
"8": "misc",
|
||||||
|
"9": "cdn",
|
||||||
|
"10": "hosting",
|
||||||
|
"11": "unknown",
|
||||||
|
"12": "extensions",
|
||||||
|
"13": "email",
|
||||||
|
"101": "mobile_analytics"
|
||||||
|
},
|
||||||
|
"trackers": {
|
||||||
|
"akamai_technologies": {
|
||||||
|
"name": "Akamai Technologies",
|
||||||
|
"categoryId": 9,
|
||||||
|
"url": "https://www.akamai.com/",
|
||||||
|
"companyId": "akamai"
|
||||||
|
},
|
||||||
|
"apple": {
|
||||||
|
"name": "Apple",
|
||||||
|
"categoryId": 8,
|
||||||
|
"url": "https://www.apple.com/",
|
||||||
|
"companyId": "apple"
|
||||||
|
},
|
||||||
|
"apple_ads": {
|
||||||
|
"name": "Apple Search Ads",
|
||||||
|
"categoryId": 4,
|
||||||
|
"url": "https://searchads.apple.com/",
|
||||||
|
"companyId": "apple"
|
||||||
|
},
|
||||||
|
"facebook_audience": {
|
||||||
|
"name": "Facebook Audience Network",
|
||||||
|
"categoryId": 4,
|
||||||
|
"url": "https://www.facebook.com/business/products/audience-network",
|
||||||
|
"companyId": "facebook"
|
||||||
|
},
|
||||||
|
"crashlytics": {
|
||||||
|
"name": "Crashlytics",
|
||||||
|
"categoryId": 101,
|
||||||
|
"url": "https://crashlytics.com/",
|
||||||
|
"companyId": null
|
||||||
|
},
|
||||||
|
"flurry": {
|
||||||
|
"name": "Flurry",
|
||||||
|
"categoryId": 101,
|
||||||
|
"url": "http://www.flurry.com/",
|
||||||
|
"companyId": "verizon"
|
||||||
|
},
|
||||||
|
"hockeyapp": {
|
||||||
|
"name": "HockeyApp",
|
||||||
|
"categoryId": 101,
|
||||||
|
"url": "https://hockeyapp.net/",
|
||||||
|
"companyId": null
|
||||||
|
},
|
||||||
|
"firebase": {
|
||||||
|
"name": "Firebase",
|
||||||
|
"categoryId": 101,
|
||||||
|
"url": "https://firebase.google.com/",
|
||||||
|
"companyId": "google"
|
||||||
|
},
|
||||||
|
"appsflyer": {
|
||||||
|
"name": "AppsFlyer",
|
||||||
|
"categoryId": 101,
|
||||||
|
"url": "https://www.appsflyer.com/",
|
||||||
|
"companyId": "appsflyer"
|
||||||
|
},
|
||||||
|
"yandex_appmetrica": {
|
||||||
|
"name": "Yandex AppMetrica",
|
||||||
|
"categoryId": 101,
|
||||||
|
"url": "https://appmetrica.yandex.com/",
|
||||||
|
"companyId": "yandex"
|
||||||
|
},
|
||||||
|
"adjust": {
|
||||||
|
"name": "Adjust",
|
||||||
|
"categoryId": 101,
|
||||||
|
"url": "https://www.adjust.com/",
|
||||||
|
"companyId": "adjust"
|
||||||
|
},
|
||||||
|
"branch": {
|
||||||
|
"name": "Branch.io",
|
||||||
|
"categoryId": 101,
|
||||||
|
"url": "https://branch.io/",
|
||||||
|
"companyId": "branch_metrics_inc"
|
||||||
|
},
|
||||||
|
"markmonitor": {
|
||||||
|
"name": "MarkMonitor",
|
||||||
|
"categoryId": 4,
|
||||||
|
"url": "https://www.markmonitor.com/",
|
||||||
|
"companyId": "markmonitor"
|
||||||
|
},
|
||||||
|
"appcenter": {
|
||||||
|
"name": "Microsoft App Center",
|
||||||
|
"categoryId": 5,
|
||||||
|
"url": "https://appcenter.ms/",
|
||||||
|
"companyId": null
|
||||||
|
},
|
||||||
|
"unity_ads": {
|
||||||
|
"name": "Unity Ads",
|
||||||
|
"categoryId": 4,
|
||||||
|
"url": "https://unity.com/solutions/mobile-business/monetize-your-game",
|
||||||
|
"companyId": null
|
||||||
|
},
|
||||||
|
"azure": {
|
||||||
|
"name": "Microsoft Azure",
|
||||||
|
"categoryId": 10,
|
||||||
|
"url": "https://azure.microsoft.com/",
|
||||||
|
"companyId": "microsoft"
|
||||||
|
},
|
||||||
|
"button": {
|
||||||
|
"name": "Button",
|
||||||
|
"categoryId": 4,
|
||||||
|
"url": "https://www.usebutton.com/",
|
||||||
|
"companyId": null
|
||||||
|
},
|
||||||
|
"netflix": {
|
||||||
|
"name": "Netflix",
|
||||||
|
"categoryId": 8,
|
||||||
|
"url": "https://www.netflix.com/",
|
||||||
|
"companyId": null
|
||||||
|
},
|
||||||
|
"mail.ru_banner": {
|
||||||
|
"name": "Mail.Ru Banner Network",
|
||||||
|
"categoryId": 4,
|
||||||
|
"url": "http://mail.ru/",
|
||||||
|
"companyId": "vk"
|
||||||
|
},
|
||||||
|
"mail.ru_counter": {
|
||||||
|
"name": "Mail.Ru Counter",
|
||||||
|
"categoryId": 2,
|
||||||
|
"url": "http://mail.ru/",
|
||||||
|
"companyId": "vk"
|
||||||
|
},
|
||||||
|
"mail.ru_group": {
|
||||||
|
"name": "Mail.Ru Group",
|
||||||
|
"categoryId": 7,
|
||||||
|
"url": "http://mail.ru/",
|
||||||
|
"companyId": "vk"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"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",
|
||||||
|
"hockeyapp.net": "hockeyapp",
|
||||||
|
"app-measurement.com": "firebase",
|
||||||
|
"appsflyer.com": "appsflyer",
|
||||||
|
"appmetrica.yandex.com": "yandex_appmetrica",
|
||||||
|
"adjust.com": "adjust",
|
||||||
|
"mobileapptracking.com": "branch",
|
||||||
|
"edgecastcdn.net": "markmonitor",
|
||||||
|
"appcenter.ms": "appcenter",
|
||||||
|
"unityads.unity3d.com": "unity_ads",
|
||||||
|
"azure.com": "azure",
|
||||||
|
"bttn.io": "button"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
|
import whotracksmeDb from './whotracksme.json';
|
||||||
import whotracksmeWebsites from './whotracksme_web.json';
|
import whotracksmeWebsites from './whotracksme_web.json';
|
||||||
import trackersDb from './trackers.json';
|
import adguardDb from './adguard.json';
|
||||||
import { REPOSITORY } from '../constants';
|
import { REPOSITORY } from '../constants';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -38,7 +39,6 @@ const getWhotracksmeUrl = (trackerId) => {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the source metadata for the specified tracker
|
* Gets the source metadata for the specified tracker
|
||||||
*
|
|
||||||
* @param {TrackerData} trackerData tracker data
|
* @param {TrackerData} trackerData tracker data
|
||||||
* @returns {source} source metadata or null if no matching tracker found
|
* @returns {source} source metadata or null if no matching tracker found
|
||||||
*/
|
*/
|
||||||
@@ -64,26 +64,14 @@ export const getSourceData = (trackerData) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts the JSON string source into numeric source for AdGuard Home
|
* Gets tracker data in the specified database
|
||||||
*
|
|
||||||
* @param {TrackerData} trackerData tracker data
|
|
||||||
* @returns {number} source number
|
|
||||||
*/
|
|
||||||
const convertSource = (sourceStr) => {
|
|
||||||
if (!sourceStr || sourceStr !== 'AdGuard') {
|
|
||||||
return sources.WHOTRACKSME;
|
|
||||||
}
|
|
||||||
|
|
||||||
return sources.ADGUARD;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets tracker data from the trackers database
|
|
||||||
*
|
*
|
||||||
* @param {String} domainName domain name to check
|
* @param {String} domainName domain name to check
|
||||||
|
* @param {*} trackersDb trackers database
|
||||||
|
* @param {number} source source ID
|
||||||
* @returns {TrackerData} tracker data or null if no matching tracker found
|
* @returns {TrackerData} tracker data or null if no matching tracker found
|
||||||
*/
|
*/
|
||||||
export const getTrackerData = (domainName) => {
|
const getTrackerDataFromDb = (domainName, trackersDb, source) => {
|
||||||
if (!domainName) {
|
if (!domainName) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -100,7 +88,7 @@ export const getTrackerData = (domainName) => {
|
|||||||
if (trackerId) {
|
if (trackerId) {
|
||||||
const trackerData = trackersDb.trackers[trackerId];
|
const trackerData = trackersDb.trackers[trackerId];
|
||||||
const categoryName = trackersDb.categories[trackerData.categoryId];
|
const categoryName = trackersDb.categories[trackerData.categoryId];
|
||||||
const source = convertSource(trackerData.source);
|
trackerData.source = source;
|
||||||
const sourceData = getSourceData(trackerData);
|
const sourceData = getSourceData(trackerData);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
@@ -117,3 +105,22 @@ export const getTrackerData = (domainName) => {
|
|||||||
// No tracker found for the specified domain
|
// No tracker found for the specified domain
|
||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets tracker data from the trackers database
|
||||||
|
*
|
||||||
|
* @param {String} domainName domain name to check
|
||||||
|
* @returns {TrackerData} tracker data or null if no matching tracker found
|
||||||
|
*/
|
||||||
|
export const getTrackerData = (domainName) => {
|
||||||
|
if (!domainName) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
let data = getTrackerDataFromDb(domainName, adguardDb, sources.ADGUARD);
|
||||||
|
if (!data) {
|
||||||
|
data = getTrackerDataFromDb(domainName, whotracksmeDb, sources.WHOTRACKSME);
|
||||||
|
}
|
||||||
|
|
||||||
|
return data;
|
||||||
|
};
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"timeUpdated": "2023-03-08T00:09:48.692Z",
|
"timeUpdated": "2022-10-15T00:14:03.765Z",
|
||||||
"categories": {
|
"categories": {
|
||||||
"0": "audio_video_player",
|
"0": "audio_video_player",
|
||||||
"1": "comments",
|
"1": "comments",
|
||||||
@@ -16,8 +16,7 @@
|
|||||||
"12": "extensions",
|
"12": "extensions",
|
||||||
"13": "email",
|
"13": "email",
|
||||||
"14": "consent",
|
"14": "consent",
|
||||||
"15": "telemetry",
|
"15": "telemetry"
|
||||||
"101": "mobile_analytics"
|
|
||||||
},
|
},
|
||||||
"trackers": {
|
"trackers": {
|
||||||
"163": {
|
"163": {
|
||||||
@@ -873,11 +872,10 @@
|
|||||||
"companyId": "adgoto"
|
"companyId": "adgoto"
|
||||||
},
|
},
|
||||||
"adguard": {
|
"adguard": {
|
||||||
"name": "AdGuard",
|
"name": "Adguard",
|
||||||
"categoryId": 8,
|
"categoryId": 12,
|
||||||
"url": "https://adguard.com/",
|
"url": "https://adguard.com/",
|
||||||
"companyId": "adguard",
|
"companyId": null
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
},
|
||||||
"adhands": {
|
"adhands": {
|
||||||
"name": "AdHands",
|
"name": "AdHands",
|
||||||
@@ -953,10 +951,9 @@
|
|||||||
},
|
},
|
||||||
"adjust": {
|
"adjust": {
|
||||||
"name": "Adjust",
|
"name": "Adjust",
|
||||||
"categoryId": 101,
|
"categoryId": 6,
|
||||||
"url": "https://www.adjust.com/",
|
"url": "https://www.adjust.com/",
|
||||||
"companyId": "adjust",
|
"companyId": "adjust"
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
},
|
||||||
"adk2": {
|
"adk2": {
|
||||||
"name": "adk2",
|
"name": "adk2",
|
||||||
@@ -2144,8 +2141,7 @@
|
|||||||
"name": "Akamai Technologies",
|
"name": "Akamai Technologies",
|
||||||
"categoryId": 9,
|
"categoryId": 9,
|
||||||
"url": "https://www.akamai.com/",
|
"url": "https://www.akamai.com/",
|
||||||
"companyId": "akamai",
|
"companyId": "akamai"
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
},
|
||||||
"akamoihd.net": {
|
"akamoihd.net": {
|
||||||
"name": "akamoihd.net",
|
"name": "akamoihd.net",
|
||||||
@@ -2545,10 +2541,9 @@
|
|||||||
},
|
},
|
||||||
"appsflyer": {
|
"appsflyer": {
|
||||||
"name": "AppsFlyer",
|
"name": "AppsFlyer",
|
||||||
"categoryId": 101,
|
"categoryId": 6,
|
||||||
"url": "https://www.appsflyer.com/",
|
"url": "https://www.appsflyer.com/",
|
||||||
"companyId": "appsflyer",
|
"companyId": "appsflyer"
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
},
|
||||||
"apptv": {
|
"apptv": {
|
||||||
"name": "appTV",
|
"name": "appTV",
|
||||||
@@ -6772,64 +6767,55 @@
|
|||||||
"name": "Facebook",
|
"name": "Facebook",
|
||||||
"categoryId": 4,
|
"categoryId": 4,
|
||||||
"url": "https://www.facebook.com",
|
"url": "https://www.facebook.com",
|
||||||
"companyId": "meta",
|
"companyId": "facebook"
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
},
|
||||||
"facebook_beacon": {
|
"facebook_beacon": {
|
||||||
"name": "Facebook Beacon",
|
"name": "Facebook Beacon",
|
||||||
"categoryId": 7,
|
"categoryId": 7,
|
||||||
"url": "http://www.facebook.com/beacon/faq.php",
|
"url": "http://www.facebook.com/beacon/faq.php",
|
||||||
"companyId": "meta",
|
"companyId": "facebook"
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
},
|
||||||
"facebook_cdn": {
|
"facebook_cdn": {
|
||||||
"name": "Facebook CDN",
|
"name": "Facebook CDN",
|
||||||
"categoryId": 9,
|
"categoryId": 9,
|
||||||
"url": "https://www.facebook.com",
|
"url": "https://www.facebook.com",
|
||||||
"companyId": "meta",
|
"companyId": "facebook"
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
},
|
||||||
"facebook_connect": {
|
"facebook_connect": {
|
||||||
"name": "Facebook Connect",
|
"name": "Facebook Connect",
|
||||||
"categoryId": 6,
|
"categoryId": 6,
|
||||||
"url": "https://developers.facebook.com/connect.php",
|
"url": "https://developers.facebook.com/connect.php",
|
||||||
"companyId": "meta",
|
"companyId": "facebook"
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
},
|
||||||
"facebook_conversion_tracking": {
|
"facebook_conversion_tracking": {
|
||||||
"name": "Facebook Conversion Tracking",
|
"name": "Facebook Conversion Tracking",
|
||||||
"categoryId": 4,
|
"categoryId": 4,
|
||||||
"url": "http://www.facebook.com/",
|
"url": "http://www.facebook.com/",
|
||||||
"companyId": "meta",
|
"companyId": "facebook"
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
},
|
||||||
"facebook_custom_audience": {
|
"facebook_custom_audience": {
|
||||||
"name": "Facebook Custom Audience",
|
"name": "Facebook Custom Audience",
|
||||||
"categoryId": 4,
|
"categoryId": 4,
|
||||||
"url": "https://www.facebook.com",
|
"url": "https://www.facebook.com",
|
||||||
"companyId": "meta",
|
"companyId": "facebook"
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
},
|
||||||
"facebook_graph": {
|
"facebook_graph": {
|
||||||
"name": "Facebook Social Graph",
|
"name": "Facebook Social Graph",
|
||||||
"categoryId": 7,
|
"categoryId": 7,
|
||||||
"url": "https://developers.facebook.com/docs/reference/api/",
|
"url": "https://developers.facebook.com/docs/reference/api/",
|
||||||
"companyId": "meta",
|
"companyId": "facebook"
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
},
|
||||||
"facebook_impressions": {
|
"facebook_impressions": {
|
||||||
"name": "Facebook Impressions",
|
"name": "Facebook Impressions",
|
||||||
"categoryId": 4,
|
"categoryId": 4,
|
||||||
"url": "https://www.facebook.com/",
|
"url": "https://www.facebook.com/",
|
||||||
"companyId": "meta",
|
"companyId": "facebook"
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
},
|
||||||
"facebook_social_plugins": {
|
"facebook_social_plugins": {
|
||||||
"name": "Facebook Social Plugins",
|
"name": "Facebook Social Plugins",
|
||||||
"categoryId": 7,
|
"categoryId": 7,
|
||||||
"url": "https://developers.facebook.com/plugins",
|
"url": "https://developers.facebook.com/plugins",
|
||||||
"companyId": "meta",
|
"companyId": "facebook"
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
},
|
||||||
"facetz.dca": {
|
"facetz.dca": {
|
||||||
"name": "Facetz.DCA",
|
"name": "Facetz.DCA",
|
||||||
@@ -7109,10 +7095,9 @@
|
|||||||
},
|
},
|
||||||
"flurry": {
|
"flurry": {
|
||||||
"name": "Flurry",
|
"name": "Flurry",
|
||||||
"categoryId": 101,
|
"categoryId": 6,
|
||||||
"url": "http://www.flurry.com/",
|
"url": "http://www.flurry.com/",
|
||||||
"companyId": "verizon",
|
"companyId": "verizon"
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
},
|
||||||
"flxone": {
|
"flxone": {
|
||||||
"name": "FLXONE",
|
"name": "FLXONE",
|
||||||
@@ -8918,8 +8903,7 @@
|
|||||||
"name": "Instagram",
|
"name": "Instagram",
|
||||||
"categoryId": 8,
|
"categoryId": 8,
|
||||||
"url": "https://www.facebook.com/",
|
"url": "https://www.facebook.com/",
|
||||||
"companyId": "meta",
|
"companyId": "facebook"
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
},
|
||||||
"instant_check_mate": {
|
"instant_check_mate": {
|
||||||
"name": "Instant Check Mate",
|
"name": "Instant Check Mate",
|
||||||
@@ -10509,22 +10493,19 @@
|
|||||||
"name": "Mail.Ru Banner Network",
|
"name": "Mail.Ru Banner Network",
|
||||||
"categoryId": 4,
|
"categoryId": 4,
|
||||||
"url": "http://mail.ru/",
|
"url": "http://mail.ru/",
|
||||||
"companyId": "vk",
|
"companyId": "megafon"
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
},
|
||||||
"mail.ru_counter": {
|
"mail.ru_counter": {
|
||||||
"name": "Mail.Ru Counter",
|
"name": "Mail.Ru Counter",
|
||||||
"categoryId": 2,
|
"categoryId": 2,
|
||||||
"url": "http://mail.ru/",
|
"url": "https://corp.megafon.com/",
|
||||||
"companyId": "vk",
|
"companyId": "megafon"
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
},
|
||||||
"mail.ru_group": {
|
"mail.ru_group": {
|
||||||
"name": "Mail.Ru Group",
|
"name": "Mail.Ru Group",
|
||||||
"categoryId": 7,
|
"categoryId": 7,
|
||||||
"url": "http://mail.ru/",
|
"url": "http://mail.ru/",
|
||||||
"companyId": "vk",
|
"companyId": "megafon"
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
},
|
||||||
"mailchimp_tracking": {
|
"mailchimp_tracking": {
|
||||||
"name": "MailChimp Tracking",
|
"name": "MailChimp Tracking",
|
||||||
@@ -10650,8 +10631,7 @@
|
|||||||
"name": "MarkMonitor",
|
"name": "MarkMonitor",
|
||||||
"categoryId": 4,
|
"categoryId": 4,
|
||||||
"url": "https://www.markmonitor.com/",
|
"url": "https://www.markmonitor.com/",
|
||||||
"companyId": "markmonitor",
|
"companyId": "markmonitor"
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
},
|
||||||
"marktest": {
|
"marktest": {
|
||||||
"name": "Marktest",
|
"name": "Marktest",
|
||||||
@@ -11711,10 +11691,9 @@
|
|||||||
},
|
},
|
||||||
"netflix": {
|
"netflix": {
|
||||||
"name": "Netflix",
|
"name": "Netflix",
|
||||||
"categoryId": 0,
|
"categoryId": 8,
|
||||||
"url": "https://www.netflix.com/",
|
"url": null,
|
||||||
"companyId": "netflix",
|
"companyId": null
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
},
|
||||||
"netletix": {
|
"netletix": {
|
||||||
"name": "Netletix",
|
"name": "Netletix",
|
||||||
@@ -17990,22 +17969,19 @@
|
|||||||
"name": "Vk.com",
|
"name": "Vk.com",
|
||||||
"categoryId": 7,
|
"categoryId": 7,
|
||||||
"url": "https://vk.com/",
|
"url": "https://vk.com/",
|
||||||
"companyId": "vk",
|
"companyId": "megafon"
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
},
|
||||||
"vkontakte": {
|
"vkontakte": {
|
||||||
"name": "VKontakte",
|
"name": "VKontakte",
|
||||||
"categoryId": 7,
|
"categoryId": 7,
|
||||||
"url": "https://vk.com/",
|
"url": "https://vk.com/",
|
||||||
"companyId": "vk",
|
"companyId": "megafon"
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
},
|
||||||
"vkontakte_widgets": {
|
"vkontakte_widgets": {
|
||||||
"name": "VKontakte Widgets",
|
"name": "VKontakte Widgets",
|
||||||
"categoryId": 7,
|
"categoryId": 7,
|
||||||
"url": "https://dev.vk.com/",
|
"url": "http://vk.com/developers.php",
|
||||||
"companyId": "vk",
|
"companyId": "megafon"
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
},
|
||||||
"vntsm.com": {
|
"vntsm.com": {
|
||||||
"name": "Venatus Media",
|
"name": "Venatus Media",
|
||||||
@@ -19224,363 +19200,6 @@
|
|||||||
"categoryId": 4,
|
"categoryId": 4,
|
||||||
"url": "http://www.zypmedia.com/",
|
"url": "http://www.zypmedia.com/",
|
||||||
"companyId": "zypmedia"
|
"companyId": "zypmedia"
|
||||||
},
|
|
||||||
"adguard_dns": {
|
|
||||||
"name": "AdGuard DNS",
|
|
||||||
"categoryId": 8,
|
|
||||||
"url": "https://adguard-dns.io/",
|
|
||||||
"companyId": "adguard",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"adguard_vpn": {
|
|
||||||
"name": "AdGuard VPN",
|
|
||||||
"categoryId": 8,
|
|
||||||
"url": "https://adguard-vpn.com/",
|
|
||||||
"companyId": "adguard",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"appcenter": {
|
|
||||||
"name": "Microsoft App Center",
|
|
||||||
"categoryId": 5,
|
|
||||||
"url": "https://appcenter.ms/",
|
|
||||||
"companyId": null,
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"alibaba_cloud": {
|
|
||||||
"name": "Alibaba Cloud",
|
|
||||||
"categoryId": 10,
|
|
||||||
"url": "https://www.alibabacloud.com/",
|
|
||||||
"companyId": "alibaba",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"alibaba_ucbrowser": {
|
|
||||||
"name": "UC Browser",
|
|
||||||
"categoryId": 8,
|
|
||||||
"url": "https://ucweb.com/",
|
|
||||||
"companyId": "alibaba",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"apple": {
|
|
||||||
"name": "Apple",
|
|
||||||
"categoryId": 8,
|
|
||||||
"url": "https://www.apple.com/",
|
|
||||||
"companyId": "apple",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"apple_ads": {
|
|
||||||
"name": "Apple Search Ads",
|
|
||||||
"categoryId": 4,
|
|
||||||
"url": "https://searchads.apple.com/",
|
|
||||||
"companyId": "apple",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"azure": {
|
|
||||||
"name": "Microsoft Azure",
|
|
||||||
"categoryId": 10,
|
|
||||||
"url": "https://azure.microsoft.com/",
|
|
||||||
"companyId": "microsoft",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"azure_blob_storage": {
|
|
||||||
"name": "Azure Blob Storage",
|
|
||||||
"categoryId": 8,
|
|
||||||
"url": "https://azure.microsoft.com/en-us/products/storage/blobs",
|
|
||||||
"companyId": "microsoft",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"bitwarden": {
|
|
||||||
"name": "Bitwarden",
|
|
||||||
"categoryId": 8,
|
|
||||||
"url": "https://bitwarden.com/",
|
|
||||||
"companyId": "bitwarden",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"branch": {
|
|
||||||
"name": "Branch.io",
|
|
||||||
"categoryId": 101,
|
|
||||||
"url": "https://branch.io/",
|
|
||||||
"companyId": "branch_metrics_inc",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"button": {
|
|
||||||
"name": "Button",
|
|
||||||
"categoryId": 4,
|
|
||||||
"url": "https://www.usebutton.com/",
|
|
||||||
"companyId": null,
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"crashlytics": {
|
|
||||||
"name": "Crashlytics",
|
|
||||||
"categoryId": 101,
|
|
||||||
"url": "https://crashlytics.com/",
|
|
||||||
"companyId": null,
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"edgio": {
|
|
||||||
"name": "Edgio",
|
|
||||||
"categoryId": 9,
|
|
||||||
"url": "https://edg.io/",
|
|
||||||
"companyId": "edgio",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"element": {
|
|
||||||
"name": "Element",
|
|
||||||
"categoryId": 7,
|
|
||||||
"url": "https://element.io/",
|
|
||||||
"companyId": "element",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"facebook_audience": {
|
|
||||||
"name": "Facebook Audience Network",
|
|
||||||
"categoryId": 4,
|
|
||||||
"url": "https://www.facebook.com/business/products/audience-network",
|
|
||||||
"companyId": "meta",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"firebase": {
|
|
||||||
"name": "Firebase",
|
|
||||||
"categoryId": 101,
|
|
||||||
"url": "https://firebase.google.com/",
|
|
||||||
"companyId": "google",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"gmail": {
|
|
||||||
"name": "Gmail",
|
|
||||||
"categoryId": 13,
|
|
||||||
"url": "https://mail.google.com/",
|
|
||||||
"companyId": "google",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"google_trust_services": {
|
|
||||||
"name": "Google Trust Services",
|
|
||||||
"categoryId": 5,
|
|
||||||
"url": "https://pki.goog/",
|
|
||||||
"companyId": "google",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"hockeyapp": {
|
|
||||||
"name": "HockeyApp",
|
|
||||||
"categoryId": 101,
|
|
||||||
"url": "https://hockeyapp.net/",
|
|
||||||
"companyId": null,
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"kik": {
|
|
||||||
"name": "Kik",
|
|
||||||
"categoryId": 7,
|
|
||||||
"url": "https://kik.com/",
|
|
||||||
"companyId": "kik",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"lets_encrypt": {
|
|
||||||
"name": "Let's Encrypt",
|
|
||||||
"categoryId": 5,
|
|
||||||
"url": "https://letsencrypt.org/",
|
|
||||||
"companyId": "lets_encrypt",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"lgtv": {
|
|
||||||
"name": "LG TV",
|
|
||||||
"categoryId": 8,
|
|
||||||
"url": "https://www.lg.com/",
|
|
||||||
"companyId": "lgcorp",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"matrix": {
|
|
||||||
"name": "Matrix",
|
|
||||||
"categoryId": 5,
|
|
||||||
"url": "https://matrix.org/",
|
|
||||||
"companyId": "matrix",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"medialab": {
|
|
||||||
"name": "MediaLab.AI Inc.",
|
|
||||||
"categoryId": 8,
|
|
||||||
"url": "https://medialab.la/",
|
|
||||||
"companyId": "medialab",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"meganz": {
|
|
||||||
"name": "Mega Ltd.",
|
|
||||||
"categoryId": 8,
|
|
||||||
"url": "https://mega.io/",
|
|
||||||
"companyId": "meganz",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"msedge": {
|
|
||||||
"name": "Microsoft Edge",
|
|
||||||
"categoryId": 8,
|
|
||||||
"url": "https://www.microsoft.com/en-us/edge",
|
|
||||||
"companyId": "microsoft",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"mozilla": {
|
|
||||||
"name": "Mozilla Foundation",
|
|
||||||
"categoryId": 8,
|
|
||||||
"url": "https://www.mozilla.org/",
|
|
||||||
"companyId": "mozilla",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"nab": {
|
|
||||||
"name": "National Australia Bank",
|
|
||||||
"categoryId": 8,
|
|
||||||
"url": "https://www.nab.com.au/",
|
|
||||||
"companyId": "nab",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"notion": {
|
|
||||||
"name": "Notion",
|
|
||||||
"categoryId": 8,
|
|
||||||
"url": "https://www.notion.so/",
|
|
||||||
"companyId": "notion",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"ntppool": {
|
|
||||||
"name": "Network Time Protocol",
|
|
||||||
"categoryId": 5,
|
|
||||||
"url": "https://ntp.org/",
|
|
||||||
"companyId": "ntppool",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"oppo": {
|
|
||||||
"name": "OPPO",
|
|
||||||
"categoryId": 101,
|
|
||||||
"url": "https://www.oppo.com/",
|
|
||||||
"companyId": "oppo",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"outlook": {
|
|
||||||
"name": "Microsoft Outlook",
|
|
||||||
"categoryId": 13,
|
|
||||||
"url": "https://outlook.live.com/",
|
|
||||||
"companyId": "microsoft",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"oztam": {
|
|
||||||
"name": "OzTAM",
|
|
||||||
"categoryId": 8,
|
|
||||||
"url": "https://oztam.com.au/",
|
|
||||||
"companyId": "oztam",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"plex": {
|
|
||||||
"name": "Plex",
|
|
||||||
"categoryId": 0,
|
|
||||||
"url": "https://www.plex.tv/",
|
|
||||||
"companyId": "plex",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"qualcomm": {
|
|
||||||
"name": "Qualcomm",
|
|
||||||
"categoryId": 8,
|
|
||||||
"url": "https://www.qualcomm.com/",
|
|
||||||
"companyId": "qualcomm",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"recaptcha": {
|
|
||||||
"name": "reCAPTCHA",
|
|
||||||
"categoryId": 8,
|
|
||||||
"url": "https://www.google.com/recaptcha/about/",
|
|
||||||
"companyId": "google",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"sectigo": {
|
|
||||||
"name": "Sectigo Limited",
|
|
||||||
"categoryId": 5,
|
|
||||||
"url": "https://www.solaredge.com/",
|
|
||||||
"companyId": "sectigo",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"showrss": {
|
|
||||||
"name": "showRSS",
|
|
||||||
"categoryId": 8,
|
|
||||||
"url": "https://showrss.info/",
|
|
||||||
"companyId": "showrss",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"similarweb": {
|
|
||||||
"name": "SimilarWeb",
|
|
||||||
"categoryId": 6,
|
|
||||||
"url": "https://www.similarweb.com/",
|
|
||||||
"companyId": "similarweb",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"slack": {
|
|
||||||
"name": "Slack",
|
|
||||||
"categoryId": 8,
|
|
||||||
"url": "https://www.slack.com/",
|
|
||||||
"companyId": "salesforce",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"solaredge": {
|
|
||||||
"name": "SolarEdge Technologies, Inc.",
|
|
||||||
"categoryId": 8,
|
|
||||||
"url": "https://www.solaredge.com/",
|
|
||||||
"companyId": "solaredge",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"telstra": {
|
|
||||||
"name": "Telstra",
|
|
||||||
"categoryId": 8,
|
|
||||||
"url": "https://www.telstra.com.au/",
|
|
||||||
"companyId": "telstra",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"unity_ads": {
|
|
||||||
"name": "Unity Ads",
|
|
||||||
"categoryId": 4,
|
|
||||||
"url": "https://unity.com/solutions/mobile-business/monetize-your-game",
|
|
||||||
"companyId": null,
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"vscode": {
|
|
||||||
"name": "Visual Studio Code",
|
|
||||||
"categoryId": 8,
|
|
||||||
"url": "https://code.visualstudio.com/",
|
|
||||||
"companyId": "microsoft",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"whatsapp": {
|
|
||||||
"name": "WhatsApp",
|
|
||||||
"categoryId": 8,
|
|
||||||
"url": "https://www.whatsapp.com/",
|
|
||||||
"companyId": "meta",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"windows_maps": {
|
|
||||||
"name": "Windows Maps",
|
|
||||||
"categoryId": 8,
|
|
||||||
"url": "https://www.microsoft.com/store/apps/9wzdncrdtbvb",
|
|
||||||
"companyId": "microsoft",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"windows_notifications": {
|
|
||||||
"name": "The Windows Push Notification Services",
|
|
||||||
"categoryId": 8,
|
|
||||||
"url": "https://learn.microsoft.com/en-us/windows/apps/design/shell/tiles-and-notifications/windows-push-notification-services--wns--overview",
|
|
||||||
"companyId": "microsoft",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"windows_time": {
|
|
||||||
"name": "Windows Time Service",
|
|
||||||
"categoryId": 8,
|
|
||||||
"url": "https://learn.microsoft.com/en-us/windows-server/networking/windows-time-service/how-the-windows-time-service-works",
|
|
||||||
"companyId": "microsoft",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"windowsupdate": {
|
|
||||||
"name": "Windows Update",
|
|
||||||
"categoryId": 9,
|
|
||||||
"url": "https://support.microsoft.com/en-us/windows/windows-update-faq-8a903416-6f45-0718-f5c7-375e92dddeb2",
|
|
||||||
"companyId": "microsoft",
|
|
||||||
"source": "AdGuard"
|
|
||||||
},
|
|
||||||
"yandex_appmetrica": {
|
|
||||||
"name": "Yandex AppMetrica",
|
|
||||||
"categoryId": 101,
|
|
||||||
"url": "https://appmetrica.yandex.com/",
|
|
||||||
"companyId": "yandex",
|
|
||||||
"source": "AdGuard"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"trackerDomains": {
|
"trackerDomains": {
|
||||||
@@ -21121,7 +20740,7 @@
|
|||||||
"facebook.net": "facebook",
|
"facebook.net": "facebook",
|
||||||
"fbcdn.net": "facebook_cdn",
|
"fbcdn.net": "facebook_cdn",
|
||||||
"fbsbx.com": "facebook_cdn",
|
"fbsbx.com": "facebook_cdn",
|
||||||
"graph.facebook.com": "facebook_audience",
|
"graph.facebook.com": "facebook_graph",
|
||||||
"facetz.net": "facetz.dca",
|
"facetz.net": "facetz.dca",
|
||||||
"adsfac.eu": "facilitate_digital",
|
"adsfac.eu": "facilitate_digital",
|
||||||
"adsfac.net": "facilitate_digital",
|
"adsfac.net": "facilitate_digital",
|
||||||
@@ -21654,7 +21273,7 @@
|
|||||||
"isocket.com": "isocket",
|
"isocket.com": "isocket",
|
||||||
"ispot.tv": "ispot.tv",
|
"ispot.tv": "ispot.tv",
|
||||||
"itineraire.info": "itineraire.info",
|
"itineraire.info": "itineraire.info",
|
||||||
"apple.com": "apple",
|
"apple.com": "itunes_link_maker",
|
||||||
"autolinkmaker.itunes.apple.com": "itunes_link_maker",
|
"autolinkmaker.itunes.apple.com": "itunes_link_maker",
|
||||||
"ity.im": "ity.im",
|
"ity.im": "ity.im",
|
||||||
"iubenda.com": "iubenda.com",
|
"iubenda.com": "iubenda.com",
|
||||||
@@ -22108,7 +21727,7 @@
|
|||||||
"azurewebsites.net": "microsoft",
|
"azurewebsites.net": "microsoft",
|
||||||
"cloudapp.net": "microsoft",
|
"cloudapp.net": "microsoft",
|
||||||
"gfx.ms": "microsoft",
|
"gfx.ms": "microsoft",
|
||||||
"live.com": "outlook",
|
"live.com": "microsoft",
|
||||||
"microsoft.com": "microsoft",
|
"microsoft.com": "microsoft",
|
||||||
"microsoftonline-p.com": "microsoft",
|
"microsoftonline-p.com": "microsoft",
|
||||||
"microsoftonline.com": "microsoft",
|
"microsoftonline.com": "microsoft",
|
||||||
@@ -23910,191 +23529,6 @@
|
|||||||
"zukxd6fkxqn.com": "zukxd6fkxqn.com",
|
"zukxd6fkxqn.com": "zukxd6fkxqn.com",
|
||||||
"zwaar.net": "zwaar",
|
"zwaar.net": "zwaar",
|
||||||
"zwaar.org": "zwaar",
|
"zwaar.org": "zwaar",
|
||||||
"extend.tv": "zypmedia",
|
"extend.tv": "zypmedia"
|
||||||
"adtidy.org": "adguard",
|
|
||||||
"agrd.io": "adguard",
|
|
||||||
"adguard.app": "adguard",
|
|
||||||
"adguard.io": "adguard",
|
|
||||||
"adguard.org": "adguard",
|
|
||||||
"adguard-dns.com": "adguard_dns",
|
|
||||||
"adguard-dns.io": "adguard_dns",
|
|
||||||
"adguardvpn.com": "adguard_vpn",
|
|
||||||
"adguard-vpn.com": "adguard_vpn",
|
|
||||||
"adguard-vpn.online": "adguard_vpn",
|
|
||||||
"adjust.net.in": "adjust",
|
|
||||||
"adj.st": "adjust",
|
|
||||||
"adjust.io": "adjust",
|
|
||||||
"adjust.world": "adjust",
|
|
||||||
"apptrace.com": "adjust",
|
|
||||||
"akadns.net": "akamai_technologies",
|
|
||||||
"akamaiedge.net": "akamai_technologies",
|
|
||||||
"akaquill.net": "akamai_technologies",
|
|
||||||
"aliapp.org": "alibaba.com",
|
|
||||||
"alibabachengdun.com": "alibaba.com",
|
|
||||||
"alibabausercontent.com": "alibaba.com",
|
|
||||||
"aliexpress.com": "alibaba.com",
|
|
||||||
"alikunlun.com": "alibaba.com",
|
|
||||||
"aliyuncs.com": "alibaba.com",
|
|
||||||
"alibabacloud.com": "alibaba_cloud",
|
|
||||||
"alibabadns.com": "alibaba_cloud",
|
|
||||||
"aliyun.com": "alibaba_cloud",
|
|
||||||
"ucweb.com": "alibaba_ucbrowser",
|
|
||||||
"alipayobjects.com": "alipay.com",
|
|
||||||
"amazoncrl.com": "amazon",
|
|
||||||
"aamazoncognito.com": "amazon",
|
|
||||||
"amazonbrowserapp.es": "amazon",
|
|
||||||
"amazonbrowserapp.co.uk": "amazon",
|
|
||||||
"amazon.sa": "amazon",
|
|
||||||
"amazon.nl": "amazon",
|
|
||||||
"amazon.in": "amazon",
|
|
||||||
"amazon.com.mx": "amazon",
|
|
||||||
"amazon.com.au": "amazon",
|
|
||||||
"amazon-corp.com": "amazon",
|
|
||||||
"a2z.com": "amazon",
|
|
||||||
"amazontrust.com": "amazon_cdn",
|
|
||||||
"associates-amazon.com": "amazon_cdn",
|
|
||||||
"amazonpay.in": "amazon_payments",
|
|
||||||
"amazonvideo.com": "amazon_video",
|
|
||||||
"taobao.com": "taobao",
|
|
||||||
"appcenter.ms": "appcenter",
|
|
||||||
"iadsdk.apple.com": "apple_ads",
|
|
||||||
"me.com": "apple",
|
|
||||||
"apple.news": "apple",
|
|
||||||
"apple-dns.net": "apple",
|
|
||||||
"aaplimg.com": "apple",
|
|
||||||
"icloud.com": "apple",
|
|
||||||
"itunes.com": "apple",
|
|
||||||
"icloud-content.com": "apple",
|
|
||||||
"mzstatic.com": "apple",
|
|
||||||
"cdn-apple.com": "apple",
|
|
||||||
"apple-mapkit.com": "apple",
|
|
||||||
"icons.axm-usercontent-apple.com": "apple",
|
|
||||||
"apple-cloudkit.com": "apple",
|
|
||||||
"apzones.com": "apple",
|
|
||||||
"apple-livephotoskit.com": "apple",
|
|
||||||
"safebrowsing.apple": "apple",
|
|
||||||
"safebrowsing.g.applimg.com": "apple",
|
|
||||||
"applvn.com": "applovin",
|
|
||||||
"applovin.com": "applovin",
|
|
||||||
"blob.core.windows.net": "azure_blob_storage",
|
|
||||||
"azure.com": "azure",
|
|
||||||
"trafficmanager.net": "azure",
|
|
||||||
"bitwarden.com": "bitwarden",
|
|
||||||
"mobileapptracking.com": "branch",
|
|
||||||
"bttn.io": "button",
|
|
||||||
"cloudflare-dns.com": "cloudflare",
|
|
||||||
"crashlytics.com": "crashlytics",
|
|
||||||
"phicdn.net": "digicert_trust_seal",
|
|
||||||
"alphacdn.net": "edgio",
|
|
||||||
"edg.io": "edgio",
|
|
||||||
"edgecast.com": "edgio",
|
|
||||||
"edgecastcdn.net": "edgio",
|
|
||||||
"edgecastdns.net": "edgio",
|
|
||||||
"sigmacdn.net": "edgio",
|
|
||||||
"element.io": "element",
|
|
||||||
"riot.im": "element",
|
|
||||||
"app-measurement.com": "firebase",
|
|
||||||
"flipboard.com": "flipboard",
|
|
||||||
"flurry.com": "flurry",
|
|
||||||
"ghcr.io": "github",
|
|
||||||
"github.dev": "github",
|
|
||||||
"gmail.com": "gmail",
|
|
||||||
"googlehosted.com": "google_appspot",
|
|
||||||
"gvt1.com": "google_servers",
|
|
||||||
"gvt2.com": "google_servers",
|
|
||||||
"gvt3.com": "google_servers",
|
|
||||||
"pki.goog": "google_trust_services",
|
|
||||||
"hockeyapp.net": "hockeyapp",
|
|
||||||
"kik.com": "kik",
|
|
||||||
"apikik.com": "kik",
|
|
||||||
"kik-live.com": "kik",
|
|
||||||
"slatic.net": "lazada",
|
|
||||||
"lencr.org": "lets_encrypt",
|
|
||||||
"letsencrypt.org": "lets_encrypt",
|
|
||||||
"lgsmartad.com": "lgtv",
|
|
||||||
"lgtvcommon.com": "lgtv",
|
|
||||||
"lgtvsdp.com": "lgtv",
|
|
||||||
"lge.com": "lgtv",
|
|
||||||
"lg.com": "lgtv",
|
|
||||||
"markmonitor.com": "markmonitor",
|
|
||||||
"matrix.org": "matrix",
|
|
||||||
"medialab.la": "medialab",
|
|
||||||
"media-lab.ai": "medialab",
|
|
||||||
"mega.co.nz": "meganz",
|
|
||||||
"mega.io": "meganz",
|
|
||||||
"mega.nz": "meganz",
|
|
||||||
"e-msedge.net": "msedge",
|
|
||||||
"l-msedge.net": "msedge",
|
|
||||||
"firefox.com": "mozilla",
|
|
||||||
"mozaws.net": "mozilla",
|
|
||||||
"mozgcp.net": "mozilla",
|
|
||||||
"mozilla.com": "mozilla",
|
|
||||||
"mozilla.net": "mozilla",
|
|
||||||
"mozilla.org": "mozilla",
|
|
||||||
"nflximg.com": "netflix",
|
|
||||||
"nab.com": "nab",
|
|
||||||
"nab.com.au": "nab",
|
|
||||||
"nab.net": "nab",
|
|
||||||
"nabgroup.com": "nab",
|
|
||||||
"national.com.au": "nab",
|
|
||||||
"nationalaustraliabank.com.au": "nab",
|
|
||||||
"nationalbank.com.au": "nab",
|
|
||||||
"notion.so": "notion",
|
|
||||||
"ntp.org": "ntppool",
|
|
||||||
"ntppool.org": "ntppool",
|
|
||||||
"oppomobile.com": "oppo",
|
|
||||||
"heytapmobi.com": "oppo",
|
|
||||||
"heytapmobile.com": "oppo",
|
|
||||||
"heytapdl.com": "oppo",
|
|
||||||
"allawnos.com": "oppo",
|
|
||||||
"allawntech.com": "oppo",
|
|
||||||
"hotmail.com": "outlook",
|
|
||||||
"outlook.com": "outlook",
|
|
||||||
"oztam.com.au": "oztam",
|
|
||||||
"plex.tv": "plex",
|
|
||||||
"plex.direct": "plex",
|
|
||||||
"xtracloud.net": "qualcomm",
|
|
||||||
"qualcomm.com": "qualcomm",
|
|
||||||
"recaptcha.net": "recaptcha",
|
|
||||||
"sectigo.com": "sectigo",
|
|
||||||
"showrss.info": "showrss",
|
|
||||||
"similarweb.io": "similarweb",
|
|
||||||
"similarweb.com": "similarweb",
|
|
||||||
"slack.com": "slack",
|
|
||||||
"slackb.com": "slack",
|
|
||||||
"slack-edge.com": "slack",
|
|
||||||
"slack-imgs.com": "slack",
|
|
||||||
"addlive.io": "snap",
|
|
||||||
"feelinsonice.com": "snap",
|
|
||||||
"sc-cdn.net": "snap",
|
|
||||||
"sc-corp.net": "snap",
|
|
||||||
"sc-gw.com": "snap",
|
|
||||||
"sc-jpl.com": "snap",
|
|
||||||
"sc-prod.net": "snap",
|
|
||||||
"snap-dev.net": "snap",
|
|
||||||
"snapads.com": "snap",
|
|
||||||
"snapkit.com": "snap",
|
|
||||||
"solaredge.com": "solaredge",
|
|
||||||
"telstra.com.au": "telstra",
|
|
||||||
"telstra.com": "telstra",
|
|
||||||
"usertrust.com": "trustlogo",
|
|
||||||
"unityads.unity3d.com": "unity_ads",
|
|
||||||
"exp-tas.com": "vscode",
|
|
||||||
"vscode-unpkg.net": "vscode",
|
|
||||||
"v0cdn.net": "vscode",
|
|
||||||
"vscode-cdn.net": "vscode",
|
|
||||||
"whatsapp.net": "whatsapp",
|
|
||||||
"whatsapp.com": "whatsapp",
|
|
||||||
"maps.windows.com": "windows_maps",
|
|
||||||
"client.wns.windows.com": "windows_notifications",
|
|
||||||
"time.windows.com": "windows_time",
|
|
||||||
"windowsupdate.com": "windowsupdate",
|
|
||||||
"ya.ru": "yandex",
|
|
||||||
"yandex.by": "yandex",
|
|
||||||
"yandex.com": "yandex",
|
|
||||||
"yandex.com.tr": "yandex",
|
|
||||||
"yandex.fr": "yandex",
|
|
||||||
"yandex.kz": "yandex",
|
|
||||||
"appmetrica.yandex.com": "yandex_appmetrica"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -21,16 +21,11 @@
|
|||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
padding: 30px 20px;
|
padding: 30px 20px;
|
||||||
line-height: 1.6;
|
line-height: 1.6;
|
||||||
background-color: var(--card-bgcolor);
|
background-color: #fff;
|
||||||
box-shadow: 0 1px 4px rgba(74, 74, 74, 0.36);
|
box-shadow: 0 1px 4px rgba(74, 74, 74, 0.36);
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
[data-theme=dark] .setup__container {
|
|
||||||
box-shadow: none;
|
|
||||||
border: 1px solid var(--card-border-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (min-width: 768px) {
|
@media screen and (min-width: 768px) {
|
||||||
.setup__container {
|
.setup__container {
|
||||||
width: 650px;
|
width: 650px;
|
||||||
@@ -44,10 +39,6 @@
|
|||||||
max-width: 140px;
|
max-width: 140px;
|
||||||
}
|
}
|
||||||
|
|
||||||
[data-theme=dark] .setup__logo {
|
|
||||||
filter: invert(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
.setup__nav {
|
.setup__nav {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,10 +13,6 @@
|
|||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
}
|
}
|
||||||
|
|
||||||
[data-theme=dark] .login__logo {
|
|
||||||
filter: invert(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
.login__form {
|
.login__form {
|
||||||
margin: auto;
|
margin: auto;
|
||||||
padding: 40px 15px 100px;
|
padding: 40px 15px 100px;
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ class Login extends Component {
|
|||||||
<div className="login">
|
<div className="login">
|
||||||
<div className="login__form">
|
<div className="login__form">
|
||||||
<div className="text-center mb-6">
|
<div className="text-center mb-6">
|
||||||
<img src={logo} className="h-6 login__logo" alt="logo" />
|
<img src={logo} className="h-6" alt="logo" />
|
||||||
</div>
|
</div>
|
||||||
<Form onSubmit={this.handleSubmit} processing={processingLogin} />
|
<Form onSubmit={this.handleSubmit} processing={processingLogin} />
|
||||||
<div className="login__info">
|
<div className="login__info">
|
||||||
|
|||||||
@@ -112,6 +112,14 @@ const dashboard = handleActions(
|
|||||||
return newState;
|
return newState;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
[actions.getLanguageSuccess]: (state, { payload }) => {
|
||||||
|
const newState = {
|
||||||
|
...state,
|
||||||
|
language: payload,
|
||||||
|
};
|
||||||
|
return newState;
|
||||||
|
},
|
||||||
|
|
||||||
[actions.getClientsRequest]: (state) => ({
|
[actions.getClientsRequest]: (state) => ({
|
||||||
...state,
|
...state,
|
||||||
processingClients: true,
|
processingClients: true,
|
||||||
@@ -140,13 +148,8 @@ const dashboard = handleActions(
|
|||||||
[actions.getProfileSuccess]: (state, { payload }) => ({
|
[actions.getProfileSuccess]: (state, { payload }) => ({
|
||||||
...state,
|
...state,
|
||||||
name: payload.name,
|
name: payload.name,
|
||||||
theme: payload.theme,
|
|
||||||
processingProfile: false,
|
processingProfile: false,
|
||||||
}),
|
}),
|
||||||
[actions.changeThemeSuccess]: (state, { payload }) => ({
|
|
||||||
...state,
|
|
||||||
theme: payload.theme,
|
|
||||||
}),
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
processing: true,
|
processing: true,
|
||||||
@@ -165,7 +168,6 @@ const dashboard = handleActions(
|
|||||||
autoClients: [],
|
autoClients: [],
|
||||||
supportedTags: [],
|
supportedTags: [],
|
||||||
name: '',
|
name: '',
|
||||||
theme: 'auto',
|
|
||||||
checkUpdateFlag: false,
|
checkUpdateFlag: false,
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|||||||
6
client2/.eslintignore
Normal file
6
client2/.eslintignore
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
scripts
|
||||||
|
node_modules
|
||||||
|
postcss.config.js
|
||||||
|
src/lib/entities
|
||||||
|
src/lib/apis
|
||||||
|
openApi
|
||||||
5
client2/.eslintrc
Normal file
5
client2/.eslintrc
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"extends": [
|
||||||
|
"./scripts/lint/dev.js"
|
||||||
|
]
|
||||||
|
}
|
||||||
18
client2/declaration.d.ts
vendored
Normal file
18
client2/declaration.d.ts
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
declare module '*.pcss' {
|
||||||
|
const content: {[className: string]: string};
|
||||||
|
export default content;
|
||||||
|
}
|
||||||
|
declare module '*.css' {
|
||||||
|
const content: {[className: string]: string};
|
||||||
|
export default content;
|
||||||
|
}
|
||||||
|
declare module '*.png'
|
||||||
|
declare module '*.jpg'
|
||||||
|
declare let AUTH_TOKEN: string;
|
||||||
|
declare let MAIN_TOKEN: string | undefined;
|
||||||
|
declare let NO_CAPTCHA: boolean | undefined;
|
||||||
|
declare module 'dygraphs';
|
||||||
|
declare module '@novnc/novnc/core/rfb';
|
||||||
|
// cp - CloudPayments script
|
||||||
|
declare let cp: any;
|
||||||
|
declare const DEV: any;
|
||||||
89
client2/package.json
Normal file
89
client2/package.json
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
{
|
||||||
|
"author": "Performix",
|
||||||
|
"private": true,
|
||||||
|
"name": "adguard-home",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"scripts": {
|
||||||
|
"build": "webpack --config ./scripts/webpack/webpack.config.prod.js",
|
||||||
|
"start": "webpack serve --config ./scripts/webpack/webpack.config.dev.js",
|
||||||
|
"generate": "rm -rf ./src/lib/entities ./src/lib/apis && ts-node --compiler-options '{ \"module\": \"CommonJS\" }' ./scripts/generator/index.ts",
|
||||||
|
"translations:check": "ts-node --compiler-options '{ \"module\": \"CommonJS\" }' ./scripts/plugins/checkTranslations.ts",
|
||||||
|
"lint": "eslint -c ./scripts/lint/prod.js --ext .tsx --ext .ts ./",
|
||||||
|
"go:build": "cd .. && make REBUILD_CLIENT=0 build",
|
||||||
|
"go:run": "sudo ../AdguardHome"
|
||||||
|
},
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"@adguard/translate": "^0.2.0",
|
||||||
|
"@ant-design/icons": "^4.4.0",
|
||||||
|
"@sentry/react": "^5.27.0",
|
||||||
|
"antd": "^4.7.2",
|
||||||
|
"classnames": "^2.2.6",
|
||||||
|
"dayjs": "^1.9.3",
|
||||||
|
"formik": "^2.2.0",
|
||||||
|
"mobx": "^6.0.1",
|
||||||
|
"mobx-react-lite": "^3.0.1",
|
||||||
|
"qs": "^6.9.4",
|
||||||
|
"react": "^17.0.0",
|
||||||
|
"react-dom": "^17.0.0",
|
||||||
|
"react-router-dom": "^5.2.0",
|
||||||
|
"recharts": "^2.0.3"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/classnames": "^2.2.10",
|
||||||
|
"@types/qs": "^6.9.5",
|
||||||
|
"@types/react": "^16.9.53",
|
||||||
|
"@types/react-dom": "^16.9.8",
|
||||||
|
"@types/react-redux": "^7.1.9",
|
||||||
|
"@types/react-router-dom": "^5.1.6",
|
||||||
|
"@typescript-eslint/eslint-plugin": "^4.5.0",
|
||||||
|
"@typescript-eslint/parser": "^4.5.0",
|
||||||
|
"antd-dayjs-webpack-plugin": "^1.0.1",
|
||||||
|
"autoprefixer": "^10.0.1",
|
||||||
|
"connect-history-api-fallback": "^1.6.0",
|
||||||
|
"copy-webpack-plugin": "^6.2.1",
|
||||||
|
"css-loader": "^5.0.0",
|
||||||
|
"eslint": "^7.11.0",
|
||||||
|
"eslint-config-airbnb-base": "^14.2.0",
|
||||||
|
"eslint-config-airbnb-typescript": "^12.0.0",
|
||||||
|
"eslint-import-resolver-typescript": "^2.3.0",
|
||||||
|
"eslint-loader": "^4.0.2",
|
||||||
|
"eslint-plugin-import": "^2.22.1",
|
||||||
|
"eslint-plugin-react": "^7.21.5",
|
||||||
|
"eslint-plugin-react-hooks": "^4.2.0",
|
||||||
|
"file-loader": "^6.1.1",
|
||||||
|
"html-webpack-plugin": "^4.5.0",
|
||||||
|
"http-proxy-middleware": "^1.0.6",
|
||||||
|
"less": "^3.12.2",
|
||||||
|
"less-loader": "^5.0.0",
|
||||||
|
"mini-css-extract-plugin": "^1.1.1",
|
||||||
|
"optimize-css-assets-webpack-plugin": "^5.0.4",
|
||||||
|
"postcss": "^8.1.2",
|
||||||
|
"postcss-calc": "^7.0.5",
|
||||||
|
"postcss-css-variables": "^0.17.0",
|
||||||
|
"postcss-custom-media": "^7.0.8",
|
||||||
|
"postcss-import": "^13.0.0",
|
||||||
|
"postcss-inline-svg": "^4.1.0",
|
||||||
|
"postcss-loader": "^4.0.4",
|
||||||
|
"postcss-mixins": "^7.0.1",
|
||||||
|
"postcss-modules": "^3.2.2",
|
||||||
|
"postcss-nested": "^5.0.1",
|
||||||
|
"postcss-preset-env": "^6.7.0",
|
||||||
|
"postcss-reporter": "^7.0.1",
|
||||||
|
"postcss-variables": "^1.1.1",
|
||||||
|
"style-loader": "^2.0.0",
|
||||||
|
"stylelint": "^13.7.2",
|
||||||
|
"stylelint-webpack-plugin": "^2.1.1",
|
||||||
|
"terser-webpack-plugin": "^5.0.0",
|
||||||
|
"ts-loader": "^8.0.6",
|
||||||
|
"ts-morph": "^8.1.2",
|
||||||
|
"ts-node": "^9.0.0",
|
||||||
|
"typescript": "^4.0.3",
|
||||||
|
"url-loader": "^4.1.1",
|
||||||
|
"webpack": "^5.10.0",
|
||||||
|
"webpack-cli": "^4.2.0",
|
||||||
|
"webpack-dev-server": "^3.11.0",
|
||||||
|
"webpack-merge": "^5.2.0",
|
||||||
|
"yaml": "^1.10.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
17
client2/postcss.config.js
Normal file
17
client2/postcss.config.js
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
module.exports = {
|
||||||
|
plugins: [
|
||||||
|
['postcss-import', {}],
|
||||||
|
['postcss-nested', {}],
|
||||||
|
['postcss-custom-media', {}],
|
||||||
|
['postcss-variables', {}],
|
||||||
|
['postcss-calc', {}],
|
||||||
|
['postcss-mixins', {}],
|
||||||
|
['postcss-preset-env', { stage: 3, features: { 'nesting-rules': true } }],
|
||||||
|
['postcss-reporter', { clearMessages: true }],
|
||||||
|
['postcss-inline-svg', {
|
||||||
|
paths: ['frontend/icons', 'vendor/adguard/utils-bundle/src/Resources/frontend/icons'],
|
||||||
|
svgo: { plugins: [{ cleanupAttrs: true }] }
|
||||||
|
}],
|
||||||
|
['autoprefixer'],
|
||||||
|
]
|
||||||
|
};
|
||||||
BIN
client2/public/assets/apple-touch-icon-180x180.png
Normal file
BIN
client2/public/assets/apple-touch-icon-180x180.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.1 KiB |
BIN
client2/public/assets/favicon.png
Normal file
BIN
client2/public/assets/favicon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.3 KiB |
8
client2/public/assets/safari-pinned-tab.svg
Normal file
8
client2/public/assets/safari-pinned-tab.svg
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16pt" height="16pt"
|
||||||
|
viewBox="0 0 16 16" version="1.1">
|
||||||
|
<g id="surface1">
|
||||||
|
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;"
|
||||||
|
d="M 8 0 C 10.5 0 13.515625 0.574219 16 1.835938 L 15.996094 2.542969 C 15.957031 5.605469 15.410156 11.71875 8 16 C 0.5 11.667969 0.03125 5.460938 0.00390625 2.433594 L 0 1.835938 C 2.484375 0.574219 5.5 0 8 0 Z M 11.769531 4.203125 L 11.761719 4.203125 L 7.890625 8.160156 L 6.433594 6.4375 C 5.738281 5.644531 4.792969 6.25 4.570312 6.40625 L 7.929688 10.285156 L 12.570312 4.136719 C 12.230469 3.867188 11.933594 4.054688 11.769531 4.203125 Z M 11.769531 4.203125 "/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 801 B |
23
client2/public/index.html
Normal file
23
client2/public/index.html
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, shrink-to-fit=no">
|
||||||
|
<meta name="theme-color" content="#000000">
|
||||||
|
<meta name="google" content="notranslate">
|
||||||
|
<meta http-equiv="x-dns-prefetch-control" content="off">
|
||||||
|
<meta name="mobile-web-app-capable" content="yes" />
|
||||||
|
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||||
|
<meta name="apple-mobile-web-app-status-bar-style" content="default">
|
||||||
|
<link rel="apple-touch-icon" sizes="180x180" href="assets/apple-touch-icon-180x180.png" />
|
||||||
|
<link rel="mask-icon" href="assets/safari-pinned-tab.svg" color="#67B279">
|
||||||
|
<link rel="icon" type="image/png" href="assets/favicon.png" sizes="48x48">
|
||||||
|
<title>AdGuard Home</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<noscript>
|
||||||
|
You need to enable JavaScript to run this app.
|
||||||
|
</noscript>
|
||||||
|
<div id="app"></div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
22
client2/public/install.html
Normal file
22
client2/public/install.html
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, shrink-to-fit=no">
|
||||||
|
<meta name="theme-color" content="#000000">
|
||||||
|
<meta name="google" content="notranslate">
|
||||||
|
<meta name="mobile-web-app-capable" content="yes" />
|
||||||
|
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||||
|
<meta name="apple-mobile-web-app-status-bar-style" content="default">
|
||||||
|
<link rel="apple-touch-icon" sizes="180x180" href="assets/apple-touch-icon-180x180.png" />
|
||||||
|
<link rel="mask-icon" href="assets/safari-pinned-tab.svg" color="#67B279">
|
||||||
|
<link rel="icon" type="image/png" href="assets/favicon.png" sizes="48x48">
|
||||||
|
<title>Setup AdGuard Home</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<noscript>
|
||||||
|
You need to enable JavaScript to run this app.
|
||||||
|
</noscript>
|
||||||
|
<div id="app"></div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
22
client2/public/login.html
Normal file
22
client2/public/login.html
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, shrink-to-fit=no">
|
||||||
|
<meta name="theme-color" content="#000000">
|
||||||
|
<meta name="google" content="notranslate">
|
||||||
|
<link rel="apple-touch-icon" sizes="180x180" href="assets/apple-touch-icon-180x180.png" />
|
||||||
|
<meta name="mobile-web-app-capable" content="yes" />
|
||||||
|
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||||
|
<meta name="apple-mobile-web-app-status-bar-style" content="default">
|
||||||
|
<link rel="mask-icon" href="assets/safari-pinned-tab.svg" color="#67B279">
|
||||||
|
<link rel="icon" type="image/png" href="assets/favicon.png" sizes="48x48">
|
||||||
|
<title>Login</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<noscript>
|
||||||
|
You need to enable JavaScript to run this app.
|
||||||
|
</noscript>
|
||||||
|
<div id="app"></div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
12
client2/scripts/consts.ts
Normal file
12
client2/scripts/consts.ts
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
export const OPEN_API_PATH = '../openapi/openapi.yaml';
|
||||||
|
export const ENT_DIR = './src/lib/entities';
|
||||||
|
export const API_DIR = './src/lib/apis';
|
||||||
|
export const LOCALE_FOLDER_PATH = './src/lib/intl/__locales';
|
||||||
|
export const TRANSLATOR_CLASS_NAME = 'Translator';
|
||||||
|
export const USE_INTL_NAME = 'useIntl';
|
||||||
|
|
||||||
|
export const trimQuotes = (str: string) => {
|
||||||
|
return str.replace(/\'|\"/g, '');
|
||||||
|
};
|
||||||
|
|
||||||
|
export const GENERATOR_ENTITY_ALLIAS = 'Entities/';
|
||||||
18
client2/scripts/generator/index.ts
Normal file
18
client2/scripts/generator/index.ts
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
import * as fs from 'fs';
|
||||||
|
import * as YAML from 'yaml';
|
||||||
|
import { OPEN_API_PATH } from '../consts';
|
||||||
|
|
||||||
|
import EntitiesGenerator from './src/generateEntities';
|
||||||
|
import ApisGenerator from './src/generateApis';
|
||||||
|
|
||||||
|
|
||||||
|
const generateApi = (openApi: Record<string, any>) => {
|
||||||
|
const ent = new EntitiesGenerator(openApi);
|
||||||
|
ent.save();
|
||||||
|
|
||||||
|
const api = new ApisGenerator(openApi);
|
||||||
|
api.save();
|
||||||
|
}
|
||||||
|
|
||||||
|
const openApiFile = fs.readFileSync(OPEN_API_PATH, 'utf8');
|
||||||
|
generateApi(YAML.parse(openApiFile));
|
||||||
317
client2/scripts/generator/src/generateApis.ts
Normal file
317
client2/scripts/generator/src/generateApis.ts
Normal file
@@ -0,0 +1,317 @@
|
|||||||
|
/* eslint-disable no-template-curly-in-string */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unused-expressions */
|
||||||
|
import * as fs from 'fs';
|
||||||
|
import * as path from 'path';
|
||||||
|
import { stringify } from 'qs';
|
||||||
|
// eslint-disable-next-line import/no-extraneous-dependencies
|
||||||
|
import * as morph from 'ts-morph';
|
||||||
|
|
||||||
|
import {
|
||||||
|
API_DIR as API_DIR_CONST,
|
||||||
|
GENERATOR_ENTITY_ALLIAS,
|
||||||
|
} from '../../consts';
|
||||||
|
import { toCamel, capitalize, schemaParamParser } from './utils';
|
||||||
|
|
||||||
|
|
||||||
|
const API_DIR = path.resolve(API_DIR_CONST);
|
||||||
|
if (!fs.existsSync(API_DIR)) {
|
||||||
|
fs.mkdirSync(API_DIR);
|
||||||
|
}
|
||||||
|
|
||||||
|
const { Project, QuoteKind } = morph;
|
||||||
|
|
||||||
|
|
||||||
|
class ApiGenerator {
|
||||||
|
project = new Project({
|
||||||
|
tsConfigFilePath: './tsconfig.json',
|
||||||
|
addFilesFromTsConfig: false,
|
||||||
|
manipulationSettings: {
|
||||||
|
quoteKind: QuoteKind.Single,
|
||||||
|
usePrefixAndSuffixTextForRename: false,
|
||||||
|
useTrailingCommas: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
openapi: Record<string, any>;
|
||||||
|
|
||||||
|
serverUrl: string;
|
||||||
|
|
||||||
|
paths: any;
|
||||||
|
|
||||||
|
/* interface Controllers {
|
||||||
|
[controller: string]: {
|
||||||
|
[operationId: string]: { parameters - from opneApi, responses - from opneApi, method }
|
||||||
|
}
|
||||||
|
} */
|
||||||
|
controllers: Record<string, any> = {};
|
||||||
|
|
||||||
|
apis: morph.SourceFile[] = [];
|
||||||
|
|
||||||
|
constructor(openapi: Record<string, any>) {
|
||||||
|
this.openapi = openapi;
|
||||||
|
this.paths = openapi.paths;
|
||||||
|
this.serverUrl = openapi.servers[0].url;
|
||||||
|
|
||||||
|
Object.keys(this.paths).forEach((pathKey) => {
|
||||||
|
Object.keys(this.paths[pathKey]).forEach((method) => {
|
||||||
|
const {
|
||||||
|
tags, operationId, parameters, responses, requestBody, security,
|
||||||
|
} = this.paths[pathKey][method];
|
||||||
|
const controller = toCamel((tags ? tags[0] : pathKey.split('/')[1]).replace('-controller', ''));
|
||||||
|
|
||||||
|
if (this.controllers[controller]) {
|
||||||
|
this.controllers[controller][operationId] = {
|
||||||
|
parameters,
|
||||||
|
responses,
|
||||||
|
method,
|
||||||
|
requestBody,
|
||||||
|
security,
|
||||||
|
pathKey: pathKey.replace(/{/g, '${'),
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
this.controllers[controller] = { [operationId]: {
|
||||||
|
parameters,
|
||||||
|
responses,
|
||||||
|
method,
|
||||||
|
requestBody,
|
||||||
|
security,
|
||||||
|
pathKey: pathKey.replace(/{/g, '${'),
|
||||||
|
} };
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
this.generateApiFiles();
|
||||||
|
}
|
||||||
|
|
||||||
|
generateApiFiles = () => {
|
||||||
|
Object.keys(this.controllers).forEach(this.generateApiFile);
|
||||||
|
};
|
||||||
|
|
||||||
|
generateApiFile = (cName: string) => {
|
||||||
|
const apiFile = this.project.createSourceFile(`${API_DIR}/${cName}.ts`);
|
||||||
|
apiFile.addStatements([
|
||||||
|
'// This file was autogenerated. Please do not change.',
|
||||||
|
'// All changes will be overwrited on commit.',
|
||||||
|
'',
|
||||||
|
]);
|
||||||
|
|
||||||
|
// const schemaProperties = schemas[schemaName].properties;
|
||||||
|
const importEntities: any[] = [];
|
||||||
|
|
||||||
|
// add api class to file
|
||||||
|
const apiClass = apiFile.addClass({
|
||||||
|
name: `${capitalize(cName)}Api`,
|
||||||
|
isDefaultExport: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
// get operations of controller
|
||||||
|
const controllerOperations = this.controllers[cName];
|
||||||
|
const operationList = Object.keys(controllerOperations).sort();
|
||||||
|
// for each operation add fetcher
|
||||||
|
operationList.forEach((operation) => {
|
||||||
|
const {
|
||||||
|
requestBody, responses, parameters, method, pathKey, security,
|
||||||
|
} = controllerOperations[operation];
|
||||||
|
|
||||||
|
const queryParams: any[] = []; // { name, type }
|
||||||
|
const bodyParam: any[] = []; // { name, type }
|
||||||
|
|
||||||
|
let hasResponseBodyType: /* boolean | ReturnType<schemaParamParser> */ false | [string, boolean, boolean, boolean, boolean] = false;
|
||||||
|
let contentType = '';
|
||||||
|
if (parameters) {
|
||||||
|
parameters.forEach((p: any) => {
|
||||||
|
const [
|
||||||
|
pType, isArray, isClass, isImport,
|
||||||
|
] = schemaParamParser(p.schema, this.openapi);
|
||||||
|
|
||||||
|
if (isImport) {
|
||||||
|
importEntities.push({ type: pType, isClass });
|
||||||
|
}
|
||||||
|
if (p.in === 'query') {
|
||||||
|
queryParams.push({
|
||||||
|
name: p.name, type: `${pType}${isArray ? '[]' : ''}`, hasQuestionToken: !p.required });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (queryParams.length > 0) {
|
||||||
|
const imp = apiFile.getImportDeclaration((i) => {
|
||||||
|
return i.getModuleSpecifierValue() === 'qs';
|
||||||
|
}); if (!imp) {
|
||||||
|
apiFile.addImportDeclaration({
|
||||||
|
moduleSpecifier: 'qs',
|
||||||
|
defaultImport: 'qs',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (requestBody) {
|
||||||
|
let content = requestBody.content;
|
||||||
|
const { $ref }: { $ref: string } = requestBody;
|
||||||
|
|
||||||
|
if (!content && $ref) {
|
||||||
|
const name = $ref.split('/').pop() as string;
|
||||||
|
content = this.openapi.components.requestBodies[name].content;
|
||||||
|
}
|
||||||
|
|
||||||
|
[contentType] = Object.keys(content);
|
||||||
|
const data = content[contentType];
|
||||||
|
|
||||||
|
const [
|
||||||
|
pType, isArray, isClass, isImport,
|
||||||
|
] = schemaParamParser(data.schema, this.openapi);
|
||||||
|
|
||||||
|
if (isImport) {
|
||||||
|
importEntities.push({ type: pType, isClass });
|
||||||
|
bodyParam.push({ name: pType.toLowerCase(), type: `${isClass ? 'I' : ''}${pType}${isArray ? '[]' : ''}`, isClass, pType });
|
||||||
|
} else {
|
||||||
|
bodyParam.push({ name: 'data', type: `${pType}${isArray ? '[]' : ''}` });
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (responses['200']) {
|
||||||
|
const { content, headers } = responses['200'];
|
||||||
|
if (content && (content['*/*'] || content['application/json'])) {
|
||||||
|
const { schema, examples } = content['*/*'] || content['application/json'];
|
||||||
|
|
||||||
|
if (!schema) {
|
||||||
|
process.exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
const propType = schemaParamParser(schema, this.openapi);
|
||||||
|
const [pType, , isClass, isImport] = propType;
|
||||||
|
|
||||||
|
if (isImport) {
|
||||||
|
importEntities.push({ type: pType, isClass });
|
||||||
|
}
|
||||||
|
hasResponseBodyType = propType;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let returnType = '';
|
||||||
|
if (hasResponseBodyType) {
|
||||||
|
const [pType, isArray, isClass] = hasResponseBodyType as any;
|
||||||
|
let data = `Promise<${isClass ? 'I' : ''}${pType}${isArray ? '[]' : ''}`;
|
||||||
|
returnType = data;
|
||||||
|
} else {
|
||||||
|
returnType = 'Promise<number';
|
||||||
|
}
|
||||||
|
const shouldValidate = bodyParam.filter(b => b.isClass);
|
||||||
|
if (shouldValidate.length > 0) {
|
||||||
|
returnType += ' | string[]';
|
||||||
|
}
|
||||||
|
// append Error to default type return;
|
||||||
|
returnType += ' | Error>';
|
||||||
|
|
||||||
|
const fetcher = apiClass.addMethod({
|
||||||
|
isAsync: true,
|
||||||
|
isStatic: true,
|
||||||
|
name: operation,
|
||||||
|
returnType,
|
||||||
|
});
|
||||||
|
const params = [...queryParams, ...bodyParam].sort((a, b) => (Number(!!a.hasQuestionToken) - Number(!!b.hasQuestionToken)));
|
||||||
|
fetcher.addParameters(params);
|
||||||
|
|
||||||
|
fetcher.setBodyText((w) => {
|
||||||
|
// Add data to URLSearchParams
|
||||||
|
if (contentType === 'text/plain') {
|
||||||
|
bodyParam.forEach((b) => {
|
||||||
|
w.writeLine(`const params = String(${b.name});`);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
if (shouldValidate.length > 0) {
|
||||||
|
w.writeLine(`const haveError: string[] = [];`);
|
||||||
|
shouldValidate.forEach((b) => {
|
||||||
|
w.writeLine(`const ${b.name}Valid = new ${b.pType}(${b.name});`);
|
||||||
|
w.writeLine(`haveError.push(...${b.name}Valid.validate());`);
|
||||||
|
});
|
||||||
|
w.writeLine(`if (haveError.length > 0) {`);
|
||||||
|
w.writeLine(` return Promise.resolve(haveError);`)
|
||||||
|
w.writeLine(`}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Switch return of fetch in case on queryParams
|
||||||
|
if (queryParams.length > 0) {
|
||||||
|
w.writeLine('const queryParams = {');
|
||||||
|
queryParams.forEach((q) => {
|
||||||
|
w.writeLine(` ${q.name}: ${q.name},`);
|
||||||
|
});
|
||||||
|
w.writeLine('}');
|
||||||
|
w.writeLine(`return await fetch(\`${this.serverUrl}${pathKey}?\${qs.stringify(queryParams, { arrayFormat: 'comma' })}\`, {`);
|
||||||
|
} else {
|
||||||
|
w.writeLine(`return await fetch(\`${this.serverUrl}${pathKey}\`, {`);
|
||||||
|
}
|
||||||
|
// Add method
|
||||||
|
w.writeLine(` method: '${method.toUpperCase()}',`);
|
||||||
|
|
||||||
|
// add Fetch options
|
||||||
|
if (contentType && contentType !== 'multipart/form-data') {
|
||||||
|
w.writeLine(' headers: {');
|
||||||
|
w.writeLine(` 'Content-Type': '${contentType}',`);
|
||||||
|
w.writeLine(' },');
|
||||||
|
}
|
||||||
|
if (contentType) {
|
||||||
|
switch (contentType) {
|
||||||
|
case 'text/plain':
|
||||||
|
w.writeLine(' body: params,');
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
w.writeLine(` body: JSON.stringify(${bodyParam.map((b) => b.isClass ? `${b.name}Valid.serialize()` : b.name).join(', ')}),`);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle response
|
||||||
|
if (hasResponseBodyType) {
|
||||||
|
w.writeLine('}).then(async (res) => {');
|
||||||
|
w.writeLine(' if (res.status === 200) {');
|
||||||
|
w.writeLine(' return res.json();');
|
||||||
|
} else {
|
||||||
|
w.writeLine('}).then(async (res) => {');
|
||||||
|
w.writeLine(' if (res.status === 200) {');
|
||||||
|
w.writeLine(' return res.status;');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle Error
|
||||||
|
w.writeLine(' } else {');
|
||||||
|
w.writeLine(' return new Error(String(res.status));');
|
||||||
|
w.writeLine(' }');
|
||||||
|
w.writeLine('})');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
const imports: any[] = [];
|
||||||
|
const types: string[] = [];
|
||||||
|
importEntities.forEach((i) => {
|
||||||
|
const { type } = i;
|
||||||
|
if (!types.includes(type)) {
|
||||||
|
imports.push(i);
|
||||||
|
types.push(type);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
imports.sort((a,b) => a.type > b.type ? 1 : -1).forEach((ie) => {
|
||||||
|
const { type: pType, isClass } = ie;
|
||||||
|
if (isClass) {
|
||||||
|
apiFile.addImportDeclaration({
|
||||||
|
moduleSpecifier: `${GENERATOR_ENTITY_ALLIAS}${pType}`,
|
||||||
|
defaultImport: pType,
|
||||||
|
namedImports: [`I${pType}`],
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
apiFile.addImportDeclaration({
|
||||||
|
moduleSpecifier: `${GENERATOR_ENTITY_ALLIAS}${pType}`,
|
||||||
|
namedImports: [pType],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.apis.push(apiFile);
|
||||||
|
};
|
||||||
|
|
||||||
|
save = () => {
|
||||||
|
this.apis.forEach(async (e) => {
|
||||||
|
await e.saveSync();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export default ApiGenerator;
|
||||||
603
client2/scripts/generator/src/generateEntities.ts
Normal file
603
client2/scripts/generator/src/generateEntities.ts
Normal file
@@ -0,0 +1,603 @@
|
|||||||
|
import * as fs from 'fs';
|
||||||
|
import * as path from 'path';
|
||||||
|
// eslint-disable-next-line import/no-extraneous-dependencies
|
||||||
|
import * as morph from 'ts-morph';
|
||||||
|
|
||||||
|
import { ENT_DIR } from '../../consts';
|
||||||
|
import { TYPES, toCamel, schemaParamParser, uncapitalize } from './utils';
|
||||||
|
|
||||||
|
const { Project, QuoteKind } = morph;
|
||||||
|
|
||||||
|
|
||||||
|
const EntDir = path.resolve(ENT_DIR);
|
||||||
|
if (!fs.existsSync(EntDir)) {
|
||||||
|
fs.mkdirSync(EntDir);
|
||||||
|
}
|
||||||
|
|
||||||
|
class EntitiesGenerator {
|
||||||
|
project = new Project({
|
||||||
|
tsConfigFilePath: './tsconfig.json',
|
||||||
|
addFilesFromTsConfig: false,
|
||||||
|
manipulationSettings: {
|
||||||
|
quoteKind: QuoteKind.Single,
|
||||||
|
usePrefixAndSuffixTextForRename: false,
|
||||||
|
useTrailingCommas: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
openapi: Record<string, any>;
|
||||||
|
|
||||||
|
schemas: Record<string, any>;
|
||||||
|
|
||||||
|
schemaNames: string[];
|
||||||
|
|
||||||
|
entities: morph.SourceFile[] = [];
|
||||||
|
|
||||||
|
constructor(openapi: Record<string, any>) {
|
||||||
|
this.openapi = openapi;
|
||||||
|
this.schemas = openapi.components.schemas;
|
||||||
|
this.schemaNames = Object.keys(this.schemas);
|
||||||
|
this.generateEntities();
|
||||||
|
}
|
||||||
|
|
||||||
|
generateEntities = () => {
|
||||||
|
this.schemaNames.forEach(this.generateEntity);
|
||||||
|
};
|
||||||
|
|
||||||
|
generateEntity = (sName: string) => {
|
||||||
|
const { properties, type, oneOf } = this.schemas[sName];
|
||||||
|
const notAClass = !properties && TYPES[type as keyof typeof TYPES];
|
||||||
|
|
||||||
|
if (oneOf) {
|
||||||
|
this.generateOneOf(sName);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (notAClass) {
|
||||||
|
this.generateEnum(sName);
|
||||||
|
} else {
|
||||||
|
this.generateClass(sName);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
generateEnum = (sName: string) => {
|
||||||
|
const entityFile = this.project.createSourceFile(`${EntDir}/${sName}.ts`);
|
||||||
|
entityFile.addStatements([
|
||||||
|
'// This file was autogenerated. Please do not change.',
|
||||||
|
'// All changes will be overwrited on commit.',
|
||||||
|
'',
|
||||||
|
]);
|
||||||
|
|
||||||
|
const { enum: enumMembers } = this.schemas[sName];
|
||||||
|
entityFile.addEnum({
|
||||||
|
name: sName,
|
||||||
|
members: enumMembers.map((e: string) => ({ name: e.toUpperCase(), value: e })),
|
||||||
|
isExported: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
this.entities.push(entityFile);
|
||||||
|
};
|
||||||
|
|
||||||
|
generateOneOf = (sName: string) => {
|
||||||
|
const entityFile = this.project.createSourceFile(`${EntDir}/${sName}.ts`);
|
||||||
|
entityFile.addStatements([
|
||||||
|
'// This file was autogenerated. Please do not change.',
|
||||||
|
'// All changes will be overwrited on commit.',
|
||||||
|
'',
|
||||||
|
]);
|
||||||
|
const importEntities: { type: string, isClass: boolean }[] = [];
|
||||||
|
const entities = this.schemas[sName].oneOf.map((elem: any) => {
|
||||||
|
const [
|
||||||
|
pType, isArray, isClass, isImport,
|
||||||
|
] = schemaParamParser(elem, this.openapi);
|
||||||
|
importEntities.push({ type: pType, isClass });
|
||||||
|
return { type: pType, isArray };
|
||||||
|
});
|
||||||
|
entityFile.addTypeAlias({
|
||||||
|
name: sName,
|
||||||
|
isExported: true,
|
||||||
|
type: entities.map((e: any) => e.isArray ? `I${e.type}[]` : `I${e.type}`).join(' | '),
|
||||||
|
})
|
||||||
|
|
||||||
|
// add import
|
||||||
|
importEntities.sort((a, b) => a.type > b.type ? 1 : -1).forEach((ie) => {
|
||||||
|
const { type: pType, isClass } = ie;
|
||||||
|
if (isClass) {
|
||||||
|
entityFile.addImportDeclaration({
|
||||||
|
moduleSpecifier: `./${pType}`,
|
||||||
|
namedImports: [`I${pType}`],
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
entityFile.addImportDeclaration({
|
||||||
|
moduleSpecifier: `./${pType}`,
|
||||||
|
namedImports: [pType],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.entities.push(entityFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
generateClass = (sName: string) => {
|
||||||
|
const entityFile = this.project.createSourceFile(`${EntDir}/${sName}.ts`);
|
||||||
|
entityFile.addStatements([
|
||||||
|
'// This file was autogenerated. Please do not change.',
|
||||||
|
'// All changes will be overwrited on commit.',
|
||||||
|
'',
|
||||||
|
]);
|
||||||
|
|
||||||
|
|
||||||
|
const { properties: sProps, required, $ref, additionalProperties } = this.schemas[sName];
|
||||||
|
if ($ref) {
|
||||||
|
const temp = $ref.split('/');
|
||||||
|
const importSchemaName = `${temp[temp.length - 1]}`;
|
||||||
|
entityFile.addImportDeclaration({
|
||||||
|
defaultImport: importSchemaName,
|
||||||
|
moduleSpecifier: `./${importSchemaName}`,
|
||||||
|
namedImports: [`I${importSchemaName}`],
|
||||||
|
});
|
||||||
|
|
||||||
|
entityFile.addTypeAlias({
|
||||||
|
name: `I${sName}`,
|
||||||
|
type: `I${importSchemaName}`,
|
||||||
|
isExported: true,
|
||||||
|
})
|
||||||
|
|
||||||
|
entityFile.addStatements(`export default ${importSchemaName};`);
|
||||||
|
this.entities.push(entityFile);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const importEntities: { type: string, isClass: boolean }[] = [];
|
||||||
|
const entityInterface = entityFile.addInterface({
|
||||||
|
name: `I${sName}`,
|
||||||
|
isExported: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
const sortedSProps = Object.keys(sProps || {}).sort();
|
||||||
|
const additionalPropsOnly = additionalProperties && sortedSProps.length === 0;
|
||||||
|
|
||||||
|
// add server response interface to entityFile
|
||||||
|
sortedSProps.forEach((sPropName) => {
|
||||||
|
const [
|
||||||
|
pType, isArray, isClass, isImport, isAdditional
|
||||||
|
] = schemaParamParser(sProps[sPropName], this.openapi);
|
||||||
|
|
||||||
|
if (isImport) {
|
||||||
|
importEntities.push({ type: pType, isClass });
|
||||||
|
}
|
||||||
|
const propertyType = isAdditional
|
||||||
|
? `{ [key: string]: ${isClass ? 'I' : ''}${pType}${isArray ? '[]' : ''} }`
|
||||||
|
: `${isClass ? 'I' : ''}${pType}${isArray ? '[]' : ''}`;
|
||||||
|
entityInterface.addProperty({
|
||||||
|
name: sPropName,
|
||||||
|
type: propertyType,
|
||||||
|
hasQuestionToken: !(
|
||||||
|
(required && required.includes(sPropName)) || sProps[sPropName].required
|
||||||
|
),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
if (additionalProperties) {
|
||||||
|
const [
|
||||||
|
pType, isArray, isClass, isImport, isAdditional
|
||||||
|
] = schemaParamParser(additionalProperties, this.openapi);
|
||||||
|
|
||||||
|
if (isImport) {
|
||||||
|
importEntities.push({ type: pType, isClass });
|
||||||
|
}
|
||||||
|
const type = isAdditional
|
||||||
|
? `{ [key: string]: ${isClass ? 'I' : ''}${pType}${isArray ? '[]' : ''} }`
|
||||||
|
: `${isClass ? 'I' : ''}${pType}${isArray ? '[]' : ''}`;
|
||||||
|
entityInterface.addIndexSignature({
|
||||||
|
keyName: 'key',
|
||||||
|
keyType: 'string',
|
||||||
|
returnType: additionalPropsOnly ? type : `${type} | undefined`,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// add import
|
||||||
|
const imports: { type: string, isClass: boolean }[] = [];
|
||||||
|
const types: string[] = [];
|
||||||
|
importEntities.forEach((i) => {
|
||||||
|
const { type } = i;
|
||||||
|
if (!types.includes(type)) {
|
||||||
|
imports.push(i);
|
||||||
|
types.push(type);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
imports.sort((a, b) => a.type > b.type ? 1 : -1).forEach((ie) => {
|
||||||
|
const { type: pType, isClass } = ie;
|
||||||
|
if (isClass) {
|
||||||
|
entityFile.addImportDeclaration({
|
||||||
|
defaultImport: pType,
|
||||||
|
moduleSpecifier: `./${pType}`,
|
||||||
|
namedImports: [`I${pType}`],
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
entityFile.addImportDeclaration({
|
||||||
|
moduleSpecifier: `./${pType}`,
|
||||||
|
namedImports: [pType],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const entityClass = entityFile.addClass({
|
||||||
|
name: sName,
|
||||||
|
isDefaultExport: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
// addProperties to class;
|
||||||
|
sortedSProps.forEach((sPropName) => {
|
||||||
|
const [pType, isArray, isClass, isImport, isAdditional] = schemaParamParser(sProps[sPropName], this.openapi);
|
||||||
|
|
||||||
|
const isRequred = (required && required.includes(sPropName))
|
||||||
|
|| sProps[sPropName].required;
|
||||||
|
|
||||||
|
const propertyType = isAdditional
|
||||||
|
? `{ [key: string]: ${pType}${isArray ? '[]' : ''}${isRequred ? '' : ' | undefined'} }`
|
||||||
|
: `${pType}${isArray ? '[]' : ''}${isRequred ? '' : ' | undefined'}`;
|
||||||
|
|
||||||
|
entityClass.addProperty({
|
||||||
|
name: `_${sPropName}`,
|
||||||
|
isReadonly: true,
|
||||||
|
type: propertyType,
|
||||||
|
});
|
||||||
|
const getter = entityClass.addGetAccessor({
|
||||||
|
name: toCamel(sPropName),
|
||||||
|
returnType: propertyType,
|
||||||
|
statements: [`return this._${sPropName};`],
|
||||||
|
});
|
||||||
|
const { description, example, minItems, maxItems, maxLength, minLength, maximum, minimum } = sProps[sPropName];
|
||||||
|
if (description || example) {
|
||||||
|
getter.addJsDoc(`${example ? `Description: ${description}` : ''}${example ? `\nExample: ${example}` : ''}`);
|
||||||
|
}
|
||||||
|
if (minItems) {
|
||||||
|
entityClass.addGetAccessor({
|
||||||
|
isStatic: true,
|
||||||
|
name: `${toCamel(sPropName)}MinItems`,
|
||||||
|
statements: [`return ${minItems};`],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (maxItems) {
|
||||||
|
entityClass.addGetAccessor({
|
||||||
|
isStatic: true,
|
||||||
|
name: `${toCamel(sPropName)}MaxItems`,
|
||||||
|
statements: [`return ${maxItems};`],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (typeof minLength === 'number') {
|
||||||
|
entityClass.addGetAccessor({
|
||||||
|
isStatic: true,
|
||||||
|
name: `${toCamel(sPropName)}MinLength`,
|
||||||
|
statements: [`return ${minLength};`],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (maxLength) {
|
||||||
|
entityClass.addGetAccessor({
|
||||||
|
isStatic: true,
|
||||||
|
name: `${toCamel(sPropName)}MaxLength`,
|
||||||
|
statements: [`return ${maxLength};`],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (typeof minimum === 'number') {
|
||||||
|
entityClass.addGetAccessor({
|
||||||
|
isStatic: true,
|
||||||
|
name: `${toCamel(sPropName)}MinValue`,
|
||||||
|
statements: [`return ${minimum};`],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (maximum) {
|
||||||
|
entityClass.addGetAccessor({
|
||||||
|
isStatic: true,
|
||||||
|
name: `${toCamel(sPropName)}MaxValue`,
|
||||||
|
statements: [`return ${maximum};`],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(isArray && isClass) && !isClass) {
|
||||||
|
const isEnum = !isClass && isImport;
|
||||||
|
const isRequired = (required && required.includes(sPropName)) || sProps[sPropName].required;
|
||||||
|
const { maxLength, minLength, maximum, minimum } = sProps[sPropName];
|
||||||
|
const haveValidationFields = maxLength || typeof minLength === 'number' || maximum || typeof minimum === 'number';
|
||||||
|
if (isRequired || haveValidationFields) {
|
||||||
|
const prop = toCamel(sPropName);
|
||||||
|
const validateField = entityClass.addMethod({
|
||||||
|
isStatic: true,
|
||||||
|
name: `${prop}Validate`,
|
||||||
|
returnType: `boolean`,
|
||||||
|
parameters: [{
|
||||||
|
name: prop,
|
||||||
|
type: `${pType}${isArray ? '[]' : ''}${isRequred ? '' : ' | undefined'}`,
|
||||||
|
}],
|
||||||
|
})
|
||||||
|
|
||||||
|
validateField.setBodyText((w) => {
|
||||||
|
w.write('return ');
|
||||||
|
const nonRequiredCall = isRequired ? prop : `!${prop} ? true : ${prop}`;
|
||||||
|
if (pType === 'string') {
|
||||||
|
if (isArray) {
|
||||||
|
w.write(`${nonRequiredCall}.reduce<boolean>((result, p) => result && (typeof p === 'string' && !!p.trim()), true)`);
|
||||||
|
} else {
|
||||||
|
if (typeof minLength === 'number' && maxLength) {
|
||||||
|
w.write(`(${nonRequiredCall}.length >${minLength > 0 ? '=' : ''} ${minLength}) && (${nonRequiredCall}.length <= ${maxLength})`);
|
||||||
|
}
|
||||||
|
if (typeof minLength !== 'number' || !maxLength) {
|
||||||
|
w.write(`${isRequired ? `typeof ${prop} === 'string'` : `!${prop} ? true : typeof ${prop} === 'string'`} && !!${nonRequiredCall}.trim()`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (pType === 'number') {
|
||||||
|
if (isArray) {
|
||||||
|
w.write(`${nonRequiredCall}.reduce<boolean>((result, p) => result && typeof p === 'number', true)`);
|
||||||
|
} else {
|
||||||
|
if (typeof minimum === 'number' && maximum) {
|
||||||
|
w.write(`${isRequired ? `${prop} >= ${minimum} && ${prop} <= ${maximum}` : `!${prop} ? true : ((${prop} >= ${minimum}) && (${prop} <= ${maximum}))`}`);
|
||||||
|
}
|
||||||
|
if (typeof minimum !== 'number' || !maximum) {
|
||||||
|
w.write(`${isRequired ? `typeof ${prop} === 'number'` : `!${prop} ? true : typeof ${prop} === 'number'`}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (pType === 'boolean') {
|
||||||
|
w.write(`${isRequired ? `typeof ${prop} === 'boolean'` : `!${prop} ? true : typeof ${prop} === 'boolean'`}`);
|
||||||
|
} else if (isEnum) {
|
||||||
|
if (isArray){
|
||||||
|
w.write(`${nonRequiredCall}.reduce<boolean>((result, p) => result && Object.keys(${pType}).includes(${prop}), true)`);
|
||||||
|
} else {
|
||||||
|
w.write(`${isRequired ? `Object.keys(${pType}).includes(${prop})` : `!${prop} ? true : typeof ${prop} === 'boolean'`}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
w.write(';');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (additionalProperties) {
|
||||||
|
const [
|
||||||
|
pType, isArray, isClass, isImport, isAdditional
|
||||||
|
] = schemaParamParser(additionalProperties, this.openapi);
|
||||||
|
const type = `Record<string, ${pType}${isArray ? '[]' : ''}>`;
|
||||||
|
|
||||||
|
entityClass.addProperty({
|
||||||
|
name: additionalPropsOnly ? 'data' : `${uncapitalize(pType)}Data`,
|
||||||
|
isReadonly: true,
|
||||||
|
type: type,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// add constructor;
|
||||||
|
const ctor = entityClass.addConstructor({
|
||||||
|
parameters: [{
|
||||||
|
name: 'props',
|
||||||
|
type: `I${sName}`,
|
||||||
|
}],
|
||||||
|
});
|
||||||
|
ctor.setBodyText((w) => {
|
||||||
|
if (additionalProperties) {
|
||||||
|
const [
|
||||||
|
pType, isArray, isClass, isImport, isAdditional
|
||||||
|
] = schemaParamParser(additionalProperties, this.openapi);
|
||||||
|
w.writeLine(`this.${additionalPropsOnly ? 'data' : `${uncapitalize(pType)}Data`} = Object.entries(props).reduce<Record<string, ${pType}>>((prev, [key, value]) => {`);
|
||||||
|
if (isClass) {
|
||||||
|
w.writeLine(` prev[key] = new ${pType}(value!);`);
|
||||||
|
} else {
|
||||||
|
w.writeLine(' prev[key] = value!;')
|
||||||
|
}
|
||||||
|
w.writeLine(' return prev;');
|
||||||
|
w.writeLine('}, {})');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
sortedSProps.forEach((sPropName) => {
|
||||||
|
const [
|
||||||
|
pType, isArray, isClass, , isAdditional
|
||||||
|
] = schemaParamParser(sProps[sPropName], this.openapi);
|
||||||
|
const req = (required && required.includes(sPropName))
|
||||||
|
|| sProps[sPropName].required;
|
||||||
|
if (!req) {
|
||||||
|
if ((pType === 'boolean' || pType === 'number' || pType ==='string') && !isClass && !isArray) {
|
||||||
|
w.writeLine(`if (typeof props.${sPropName} === '${pType}') {`);
|
||||||
|
} else {
|
||||||
|
w.writeLine(`if (props.${sPropName}) {`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isAdditional) {
|
||||||
|
if (isArray && isClass) {
|
||||||
|
w.writeLine(`${!req ? ' ' : ''}this._${sPropName} = props.${sPropName}.map((p) => Object.keys(p).reduce((prev, key) => {
|
||||||
|
return { ...prev, [key]: new ${pType}(p[key])};
|
||||||
|
},{}))`);
|
||||||
|
} else if (isClass) {
|
||||||
|
w.writeLine(`${!req ? ' ' : ''}this._${sPropName} = Object.keys(props.${sPropName}).reduce((prev, key) => {
|
||||||
|
return { ...prev, [key]: new ${pType}(props.${sPropName}[key])};
|
||||||
|
},{})`);
|
||||||
|
} else {
|
||||||
|
if (pType === 'string' && !isArray) {
|
||||||
|
w.writeLine(`${!req ? ' ' : ''}this._${sPropName} = Object.keys(props.${sPropName}).reduce((prev, key) => {
|
||||||
|
return { ...prev, [key]: props.${sPropName}[key].trim()};
|
||||||
|
},{})`);
|
||||||
|
} else {
|
||||||
|
w.writeLine(`${!req ? ' ' : ''}this._${sPropName} = Object.keys(props.${sPropName}).reduce((prev, key) => {
|
||||||
|
return { ...prev, [key]: props.${sPropName}[key]};
|
||||||
|
},{})`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (isArray && isClass) {
|
||||||
|
w.writeLine(`${!req ? ' ' : ''}this._${sPropName} = props.${sPropName}.map((p) => new ${pType}(p));`);
|
||||||
|
} else if (isClass) {
|
||||||
|
w.writeLine(`${!req ? ' ' : ''}this._${sPropName} = new ${pType}(props.${sPropName});`);
|
||||||
|
} else {
|
||||||
|
if (pType === 'string' && !isArray) {
|
||||||
|
w.writeLine(`${!req ? ' ' : ''}this._${sPropName} = props.${sPropName}.trim();`);
|
||||||
|
} else {
|
||||||
|
w.writeLine(`${!req ? ' ' : ''}this._${sPropName} = props.${sPropName};`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!req) {
|
||||||
|
w.writeLine('}');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
// add serialize method;
|
||||||
|
const serialize = entityClass.addMethod({
|
||||||
|
isStatic: false,
|
||||||
|
name: 'serialize',
|
||||||
|
returnType: `I${sName}`,
|
||||||
|
});
|
||||||
|
serialize.setBodyText((w) => {
|
||||||
|
if (additionalProperties) {
|
||||||
|
const [
|
||||||
|
pType, isArray, isClass, isImport, isAdditional
|
||||||
|
] = schemaParamParser(additionalProperties, this.openapi);
|
||||||
|
w.writeLine(`return Object.entries(this.${additionalPropsOnly ? 'data' : `${uncapitalize(pType)}Data`}).reduce<Record<string, ${isClass ? 'I' : ''}${pType}>>((prev, [key, value]) => {`);
|
||||||
|
if (isClass) {
|
||||||
|
w.writeLine(` prev[key] = value.serialize();`);
|
||||||
|
} else {
|
||||||
|
w.writeLine(' prev[key] = value;')
|
||||||
|
}
|
||||||
|
w.writeLine(' return prev;');
|
||||||
|
w.writeLine('}, {})');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
w.writeLine(`const data: I${sName} = {`);
|
||||||
|
const unReqFields: string[] = [];
|
||||||
|
sortedSProps.forEach((sPropName) => {
|
||||||
|
const req = (required && required.includes(sPropName))
|
||||||
|
|| sProps[sPropName].required;
|
||||||
|
const [, isArray, isClass, , isAdditional] = schemaParamParser(sProps[sPropName], this.openapi);
|
||||||
|
if (!req) {
|
||||||
|
unReqFields.push(sPropName);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (isAdditional) {
|
||||||
|
if (isArray && isClass) {
|
||||||
|
w.writeLine(` ${sPropName}: this._${sPropName}.map((p) => Object.keys(p).reduce((prev, key) => ({ ...prev, [key]: p[key].serialize() }))),`);
|
||||||
|
} else if (isClass) {
|
||||||
|
w.writeLine(` ${sPropName}: Object.keys(this._${sPropName}).reduce<Record<string, any>>((prev, key) => ({ ...prev, [key]: this._${sPropName}[key].serialize() }), {}),`);
|
||||||
|
} else {
|
||||||
|
w.writeLine(` ${sPropName}: Object.keys(this._${sPropName}).reduce((prev, key) => ({ ...prev, [key]: this._${sPropName}[key] })),`);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (isArray && isClass) {
|
||||||
|
w.writeLine(` ${sPropName}: this._${sPropName}.map((p) => p.serialize()),`);
|
||||||
|
} else if (isClass) {
|
||||||
|
w.writeLine(` ${sPropName}: this._${sPropName}.serialize(),`);
|
||||||
|
} else {
|
||||||
|
w.writeLine(` ${sPropName}: this._${sPropName},`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
w.writeLine('};');
|
||||||
|
unReqFields.forEach((sPropName) => {
|
||||||
|
const [, isArray, isClass, , isAdditional] = schemaParamParser(sProps[sPropName], this.openapi);
|
||||||
|
w.writeLine(`if (typeof this._${sPropName} !== 'undefined') {`);
|
||||||
|
if (isAdditional) {
|
||||||
|
if (isArray && isClass) {
|
||||||
|
w.writeLine(` data.${sPropName} = this._${sPropName}.map((p) => Object.keys(p).reduce((prev, key) => ({ ...prev, [key]: p[key].serialize() }), {}));`);
|
||||||
|
} else if (isClass) {
|
||||||
|
w.writeLine(` data.${sPropName} = Object.keys(this._${sPropName}).reduce((prev, key) => ({ ...prev, [key]: this._${sPropName}[key].serialize() }), {});`);
|
||||||
|
} else {
|
||||||
|
w.writeLine(` data.${sPropName} = Object.keys(this._${sPropName}).reduce((prev, key) => ({ ...prev, [key]: this._${sPropName}[key] }), {});`);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (isArray && isClass) {
|
||||||
|
w.writeLine(` data.${sPropName} = this._${sPropName}.map((p) => p.serialize());`);
|
||||||
|
} else if (isClass) {
|
||||||
|
w.writeLine(` data.${sPropName} = this._${sPropName}.serialize();`);
|
||||||
|
} else {
|
||||||
|
w.writeLine(` data.${sPropName} = this._${sPropName};`);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
w.writeLine(`}`);
|
||||||
|
});
|
||||||
|
w.writeLine('return data;');
|
||||||
|
});
|
||||||
|
|
||||||
|
// add validate method
|
||||||
|
const validate = entityClass.addMethod({
|
||||||
|
isStatic: false,
|
||||||
|
name: 'validate',
|
||||||
|
returnType: `string[]`,
|
||||||
|
})
|
||||||
|
validate.setBodyText((w) => {
|
||||||
|
if (additionalPropsOnly) {
|
||||||
|
w.writeLine('return []')
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
w.writeLine('const validate = {');
|
||||||
|
Object.keys(sProps || {}).forEach((sPropName) => {
|
||||||
|
const [pType, isArray, isClass, , isAdditional] = schemaParamParser(sProps[sPropName], this.openapi);
|
||||||
|
|
||||||
|
const { maxLength, minLength, maximum, minimum } = sProps[sPropName];
|
||||||
|
|
||||||
|
const isRequired = (required && required.includes(sPropName)) || sProps[sPropName].required;
|
||||||
|
const nonRequiredCall = isRequired ? `this._${sPropName}` : `!this._${sPropName} ? true : this._${sPropName}`;
|
||||||
|
|
||||||
|
if (isArray && isClass) {
|
||||||
|
w.writeLine(` ${sPropName}: ${nonRequiredCall}.reduce((result, p) => result && p.validate().length === 0, true),`);
|
||||||
|
} else if (isClass && !isAdditional) {
|
||||||
|
w.writeLine(` ${sPropName}: ${nonRequiredCall}.validate().length === 0,`);
|
||||||
|
} else {
|
||||||
|
if (pType === 'string') {
|
||||||
|
if (isArray) {
|
||||||
|
w.writeLine(` ${sPropName}: ${nonRequiredCall}.reduce((result, p) => result && typeof p === 'string', true),`);
|
||||||
|
} else {
|
||||||
|
if (typeof minLength === 'number' && maxLength) {
|
||||||
|
w.writeLine(` ${sPropName}: (${nonRequiredCall}.length >${minLength > 0 ? '=' : ''} ${minLength}) && (${nonRequiredCall}.length <= ${maxLength}),`);
|
||||||
|
}
|
||||||
|
if (typeof minLength !== 'number' || !maxLength) {
|
||||||
|
w.writeLine(` ${sPropName}: ${isRequired ? `typeof this._${sPropName} === 'string'` : `!this._${sPropName} ? true : typeof this._${sPropName} === 'string'`} && !this._${sPropName} ? true : this._${sPropName},`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (pType === 'number') {
|
||||||
|
if (isArray) {
|
||||||
|
w.writeLine(` ${sPropName}: ${nonRequiredCall}.reduce((result, p) => result && typeof p === 'number', true),`);
|
||||||
|
} else {
|
||||||
|
if (typeof minimum === 'number' && maximum) {
|
||||||
|
w.writeLine(` ${sPropName}: ${isRequired ? `this._${sPropName} >= ${minimum} && this._${sPropName} <= ${maximum}` : `!this._${sPropName} ? true : ((this._${sPropName} >= ${minimum}) && (this._${sPropName} <= ${maximum}))`},`);
|
||||||
|
}
|
||||||
|
if (typeof minimum !== 'number' || !maximum) {
|
||||||
|
w.writeLine(` ${sPropName}: ${isRequired ? `typeof this._${sPropName} === 'number'` : `!this._${sPropName} ? true : typeof this._${sPropName} === 'number'`},`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (pType === 'boolean') {
|
||||||
|
w.writeLine(` ${sPropName}: ${isRequired ? `typeof this._${sPropName} === 'boolean'` : `!this._${sPropName} ? true : typeof this._${sPropName} === 'boolean'`},`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
w.writeLine('};');
|
||||||
|
w.writeLine('const isError: string[] = [];')
|
||||||
|
w.writeLine('Object.keys(validate).forEach((key) => {');
|
||||||
|
w.writeLine(' if (!(validate as any)[key]) {');
|
||||||
|
w.writeLine(' isError.push(key);');
|
||||||
|
w.writeLine(' }');
|
||||||
|
w.writeLine('});');
|
||||||
|
w.writeLine('return isError;');
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
// add update method;
|
||||||
|
const update = entityClass.addMethod({
|
||||||
|
isStatic: false,
|
||||||
|
name: 'update',
|
||||||
|
returnType: `${sName}`,
|
||||||
|
});
|
||||||
|
update.addParameter({
|
||||||
|
name: 'props',
|
||||||
|
type: additionalPropsOnly ? `I${sName}` : `Partial<I${sName}>`,
|
||||||
|
});
|
||||||
|
update.setBodyText((w) => { w.writeLine(`return new ${sName}({ ...this.serialize(), ...props });`); });
|
||||||
|
|
||||||
|
this.entities.push(entityFile);
|
||||||
|
};
|
||||||
|
|
||||||
|
save = () => {
|
||||||
|
this.entities.forEach(async (e) => {
|
||||||
|
await e.saveSync();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export default EntitiesGenerator;
|
||||||
83
client2/scripts/generator/src/utils.ts
Normal file
83
client2/scripts/generator/src/utils.ts
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
const toCamel = (s: string) => {
|
||||||
|
return s.replace(/([-_][a-z])/ig, ($1) => {
|
||||||
|
return $1.toUpperCase()
|
||||||
|
.replace('-', '')
|
||||||
|
.replace('_', '');
|
||||||
|
});
|
||||||
|
};
|
||||||
|
const capitalize = (s: string) => {
|
||||||
|
return s[0].toUpperCase() + s.slice(1);
|
||||||
|
};
|
||||||
|
const uncapitalize = (s: string) => {
|
||||||
|
return s[0].toLowerCase() + s.slice(1);
|
||||||
|
};
|
||||||
|
const TYPES = {
|
||||||
|
integer: 'number',
|
||||||
|
float: 'number',
|
||||||
|
number: 'number',
|
||||||
|
string: 'string',
|
||||||
|
boolean: 'boolean',
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param schemaProp: valueof shema.properties[key]
|
||||||
|
* @param openApi: openapi object
|
||||||
|
* @returns [propType - basicType or import one, isArray, isClass, isImport]
|
||||||
|
*/
|
||||||
|
const schemaParamParser = (schemaProp: any, openApi: any): [string, boolean, boolean, boolean, boolean] => {
|
||||||
|
let type = '';
|
||||||
|
let isImport = false;
|
||||||
|
let isClass = false;
|
||||||
|
let isArray = false;
|
||||||
|
let isAdditional = false;
|
||||||
|
|
||||||
|
if (schemaProp.$ref || schemaProp.additionalProperties?.$ref) {
|
||||||
|
const temp = (schemaProp.$ref || schemaProp.additionalProperties?.$ref).split('/');
|
||||||
|
|
||||||
|
if (schemaProp.additionalProperties) {
|
||||||
|
isAdditional = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
type = `${temp[temp.length - 1]}`;
|
||||||
|
|
||||||
|
const cl = openApi ? openApi.components.schemas[type] : {};
|
||||||
|
|
||||||
|
if (cl.$ref) {
|
||||||
|
const link = schemaParamParser(cl, openApi);
|
||||||
|
link.shift();
|
||||||
|
return [type, ...link] as any;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cl.type === 'string' && cl.enum) {
|
||||||
|
isImport = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cl.type === 'object' && !cl.oneOf) {
|
||||||
|
isClass = true;
|
||||||
|
isImport = true;
|
||||||
|
} else if (cl.type === 'array') {
|
||||||
|
const temp: any = schemaParamParser(cl.items, openApi);
|
||||||
|
type = `${temp[0]}`;
|
||||||
|
isArray = true;
|
||||||
|
isClass = isClass || temp[2];
|
||||||
|
isImport = isImport || temp[3];
|
||||||
|
}
|
||||||
|
} else if (schemaProp.type === 'array') {
|
||||||
|
const temp: any = schemaParamParser(schemaProp.items, openApi);
|
||||||
|
type = `${temp[0]}`;
|
||||||
|
isArray = true;
|
||||||
|
isClass = isClass || temp[2];
|
||||||
|
isImport = isImport || temp[3];
|
||||||
|
} else {
|
||||||
|
type = (TYPES as Record<any, string>)[schemaProp.type];
|
||||||
|
}
|
||||||
|
if (!type) {
|
||||||
|
// TODO: Fix bug with Error fields.
|
||||||
|
type = 'any';
|
||||||
|
// throw new Error('Failed to find entity type');
|
||||||
|
}
|
||||||
|
|
||||||
|
return [type, isArray, isClass, isImport, isAdditional];
|
||||||
|
};
|
||||||
|
|
||||||
|
export { TYPES, toCamel, capitalize, uncapitalize, schemaParamParser };
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user