Merge: fix #822 - Whitelist filter rules

Squashed commit of the following:

commit 350c6d5fadd77145b801df8887284bf4d64fbd19
Author: Ildar Kamalov <i.kamalov@adguard.com>
Date:   Wed Feb 26 15:43:29 2020 +0300

    * client: update translations

commit a884dffcd59f2259e2eee2c1e5a3270819bf8962
Author: Ildar Kamalov <i.kamalov@adguard.com>
Date:   Mon Feb 17 17:32:10 2020 +0300

    + client: handle whitelist filters

commit a586ec5bc614ffb0e01584a1fbdc7292b4865e68
Author: ArtemBaskal <a.baskal@adguard.com>
Date:   Wed Jan 29 18:16:59 2020 +0300

    + client: add whitelist

commit a52c3de62cf2fa34be6394771fb8bb56b4ee81e3
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Thu Feb 20 17:50:44 2020 +0300

    * change /filtering/refresh

commit 7f8f2ecccb9f7fa65318c1717dc6a7bd61afccf4
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Thu Feb 20 16:17:07 2020 +0300

    * fix race-detector issue

commit ac4b64c4a52c5b364a4b154bf18dea0fdf45647f
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Mon Jan 20 20:08:21 2020 +0300

    + whitelist filters
This commit is contained in:
Andrey Meshkov 2020-02-26 19:58:25 +03:00
parent 82aa38fce3
commit d839136fee
70 changed files with 1821 additions and 1132 deletions

2
.gitignore vendored
View File

@ -1,6 +1,6 @@
.DS_Store
/.vscode
/.idea
.idea
/AdGuardHome
/AdGuardHome.exe
/AdGuardHome.yaml

View File

@ -55,7 +55,10 @@ Contents:
* Filters update mechanism
* API: Get filtering parameters
* API: Set filtering parameters
* API: Refresh filters
* API: Add Filter
* API: Set URL parameters
* API: Delete URL
* API: Domain Check
* Log-in page
* API: Log in
@ -1362,9 +1365,23 @@ Response:
}
...
],
"whitelist_filters":[
{
"id":1
"enabled":true,
"url":"https://...",
"name":"...",
"rules_count":1234,
"last_updated":"2019-09-04T18:29:30+00:00",
}
...
],
"user_rules":["...", ...]
}
For both arrays `filters` and `whitelist_filters` there are unique values: id, url.
ID for each filter is assigned by Server - it's used for file names.
### API: Set filtering parameters
@ -1382,6 +1399,38 @@ Response:
200 OK
### API: Refresh filters
Request:
POST /control/filtering/refresh
Response:
200 OK
{
"updated": 123 // number of filters updated
}
### API: Add Filter
Request:
POST /control/filtering/add_url
{
"name": "..."
"url": "..."
"whitelist": true
}
Response:
200 OK
### API: Set URL parameters
Request:
@ -1390,6 +1439,7 @@ Request:
{
"url": "..."
"whitelist": true
"data": {
"name": "..."
"url": "..."
@ -1402,6 +1452,22 @@ Response:
200 OK
### API: Delete URL
Request:
POST /control/filtering/remove_url
{
"url": "..."
"whitelist": true
}
Response:
200 OK
### API: Domain Check
Check if host name is filtered.

View File

@ -90,21 +90,14 @@
"enabled_save_search_toast": "Разреши Безопасно Търсене",
"enabled_table_header": "Разреши",
"name_table_header": "Име",
"filter_url_table_header": "URL филтър",
"rules_count_table_header": "Правила общо",
"last_time_updated_table_header": "Последно обновен",
"actions_table_header": "Действия",
"delete_table_action": "Изтрий",
"filters_and_hosts": "Черни списъци с общи и местни филтри",
"filters_and_hosts_hint": "AdGuard Home разбира adblock и host синтаксис.",
"no_filters_added": "Няма добавени филтри",
"add_filter_btn": "Добави филтър",
"cancel_btn": "Откажи",
"enter_name_hint": "Въведи име",
"enter_url_hint": "Въведи URL",
"check_updates_btn": "Провери за актуализация",
"new_filter_btn": "Въведи нов филтър",
"enter_valid_filter_url": "Моля въведете валиден URL за филтъра или проверете host правописа.",
"custom_filter_rules": "Местни правила за филтриране",
"custom_filter_rules_hint": "Въвеждайте всяко правило на нов ред. Може да използвате adblock или hosts файлов синтаксис.",
"examples_title": "Примери",
@ -119,7 +112,6 @@
"example_upstream_doh": "криптиран <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-върху-HTTPS</a>",
"example_upstream_sdns": "може да ползвате <a href='https://dnscrypt.info/stamps/' target='_blank'>DNS Подписване</a> за <a href='https://dnscrypt.info/' target='_blank'>DNSCrypt</a> или <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-върху-HTTPS</a> сървъри",
"example_upstream_tcp": "класически DNS (TCP протокол)",
"all_filters_up_to_date_toast": "Всички филти са актуализирани",
"updated_upstream_dns_toast": "Глобалните DNS сървъри са обновени",
"dns_test_ok_toast": "Въведените DNS сървъри работят коректно",
"dns_test_not_ok_toast": "Сървър \"{{key}}\": не работи, моля проверете дали е въведен коректно",
@ -139,7 +131,6 @@
"next_btn": "Следващ",
"loading_table_status": "Зареждане...",
"page_table_footer_text": "Страница",
"of_table_footer_text": "от",
"rows_table_footer_text": "редове",
"updated_custom_filtering_toast": "Обновени местни правила за филтриране",
"rule_removed_from_custom_filtering_toast": "Премахнато от местни правила за филтриране",
@ -148,7 +139,6 @@
"found_in_known_domain_db": "Намерен в списъците с домейни.",
"category_label": "Категория",
"rule_label": "Правило",
"filter_label": "Филтър",
"unknown_filter": "Непознат филтър {{filterId}}",
"install_welcome_title": "Добре дошли в AdGuard Home!",
"install_welcome_desc": "AdGuard Home e мрежово решение за блокиране на реклами и тракери на DNS ниво. Създадено е за да ви даде пълен контрол над мрежата и всичките ви устройства, без да е необходимо допълнително инсталиране на друг софтуер.",

View File

@ -122,22 +122,17 @@
"enabled_save_search_toast": "Vypnuté bezpečné vyhledávání",
"enabled_table_header": "Zapnuto",
"name_table_header": "Název",
"filter_url_table_header": "URL filtru",
"rules_count_table_header": "Počet pravidel",
"last_time_updated_table_header": "Čas poslední aktualizace",
"actions_table_header": "Akce",
"edit_table_action": "Upravit",
"delete_table_action": "Vymazat",
"filters_and_hosts": "Filtry a seznamy blokovaných hostitelů",
"filters_and_hosts_hint": "AdGuard Home zná základní pravidla blokování reklam a syntaxe hostsitelských souborů.",
"no_filters_added": "Nebyly přidány žádné filtry",
"add_filter_btn": "Přidat filtr",
"cancel_btn": "Zrušit",
"enter_name_hint": "Zadejte název",
"enter_url_hint": "Zadejte URL",
"check_updates_btn": "Zkontrolovat aktualizace",
"new_filter_btn": "Odběr nového filtru",
"enter_valid_filter_url": "Zadejte platnou URL pro odběr filtru nebo hostitelského souboru.",
"form_error_url_format": "Neplatný formát URL",
"custom_filter_rules": "Vlastní pravidla filtrování",
"custom_filter_rules_hint": "Na každý řádek vložte jedno pravidlo. Můžete použít buď pravidla blokování reklam nebo syntaxe hostitelských souborů.",
"examples_title": "Příklady",
@ -153,7 +148,6 @@
"example_upstream_doh": "šifrovaný <0>DNS přes HTTPS</0>",
"example_upstream_sdns": "můžete použít <0>DNS razítka</0> pro <1>DNSCrypt</1> nebo <2>DNS přes HTTPS</2> řešitele",
"example_upstream_tcp": "obyčejný DNS (přes TCP)",
"all_filters_up_to_date_toast": "Všechny filtry jsou již aktuální",
"updated_upstream_dns_toast": "Aktualizované upstream DNS servery",
"dns_test_ok_toast": "Specifikované DNS servery pracují správně",
"dns_test_not_ok_toast": "Server \"{{key}}\": nemohl být použit, zkontrolujte, zda jste ho správně napsali",
@ -173,7 +167,6 @@
"next_btn": "Další",
"loading_table_status": "Načítání...",
"page_table_footer_text": "Stránka",
"of_table_footer_text": "z",
"rows_table_footer_text": "řádky",
"updated_custom_filtering_toast": "Aktualizovaná vlastní pravidla filtrování",
"rule_removed_from_custom_filtering_toast": "Pravidlo odstraněno z vlastních pravidel filtrování",
@ -191,6 +184,7 @@
"query_log_retention_confirm": "Opravdu chcete změnit uchovávání protokolu dotazů? Pokud snížíte hodnotu intervalu, některá data budou ztracena",
"dns_config": "Konfigurace serveru DNS",
"blocking_mode": "Režim blokování",
"default": "Výchozí",
"nxdomain": "NXDOMAIN",
"null_ip": "Nulová IP",
"custom_ip": "Vlastní IP",
@ -203,13 +197,15 @@
"rate_limit_desc": "Počet požadavků za sekundu, které smí jeden klient provádět (0: neomezeno)",
"blocking_ipv4_desc": "IP adresa, která se má vrátit v případě blokovaného požadavku A",
"blocking_ipv6_desc": "IP adresa, která se má vrátit v případě blokovaného požadavku AAAA",
"blocking_mode_desc": "<0>NXDOMAIN Odpověď s kódem NXDOMAIN;</0> <0>Nulová IP Odpověď s nulovou IP adresou (0,0.0,0 pro A; :: pro AAAA);</0> <0>Vlastní IP adresa Odpověď s ručně nastavenou IP adresou.</0>",
"blocking_mode_default": "Výchozí: Odezva pomocí NXDOMAIN, pokud je blokováno pravidlem ve stylu Adblock; odezva pomocí IP adresy uvedené v pravidle, pokud je blokováno pravidlem /etc/hosts-style",
"blocking_mode_nxdomain": "NXDOMAIN: Odezva s kódem NXDOMAIN",
"blocking_mode_null_ip": "Nulová IP: Odezva s nulovou IP adresou (0.0.0.0 pro A; :: pro AAAA)",
"blocking_mode_custom_ip": "Vlastní IP. odezva s ručně nastavenou IP adresou",
"upstream_dns_client_desc": "Pokud toto pole ponecháte prázdné, AdGuard Home použije servery nakonfigurované v<0>nastavení DNS</0>.",
"source_label": "Zdroj",
"found_in_known_domain_db": "Nalezeno v databázi známých domén",
"category_label": "Kategorie",
"rule_label": "Pravidlo",
"filter_label": "Filtr",
"unknown_filter": "Neznámý filtr {{filterId}}",
"install_welcome_title": "Vítejte v AdGuard Home!",
"install_welcome_desc": "AdGuard Home je síťový DNS server pro blokování reklam a slídičů. Jeho cílem je, abyste ovládali celou Vaši síť a všechny Vaše zařízení, přičemž se nevyžaduje použití jakéhokoliv programu na straně klienta.",
@ -321,7 +317,7 @@
"client_edit": "Upravit klienta",
"client_identifier": "Identifikátor",
"ip_address": "IP adresa",
"client_identifier_desc": "Klienti můžou být identifikováni podle IP adresy CIDR nebo MAC adresy. Upozorňujeme, že použití MAC jako identifikátoru je možné pouze v případě, že je AdGuard Home také <0>DHCP server</0>",
"client_identifier_desc": "Klienti můžou být identifikováni podle IP adresy, CIDR nebo MAC adresy. Upozorňujeme, že použití MAC jako identifikátoru je možné pouze v případě, že je AdGuard Home také <0>DHCP server</0>",
"form_enter_ip": "Zadejte IP",
"form_enter_mac": "Zadejte MAC",
"form_enter_id": "Zadejte identifikátor",
@ -333,7 +329,6 @@
"client_updated": "Klient \"{{key}}\" byl úspěšně aktualizován",
"clients_not_found": "Nenalezeni žádní klienti",
"client_confirm_delete": "Opravdu chcete odstranit klienta \"{{key}}\"?",
"filter_confirm_delete": "Opravdu chcete smazat filtr?",
"auto_clients_title": "Klienti (doba spuštění)",
"auto_clients_desc": "Data o klientech, kteří používají AdGuard Home, ale nejsou uloženi v konfiguraci",
"access_title": "Nastavení přístupu",
@ -399,7 +394,6 @@
"interval_days_plural": "Dny: {{count}}",
"domain": "Doména",
"answer": "Odpověď",
"filter_added_successfully": "Filtr byl úspěšně přidán",
"statistics_configuration": "Konfigurace statistik",
"statistics_retention": "Uchovávání statistik",
"statistics_retention_desc": "Pokud hodnotu intervalu snížíte, některá data budou ztracena",
@ -431,5 +425,33 @@
"try_again": "Zkusit znovu",
"domain_desc": "Zadejte název domény nebo zástupný znak, který chcete přepsat.",
"example_rewrite_domain": "přepsat odezvy pouze pro tento název domény.",
"example_rewrite_wildcard": "přepsat odezvy pro všechny subdomény <0>example.org</0>."
"example_rewrite_wildcard": "přepsat odezvy pro všechny subdomény <0>example.org</0>.",
"disable_ipv6": "Zakázat IPv6",
"disable_ipv6_desc": "Pokud je tato funkce povolena, budou všechny dotazy DNS pro adresy IPv6 (typ AAAA) zrušeny.",
"tags_title": "Značky",
"tags_desc": "Můžete vybrat značky, které jsou přiřazeny klientovi. Značky mohou být zahrnuty do pravidel filtrování a umožňují Vám je přesněji použít. <0>Dozvědět se více</0>",
"form_select_tags": "Vyberte značky klienta",
"check_title": "Zkontrolovat filtrování",
"check_desc": "Zkontrolujte, zda je název hostitele filtrován",
"check": "Zkontrolovat",
"form_enter_host": "Zadejte název hostitele",
"filtered_custom_rules": "Filtrováno pomocí vlastních pravidel filtrování",
"host_whitelisted": "Hostitel je na seznamu povolených",
"check_ip": "IP adresy: {{ip}}",
"check_cname": "CNAME: {{cname}}",
"check_reason": "Důvod: {{reason}}",
"check_rule": "Pravidlo: {{rule}}",
"check_service": "Název služby: {{service}}",
"check_not_found": "Nenalezeno ve Vašich seznamech filtrů",
"client_confirm_block": "Opravdu chcete zablokovat klienta „{{ip}}“?",
"client_confirm_unblock": "Opravdu chcete odblokovat klienta „{{ip}}“?",
"client_blocked": "Klient „{{ip}}“ byl úspěšně zablokován",
"client_unblocked": "Klient „{{ip}}“ byl úspěšně odblokován",
"static_ip": "Statická IP adresa",
"static_ip_desc": "AdGuard Home je server, takže pro správné fungování potřebuje statickou IP adresu. V opačném případě může váš router tomuto zařízení přiřadit jinou IP adresu.",
"set_static_ip": "Nastavit statickou IP adresu",
"install_static_ok": "Skvělá zpráva! Statická IP adresa je již nakonfigurována",
"install_static_error": "AdGuard Home nemůže automaticky nakonfigurovat toto síťové rozhraní. Prosím vyhledejte návod, jak to provést ručně.",
"install_static_configure": "Detekovali jsme, že se používá dynamická IP adresa — <0>{{ip}}</0>. Chcete ji použít jako statickou adresu?",
"confirm_static_ip": "AdGuard Home nakonfiguruje {{ip}} jako statickou IP adresu. Chcete pokračovat?"
}

View File

@ -122,22 +122,17 @@
"enabled_save_search_toast": "Sikker søgning aktiveret",
"enabled_table_header": "Aktiveret",
"name_table_header": "Navn",
"filter_url_table_header": "Filter URL",
"rules_count_table_header": "Antal regler",
"last_time_updated_table_header": "Sidst opdateret",
"actions_table_header": "Handlinger",
"edit_table_action": "Rediger",
"delete_table_action": "Slet",
"filters_and_hosts": "Filtre og værters blokeringslister",
"filters_and_hosts_hint": "AdGuard Home forstår de grundlæggende annonceblokeringsregler og værtsfilsyntaks.",
"no_filters_added": "Ingen filtre tilføjet",
"add_filter_btn": "Tilføj filter",
"cancel_btn": "Annuller",
"enter_name_hint": "Indtast navn",
"enter_url_hint": "Indtast URL",
"check_updates_btn": "Søg efter opdateringer",
"new_filter_btn": "Nyt filterabonnement",
"enter_valid_filter_url": "Indtast en gyldig URL til et filterabonnementet eller en værtsfil.",
"form_error_url_format": "Ugyldigt url-format",
"custom_filter_rules": "Brugerdefinerede filtreringsregler",
"custom_filter_rules_hint": "Indtast en regel per linje. Du kan enten bruge annonceblokeringsregler eller værtsfilsyntaks.",
"examples_title": "Eksempler",
@ -153,7 +148,6 @@
"example_upstream_doh": "krypteret <0>DNS-over-HTTPS</0>",
"example_upstream_sdns": "du kan bruge <0>DNS Stamps<0> til <1>DNSCrypt>/1> eller <2>DNS-over-HTTPS</2> resolvers",
"example_upstream_tcp": "almindelig DNS (over TCP)",
"all_filters_up_to_date_toast": "Alle filtre er allerede opdateret",
"updated_upstream_dns_toast": "Opdaterede upstream DNS-servere",
"dns_test_ok_toast": "De angivne DNS-servere fungerer korrekt",
"dns_test_not_ok_toast": "Server \"{{key}}\": kunne ikke bruges, kontroller venligst at du har skrevet det korrekt",
@ -173,7 +167,6 @@
"next_btn": "Næste",
"loading_table_status": "Indlæser...",
"page_table_footer_text": "Side",
"of_table_footer_text": "af",
"rows_table_footer_text": "rækker",
"updated_custom_filtering_toast": "De brugerdefinerede filtreringsregler er blevet opdateret",
"rule_removed_from_custom_filtering_toast": "Regel fjernet fra de brugerdefinerede filtreringsregler",
@ -191,6 +184,7 @@
"query_log_retention_confirm": "Er du sikker på, at du vil ændre opbevaring af forespørgselsloggen? Hvis du mindsker intervalværdien, vil nogle data gå tabt",
"dns_config": "DNS-serverkonfiguration",
"blocking_mode": "Blokeringstilstand",
"default": "Standard",
"nxdomain": "NXDOMAIN",
"null_ip": "Null IP",
"custom_ip": "Tilpasset IP",
@ -203,13 +197,15 @@
"rate_limit_desc": "Antallet af anmodninger pr. sekund, som en enkelt klient får lov til at fremsætte (0: ubegrænset)",
"blocking_ipv4_desc": "IP-adresse, der skal returneres for en blokeret A-anmodning",
"blocking_ipv6_desc": "IP-adresse, der skal returneres for en blokeret AAAA-anmodning",
"blocking_mode_desc": "<0>NXDOMAIN - Svar med NXDOMAIN-kode;</0> <0>Null IP - Svar med nul IP-adresse (0.0.0.0 for A, :: for AAAA);</0> <0>Brugerdefineret IP - Svar med en manuelt indstillet IP-adresse.</0>",
"blocking_mode_default": "Standard: Svar med NXDOMAIN, når det blokeres af Adblock-stil-reglen; svar med den IP-adresse, der er angivet i reglen, når den blokeres af /etc/hosts-style-reglen",
"blocking_mode_nxdomain": "NXDOMAIN: Svar med NXDOMAIN-kode",
"blocking_mode_null_ip": "Null IP: Svar med nul IP-adresse (0.0.0.0 for A; :: for AAAA)",
"blocking_mode_custom_ip": "Brugerdefineret IP: Svar med en manuelt indstillet IP-adresse",
"upstream_dns_client_desc": "Hvis du lader dette felt være tomt, vil AdGuard Home bruge de servere, der er konfigureret i <0>DNS-indstillingerne</0>.",
"source_label": "Kilde",
"found_in_known_domain_db": "Fundet i databasen med kendte domæner.",
"category_label": "Kategori",
"rule_label": "Regel",
"filter_label": "Filter",
"unknown_filter": "Ukendt filter {{filterId}}",
"install_welcome_title": "Velkommen til AdGuard Home!",
"install_welcome_desc": "AdGuard Home er en netværksbaseret annonce-og-tracker blokerende DNS-server. Formålet er at lade dig kontrollere hele dit netværk og alle dine enheder, og det kræver ikke at man bruger klientsoftware.",
@ -321,7 +317,7 @@
"client_edit": "Rediger Klient",
"client_identifier": "Identifikator",
"ip_address": "IP-adresse",
"client_identifier_desc": "Klienter kan identificeres ud fra IP-adressen, CIDR eller MAC-adressen. Bemærk venligst, at det kun er muligt at bruge MAC som identifikator, hvis AdGuard Home også er en <0>DHCP-server</0>",
"client_identifier_desc": "Klienter kan identificeres ud fra IP-adressen, CIDR eller MAC-adressen. Bemærk, at det kun er muligt at bruge MAC som identifikator, hvis AdGuard Home også er en <0>DHCP-server</0>",
"form_enter_ip": "Indtast IP",
"form_enter_mac": "Indtast MAC",
"form_enter_id": "Indtast identifikator",
@ -333,7 +329,6 @@
"client_updated": "Klient \"{{key}}\" succesfuldt opdateret",
"clients_not_found": "Ingen klienter fundet",
"client_confirm_delete": "Er du sikker på, at du vil slette klient \"{{key}}\"?",
"filter_confirm_delete": "Er du sikker på, at du vil slette filtret?",
"auto_clients_title": "Klienter (runtime)",
"auto_clients_desc": "Data om de klienter, der bruger AdGuard Home, men ikke gemt i konfigurationen",
"access_title": "Adgangsindstillinger",
@ -399,7 +394,6 @@
"interval_days_plural": "{{count}} dage",
"domain": "Domæne",
"answer": "Svar",
"filter_added_successfully": "Filtret er blevet tilføjet",
"statistics_configuration": "Konfiguration af statistik",
"statistics_retention": "Tilbageholdelse af statistikker",
"statistics_retention_desc": "Hvis du mindsker intervalværdien, vil nogle data gå tabt",
@ -431,5 +425,33 @@
"try_again": "Prøv igen",
"domain_desc": "Indtast det domænenavn eller wildcard, du ønsker skal omskrives.",
"example_rewrite_domain": "omskriv kun svar for dette domænenavn.",
"example_rewrite_wildcard": "omskriv svar for alle <0>example.org</0> subdomæner."
"example_rewrite_wildcard": "omskriv svar for alle <0>example.org</0> subdomæner.",
"disable_ipv6": "Deaktiver IPv6",
"disable_ipv6_desc": "Hvis denne funktion er aktiveret, slettes alle DNS-forespørgsler til IPv6-adresser (type AAAA).",
"tags_title": "Tags",
"tags_desc": "Du kan vælge de tags, der svarer til klienten. Tags kan inkluderes i filtreringsreglerne og giver dig mulighed for at anvende dem mere nøjagtigt. <0>Læs mere</0>",
"form_select_tags": "Vælg klient tags",
"check_title": "Kontroller filtreringen",
"check_desc": "Kontroller, om værtsnavnet er filtreret",
"check": "Kontroller",
"form_enter_host": "Indtast et værtsnavn",
"filtered_custom_rules": "Filtreret af brugerdefinerede filtreringsregler",
"host_whitelisted": "Værten er hvidlistet",
"check_ip": "IP-adresser: {{ip}}",
"check_cname": "CNAME: {{cname}}",
"check_reason": "Årsag: {{reason}}",
"check_rule": "Regel: {{rule}}",
"check_service": "Servicenavn: {{service}}",
"check_not_found": "Ikke fundet i dine filterlister",
"client_confirm_block": "Er du sikker på, at du vil blokere klienten \"{{ip}}\"?",
"client_confirm_unblock": "Er du sikker på, at du vil fjerne blokeringen af klienten \"{{ip}}\"?",
"client_blocked": "Klient \"{{ip}}\" blev blokeret",
"client_unblocked": "Blokering af klient \"{{ip}}\" fjernet",
"static_ip": "Statisk IP-adresse",
"static_ip_desc": "AdGuard Home er en server, så den har brug for en statisk IP-adresse for at fungere korrekt. Ellers på et tidspunkt vil din router muligvis tildele en anden IP-adresse til denne enhed.",
"set_static_ip": "Indstil en statisk IP-adresse",
"install_static_ok": "Gode nyheder! Den statiske IP-adresse er allerede konfigureret",
"install_static_error": "AdGuard Home kan ikke konfigurere det automatisk for denne netværksgrænseflade. Søg efter en instruktion om, hvordan man gør dette manuelt.",
"install_static_configure": "Vi har registreret, at der bruges en dynamisk IP-adresse — <0>{{ip}}</0>. Vil du bruge den som din statiske adresse?",
"confirm_static_ip": "AdGuard Home vil konfigurere {{ip}} til at være din statiske IP-adresse. Vil du fortsætte?"
}

View File

@ -122,22 +122,15 @@
"enabled_save_search_toast": "SafeSearch aktiviert",
"enabled_table_header": "Aktiviert",
"name_table_header": "Name",
"filter_url_table_header": "Filter-URL",
"rules_count_table_header": "Anzahl Regeln",
"last_time_updated_table_header": "Letztes Update",
"actions_table_header": "Aktionen",
"edit_table_action": "Bearbeiten",
"delete_table_action": "Löschen",
"filters_and_hosts": "Filter und Host-Blocklisten",
"filters_and_hosts_hint": "AdGuard Home versteht grundlegende Werbefilterregeln und Host-Datei-Syntax.",
"no_filters_added": "Keine Filter hinzugefügt",
"add_filter_btn": "Filter hinzufügen",
"cancel_btn": "Abbrechen",
"enter_name_hint": "Name eingeben",
"enter_url_hint": "URL eingeben",
"check_updates_btn": "Nach Updates suchen",
"new_filter_btn": "Neues Filterabonnement",
"enter_valid_filter_url": "Geben Sie eine gültige URL zu einem Filterabonnement oder einer Host-Datei ein.",
"custom_filter_rules": "Benutzerdefinierte Filterregeln",
"custom_filter_rules_hint": "Geben Sie pro Zeile eine Regel ein. Sie können entweder Werbefilterregeln oder Host-Datei-Syntax verwenden.",
"examples_title": "Beispiele",
@ -153,7 +146,6 @@
"example_upstream_doh": "verschlüsseltes <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a>",
"example_upstream_sdns": "Sie können <a href='https://dnscrypt.info/stamps/' target='_blank'>DNS-Stempel</a> für <a href='https://dnscrypt.info/' target='_blank'>DNSCrypt</a> oder <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a> Resolver benutzen.",
"example_upstream_tcp": "regulärer DNS (über TCP)",
"all_filters_up_to_date_toast": "Alle Filter sind bereits aktuell",
"updated_upstream_dns_toast": "Upstream-DNS-Server wurden aktualisiert",
"dns_test_ok_toast": "Angegebene DNS-Server arbeiten ordnungsgemäß",
"dns_test_not_ok_toast": "Server \"{{key}}\": konnte nicht verwendet werden, bitte überprüfen Sie die korrekte Schreibweise",
@ -173,7 +165,6 @@
"next_btn": "Nächste",
"loading_table_status": "Laden...",
"page_table_footer_text": "Seite",
"of_table_footer_text": "von",
"rows_table_footer_text": "Reihen",
"updated_custom_filtering_toast": "Die benutzerdefinierten Filterregeln wurden aktualisiert",
"rule_removed_from_custom_filtering_toast": "Regel wurde aus den benutzerdefinierten Filterregeln entfernt",
@ -203,13 +194,11 @@
"rate_limit_desc": "Die Anzahl der Anfragen pro Sekunde, die ein einzelner Client stellen darf (0: unbegrenzt)",
"blocking_ipv4_desc": "IP-Adresse, die für eine gesperrte A-Anfrage zurückgegeben werden soll",
"blocking_ipv6_desc": "IP-Adresse, die für eine gesperrte AAAA-Anfrage zurückgegeben werden soll",
"blocking_mode_desc": "<0>NXDomain - Antwortet mit NXDomain-Code;</0> <0>Null-IP-Adresse - Antwortet mit Null-IP-Adresse (0.0.0.0 für A; :: für AAAA);</0> <0>Benutzerdefinierte IP - Antwortet mit einer manuell festgelegten IP-Adresse.</0>",
"upstream_dns_client_desc": "Wenn Sie dieses Feld leer lassen, verwendet AdGuard Home die Server, die in den <0>DNS-Einstellungen</0> konfiguriert sind.",
"source_label": "Quelle",
"found_in_known_domain_db": "In der Datenbank der bekannten Domains gefunden.",
"category_label": "Kategorie",
"rule_label": "Regel",
"filter_label": "Filter",
"unknown_filter": "Unbekannter Filter {{filterId}}",
"install_welcome_title": "Willkommen bei AdGuard Home!",
"install_welcome_desc": "AdGuard Home ist ein netzwerkweiter Werbung- und Tracking sperrender DNS-Server. Sein Zweck ist es, Ihnen die Kontrolle über Ihr gesamtes Netzwerk und alle Ihre Geräte zu ermöglichen, und es ist nicht erforderlich, eine clientseitige Anwendung zu verwenden.",
@ -321,7 +310,6 @@
"client_edit": "Client bearbeiten",
"client_identifier": "Bezeichner",
"ip_address": "IP-Adresse",
"client_identifier_desc": "Clients können durch die IP-Adresse oder MAC-Adresse identifiziert werden. Bitte beachten Sie, dass die Verwendung der MAC-Adresse als Identifikator nur möglich ist, wenn AdGuard Home gleichzeitig auch ein <0>DHCP-Server</0> ist.",
"form_enter_ip": "IP-Adresse eingeben",
"form_enter_mac": "MAC-Adresse eingeben",
"form_enter_id": "Kennung eingeben",
@ -333,7 +321,6 @@
"client_updated": "Client „{{key}}” erfolgreich aktualisiert",
"clients_not_found": "Keine Clients gefunden",
"client_confirm_delete": "Möchten Sie den Client „{{key}}” wirklich löschen?",
"filter_confirm_delete": "Möchten Sie den Filter wirklich löschen?",
"auto_clients_title": "Clients (Laufzeit)",
"auto_clients_desc": "Daten zu den Clients, die AdGuard Home verwenden, aber nicht in der Konfiguration gespeichert sind",
"access_title": "Zugriffsrechte",
@ -399,7 +386,6 @@
"interval_days_plural": "{{count}} Tage",
"domain": "Domain",
"answer": "Antwort",
"filter_added_successfully": "Der Filter wurde erfolgreich hinzugefügt",
"statistics_configuration": "Statistikkonfiguration",
"statistics_retention": "Statistiken speichern",
"statistics_retention_desc": "Wenn Sie Intervallwert verringern, werden einige Daten verloren gehen",

View File

@ -105,6 +105,11 @@
"no_servers_specified": "No servers specified",
"general_settings": "General settings",
"dns_settings": "DNS settings",
"dns_blocklists": "DNS blocklists",
"dns_allowlists": "DNS allowlists",
"dns_blocklists_desc": "AdGuard Home will block domains matching the blocklists.",
"dns_allowlists_desc": "Domains from DNS allowlists will be allowed even if they are in any of the blocklists.",
"custom_filtering_rules": "Custom filtering rules",
"encryption_settings": "Encryption settings",
"dhcp_settings": "DHCP settings",
"upstream_dns": "Upstream DNS servers",
@ -122,23 +127,27 @@
"enabled_save_search_toast": "Enabled safe search",
"enabled_table_header": "Enabled",
"name_table_header": "Name",
"filter_url_table_header": "Filter URL",
"list_url_table_header": "List URL",
"rules_count_table_header": "Rules count",
"last_time_updated_table_header": "Last time updated",
"actions_table_header": "Actions",
"edit_table_action": "Edit",
"delete_table_action": "Delete",
"filters_and_hosts": "Filters and hosts blocklists",
"filters_and_hosts_hint": "AdGuard Home understands basic adblock rules and hosts files syntax.",
"no_filters_added": "No filters added",
"add_filter_btn": "Add filter",
"no_blocklist_added": "No blocklists added",
"no_whitelist_added": "No allowlists added",
"add_blocklist": "Add blocklist",
"add_allowlist": "Add allowlist",
"cancel_btn": "Cancel",
"enter_name_hint": "Enter name",
"enter_url_hint": "Enter URL",
"check_updates_btn": "Check updates",
"new_filter_btn": "New filter subscription",
"edit_filter_title": "Edit filter",
"enter_valid_filter_url": "Enter a valid URL to a filter subscription or a hosts file.",
"check_updates_btn": "Check for updates",
"new_blocklist": "New blocklist",
"new_allowlist": "New allowlist",
"edit_blocklist": "Edit blocklist",
"edit_allowlist": "Edit allowlist",
"enter_valid_blocklist": "Enter a valid URL to the blocklist.",
"enter_valid_allowlist": "Enter a valid URL to the allowlist.",
"form_error_url_format": "Invalid url format",
"custom_filter_rules": "Custom filtering rules",
"custom_filter_rules_hint": "Enter one rule on a line. You can use either adblock rules or hosts files syntax.",
@ -155,7 +164,7 @@
"example_upstream_doh": "encrypted <0>DNS-over-HTTPS</0>",
"example_upstream_sdns": "you can use <0>DNS Stamps</0> for <1>DNSCrypt</1> or <2>DNS-over-HTTPS</2> resolvers",
"example_upstream_tcp": "regular DNS (over TCP)",
"all_filters_up_to_date_toast": "All filters are already up-to-date",
"all_lists_up_to_date_toast": "All lists are already up-to-date",
"updated_upstream_dns_toast": "Updated the upstream DNS servers",
"dns_test_ok_toast": "Specified DNS servers are working correctly",
"dns_test_not_ok_toast": "Server \"{{key}}\": could not be used, please check that you've written it correctly",
@ -175,7 +184,6 @@
"next_btn": "Next",
"loading_table_status": "Loading...",
"page_table_footer_text": "Page",
"of_table_footer_text": "of",
"rows_table_footer_text": "rows",
"updated_custom_filtering_toast": "Updated the custom filtering rules",
"rule_removed_from_custom_filtering_toast": "Rule removed from the custom filtering rules",
@ -215,7 +223,7 @@
"found_in_known_domain_db": "Found in the known domains database.",
"category_label": "Category",
"rule_label": "Rule",
"filter_label": "Filter",
"list_label": "List",
"unknown_filter": "Unknown filter {{filterId}}",
"install_welcome_title": "Welcome to AdGuard Home!",
"install_welcome_desc": "AdGuard Home is a network-wide ad-and-tracker blocking DNS server. Its purpose is to let you control your entire network and all your devices, and it does not require using a client-side program.",
@ -339,7 +347,7 @@
"client_updated": "Client \"{{key}}\" successfully updated",
"clients_not_found": "No clients found",
"client_confirm_delete": "Are you sure you want to delete client \"{{key}}\"?",
"filter_confirm_delete": "Are you sure you want to delete filter?",
"list_confirm_delete": "Are you sure you want to delete this list?",
"auto_clients_title": "Clients (runtime)",
"auto_clients_desc": "Data on the clients that use AdGuard Home, but not stored in the configuration",
"access_title": "Access settings",
@ -405,8 +413,8 @@
"interval_days_plural": "{{count}} days",
"domain": "Domain",
"answer": "Answer",
"filter_added_successfully": "The filter has been successfully added",
"filter_updated": "The filter successfully updated",
"filter_added_successfully": "The list has been successfully added",
"filter_updated": "The list has been successfully updated",
"statistics_configuration": "Statistics configuration",
"statistics_retention": "Statistics retention",
"statistics_retention_desc": "If you decrease the interval value, some data will be lost",
@ -441,9 +449,9 @@
"example_rewrite_wildcard": "rewrite responses for all <0>example.org</0> subdomains.",
"disable_ipv6": "Disable IPv6",
"disable_ipv6_desc": "If this feature is enabled, all DNS queries for IPv6 addresses (type AAAA) will be dropped.",
"autofix_warning_text": "If you click \"Fix\", AdGuardHome will configure your system to use AdGuardHome DNS server.",
"autofix_warning_list": "It will perform these tasks: <0>Deactivate system DNSStubListener</0> <0>Set DNS server address to 127.0.0.1</0> <0>Replace symbolic link target of /etc/resolv.conf to /run/systemd/resolve/resolv.conf</0> <0>Stop DNSStubListener (reload systemd-resolved service)</0>",
"autofix_warning_result": "As a result all DNS requests from your system will be processed by AdGuardHome by default.",
"autofix_warning_text": "If you click \"Fix\", AdGuard Home will configure your system to use AdGuard Home DNS server.",
"autofix_warning_list": "It will perform these tasks: <0>Deactivate system DNSStubListener</0> <0>Set DNS server address to 127.0.0.1</0> <0>Replace symbolic link target of /etc/resolv.conf with /run/systemd/resolve/resolv.conf</0> <0>Stop DNSStubListener (reload systemd-resolved service)</0>",
"autofix_warning_result": "As a result all DNS requests from your system will be processed by AdGuard Home by default.",
"tags_title": "Tags",
"tags_desc": "You can select the tags that correspond to the client. Tags can be included in the filtering rules and allow you to apply them more accurately. <0>Learn more</0>",
"form_select_tags": "Select client tags",
@ -469,5 +477,7 @@
"install_static_ok": "Good news! The static IP address is already configured",
"install_static_error": "AdGuard Home cannot configure it automatically for this network interface. Please look for an instruction on how to do this manually.",
"install_static_configure": "We have detected that a dynamic IP address is used — <0>{{ip}}</0>. Do you want to use it as your static address?",
"confirm_static_ip": "AdGuard Home will configure {{ip}} to be your static IP address. Do you want to proceed?"
}
"confirm_static_ip": "AdGuard Home will configure {{ip}} to be your static IP address. Do you want to proceed?",
"list_updated": "{{count}} list updated",
"list_updated_plural": "{{count}} lists updated"
}

View File

@ -9,7 +9,7 @@
"enabled_dhcp": "Servidor DHCP habilitado",
"disabled_dhcp": "Servidor DHCP deshabilitado",
"dhcp_title": "Servidor DHCP (experimental)",
"dhcp_description": "Si su router no proporciona la configuración DHCP, puede utilizar el propio servidor DHCP incorporado de AdGuard.",
"dhcp_description": "Si tu router no proporciona la configuración DHCP, puede utilizar el propio servidor DHCP incorporado de AdGuard.",
"dhcp_enable": "Habilitar servidor DHCP",
"dhcp_disable": "Deshabilitar servidor DHCP",
"dhcp_not_found": "Es seguro habilitar el servidor DHCP incorporado. No se ha encontrado ningún servidor DHCP activo en la red, sin embargo le recomendamos que lo vuelva a comprobar manualmente, ya que nuestra prueba automática no ofrece actualmente una garantía del 100 %.",
@ -38,10 +38,10 @@
"dhcp_ip_addresses": "Direcciones IP",
"dhcp_table_hostname": "Nombre del host",
"dhcp_table_expires": "Expira",
"dhcp_warning": "Si de todos modos desea habilitar el servidor DHCP, asegúrese de que no hay otro servidor DHCP activo en su red. ¡De lo contrario, puede dejar sin Internet a los dispositivos conectados!",
"dhcp_warning": "Si de todos modos desea habilitar el servidor DHCP, asegúrese de que no hay otro servidor DHCP activo en tu red. ¡De lo contrario, puede dejar sin Internet a los dispositivos conectados!",
"dhcp_error": "No pudimos determinar si hay otro servidor DHCP en la red.",
"dhcp_static_ip_error": "Para poder utilizar el servidor DHCP se debe establecer una dirección IP estática. No hemos podido determinar si esta interfaz de red está configurada utilizando una dirección IP estática. Por favor establezca una dirección IP estática manualmente.",
"dhcp_dynamic_ip_found": "Su sistema utiliza la configuración de dirección IP dinámica para la interfaz <0>{{interfaceName}}</0>. Para poder utilizar el servidor DHCP se debe establecer una dirección IP estática. Su dirección IP actual es <0>{{ipAddress}}</0>. Si presiona el botón Habilitar servidor DHCP, estableceremos automáticamente esta dirección IP como estática.",
"dhcp_dynamic_ip_found": "Tu sistema utiliza la configuración de dirección IP dinámica para la interfaz <0>{{interfaceName}}</0>. Para poder utilizar el servidor DHCP se debe establecer una dirección IP estática. Tu dirección IP actual es <0>{{ipAddress}}</0>. Si presiona el botón Habilitar servidor DHCP, estableceremos automáticamente esta dirección IP como estática.",
"dhcp_lease_added": "Asignación estática \"{{key}}\" añadido correctamente",
"dhcp_lease_deleted": "Asignación estática \"{{key}}\" eliminado correctamente",
"dhcp_new_static_lease": "Nueva asignación estática",
@ -122,22 +122,17 @@
"enabled_save_search_toast": "Búsqueda segura habilitada",
"enabled_table_header": "Habilitado",
"name_table_header": "Nombre",
"filter_url_table_header": "URL del filtro",
"rules_count_table_header": "Número de reglas",
"last_time_updated_table_header": "Última actualización",
"actions_table_header": "Acciones",
"edit_table_action": "Editar",
"delete_table_action": "Eliminar",
"filters_and_hosts": "Filtros y listas de bloqueo de hosts",
"filters_and_hosts_hint": "AdGuard Home entiende las reglas básicas de bloqueo y la sintaxis de los archivos hosts.",
"no_filters_added": "No hay filtros añadidos",
"add_filter_btn": "Añadir filtro",
"cancel_btn": "Cancelar",
"enter_name_hint": "Ingrese el nombre",
"enter_url_hint": "Ingrese la URL",
"check_updates_btn": "Buscar actualizaciones",
"new_filter_btn": "Nueva suscripción a filtro",
"enter_valid_filter_url": "Ingrese una URL válida para suscribirse a un filtro o archivo hosts.",
"form_error_url_format": "Formato de URL no válido",
"custom_filter_rules": "Reglas de filtrado personalizado",
"custom_filter_rules_hint": "Ingrese una regla por línea. Puede utilizar reglas de bloqueo o la sintaxis de los archivos hosts.",
"examples_title": "Ejemplos",
@ -153,7 +148,6 @@
"example_upstream_doh": "cifrado <0>DNS mediante HTTPS</0>",
"example_upstream_sdns": "puedes usar <0>DNS Stamps</0> para <1>DNSCrypt</1> o resolutores <2>DNS mediante HTTPS</2>",
"example_upstream_tcp": "DNS regular (mediante TCP)",
"all_filters_up_to_date_toast": "Todos los filtros ya están actualizados",
"updated_upstream_dns_toast": "Servidores DNS de subida actualizados",
"dns_test_ok_toast": "Los servidores DNS especificados funcionan correctamente",
"dns_test_not_ok_toast": "Servidor \"{{key}}\": no se puede utilizar, por favor revise si lo ha escrito correctamente",
@ -173,7 +167,6 @@
"next_btn": "Siguiente",
"loading_table_status": "Cargando...",
"page_table_footer_text": "Página",
"of_table_footer_text": "de",
"rows_table_footer_text": "filas",
"updated_custom_filtering_toast": "Reglas de filtrado personalizado actualizadas",
"rule_removed_from_custom_filtering_toast": "Regla eliminada de las reglas de filtrado personalizado",
@ -191,6 +184,7 @@
"query_log_retention_confirm": "¿Está seguro de que desea cambiar la retención del registro de consultas? Si disminuye el valor del intervalo, se perderán algunos datos",
"dns_config": "Configuración del servidor DNS",
"blocking_mode": "Modo de bloqueo",
"default": "Predeterminado",
"nxdomain": "NXDOMAIN",
"null_ip": "IP nulo",
"custom_ip": "IP personalizada",
@ -203,16 +197,18 @@
"rate_limit_desc": "Número de peticiones por segundo que un solo cliente puede hacer (0: ilimitado)",
"blocking_ipv4_desc": "Dirección IP devolverá una petición A bloqueada",
"blocking_ipv6_desc": "Dirección IP devolverá una petición AAAA bloqueada",
"blocking_mode_desc": "<0>NXDOMAIN - Responde con el código NXDOMAIN.</0> <0>IP nulo - Responde con una dirección IP cero (0.0.0.0 para A; :: para AAAA).</0> <0>IP personalizada - Responde con una dirección IP establecida manualmente.</0>",
"blocking_mode_default": "Predeterminado: Responde con NXDOMAIN cuando está bloqueado por la regla de estilo Adblock; responde con la dirección IP especificada en la regla cuando está bloqueado por una regla de estilo /etc/hosts",
"blocking_mode_nxdomain": "NXDOMAIN: Responde con el código NXDOMAIN",
"blocking_mode_null_ip": "IP nulo: Responde con dirección IP cero (0.0.0.0 para A; :: para AAAA)",
"blocking_mode_custom_ip": "IP personalizada: Responde con una dirección IP establecida manualmente",
"upstream_dns_client_desc": "Si mantiene este campo vacío, AdGuard Home utilizará los servidores configurados en la <0>configuración del DNS</0>.",
"source_label": "Fuente",
"found_in_known_domain_db": "Encontrado en la base de datos de dominios conocidos.",
"category_label": "Categoría",
"rule_label": "Regla",
"filter_label": "Filtro",
"unknown_filter": "Filtro desconocido {{filterId}}",
"install_welcome_title": "¡Bienvenido a AdGuard Home!",
"install_welcome_desc": "AdGuard Home es un servidor DNS para bloqueo de anuncios y rastreadores a nivel de red. Su propósito es permitirle controlar toda su red y todos sus dispositivos, y no requiere el uso de un programa del lado del cliente.",
"install_welcome_desc": "AdGuard Home es un servidor DNS para bloqueo de anuncios y rastreadores a nivel de red. Su propósito es permitirte controlar toda tu red y todos tus dispositivos, y no requiere el uso de un programa del lado del cliente.",
"install_settings_title": "Interfaz web de administración",
"install_settings_listen": "Interfaz de escucha",
"install_settings_port": "Puerto",
@ -267,7 +263,7 @@
"encryption_config_saved": "Configuración de cifrado guardado",
"encryption_server": "Nombre del servidor",
"encryption_server_enter": "Ingrese su nombre de dominio",
"encryption_server_desc": "Para utilizar HTTPS, debe ingresar el nombre del servidor que coincida con su certificado SSL.",
"encryption_server_desc": "Para utilizar HTTPS, debe ingresar el nombre del servidor que coincida con tu certificado SSL.",
"encryption_redirect": "Redireccionar a HTTPS automáticamente",
"encryption_redirect_desc": "Si está marcado, AdGuard Home redireccionará automáticamente de HTTP a las direcciones HTTPS.",
"encryption_https": "Puerto HTTPS",
@ -275,12 +271,12 @@
"encryption_dot": "Puerto DNS mediante TLS",
"encryption_dot_desc": "Si este puerto está configurado, AdGuard Home ejecutará un servidor DNS mediante TLS en este puerto.",
"encryption_certificates": "Certificados",
"encryption_certificates_desc": "Para utilizar el cifrado, debe proporcionar una cadena de certificado SSL válida para su dominio. Puede obtener un certificado gratuito en <0>{{link}}</0> o puede comprarlo en una de las autoridades de certificación de confianza.",
"encryption_certificates_input": "Copie/pegue aquí su certificado codificado PEM.",
"encryption_certificates_desc": "Para utilizar el cifrado, debe proporcionar una cadena de certificado SSL válida para tu dominio. Puede obtener un certificado gratuito en <0>{{link}}</0> o puede comprarlo en una de las autoridades de certificación de confianza.",
"encryption_certificates_input": "Copia/pega aquí tu certificado codificado PEM.",
"encryption_status": "Estado",
"encryption_expire": "Expira",
"encryption_key": "Clave privada",
"encryption_key_input": "Copie/pegue aquí su clave privada codificada PEM para su certificado.",
"encryption_key_input": "Copia/pega aquí tu clave privada codificada PEM para tu certificado.",
"encryption_enable": "Habilitar cifrado (HTTPS, DNS mediante HTTPS y DNS mediante TLS)",
"encryption_enable_desc": "Si el cifrado está habilitado, la interfaz de administración de AdGuard Home funcionará a través de HTTPS, y el servidor DNS escuchará las peticiones DNS mediante HTTPS y DNS mediante TLS.",
"encryption_chain_valid": "La cadena de certificado es válida",
@ -291,8 +287,8 @@
"encryption_issuer": "Emisor",
"encryption_hostnames": "Nombres de hosts",
"encryption_reset": "¿Está seguro de que desea restablecer la configuración de cifrado?",
"topline_expiring_certificate": "Su certificado SSL está a punto de expirar. Actualice la <0>configuración del cifrado</0>.",
"topline_expired_certificate": "Su certificado SSL ha expirado. Actualice la <0>configuración del cifrado</0>.",
"topline_expiring_certificate": "Tu certificado SSL está a punto de expirar. Actualice la <0>configuración del cifrado</0>.",
"topline_expired_certificate": "Tu certificado SSL ha expirado. Actualice la <0>configuración del cifrado</0>.",
"form_error_port_range": "Ingrese el valor del puerto en el rango de 80 a 65535",
"form_error_port_unsafe": "Este es un puerto inseguro",
"form_error_equal": "No debería ser igual",
@ -333,7 +329,6 @@
"client_updated": "Cliente \"{{key}}\" actualizado correctamente",
"clients_not_found": "No se han encontrado clientes",
"client_confirm_delete": "¿Está seguro de que desea eliminar el cliente \"{{key}}\"?",
"filter_confirm_delete": "¿Está seguro de que desea eliminar el filtro?",
"auto_clients_title": "Clientes (activos)",
"auto_clients_desc": "Datos de los clientes que utilizan AdGuard Home, pero no se almacenan en la configuración",
"access_title": "Configuración de acceso",
@ -399,7 +394,6 @@
"interval_days_plural": "{{count}} días",
"domain": "Dominio",
"answer": "Respuesta",
"filter_added_successfully": "El filtro ha sido añadido correctamente",
"statistics_configuration": "Configuración de estadísticas",
"statistics_retention": "Retención de estadísticas",
"statistics_retention_desc": "Si disminuye el valor del intervalo, algunos datos estarán perdidos",
@ -431,5 +425,33 @@
"try_again": "Volver a intentar",
"domain_desc": "Ingrese el nombre de dominio o comodín que desea reescribir.",
"example_rewrite_domain": "reescribe las respuestas solo para este nombre de dominio.",
"example_rewrite_wildcard": "reescribe las respuestas para todos los subdominios de <0>ejemplo.org</0>."
"example_rewrite_wildcard": "reescribe las respuestas para todos los subdominios de <0>ejemplo.org</0>.",
"disable_ipv6": "Deshabilitar IPv6",
"disable_ipv6_desc": "Si esta función está habilitada, se eliminarán todas las consultas DNS para direcciones IPv6 (tipo AAAA).",
"tags_title": "Etiquetas",
"tags_desc": "Puede seleccionar las etiquetas que correspondan al cliente. Las etiquetas pueden ser incluidas en las reglas de filtrado y te permiten aplicarlas con mayor precisión. <0>Más información</0>",
"form_select_tags": "Seleccione las etiquetas del cliente",
"check_title": "Comprobar filtrado",
"check_desc": "Comprueba si el nombre del host está siendo filtrado",
"check": "Comprobar",
"form_enter_host": "Ingrese un nombre de host",
"filtered_custom_rules": "Filtrado por reglas de filtrado personalizadas",
"host_whitelisted": "El host está en la lista blanca",
"check_ip": "Direcciones IP: {{ip}}",
"check_cname": "CNAME: {{cname}}",
"check_reason": "Razón: {{reason}}",
"check_rule": "Regla: {{rule}}",
"check_service": "Nombre del servicio: {{service}}",
"check_not_found": "No se ha encontrado en tus listas de filtros",
"client_confirm_block": "¿Está seguro de que desea bloquear al cliente \"{{ip}}\"?",
"client_confirm_unblock": "¿Está seguro de que desea desbloquear al cliente \"{{ip}}\"?",
"client_blocked": "Cliente \"{{ip}}\" bloqueado correctamente",
"client_unblocked": "Cliente \"{{ip}}\" desbloqueado correctamente",
"static_ip": "Dirección IP estática",
"static_ip_desc": "AdGuard Home es un servidor, por lo que necesita una dirección IP estática para funcionar correctamente. De lo contrario, en algún momento tu router puede asignar una dirección IP diferente a este dispositivo.",
"set_static_ip": "Establecer una dirección IP estática",
"install_static_ok": "¡Buenas noticias! La dirección IP estática ya está configurada",
"install_static_error": "AdGuard Home no puede configurarlo automáticamente para esta interfaz de red. Busque instrucciones sobre cómo hacer esto manualmente.",
"install_static_configure": "Hemos detectado que utiliza una dirección IP dinámica: <0>{{ip}}</0>. ¿Deseas usarla como tu dirección estática?",
"confirm_static_ip": "AdGuard Home configurará {{ip}} para ser tu dirección IP estática. ¿Desea continuar?"
}

View File

@ -121,22 +121,15 @@
"enabled_save_search_toast": "جستجوی اَمن فعال شده",
"enabled_table_header": "فعال شده",
"name_table_header": "نام",
"filter_url_table_header": "فیلتر آدرس",
"rules_count_table_header": "تعداد دستور",
"last_time_updated_table_header": "زمان آخرین بروزرسانی",
"actions_table_header": "اقدامات",
"edit_table_action": "ويرايش",
"delete_table_action": "حذف",
"filters_and_hosts": "فیلترها و میزبان های لیست سیاه",
"filters_and_hosts_hint": "AdGuard Home دستورات پایه مسدودساز تبلیغ و نحو فایل های میزبان را درک می کند.",
"no_filters_added": "فیلتری اضافه نشده است",
"add_filter_btn": "افزودن فیلتر",
"cancel_btn": "لغو",
"enter_name_hint": "نام را وارد کنید",
"enter_url_hint": "آدرس را وارد کنید...",
"check_updates_btn": "بررسی بروز رسانی",
"new_filter_btn": "اشتراک فیلتر جدید",
"enter_valid_filter_url": "آدرس معتبر برای اشتراک در فیلتر یا فایل میزبان وارد کنید.",
"custom_filter_rules": "دستورات فیلترینگ دستی",
"custom_filter_rules_hint": "یک دستور در خط وارد کنید.میتوانید از دستورات مسدودساز تبلیغ یا نحو فایل های میزبان استفاده کنید.",
"examples_title": "مثال ها",
@ -152,7 +145,6 @@
"example_upstream_doh": "کُدگذاری شده <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a>",
"example_upstream_sdns": "شما میتوانید از <a href='https://dnscrypt.info/stamps/' target='_blank'>DNS Stamps</a> برای <a href='https://dnscrypt.info/' target='_blank'>DNSCrypt</a> یا <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a> resolvers استفاده کنید",
"example_upstream_tcp": "DNS عادی (بر TCP)",
"all_filters_up_to_date_toast": "همه فیلترها از قبل بروز رسانی شده است",
"updated_upstream_dns_toast": "سرورهای DNS جریان ارسالی بروز رسانی شده است",
"dns_test_ok_toast": "سرورهای DNS تعیین شده بدرستی کار می کنند",
"dns_test_not_ok_toast": "سرور \"{{key}}\": نمیتواند مورد استفاده قرار گیرد،لطفا بررسی کنید آن را بدرستی نوشته اید",
@ -172,7 +164,6 @@
"next_btn": "بعدی",
"loading_table_status": "بارگیری...",
"page_table_footer_text": "صفحه",
"of_table_footer_text": "از",
"rows_table_footer_text": "سطر",
"updated_custom_filtering_toast": "دستورات فیلترینگ دستی بروز رسانی شده است",
"rule_removed_from_custom_filtering_toast": "دستور از دستورات فیلترینگ دستی حذف شد",
@ -202,13 +193,11 @@
"rate_limit_desc": "تعداد درخواست های بر ثانیه مجازی که یک کلاینت میتواند بسازد (0: نامحدود)",
"blocking_ipv4_desc": "آدرس آی پی برگشت داده شده برای درخواست مسدود شده A",
"blocking_ipv6_desc": "آدرس آی پی برگشت داده شده برای درخواست مسدود شده AAAA",
"blocking_mode_desc": "<0>NXDOMAIN با کد NXDOMAIN پاسخ می دهد،</0> <0>Null IP با آدرس آی پی صفر پاسخ میدهد (0.0.0.0 برای A; :: برای AAAA);</0> <0>آی پی دستی - با آدرس آی پی دستی تنظیم شده پاسخ میدهد.</0>",
"upstream_dns_client_desc": "اگر این فیلد را خالی نگه دارید، AdGuard Home از سرور پیکربندی شده در <0> تنظیماتDNS </0> استفاده می کند.",
"source_label": "منبع",
"found_in_known_domain_db": "در پایگاه داده دامنه های شناخته شده پیدا شد",
"category_label": "دسته بندی",
"rule_label": "دستور",
"filter_label": "فیلتر",
"unknown_filter": "فیلتر ناشناخته {{filterId}}",
"install_welcome_title": "به AdGuard Home خوش آمدید!",
"install_welcome_desc": "AdGuard Home یک شبکه گسترده و ردیاب و مسدوساز تبلیغ با سرور DNS است.هدف آن این است که به شما اجازه کنترل کل شبکه و همه دستگاه های شما را بدهد و آن نیازی به برنامه سمت-کاربر ندارد.",
@ -320,7 +309,6 @@
"client_edit": "ویرایش کلاینت",
"client_identifier": "احراز با",
"ip_address": "آدرس آی پی",
"client_identifier_desc": "کلاینت میتواند با آدرس آی پی یا آدرس مَک احراز شود. لطفا توجه کنید،که استفاده از مَک بعنوان عامل احراز زمانی امکان دارد که AdGuard Home نیز <0>سرور DHCP </0> باشد",
"form_enter_ip": "آی پی را وارد کنید",
"form_enter_mac": "مَک را وارد کنید",
"form_enter_id": "خطای احرازکننده",
@ -332,7 +320,6 @@
"client_updated": "کلاینت \"{{key}}\" با موفقیت بروز رسانی شد",
"clients_not_found": "کلاینتی یافت نشد",
"client_confirm_delete": "آیا واقعا میخواهید \"{{key}}\" کلاینت را حذف کنید؟",
"filter_confirm_delete": "آیا واقعا میخواهید فیلتر را حذف کنید؟",
"auto_clients_title": "کلاینت ها (زمان اِجرا)",
"auto_clients_desc": "داده در کلاینت ها که از AdGuard Home استفاده می کند،اما در پیکربندی ذخیره نمی شود",
"access_title": "تنظیمات دسترسی",
@ -398,7 +385,6 @@
"interval_days_plural": "{{count}} روز",
"domain": "دامنه",
"answer": "پاسخ",
"filter_added_successfully": "فیلتر با موفقیت اضافه شد",
"statistics_configuration": "پیکربندی آمارها",
"statistics_retention": "مدت حفظ آمارها",
"statistics_retention_desc": "اگر مقدار فاصله را کاهش دهید،برخی داده ها از بین خواهد رفت",

View File

@ -121,22 +121,15 @@
"enabled_save_search_toast": "Recherche sécurisée activée",
"enabled_table_header": "Activé",
"name_table_header": "Nom",
"filter_url_table_header": "URL du filtre",
"rules_count_table_header": "Nombre des règles",
"last_time_updated_table_header": "Dernière mise à jour",
"actions_table_header": "Actions",
"edit_table_action": "Modifier",
"delete_table_action": "Supprimer",
"filters_and_hosts": "Listes de blocage des filtres et hosts",
"filters_and_hosts_hint": "AdGuard Home comprend les règles basiques de blocage ainsi que la syntaxe des fichiers hosts.",
"no_filters_added": "Aucun filtre ajouté",
"add_filter_btn": "Ajouter filtre",
"cancel_btn": "Annuler",
"enter_name_hint": "Saisir nom",
"enter_url_hint": "Saisir URL",
"check_updates_btn": "Vérifier les mises à jour",
"new_filter_btn": "Abonnement à un nouveau filtre",
"enter_valid_filter_url": "Saisir un URL valide pour s'abonner au filtre ou à un fichier host.",
"custom_filter_rules": "Règles de filtrage d'utilisateur",
"custom_filter_rules_hint": "Saisissez la règle en une ligne. C'est possible d'utiliser les règles de blocage ou la syntaxe des fichiers hosts.",
"examples_title": "Exemples",
@ -152,7 +145,6 @@
"example_upstream_doh": "<a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-au-dessus-de-HTTPS</a> chiffré",
"example_upstream_sdns": "vous pouvez utiliser <a href='https://dnscrypt.info/stamps/' target='_blank'>DNS Stamps</a> pour <a href='https://dnscrypt.info/' target='_blank'>DNSCrypt</a> ou les resolveurs <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-au-dessus-de-HTTPS</a>",
"example_upstream_tcp": "DNS classique (au-dessus de TCP)",
"all_filters_up_to_date_toast": "Tous les filtres sont mis à jour",
"updated_upstream_dns_toast": "Les serveurs DNS upstream sont mis à jour",
"dns_test_ok_toast": "Les serveurs DNS spécifiés fonctionnent correctement",
"dns_test_not_ok_toast": "Impossible d'utiliser le serveur \"{{key}}\": veuillez vérifier si le nom saisi est bien correct",
@ -172,7 +164,6 @@
"next_btn": "Suivant",
"loading_table_status": "Chargement en cours ...",
"page_table_footer_text": "Page",
"of_table_footer_text": "de",
"rows_table_footer_text": "lignes",
"updated_custom_filtering_toast": "Règles de filtrage d'utilisateur mises à jour",
"rule_removed_from_custom_filtering_toast": "Règle retirée des règles d'utilisateur",
@ -202,13 +193,11 @@
"rate_limit_desc": "Le nombre de requêtes par seconde quun seul client est autorisé à faire (0 : illimité)",
"blocking_ipv4_desc": "Adresse IP à renvoyer pour une demande A bloquée",
"blocking_ipv6_desc": "Adresse IP à renvoyer pour une demande AAAA bloquée",
"blocking_mode_desc": "<0>NXDOMAIN Répondre avec le code NXDOMAIN;</0> <0>IP nulle Répondre avec une adresse IP de zéros (0.0.0.0 pour A; :: pour AAAA);</0> <0>IP personnalisée Répondre avec une adresse IP définie manuellement.</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>.",
"source_label": "Source",
"found_in_known_domain_db": "Trouvé dans la base de données des domaines connus",
"category_label": "Catégorie",
"rule_label": "Règle",
"filter_label": "Filtre",
"unknown_filter": "Filtre inconnu {{filterId}}",
"install_welcome_title": "Bienvenue sur AdGuard Home !",
"install_welcome_desc": "AdGuard Home est un seveur DNS pour bloquer les pubs et traceurs sur tout un réseau. Son but est de vous donner le contrôle sur l'ensemble de votre réseau et tous vos appareils sans programme côté client supplémentaire.",
@ -281,7 +270,6 @@
"client_edit": "Modifier le client",
"client_identifier": "Identifiant",
"ip_address": "Adresse IP",
"client_identifier_desc": "Les clients peuvent être identifiés par les adresses IP ou MAC. Veuillez noter que l'utilisation de l'adresse MAC comme identifiant est possible uniquement si AdGuard Home est aussi un <0>serveur DHCP</0>",
"form_enter_ip": "Saisissez l'IP",
"form_enter_mac": "Saisissez MAC",
"form_enter_id": "Entrer identifiant",
@ -293,7 +281,6 @@
"client_updated": "Le client \"{{key}}\" a été mis à jour",
"clients_not_found": "Aucun client trouvé",
"client_confirm_delete": "Voulez-vous vraiment supprimer le client \"{{key}}\" ?",
"filter_confirm_delete": "Voulez-vous vraiment supprimer ce filtre ?",
"auto_clients_title": "Clients (exécution)",
"auto_clients_desc": "Les données des clients qu'utilisent AdGuard Home, mais non stockées dans la configuration",
"access_title": "Paramètres d'accès",
@ -359,7 +346,6 @@
"interval_days_plural": "{{count}} jours",
"domain": "Domaine",
"answer": "Réponse",
"filter_added_successfully": "Le filtre a été ajouté",
"statistics_configuration": "Configuration des statistiques",
"statistics_retention": "Maintien des statistiques",
"statistics_retention_desc": "Si vous baissez la valeur de l'intervalle, des données seront perdues",

View File

@ -116,22 +116,15 @@
"enabled_save_search_toast": "Pencarian aman diaktifkan",
"enabled_table_header": "Diaktifkan",
"name_table_header": "Nama",
"filter_url_table_header": "URL penyaringan",
"rules_count_table_header": "Jumlah Aturan",
"last_time_updated_table_header": "Terakhir diperbaharui",
"actions_table_header": "Aksi",
"edit_table_action": "Ubah",
"delete_table_action": "Hapus",
"filters_and_hosts": "Daftar blokir penyaringan dan hosts",
"filters_and_hosts_hint": "AdGuard Home memahami aturan dasar adblock dan sintak file hosts.",
"no_filters_added": "Tidak ada penyaringan ditambahkan",
"add_filter_btn": "Tambah penyaringan",
"cancel_btn": "Batal",
"enter_name_hint": "Masukkan nama",
"enter_url_hint": "Masukkan URL",
"check_updates_btn": "Cek pembaruan",
"new_filter_btn": "Langganan penyaring baru",
"enter_valid_filter_url": "Tambah URL valid ke langganan penyaring atau file hosts.",
"custom_filter_rules": "Aturan penyaringan khusus",
"custom_filter_rules_hint": "Masukkan satu aturan dalam sebuah baris. Anda dapat menggunakan baik aturan adblock maupun sintaks file hosts.",
"examples_title": "Contoh",
@ -147,7 +140,6 @@
"example_upstream_doh": "terenkripsi <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a>",
"example_upstream_sdns": "anda bisa menggunakan <a href='https://dnscrypt.info/stamps/' target='_blank'>Stempel DNS</a> untuk <a href='https://dnscrypt.info/' target='_blank'>DNSCrypt</a> atau pengarah <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a>",
"example_upstream_tcp": "DNS reguler (melalui TCP)",
"all_filters_up_to_date_toast": "Semua penyaringan telah terbaharui",
"updated_upstream_dns_toast": "Server DNS hulu terbarui",
"dns_test_ok_toast": "Server DNS yang ditentukan bekerja dengan benar",
"dns_test_not_ok_toast": "Server \"{{key}}\": tidak dapat digunakan, mohon cek bahwa Anda telah menulisnya dengan benar",
@ -167,7 +159,6 @@
"next_btn": "Selanjutnya",
"loading_table_status": "Memuat...",
"page_table_footer_text": "Halaman",
"of_table_footer_text": "dari",
"rows_table_footer_text": "baris",
"updated_custom_filtering_toast": "Perbarui aturan penyaringan khusus",
"rule_removed_from_custom_filtering_toast": "Aturan dihapus dari aturan penyaringan khusus",
@ -187,7 +178,6 @@
"found_in_known_domain_db": "Ditemukan di database domain dikenal",
"category_label": "Kategori",
"rule_label": "Aturan",
"filter_label": "Penyaringan",
"unknown_filter": "Penyaringan {{filterId}} tidak dikenal",
"install_welcome_title": "Selamat datang di AdGuard Home!",
"install_welcome_desc": "AdGuard Home adalah sebuah server DNS pemblokiran iklan dan pelacak di jaringan. Tujuannya adalah memungkinkan anda mengkontrol seluruh jaringan dan semua perangkat anda, dan ini tidak membutuhkan aplikasi tambahan di klien",
@ -298,7 +288,6 @@
"client_edit": "Ubah Klien",
"client_identifier": "Identifikasi",
"ip_address": "Alamat IP",
"client_identifier_desc": "Klien dapat diidentifikasi dengan alamat IP atau alamat MAC. Harap dicatat bahwa menggunakan MAC sebagai pengidentifikasi hanya dimungkinkan jika AdGuard Home juga merupakan <0>server DHCP</0>",
"form_enter_ip": "Masukkan IP",
"form_enter_mac": "Masukkan MAC",
"form_client_name": "Masukkan nama klien",
@ -308,7 +297,6 @@
"client_updated": "Klien \"{{key}}\" berhasil diperbarui",
"clients_not_found": "Tidak ada klien ditemukan",
"client_confirm_delete": "Apakah anda yakin ingin menghapus klien \"{{key}}\"?",
"filter_confirm_delete": "Apakah anda yakin ingin menghapus penyaring ini?",
"auto_clients_title": "Klien (waktu berjalan)",
"auto_clients_desc": "Data pada klien yang menggunakan AdGuard Home, tetapi tidak disimpan dalam konfigurasi",
"access_title": "Pengaturan akses",
@ -373,7 +361,6 @@
"interval_days_plural": "{{count}} hari",
"domain": "Domain",
"answer": "Jawab",
"filter_added_successfully": "Filter telah berhasil ditambahkan",
"statistics_configuration": "Konfigurasi statistik",
"statistics_retention": "Statistik disimpan",
"statistics_retention_desc": "Jika Anda menurunkan nilai interval, beberapa data akan hilang",

View File

@ -112,22 +112,15 @@
"enabled_save_search_toast": "Abilita Ricerca Sicura",
"enabled_table_header": "Attivo",
"name_table_header": "Nome",
"filter_url_table_header": "URL filtro",
"rules_count_table_header": "Numero regole",
"last_time_updated_table_header": "Ultimo aggiornamento",
"actions_table_header": "Azioni",
"edit_table_action": "Modifica",
"delete_table_action": "Elimina",
"filters_and_hosts": "Filtri e blocco hosts",
"filters_and_hosts_hint": "AdGuard Home è in grado di comprendere la sintassi delle regole di adblock o quelle dei file hosts",
"no_filters_added": "Nessun filtro aggiunto",
"add_filter_btn": "Aggiungi filtro",
"cancel_btn": "Annulla",
"enter_name_hint": "Inserisci nome",
"enter_url_hint": "Inserisci URL",
"check_updates_btn": "Controlla aggiornamenti",
"new_filter_btn": "Aggiunta nuovo filtro",
"enter_valid_filter_url": "Inserisci un URL valido di un filtro o un file hosts",
"custom_filter_rules": "Regole filtri personalizzate",
"custom_filter_rules_hint": "Inserisci una regola per riga. Puoi usare la sintassi delle regole di adblock o quelle dei file hosts.",
"examples_title": "Esempi",
@ -143,7 +136,6 @@
"example_upstream_doh": "<a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a> criptato",
"example_upstream_sdns": "puoi usare <a href='https://dnscrypt.info/stamps/' target='_blank'>DNS Stamps</a> per <a href='https://dnscrypt.info/' target='_blank'>DNSCrypt</a> oppure dei resolver con <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a>",
"example_upstream_tcp": "DNS regolari (via TCP)",
"all_filters_up_to_date_toast": "Tutti i filtri sono già aggiornati",
"updated_upstream_dns_toast": "Server DNS upstream aggiornati",
"dns_test_ok_toast": "I server DNS specificati funzionano correttamente",
"dns_test_not_ok_toast": "Server \"{{key}}\": non può essere usato, assicurati di averlo digitato correttamente",
@ -163,7 +155,6 @@
"next_btn": "Successivo",
"loading_table_status": "Caricamento...",
"page_table_footer_text": "Pagina",
"of_table_footer_text": "di",
"rows_table_footer_text": "righe",
"updated_custom_filtering_toast": "Le regole dei filtri personalizzate sono state aggiornate",
"rule_removed_from_custom_filtering_toast": "Regola rimossa dalle regole dei filtri personalizzate",
@ -183,7 +174,6 @@
"found_in_known_domain_db": "Trovato nel database dei domini conosciuti.",
"category_label": "Categoria",
"rule_label": "Regola",
"filter_label": "Filtro",
"unknown_filter": "Filtro sconosciuto {{filterId}}",
"install_welcome_title": "Benvenuto nella Home di AdGuard!",
"install_welcome_desc": "AdGuard Home è un server DNS che blocca annunci e tracker in tutta la rete. Il suo scopo è quello di consentire di controllare l'intera rete e tutti i dispositivi, e non richiede l'utilizzo di un programma sul lato client.",
@ -302,7 +292,6 @@
"client_updated": "Client \"{{key}}\" aggiornato correttamente",
"clients_not_found": "Nessun client trovato",
"client_confirm_delete": "Sei sicuro di voler eliminare il client \"{{key}}\"?",
"filter_confirm_delete": "Sei sicuro di voler cancellare questo filtro?",
"auto_clients_title": "Clienti (tempo di esecuzione)",
"auto_clients_desc": "Dati dei clienti che utilizzano AdGuard Home, ma che non sono salvati nella configurazione",
"access_title": "Impostazioni di accesso",
@ -367,7 +356,6 @@
"interval_days_plural": "{{count}} giorni",
"domain": "Dominio",
"answer": "Risposta",
"filter_added_successfully": "Il filtro è stato aggiunto correttamente",
"statistics_configuration": "Configurazione delle statistiche",
"statistics_retention": "Conservazione statistiche",
"statistics_retention_desc": "Se si diminuisce il valore di intervallo, alcuni dati saranno persi",

View File

@ -122,22 +122,15 @@
"enabled_save_search_toast": "セーフサーチを有効にしました",
"enabled_table_header": "有効",
"name_table_header": "名称",
"filter_url_table_header": "フィルタのURL",
"rules_count_table_header": "ルール数",
"last_time_updated_table_header": "最終更新時刻",
"actions_table_header": "操作",
"edit_table_action": "編集する",
"delete_table_action": "削除する",
"filters_and_hosts": "フィルタとhostsブロックリスト",
"filters_and_hosts_hint": "AdGuard Homeは、基本的な広告ブロックルールとhostsファイルの構文を理解します。",
"no_filters_added": "フィルタは追加されませんでした",
"add_filter_btn": "フィルタを追加する",
"cancel_btn": "キャンセル",
"enter_name_hint": "名称を入力",
"enter_url_hint": "URLを入力",
"check_updates_btn": "アップデートを確認する",
"new_filter_btn": "新しいフィルタ・サブスクリプション",
"enter_valid_filter_url": "フィルタ・サブスクリプションもしくはhostsファイルの有効なURLを入力してください。",
"custom_filter_rules": "カスタム・フィルタリングルール",
"custom_filter_rules_hint": "1つの行に1つのルールを入力してください。 広告ブロックルールやhostsファイル構文を使用できます。",
"examples_title": "例",
@ -153,7 +146,6 @@
"example_upstream_doh": "暗号化されている <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a>",
"example_upstream_sdns": "<a href='https://dnscrypt.info/' target='_blank'>DNSCrypt</a> または <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a> リゾルバのために <a href='https://dnscrypt.info/stamps/' target='_blank'>DNS Stamps</a> を使えます",
"example_upstream_tcp": "通常のDNSTCPでの問い合わせ",
"all_filters_up_to_date_toast": "すべてのフィルタは既に最新です",
"updated_upstream_dns_toast": "上流DNSサーバを更新しました",
"dns_test_ok_toast": "指定されたDNSサーバは正しく動作しています",
"dns_test_not_ok_toast": "サーバ \"{{key}}\": 使用できませんでした。正しく入力されているかどうかを確認してください",
@ -173,7 +165,6 @@
"next_btn": "次へ",
"loading_table_status": "読み込み中…",
"page_table_footer_text": "ページ",
"of_table_footer_text": "",
"rows_table_footer_text": "行",
"updated_custom_filtering_toast": "カスタム・フィルタリングルールを更新しました",
"rule_removed_from_custom_filtering_toast": "ルールをカスタム・フィルタリングルールから除去しました",
@ -203,13 +194,11 @@
"rate_limit_desc": "単一のクライアントに許可される1秒あたりのリクエスト数0無制限",
"blocking_ipv4_desc": "ブロックされたAリクエストに対して応答されるIPアドレス",
"blocking_ipv6_desc": "ブロックされたAAAAリクエストに対して応答されるIPアドレス",
"blocking_mode_desc": "<0>NXDOMAIN - NXDOMAINコードで応答;</0> <0>Null IP - ゼロのIPアドレスで応答Aの場合は0.0.0.0; AAAAの場合は::;</0> <0>カスタムIP - 手動で設定されたIPアドレスで応答。</0>",
"upstream_dns_client_desc": "このフィールドを未入力のままにすると、AdGuard Homeは<0>DNS設定</0>で構成されたサーバを使用します。",
"source_label": "ソース",
"found_in_known_domain_db": "既知のドメインデータベースに見つかりました。",
"category_label": "カテゴリ",
"rule_label": "ルール",
"filter_label": "フィルタ",
"unknown_filter": "不明なフィルタ {{filterId}}",
"install_welcome_title": "ようこそ、AdGuard Home へ!",
"install_welcome_desc": "AdGuard Homeは、ネットワーク全体で広告と追跡をブロックするDNSサーバです。その目的は、ネットワークとデバイスのすべてをあなたが制御できるようにすることであり、クライアント側のプログラムを使用する必要はありません。",
@ -321,7 +310,6 @@
"client_edit": "クライアントの編集",
"client_identifier": "識別子",
"ip_address": "IPアドレス",
"client_identifier_desc": "クライアントはIPアドレスまたはMACアドレスで識別できます。AdGuard Homeが<0>DHCPサーバ</0>でもある場合にのみ、識別子としてMACを使用することが可能であることにご注意ください。",
"form_enter_ip": "IPアドレスを入力してください",
"form_enter_mac": "MACアドレスを入力してください",
"form_enter_id": "識別子を入力してください",
@ -333,7 +321,6 @@
"client_updated": "クライアント \"{{key}}\" の更新に成功しました",
"clients_not_found": "クライアント情報はありません",
"client_confirm_delete": "クライアント \"{{key}}\" を削除してもよろしいですか?",
"filter_confirm_delete": "フィルターを削除してもよろしいですか?",
"auto_clients_title": "クライアント(実行時)",
"auto_clients_desc": "AdGuard Homeで使用しているが設定に保存されていないクライアント上のデータ",
"access_title": "アクセス設定",
@ -399,7 +386,6 @@
"interval_days_plural": "{{count}}日",
"domain": "ドメイン",
"answer": "応答",
"filter_added_successfully": "フィルタの追加に成功しました",
"statistics_configuration": "統計設定",
"statistics_retention": "統計保持",
"statistics_retention_desc": "期間を短くすると、一部のデータが失われます",

View File

@ -25,6 +25,7 @@
"form_error_mac_format": "잘못된 MAC 형식",
"form_error_client_id_format": "잘못된 클라이언트 ID 형식",
"form_error_positive": "0보다 커야 합니다",
"form_error_negative": "반드시 0 이상이여야 합니다",
"dhcp_form_gateway_input": "게이트웨이 IP",
"dhcp_form_subnet_input": "서브넷 마스크",
"dhcp_form_range_title": "IP 주소 범위",
@ -121,22 +122,15 @@
"enabled_save_search_toast": "세이프서치 활성화됨",
"enabled_table_header": "활성화됨",
"name_table_header": "이름",
"filter_url_table_header": "필터 주소",
"rules_count_table_header": "규칙 개수",
"last_time_updated_table_header": "마지막 업데이트",
"actions_table_header": "가능한 동작",
"edit_table_action": "편집",
"delete_table_action": "삭제",
"filters_and_hosts": "필터와 호스트 차단목록",
"filters_and_hosts_hint": "AdGuard Home은 기본적인 광고 차단 규칙과 호스트 파일 문법을 읽을 수 있습니다",
"no_filters_added": "추가된 필터 없음",
"add_filter_btn": "필터 추가",
"cancel_btn": "취소",
"enter_name_hint": "이름을 입력하세요",
"enter_url_hint": "주소를 입력하세요",
"check_updates_btn": "업데이트 확인",
"new_filter_btn": "새로운 필터 구독",
"enter_valid_filter_url": "호스트 파일 또는 필터 구독에 올바른 URL 을 입력하세요.",
"custom_filter_rules": "커스텀 필터링 규칙",
"custom_filter_rules_hint": "한 라인에 한 규칙만 입력하세요. 광고 차단 규칙과 호스트 파일 문법 중 하나를 사용할 수 있습니다",
"examples_title": "예시",
@ -152,7 +146,6 @@
"example_upstream_doh": "암호화 된 <0>DNS-over-HTTPS</0>",
"example_upstream_sdns": "<1>DNSCrypt</1>나 <2>DNS-over-HTTPS</2> 리졸버를 위해 <0>DNS 스탬프</0>를 사용할 수 있습니다",
"example_upstream_tcp": "사용자 지정 DNS (TCP를 통한 접속)",
"all_filters_up_to_date_toast": "모든 필터는 이미 최신입니다",
"updated_upstream_dns_toast": "업스트림 DNS 서버를 업데이트하였습니다",
"dns_test_ok_toast": "특정 DNS 서버들은 정상적으로 동작 중입니다",
"dns_test_not_ok_toast": "서버 \"{{key}}\": 사용할 수 없습니다, 제대로 작성했는지 확인하세요.",
@ -172,7 +165,6 @@
"next_btn": "다음",
"loading_table_status": "로딩중...",
"page_table_footer_text": "페이지",
"of_table_footer_text": "/",
"rows_table_footer_text": "행",
"updated_custom_filtering_toast": "사용자 정의 필터링 규칙 업데이트",
"rule_removed_from_custom_filtering_toast": "사용자 정의 필터링 규칙에서 규칙 제거",
@ -188,11 +180,30 @@
"query_log_disabled": "쿼리 로그가 비활성화되어 있으며 <0>설정</0>에서 설정할 수 있습니다",
"query_log_strict_search": "검색을 제한하려면 쌍따옴표를 사용해주세요",
"query_log_retention_confirm": "정말로 쿼리 로그 저장 기간을 변경하시겠습니까? 저장 주기를 낮출 경우, 일부 데이터가 손실됩니다",
"dns_config": "DNS 서버 설정",
"blocking_mode": "차단 모드",
"default": "기본",
"nxdomain": "NXDOMAIN",
"null_ip": "빈 IP",
"custom_ip": "사용자 지정 IP",
"blocking_ipv4": "IPv4 차단",
"blocking_ipv6": "IPv6 차단",
"form_enter_rate_limit": "한도 제한 입력하기",
"rate_limit": "한도 제한",
"edns_enable": "EDNS 클라이언트 서브넷 활성화",
"edns_cs_desc": "활성화되면 AdGuard Home은 클라이언트의 서브넷을 DNS 서버에 전달합니다.",
"rate_limit_desc": "단일 클라이언트에서 허용 가능한 초 당 요청 생성 숫자 (0: 무제한)",
"blocking_ipv4_desc": "차단된 A 요청에 대해서 반환할 IP 주소",
"blocking_ipv6_desc": "차단된 AAAA 요청에 대해서 반환할 IP 주소",
"blocking_mode_default": "기본: Adblock 스타일 규칙에 의해 차단되면 NXDOMAIN으로 응답합니다; /etc/hosts 스타일 규칙에 의해 차단되면 규칙에 정의된 IP 주소로 응답합니다",
"blocking_mode_nxdomain": "NXDOMAIN: NXDOMAIN 코드로 응답",
"blocking_mode_null_ip": "Null IP: 제로 IP 주소 (A는 0.0.0.0; AAAA는 ::) 로 응답합니다",
"blocking_mode_custom_ip": "커스텀 IP: 직접 설정한 IP 주소로 응답합니다",
"upstream_dns_client_desc": "이 값을 비워둔다면 AdGuard Home은 <0>DNS 설정</0>에 설정되어 있는 값을 사용합니다.",
"source_label": "소스",
"found_in_known_domain_db": "알려진 도메인 데이터베이스에서 발견됨.",
"category_label": "카테고리",
"rule_label": "규칙",
"filter_label": "필터",
"unknown_filter": "알려지지 않은 필터 {{filterId}}",
"install_welcome_title": "AdGuard Home에 오신 것을 환영합니다!",
"install_welcome_desc": "AdGuard Home은 광범위한 네트워크 광고와 추적 DNS 서버를 차단 합니다. 그것의 목적은 당신이 당신의 전체 네트워크와 당신의 모든 기기를 제어하는 것이며, 그것은 클라이언트의 프로그램을 사용할 필요가 없습니다.",
@ -304,7 +315,6 @@
"client_edit": "클라이언트 수정",
"client_identifier": "식별자",
"ip_address": "IP 주소",
"client_identifier_desc": "사용자는 IP 주소 또는 MAC 주소로 식별할 수 있지만 AdGuard Home이 <0>DHCP 서버인 </0> 경우에만 사용자는 MAC 주소로 식별할 수 있습니다.",
"form_enter_ip": "IP 입력",
"form_enter_mac": "MAC 입력",
"form_enter_id": "식별자 입력",
@ -316,7 +326,6 @@
"client_updated": "클라이언트 \"{{key}}\"가 정상적으로 업데이트되었습니다",
"clients_not_found": "클라이언트 없음",
"client_confirm_delete": "정말 클라이언트 \"{{key}}\" 삭제하시겠습니까?",
"filter_confirm_delete": "정말 이 필터를 삭제하시겠습니까?",
"auto_clients_title": "클라이언트 (런타임)",
"auto_clients_desc": "AdGuard Home을 사용하지만 구성에 저장되지 않은 클라이언트의 데이터입니다.",
"access_title": "접근 설정",
@ -382,7 +391,6 @@
"interval_days_plural": "{{count}} 일",
"domain": "도메인",
"answer": "응답",
"filter_added_successfully": "필터가 성공적으로 추가되었습니다.",
"statistics_configuration": "통계 구성",
"statistics_retention": "통계 저장 기간",
"statistics_retention_desc": "값을 줄이면 설정한 값보다 오래된 데이터가 소멸됩니다.",
@ -414,5 +422,7 @@
"try_again": "다시 시도해주세요",
"domain_desc": "다시 작성할 도메인 이름 또는 와일드카드를 입력합니다.",
"example_rewrite_domain": "이 도메인 이름에 대한 응답을 변경합니다.",
"example_rewrite_wildcard": "모든 서브 도메인에 대한 <0>example.org</0> 응답을 변경합니다"
"example_rewrite_wildcard": "모든 서브 도메인에 대한 <0>example.org</0> 응답을 변경합니다",
"disable_ipv6": "IPv6 비활성화",
"disable_ipv6_desc": "이 기능이 활성화되면 IPv6 (타입 AAAA) 의 모든 DNS 쿼리가 드랍됩니다."
}

View File

@ -23,6 +23,7 @@
"form_error_ip6_format": "Ongeldig IPv6 formaat",
"form_error_ip_format": "Ongeldig IPv4 formaat",
"form_error_mac_format": "Ongeldig MAC formaat.",
"form_error_client_id_format": "Opmaak cliënt-ID is ongeldig",
"form_error_positive": "Moet groter zijn dan 0",
"dhcp_form_gateway_input": "Gateway IP",
"dhcp_form_subnet_input": "Subnet mask",
@ -120,22 +121,17 @@
"enabled_save_search_toast": "Veilig zoeken ingeschakeld",
"enabled_table_header": "Ingeschakeld",
"name_table_header": "Naam",
"filter_url_table_header": "Filter URL",
"rules_count_table_header": "Aantal regels",
"last_time_updated_table_header": "Laatste update",
"actions_table_header": "Actie",
"edit_table_action": "Bewerk",
"delete_table_action": "Verwijderen",
"filters_and_hosts": "Filters en hosts blokkeerlijsten",
"filters_and_hosts_hint": "AdGuard Home kan overweg met basic adblock regels en hosts bestanden syntaxis.",
"no_filters_added": "Geen filters toegevoegd",
"add_filter_btn": "Filter toevoegen",
"cancel_btn": "Annuleren",
"enter_name_hint": "Voeg naam toe",
"enter_url_hint": "Voeg URL toe",
"check_updates_btn": "Controleer op updates",
"new_filter_btn": "Nieuw filter abonnement",
"enter_valid_filter_url": "Voer een geldige URL in voor een filterabonnement of een hosts-bestand.",
"form_error_url_format": "Ongeldig URL formaat",
"custom_filter_rules": "Aangepaste filterregels",
"custom_filter_rules_hint": "Voer één regel op een regel in. U kunt adblock-regels gebruiken of de syntaxis van hosts-bestanden gebruiken.",
"examples_title": "Voorbeelden",
@ -151,7 +147,6 @@
"example_upstream_doh": "versleutelde<a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a>",
"example_upstream_sdns": "je kunt <a href='https://dnscrypt.info/stamps/' target='_blank'>DNS Stamps</a> voor <a href='https://dnscrypt.info/' target='_blank'>DNSCrypt</a> of <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a> resolvers",
"example_upstream_tcp": "standaard DNS (over TCP)",
"all_filters_up_to_date_toast": "Alle filters zijn al up-to-date",
"updated_upstream_dns_toast": "De upstream DNS-servers zijn bijgewerkt",
"dns_test_ok_toast": "Opgegeven DNS-servers werken correct",
"dns_test_not_ok_toast": "Server \"{{key}}\": kon niet worden gebruikt, controleer of u het correct hebt geschreven",
@ -171,7 +166,6 @@
"next_btn": "Volgende",
"loading_table_status": "Laden...",
"page_table_footer_text": "Pagina",
"of_table_footer_text": "van",
"rows_table_footer_text": "rijen",
"updated_custom_filtering_toast": "Aangepaste filter regels zijn bijgewerkt",
"rule_removed_from_custom_filtering_toast": "Regel verwijderd uit de aangepaste filterregels",
@ -192,7 +186,6 @@
"found_in_known_domain_db": "Gevonden in de bekende domeingegevensbank.",
"category_label": "Categorie",
"rule_label": "Regel",
"filter_label": "Filter",
"unknown_filter": "Onbekend filter {{filterId}}",
"install_welcome_title": "Welkom bij AdGuard Home!",
"install_welcome_desc": "AdGuard Home is een netwerk DNS server die advertenties en trackers blokkeert. Het doel is om jou controle te geven over je gehele netwerk en al je apparaten, en er hoeft geen client-side programma te worden gebruikt.",
@ -304,7 +297,7 @@
"client_edit": "Wijzig gebruiker",
"client_identifier": "Identificeer via",
"ip_address": "IP adres",
"client_identifier_desc": "Gebruikers kunnen worden geïdentificeerd door het IP-adres of MAC-adres. Houd er rekening mee dat het gebruik van MAC als ID alleen mogelijk is als AdGuard Home ook een <0> DHCP-server </0> is",
"client_identifier_desc": "Gebruikers kunnen worden geïdentificeerd door het IP-adres, CIDR of MAC-adres. Hou er rekening mee dat het gebruik van MAC als ID alleen mogelijk is als AdGuard Home ook een <0>DHCP-server</0> is",
"form_enter_ip": "Vul IP in",
"form_enter_mac": "Vul MAC in",
"form_enter_id": "ID invoeren",
@ -316,7 +309,6 @@
"client_updated": "Gebruiker \"{{key}}\" met succes ge-updated",
"clients_not_found": "Geen gebruikers gevonden",
"client_confirm_delete": "Ben je zeker dat je deze gebruiker \"{{key}}\" wilt verwijderen?",
"filter_confirm_delete": "Ben je zeker dat je deze filter wilt verwijderen?",
"auto_clients_title": "Gebruikers (runtime)",
"auto_clients_desc": "Data over gebruikers die AdGuard Home gebruiken, maar niet geconfigureerd zijn",
"access_title": "Toegangs instellingen",
@ -355,6 +347,7 @@
"rewrite_desc": "Hiermee kunt u eenvoudig aangepaste DNS-antwoorden configureren voor een specifieke domeinnaam.",
"rewrite_applied": "Toegepaste herschrijf regel",
"dns_rewrites": "DNS herschrijvingen",
"form_domain": "Vul domein of wildcard in",
"form_answer": "Vul IP adres of domeinnaam in",
"form_error_domain_format": "Ongeldige domeinnaam",
"form_error_answer_format": "Ongeldig antwoord",
@ -381,7 +374,6 @@
"interval_days_plural": "{{count}} dagen",
"domain": "Domein",
"answer": "Antwoord",
"filter_added_successfully": "Het filter is succesvol toegevoegd",
"statistics_configuration": "Statistieken configuratie",
"statistics_retention": "Statistieken retentie",
"statistics_retention_desc": "Als je de interval waarde vermindert, zullen sommige gegevens verloren gaan",
@ -410,5 +402,17 @@
"whois": "Whois",
"filtering_rules_learn_more": "<0>Meer informatie</0> over het maken van uw eigen hosts-blocklists.",
"blocked_by_response": "Geblokkeerd door CNAME of IP als antwoord",
"try_again": "Probeer opnieuw"
"try_again": "Probeer opnieuw",
"domain_desc": "Voer de domeinnaam of wildcard in die herschreven moet worden.",
"example_rewrite_domain": "herschrijf reacties uitsluitend voor deze domeinnaam.",
"example_rewrite_wildcard": "herschrijf reacties voor alle subdomeinen van <0>example.org</0>.",
"tags_title": "Labels",
"check": "Controleren",
"form_enter_host": "Voer een hostnaam in",
"host_whitelisted": "De host staat op de toestemmingslijst",
"check_ip": "IP-adressen: {{ip}}",
"check_cname": "CNAME: {{cname}}",
"check_reason": "Reden: {{reason}}",
"check_rule": "Regel: {{rule}}",
"check_service": "Servicenaam: {{service}}"
}

View File

@ -115,22 +115,15 @@
"enabled_save_search_toast": "Skrudde på barnevennlige søk",
"enabled_table_header": "Skrudd på",
"name_table_header": "Navn",
"filter_url_table_header": "Filterets URL",
"rules_count_table_header": "Antall oppføringer",
"last_time_updated_table_header": "Senest oppdatert",
"actions_table_header": "Handlinger",
"edit_table_action": "Rediger",
"delete_table_action": "Slett",
"filters_and_hosts": "Filtre og «hosts»-lister",
"filters_and_hosts_hint": "AdGuard Home forstår grunnleggende adblock-oppføringer, «hosts»-filsyntaks, og domenelister.",
"no_filters_added": "Ingen filtre er lagt til",
"add_filter_btn": "Legg til et filter",
"cancel_btn": "Avbryt",
"enter_name_hint": "Skriv inn navn",
"enter_url_hint": "Skriv inn nettadresse",
"check_updates_btn": "Se etter oppdateringer",
"new_filter_btn": "Nytt filterabonnement",
"enter_valid_filter_url": "Skriv inn en gyldig URL til et filterlisteabonnement.",
"custom_filter_rules": "Selvvalgte filtreringsregler",
"custom_filter_rules_hint": "Skriv inn én oppføring per linje. Du kan bruke adblock-oppføringer, «hosts»-filsyntaks, eller rå domener.",
"examples_title": "Eksempler",
@ -146,7 +139,6 @@
"example_upstream_doh": "kryptert <0>DNS-over-HTTPS</0>",
"example_upstream_sdns": "du kan bruke <0>DNS-stempler</0> med <1>DNSCrypt</1> eller <2>DNS-over-HTTPS</2>-behandlere",
"example_upstream_tcp": "vanlig DNS (over TCP)",
"all_filters_up_to_date_toast": "Alle filterlistene er allerede fullt oppdatert",
"updated_upstream_dns_toast": "Oppdaterte oppstrøms-DNS-tjenerne",
"dns_test_ok_toast": "De spesifiserte DNS-tjenerne fungerer riktig",
"dns_test_not_ok_toast": "Tjeneren «{{key}}» kunne ikke brukes, vennligst dobbeltsjekk at du har skrevet den riktig",
@ -166,7 +158,6 @@
"next_btn": "Neste",
"loading_table_status": "Laster inn …",
"page_table_footer_text": "Side",
"of_table_footer_text": "av",
"rows_table_footer_text": "rekker",
"updated_custom_filtering_toast": "Oppdaterte de selvvalgte filtreringsreglene",
"rule_removed_from_custom_filtering_toast": "Oppføringen ble fjernet fra de selvvalgte filtreringsreglene",
@ -186,7 +177,6 @@
"found_in_known_domain_db": "Funnet i databasen over kjente domener.",
"category_label": "Kategori",
"rule_label": "Oppføring",
"filter_label": "Filter",
"unknown_filter": "Ukjent filter {{filterId}}",
"install_welcome_title": "Velkommen til AdGuard Home!",
"install_welcome_desc": "AdGuard Home er en nettverksdekkende reklame-og-sporings-blokkerende DNS-tjener. Formålet dens er å la deg styre hele nettverket ditt og alle dine enheter, og den krever ikke at klientene bruker spesifikke programmer.",
@ -296,7 +286,6 @@
"client_edit": "Rediger klienten",
"client_identifier": "Identifikator",
"ip_address": "IP-adresse",
"client_identifier_desc": "Klienter kan bli identifisert gjennom IP-adressen eller MAC-adressen. Vennligst bemerk at å bruke MAC som en identifikator, bare er mulig dersom AdGuard Home også er en <0>DHCP-tjener</0>",
"form_enter_ip": "Skriv inn IP",
"form_enter_mac": "Skriv inn MAC",
"form_client_name": "Skriv inn klientnavnet",
@ -306,7 +295,6 @@
"client_updated": "Klienten «{{key}}» ble vellykket oppdatert",
"clients_not_found": "Ingen klienter ble funnet",
"client_confirm_delete": "Er du sikker på at du vil slette klienten «{{key}}»?",
"filter_confirm_delete": "Er du sikker på at du vil slette filteret?",
"auto_clients_title": "Klienter (kjørende)",
"auto_clients_desc": "Loggføring over klientene som bruker AdGuard Home, men som ikke har blitt lagret i oppsettet",
"access_title": "Tilgangsinnstillinger",
@ -372,7 +360,6 @@
"interval_days_plural": "{{count}} dager",
"domain": "Domene",
"answer": "Svar",
"filter_added_successfully": "Filteret har blitt vellykket lagt til",
"statistics_configuration": "Statistikk-oppsett",
"statistics_retention": "Statistikkbeholding",
"statistics_retention_desc": "Hvis du reduserer intervallverdien, vil noen av dataene gå tapt",

View File

@ -122,22 +122,15 @@
"enabled_save_search_toast": "Włączone bezpieczne wyszukiwanie",
"enabled_table_header": "Włączone",
"name_table_header": "Nazwa",
"filter_url_table_header": "Filtruj adres URL",
"rules_count_table_header": "Licznik reguł",
"last_time_updated_table_header": "Ostatni raz zaktualizowany",
"actions_table_header": "Akcje",
"edit_table_action": "Edytuj",
"delete_table_action": "Usuń",
"filters_and_hosts": "Filtry i czarne listy hostów",
"filters_and_hosts_hint": "AdGuard Home rozumie podstawowe reguły adblocka i składnię plików hostów.",
"no_filters_added": "Nie dodano filtrów",
"add_filter_btn": "Dodaj filtr",
"cancel_btn": "Anuluj",
"enter_name_hint": "Wprowadź nazwę",
"enter_url_hint": "Wprowadź adres URL ",
"check_updates_btn": "Sprawdź aktualizacje",
"new_filter_btn": "Nowa subskrypcja filtra",
"enter_valid_filter_url": "Wprowadź poprawny adres URL subskrypcji filtru lub pliku hosta.",
"custom_filter_rules": "Niestandardowe reguły filtrowania",
"custom_filter_rules_hint": "Wprowadź jedną regułę w jednej linii. Możesz użyć reguł adblock lub składni plików hostów.",
"examples_title": "Przykłady",
@ -153,7 +146,6 @@
"example_upstream_doh": "zaszyfrowany <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-przez-HTTPS</a>",
"example_upstream_sdns": "możesz użyć <a href='https://dnscrypt.info/stamps/' target='_blank'>DNS Stamps</a> dla <a href='https://dnscrypt.info/' target='_blank'>DNSCrypt</a> lub <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a> resolvers",
"example_upstream_tcp": "zwykły DNS (przez TCP)",
"all_filters_up_to_date_toast": "Wszystkie filtry są już aktualne",
"updated_upstream_dns_toast": "Zaktualizowano wyższe serwery DNS",
"dns_test_ok_toast": "Określone serwery DNS działają poprawnie",
"dns_test_not_ok_toast": "Serwer \"{{key}}\": nie można go użyć, sprawdź, czy napisałeś go poprawnie",
@ -173,7 +165,6 @@
"next_btn": "Następny",
"loading_table_status": "Wczytuję...",
"page_table_footer_text": "Strona",
"of_table_footer_text": "z",
"rows_table_footer_text": "rzędy",
"updated_custom_filtering_toast": "Zaktualizowano niestandardowe reguły filtrowania",
"rule_removed_from_custom_filtering_toast": "Reguła usunięta z niestandardowych reguł filtrowania",
@ -203,13 +194,11 @@
"rate_limit_desc": "Liczba żądań na sekundę, które może wykonać pojedynczy klient (0: nieograniczona)",
"blocking_ipv4_desc": "Adres IP, który ma zostać zwrócony w przypadku zablokowanego żądania A",
"blocking_ipv6_desc": "Adres IP, który ma zostać zwrócony w przypadku zablokowanego żądania AAAA",
"blocking_mode_desc": "<0>NXDOMAIN Odpowiedz kodem NXDOMAIN;</0> <0>Null IP Odpowiedz z zerowym adresem IP (0.0.0.0 dla A; :: dla AAAA);</0> <0>Niestandardowe IP - Odpowiedz z ręcznie ustawionym adresem IP.</0>",
"upstream_dns_client_desc": "Jeśli to pole pozostanie puste, AdGuard Home użyje serwerów skonfigurowanych w <0>Ustawieniach DNS</0>.",
"source_label": "Źródło",
"found_in_known_domain_db": "Znaleziono w bazie danych znanych domen.",
"category_label": "Kategoria",
"rule_label": "Reguła",
"filter_label": "Filtr",
"unknown_filter": "Nieznany filtr {{filterId}}",
"install_welcome_title": "Witamy w AdGuard Home!",
"install_welcome_desc": "AdGuard Home to w pełni funkcjonalny serwer DNS do blokowania reklam i śledzenia. Jego celem jest kontrolowanie całej sieci i wszystkich urządzeń, bez konieczności korzystania z jakiegokolwiek programu po stronie klienta.",
@ -321,7 +310,6 @@
"client_edit": "Edytuj klienta",
"client_identifier": "Identyfikator",
"ip_address": "Adres IP",
"client_identifier_desc": "Klienci mogą być identyfikowani na podstawie adresu IP, CIDR, adresu MAC. Pamiętaj, że użycie MAC jako identyfikatora jest możliwe tylko wtedy, gdy AdGuard Home jest również <0>serwerem DHCP</0>",
"form_enter_ip": "Wpisz adres IP",
"form_enter_mac": "Wpisz adres MAC",
"form_enter_id": "Wprowadź identyfikator",
@ -333,7 +321,6 @@
"client_updated": "Klient \"{{key}}\" został pomyślnie zaktualizowany",
"clients_not_found": "Nie znaleziono klientów",
"client_confirm_delete": "Czy na pewno chcesz usunąć klienta \"{{key}}\"?",
"filter_confirm_delete": "Czy na pewno chcesz usunąć filtr?",
"auto_clients_title": "Klienci (czas uruchamiania)",
"auto_clients_desc": "Dane klientów, które używają AdGuard Home, ale nie są przechowywane w konfiguracji",
"access_title": "Ustawienia dostępu",
@ -399,7 +386,6 @@
"interval_days_plural": "{{count}} dni",
"domain": "Domena",
"answer": "Odpowiedź",
"filter_added_successfully": "Pomyślnie dodano filtr",
"statistics_configuration": "Konfiguracja statystyk",
"statistics_retention": "Przechowywanie statystyk",
"statistics_retention_desc": "Jeśli zmniejszysz wartość interwału, niektóre dane zostaną utracone",

View File

@ -122,22 +122,17 @@
"enabled_save_search_toast": "Pesquisa segura ativada",
"enabled_table_header": "Ativado",
"name_table_header": "Nome",
"filter_url_table_header": "URL do filtro",
"rules_count_table_header": "Quantidade de regras",
"last_time_updated_table_header": "Última atualização",
"actions_table_header": "Ações",
"edit_table_action": "Editar",
"delete_table_action": "Excluir",
"filters_and_hosts": "Filtros e listas de bloqueio de hosts",
"filters_and_hosts_hint": "O AdGuard Home entende regras básicas de bloqueio de anúncios e a sintaxe de arquivos de hosts.",
"no_filters_added": "Nenhum filtro adicionado",
"add_filter_btn": "Adicionar filtro",
"cancel_btn": "Cancelar",
"enter_name_hint": "Digite o nome",
"enter_url_hint": "Digite a URL",
"check_updates_btn": "Verificar atualizações",
"new_filter_btn": "Nova inscrição de filtro",
"enter_valid_filter_url": "Digite a URL válida para efetuar a inscrição de filtro ou um arquivo de hosts.",
"form_error_url_format": "Formato da url inválida",
"custom_filter_rules": "Regras de filtragem personalizadas",
"custom_filter_rules_hint": "Digite uma regra por linha. Você pode usar regras de bloqueio de anúncios ou a sintaxe de arquivos de hosts.",
"examples_title": "Exemplos",
@ -153,7 +148,6 @@
"example_upstream_doh": "<0>DNS-sobre-HTTPS</0> criptografado",
"example_upstream_sdns": "Você pode usar <0>DNS Stamps</0>para o <1>DNSCrypt</1>ou usar os resolvedores <2>DNS-sobre-HTTPS</2>",
"example_upstream_tcp": "DNS regular (através do TCP)",
"all_filters_up_to_date_toast": "Todos os filtros já estão atualizados",
"updated_upstream_dns_toast": "Atualizado os servidores DNS upstream",
"dns_test_ok_toast": "Os servidores DNS especificados estão funcionando corretamente",
"dns_test_not_ok_toast": "O servidor \"{{key}}\": não pôde ser utilizado. Por favor, verifique se você escreveu corretamente",
@ -173,7 +167,6 @@
"next_btn": "Próximo",
"loading_table_status": "Carregando",
"page_table_footer_text": "Página",
"of_table_footer_text": "de",
"rows_table_footer_text": "linhas",
"updated_custom_filtering_toast": "Regras de filtragem personalizadas atualizadas",
"rule_removed_from_custom_filtering_toast": "Regra removida das regras de filtragem personalizadas",
@ -191,6 +184,7 @@
"query_log_retention_confirm": "Você tem certeza de que deseja alterar o arquivamento do registro de consulta? Se diminuir o valor de intervalo, alguns dados serão perdidos",
"dns_config": "Configuração do servidor DNS",
"blocking_mode": "Modo de bloqueio",
"default": "Padrão",
"nxdomain": "NXDOMAIN",
"null_ip": "IP nulo",
"custom_ip": "IP personalizado",
@ -203,13 +197,15 @@
"rate_limit_desc": "O número de solicitações por segundo que um único cliente pode fazer (0: ilimitado)",
"blocking_ipv4_desc": "Endereço de IP a ser retornado para uma solicitação bloqueada",
"blocking_ipv6_desc": "Endereço de IP a ser retornado para uma solicitação AAAA bloqueada",
"blocking_mode_desc": "<0>NXDOMAIN - Responde com o código NXDOMAIN;</0> <0>IP nulo - Responde com endereço IP zero (0.0.0.0.0 para A; :: para AAAA);</0><0>IP personalizado - Responde com um endereço de IP definido manualmente.</0>",
"blocking_mode_default": "Por padrão: Responder com NXDOMAIN quando bloqueado pela regra estilo Adblock e responde com o endereço de IP especificado na regra quando bloqueado pela regra estilo /etc/hosts-style",
"blocking_mode_nxdomain": "NXDOMAIN: Responder com o código NXDOMAIN",
"blocking_mode_null_ip": "IP nulo: Responder com endereço IP zero (0.0.0.0 para A; :: para AAAA)",
"blocking_mode_custom_ip": "IP personalizado: Responder com um endereço IP definido manualmente",
"upstream_dns_client_desc": "Se você mantiver este campo vazio, o AdGuard Home usará os servidores configurados nas configurações <0>DNS</0>.",
"source_label": "Fonte",
"found_in_known_domain_db": "Encontrado no banco de dados de domínios conhecidos.",
"category_label": "Categoria",
"rule_label": "Regra",
"filter_label": "Filtro",
"unknown_filter": "Filtro desconhecido {{filterId}}",
"install_welcome_title": "Bem-vindo(a) ao AdGuard Home!",
"install_welcome_desc": "O AdGuard Home é um servidor de DNS para bloqueio de anúncios e rastreamento em toda a rede. Sua finalidade é permitir que você controle toda a sua rede e seus dispositivos sem precisar ter um programa instalado.",
@ -333,7 +329,6 @@
"client_updated": "Cliente \"{{key}}\" atualizado com sucesso",
"clients_not_found": "Nenhum cliente foi encontrado",
"client_confirm_delete": "Você tem certeza de que deseja excluir o cliente \"{{key}}\"?",
"filter_confirm_delete": "Você tem certeza de que deseja excluir o filtro?",
"auto_clients_title": "Clientes (tempo de execução)",
"auto_clients_desc": "Dados dos clientes que usam o AdGuard Home, que não são armazenados na configuração",
"access_title": "Configurações de acessos",
@ -399,7 +394,6 @@
"interval_days_plural": "{{count}} dias",
"domain": "Domínio",
"answer": "Resposta",
"filter_added_successfully": "O filtro foi adicionado com sucesso",
"statistics_configuration": "Configurações de estatísticas",
"statistics_retention": "Permanência das estatísticas",
"statistics_retention_desc": "Se você diminuir o valor do intervalo, alguns dados serão perdidos",
@ -431,5 +425,33 @@
"try_again": "Tente novamente",
"domain_desc": "Digite o nome do domínio ou wildcard que pretende reescrever.",
"example_rewrite_domain": "reescrever respostas apenas para este nome de domínio.",
"example_rewrite_wildcard": "reescrever respostas para todos subdomínios <0>exemplo.org</0>."
"example_rewrite_wildcard": "reescrever respostas para todos subdomínios <0>exemplo.org</0>.",
"disable_ipv6": "Desativar IPv6",
"disable_ipv6_desc": "Se este recurso estiver ativado, todas as consultas de DNS para endereços IPv6 (tipo AAAA) serão ignoradas.",
"tags_title": "Marcadores",
"tags_desc": "Você pode selecionar as tags que correspondem ao cliente. As tags podem ser incluídas nas regras de filtragem e permitir que você as aplique com mais precisão. <0>Saiba mais</0>",
"form_select_tags": "Selecione as tags do cliente",
"check_title": "Verifique a filtragem",
"check_desc": "Verificar se o nome do host está sendo filtrado",
"check": "Verificar",
"form_enter_host": "Digite o nome do host",
"filtered_custom_rules": "Filtrado pelas regras de filtragem personalizadas",
"host_whitelisted": "O host está na lista branca",
"check_ip": "Endereços de IP: {{ip}}",
"check_cname": "CNAME: {{cname}}",
"check_reason": "Motivo: {{reason}}",
"check_rule": "Regra: {{rule}}",
"check_service": "Nome do serviço: {{service}}",
"check_not_found": "Não encontrado em suas listas de filtros",
"client_confirm_block": "Você tem certeza de que deseja bloquear o cliente \"{{ip}}\"?",
"client_confirm_unblock": "Você tem certeza de que deseja desbloquear o cliente \"{{ip}}\"?",
"client_blocked": "Cliente \"{{ip}}\" foi bloqueado com sucesso",
"client_unblocked": "Cliente \"{{ip}}\" foi desbloqueado com sucesso",
"static_ip": "Endereço de IP estático",
"static_ip_desc": "O AdGuard Home é um servidor, portanto, ele precisa de um endereço de IP estático para funcionar corretamente. Caso contrário, em algum momento, seu roteador poderá atribuir um novo endereço de IP neste dispositivo.",
"set_static_ip": "Definir um endereço de IP estático",
"install_static_ok": "Boas notícias! O endereço de IP estático já está configurado",
"install_static_error": "O AdGuard Home não pode configurar automaticamente para esta interface de rede. Por favor, procure uma instrução sobre como fazer isso manualmente.",
"install_static_configure": "Detectamos que um endereço de IP dinâmico é sendo usado — <0>{{ip}}</0>. Deseja utilizar como seu endereço estático?",
"confirm_static_ip": "O AdGuard Home irá configurar {{ip}} para ser seu endereço IP estático. Deseja continuar?"
}

View File

@ -121,22 +121,15 @@
"enabled_save_search_toast": "Pesquisa segura activada",
"enabled_table_header": "Activados",
"name_table_header": "Nome",
"filter_url_table_header": "URL do filtro",
"rules_count_table_header": "Total de Regras",
"last_time_updated_table_header": "Última actualização",
"actions_table_header": "Acções",
"edit_table_action": "Editar",
"delete_table_action": "Apagar",
"filters_and_hosts": "Filtros e listas de bloqueio de hosts",
"filters_and_hosts_hint": "O AdGuard Home entende regras básicas de bloqueio de anúncios e a sintaxe de arquivos de hosts.",
"no_filters_added": "Nenhum filtro adicionado",
"add_filter_btn": "Adicionar filtro",
"cancel_btn": "Cancelar",
"enter_name_hint": "Insira o nome",
"enter_url_hint": "Insira URL",
"check_updates_btn": "Verificar actualizações",
"new_filter_btn": "Nova inscrição de filtro",
"enter_valid_filter_url": "Insira a URL válida para efectuar a inscrição de filtro ou um arquivo de hosts.",
"custom_filter_rules": "Regras de filtragem personalizadas",
"custom_filter_rules_hint": "Insira uma regra por linha. Pode usar regras de bloqueio de anúncios ou a sintaxe de arquivos de hosts.",
"examples_title": "Exemplos",
@ -152,7 +145,6 @@
"example_upstream_doh": "<0>DNS-sobre-HTTPS</0> criptografado",
"example_upstream_sdns": "pode usar <0>DNS Stamps</0>para o <1>DNSCrypt</1>ou usar os resolvedores <2>DNS-sobre-HTTPS</2>",
"example_upstream_tcp": "dNS regular (através do TCP)",
"all_filters_up_to_date_toast": "Os filtros já estão actualizados",
"updated_upstream_dns_toast": "A actualizar os servidores DNS upstream",
"dns_test_ok_toast": "Os servidores DNS especificados estão a funcionar correctamente",
"dns_test_not_ok_toast": "O servidor \"{{key}}\": não pôde ser utilizado. Por favor, verifique se o escreveu correctamente",
@ -172,7 +164,6 @@
"next_btn": "Seguinte",
"loading_table_status": "A carregar...",
"page_table_footer_text": "Página",
"of_table_footer_text": "de",
"rows_table_footer_text": "linhas",
"updated_custom_filtering_toast": "Regras de filtragem personalizadas actualizadas",
"rule_removed_from_custom_filtering_toast": "Regra removida das regras de filtragem personalizadas",
@ -202,13 +193,11 @@
"rate_limit_desc": "O número de solicitações por segundo que um único cliente pode fazer (0: ilimitado)",
"blocking_ipv4_desc": "Endereço IP a ser devolvido para uma solicitação A bloqueada",
"blocking_ipv6_desc": "Endereço IP a ser devolvido para uma solicitação AAAA bloqueada",
"blocking_mode_desc": "<0>NXDOMAIN Responda com o código NXDOMAIN;;</0> <0>IP nulo - responda com zero endereço IP (0.0.0.0 for A; :: for AAAA);</0> <0>IP personalizado - Responda com um endereço IP definido manualmente.</0>",
"upstream_dns_client_desc": "Se mantiver esse campo vazio, o AdGuard Home usará os servidores configurados nas <0>Definições de DNS</0>.",
"source_label": "Fonte",
"found_in_known_domain_db": "Encontrado no banco de dados de domínios conhecido.",
"category_label": "Categoria",
"rule_label": "Regra",
"filter_label": "Filtro",
"unknown_filter": "Filtro desconhecido {{filterId}}",
"install_welcome_title": "Bem-vindo ao AdGuard Home!",
"install_welcome_desc": "O AdGuard Home é um servidor de DNS para bloqueio de anúncios e monitorização em toda a rede. A sua finalidade é permitir que controle toda a sua rede e os seus dispositivos sem precisar de ter um programa instalado.",
@ -320,7 +309,6 @@
"client_edit": "Editar cliente",
"client_identifier": "Identificador",
"ip_address": "Endereço de IP",
"client_identifier_desc": "Os clientes podem ser identificados pelo endereço de IP, CIDR, ou pelo endereço MAC. Observe que o uso do endereço MAC como identificador só é possível se o AdGuard Home também for um <0>servidor DHCP</0>",
"form_enter_ip": "Insira IP",
"form_enter_mac": "Insira o endereço MAC",
"form_enter_id": "Inserir identificador",
@ -332,7 +320,6 @@
"client_updated": "Cliente \"{{key}}\" actualizado com sucesso",
"clients_not_found": "Nenhum cliente foi encontrado",
"client_confirm_delete": "Tem a certeza de que deseja excluir o cliente \"{{key}}\"?",
"filter_confirm_delete": "Tem a certeza de que deseja excluir o filtro?",
"auto_clients_title": "Clientes (tempo de execução)",
"auto_clients_desc": "Dados dos clientes que usam o AdGuard Home, que não são armazenados na configuração",
"access_title": "Configurações de acesso",
@ -397,7 +384,6 @@
"interval_days_plural": "{{count}} dias",
"domain": "Domínio",
"answer": "Resposta",
"filter_added_successfully": "O filtro foi adicionado com sucesso",
"statistics_configuration": "Configuração das estatísticas",
"statistics_retention": "Retenção de estatísticas",
"statistics_retention_desc": "Se diminuir o valor do intervalo, alguns dados serão perdidos",

View File

@ -101,6 +101,11 @@
"no_servers_specified": "Нет указанных серверов",
"general_settings": "Основные настройки",
"dns_settings": "Настройки DNS",
"dns_blocklists": "Черные списки DNS",
"dns_allowlists": "Белые списки DNS",
"dns_blocklists_desc": "AdGuard Home будет блокировать домены из черных списков.",
"dns_allowlists_desc": "Домены из белых списков DNS будут разрешены, даже если они находятся в любом из черных списков.",
"custom_filtering_rules": "Пользовательские правила фильтрации",
"encryption_settings": "Настройки шифрования",
"dhcp_settings": "Настройки DHCP",
"upstream_dns": "Upstream DNS-серверы",
@ -118,22 +123,28 @@
"enabled_save_search_toast": "Безопасный поиск вкл.",
"enabled_table_header": "Вкл.",
"name_table_header": "Имя",
"filter_url_table_header": "URL фильтра",
"list_url_table_header": "URL-адрес списка",
"rules_count_table_header": "Количество правил:",
"last_time_updated_table_header": "Последнее обновление",
"actions_table_header": "Действия",
"edit_table_action": "Редактировать",
"delete_table_action": "Удалить",
"filters_and_hosts": "Фильтры и черные списки hosts",
"filters_and_hosts_hint": "AdGuard Home распознает базовые правила блокировки и синтаксис файлов hosts.",
"no_filters_added": "Фильтры не добавлены",
"add_filter_btn": "Добавить фильтр",
"no_blocklist_added": "Черные списки не добавлены",
"no_whitelist_added": "Белые списки не добавлены",
"add_blocklist": "Добавить черный список",
"add_allowlist": "Добавить белый список",
"cancel_btn": "Отмена",
"enter_name_hint": "Введите имя",
"enter_url_hint": "Введите URL",
"check_updates_btn": "Проверить обновления",
"new_filter_btn": "Добавление нового фильтра",
"enter_valid_filter_url": "Введите действующий URL для подписки на фильтр или файл hosts.",
"new_blocklist": "Новый черный список",
"new_allowlist": "Новый белый список",
"edit_blocklist": "Редактировать черный список",
"edit_allowlist": "Редактировать белый список",
"enter_valid_blocklist": "Добавьте действующий URL-адрес в черный список.",
"enter_valid_allowlist": "Добавьте действующий URL-адрес в белый список.",
"form_error_url_format": "Неверный формат URL",
"custom_filter_rules": "Пользовательское правило фильтрации",
"custom_filter_rules_hint": "Вводите по одному правилу на строчку. Вы можете использовать правила блокировки или синтаксис файлов hosts.",
"examples_title": "Примеры",
@ -149,7 +160,7 @@
"example_upstream_doh": "зашифрованный <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a>",
"example_upstream_sdns": "вы можете использовать <a href='https://dnscrypt.info/stamps/' target='_blank'>DNS Stamps</a> для <a href='https://dnscrypt.info/' target='_blank'>DNSCrypt</a> или <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a> резолверов",
"example_upstream_tcp": "обычный DNS (поверх TCP)",
"all_filters_up_to_date_toast": "Все фильтры обновлены",
"all_lists_up_to_date_toast": "Все списки уже обновлены",
"updated_upstream_dns_toast": "Upstream DNS-серверы обновлены",
"dns_test_ok_toast": "Указанные серверы DNS работают корректно",
"dns_test_not_ok_toast": "Сервер \"{{key}}\": невозможно использовать, проверьте правильность написания",
@ -169,7 +180,6 @@
"next_btn": "Вперёд",
"loading_table_status": "Загрузка...",
"page_table_footer_text": "Страница",
"of_table_footer_text": "из",
"rows_table_footer_text": "строк",
"updated_custom_filtering_toast": "Внесены изменения в пользовательские правила",
"rule_removed_from_custom_filtering_toast": "Правило удалено из авторского списка правил фильтрации",
@ -187,6 +197,7 @@
"query_log_retention_confirm": "Вы уверены, что хотите изменить срок хранения запросов? При сокращении интервала данные могут быть утеряны",
"dns_config": "Настройки DNS-сервера",
"blocking_mode": "Режим блокировки",
"default": "Стандартный",
"nxdomain": "NXDOMAIN",
"null_ip": "Нулевой IP",
"custom_ip": "Свой IP",
@ -199,13 +210,16 @@
"rate_limit_desc": "Ограничение на количество запросов в секунду для каждого клиента (0 — неограниченно)",
"blocking_ipv4_desc": "IP-адрес, возвращаемый при блокировке A-запроса",
"blocking_ipv6_desc": "IP-адрес, возвращаемый при блокировке AAAA-запроса",
"blocking_mode_desc": "<0>«NXDOMAIN» — посылать в ответ код NXDOMAIN;</0><0>«Нулевой IP» — посылать в ответ нулевой IP-адрес (0.0.0.0 для A-запроса, :: для АААА-запроса);</0><0>«Свой IP» — посылать в ответ указанный IP-адрес.</0>",
"blocking_mode_default": "Стандартный: Отвечает с NXDOMAIN, когда заблокировано правилом в стиле Adblock; отвечает с IP-адресом, указанным в правиле, когда заблокировано правилом в стиле /etc/hosts\n",
"blocking_mode_nxdomain": "NXDOMAIN: Отвечает с кодом NXDOMAIN\n",
"blocking_mode_null_ip": "Нулевой IP: Отвечает с нулевым IP-адресом (0.0.0.0 для A; :: для AAAA)",
"blocking_mode_custom_ip": "Пользовательский IP: Отвечает с вручную настроенным IP-адресом",
"upstream_dns_client_desc": "Если оставить поле пустым, AdGuard Home будет обращаться к серверам, указанным в <0>настройках DNS</0>.",
"source_label": "Источник",
"found_in_known_domain_db": "Найден в базе известных доменов.",
"category_label": "Категория",
"rule_label": "Правило",
"filter_label": "Фильтр",
"list_label": "Список",
"unknown_filter": "Неизвестный фильтр {{filterId}}",
"install_welcome_title": "Добро пожаловать в AdGuard Home!",
"install_welcome_desc": "AdGuard Home это DNS-сервер, блокирующий рекламу и трекинг. Его цель дать вам возможность контролировать всю вашу сеть и все подключенные устройства. Он не требует установки клиентских программ.",
@ -329,7 +343,7 @@
"client_updated": "Клиент \"{{key}}\" успешно обновлен",
"clients_not_found": "Клиентов не найдено",
"client_confirm_delete": "Вы уверены, что хотите удалить клиента \"{{key}}\"?",
"filter_confirm_delete": "Вы уверены, что хотите удалить фильтр?",
"list_confirm_delete": "Вы уверены, что хотите удалить этот список?",
"auto_clients_title": "Клиенты (runtime)",
"auto_clients_desc": "Данные о клиентах, которые используют AdGuard Home, но не хранятся в настройках",
"access_title": "Настройки доступа",
@ -393,7 +407,8 @@
"interval_24_hour": "24 часа",
"domain": "Домен",
"answer": "Ответ",
"filter_added_successfully": "Фильтр успешно добавлен",
"filter_added_successfully": "Список успешно добавлен",
"filter_updated": "Список успешно обновлен",
"statistics_configuration": "Конфигурация статистики",
"statistics_retention": "Сохранение статистики",
"statistics_retention_desc": "Если вы уменьшите значение интервала, некоторые данные могут быть утеряны",
@ -435,5 +450,38 @@
"for_last_days_2": "за последние {{count}} дней",
"number_of_dns_query_days_0": "Количество DNS-запросов за {{count}} день",
"number_of_dns_query_days_1": "Количество DNS-запросов за {{count}} дня",
"number_of_dns_query_days_2": "Количество DNS-запросов за {{count}} дней"
"number_of_dns_query_days_2": "Количество DNS-запросов за {{count}} дней",
"disable_ipv6": "Отключить IPv6",
"disable_ipv6_desc": "Если эта опция включена, все DNS-запросы адресов IPv6 (тип AAAA) будут игнорироваться.",
"autofix_warning_text": "При нажатии \"Исправить\" AdGuard Home настроит вашу систему на использование DNS-сервера AdGuard Home.",
"autofix_warning_result": "В результате все DNS-запросы от вашей системы будут по умолчанию обрабатываться AdGuard Home.\n",
"tags_title": "Теги",
"tags_desc": "Вы можете выбрать теги, которые соответствуют клиенту. Теги могут быть включены в правила фильтрации и позволят вам применять их более точно. <0>Узнать больше</0>.",
"form_select_tags": "Выбрать теги клиента",
"check_title": "Проверить фильтрацию",
"check_desc": "Проверить фильтрацию имени хоста",
"check": "Проверить",
"form_enter_host": "Введите имя хоста",
"filtered_custom_rules": "Отфильтрованы с помощью пользовательских правил фильтрации",
"host_whitelisted": "Хост занесен в белый список",
"check_ip": "IP-адреса: {{ip}}",
"check_cname": "CNAME: {{cname}}",
"check_reason": "Причина: {{reason}}",
"check_rule": "Правило: {{rule}}",
"check_service": "Название сервиса: {{service}}",
"check_not_found": "Не найдено в вашем списке фильтров",
"client_confirm_block": "Вы уверены, что хотите заблокировать клиента \"{{ip}}\"?",
"client_confirm_unblock": "Вы уверены, что хотите разблокировать клиента \"{{ip}}\"?",
"client_blocked": "Клиент \"{{ip}}\" успешно заблокирован",
"client_unblocked": "Клиент \"{{ip}}\" успешно разблокирован",
"static_ip": "Статический IP-адрес",
"static_ip_desc": "AdGuard Home является сервером, поэтому для корректной работы ему необходим статический IP-адрес. В противном случае, в какой-то момент ваш роутер может присвоить этому устройству другой IP-адрес.",
"set_static_ip": "Установить статический IP-адрес",
"install_static_ok": "Хорошие новости! Ваш статический IP-адрес уже настроен",
"install_static_error": "AdGuard Home не может автоматически настроить его для этого сетевого интерфейса. Пожалуйста, посмотрите инструкцию о том, как это сделать вручную.",
"install_static_configure": "Мы обнаружили использование динамического IP-адреса — <0>{{ip}}</0>. Хотите использовать его в качестве статического адреса?",
"confirm_static_ip": "AdGuard Home настроит {{ip}} в качестве вашего статического IP-адреса. Хотите продолжить?",
"list_updated_0": "Обновлен {{count}} список",
"list_updated_1": "Обновлено списка: {{count}}",
"list_updated_2": "Обновлено списков: {{count}}"
}

View File

@ -122,22 +122,17 @@
"enabled_save_search_toast": "Zapnuté bezpečné vyhľadávanie",
"enabled_table_header": "Zapnuté",
"name_table_header": "Meno",
"filter_url_table_header": "URL adresa filtra",
"rules_count_table_header": "Počet pravidiel",
"last_time_updated_table_header": "Posledná aktualizácia",
"actions_table_header": "Akcie",
"edit_table_action": "Úprava",
"delete_table_action": "Vymazať",
"filters_and_hosts": "Filtre a zoznamy blokovaných adries",
"filters_and_hosts_hint": "AdGuard Home pozná základné pravidlá adblock a syntax hosts súborov.",
"no_filters_added": "Neboli pridané žiadne filtre",
"add_filter_btn": "Pridať filter",
"cancel_btn": "Zrušiť",
"enter_name_hint": "Zadajte meno",
"enter_url_hint": "Zadajte URL adresu",
"check_updates_btn": "Skontrolovať aktualizácie",
"new_filter_btn": "Odber nového filtra",
"enter_valid_filter_url": "Zadajte platnú URL adresu na odber filtra alebo zoznamov adries.",
"form_error_url_format": "Neplatný URL formát",
"custom_filter_rules": "Vlastné filtračné pravidlá",
"custom_filter_rules_hint": "Zadajte na každý riadok jedno pravidlo. Môžete použiť buď adblock pravidlá alebo syntax host súborov.",
"examples_title": "Príklady",
@ -153,7 +148,6 @@
"example_upstream_doh": "šifrované <0>DNS-over-HTTPS</0>",
"example_upstream_sdns": "môžete použiť <0>DNS pečiatky</0> pre <1>DNSCrypt</1> alebo <2>DNS-over-HTTPS</2>",
"example_upstream_tcp": "radová DNS (cez TCP)",
"all_filters_up_to_date_toast": "Všetky filtre sú už aktuálne",
"updated_upstream_dns_toast": "Aktualizované upstream DNS servery",
"dns_test_ok_toast": "Špecifikované DNS servery pracujú korektne",
"dns_test_not_ok_toast": "Server \"{{key}}\": nemohol byť použitý, skontrolujte, či ste ho správne napísali",
@ -173,7 +167,6 @@
"next_btn": "Ďalšie",
"loading_table_status": "Načítavam...",
"page_table_footer_text": "Stránka",
"of_table_footer_text": "z",
"rows_table_footer_text": "riadky",
"updated_custom_filtering_toast": "Aktualizované vlastné filtračné pravidlá",
"rule_removed_from_custom_filtering_toast": "Pravidlo odstránené z vlastných filtračných pravidiel",
@ -191,6 +184,7 @@
"query_log_retention_confirm": "Naozaj chcete zmeniť uchovávanie denníku dopytov? Ak znížite hodnotu intervalu, niektoré údaje sa stratia",
"dns_config": "Konfigurácia DNS servera",
"blocking_mode": "Spôsob blokovania",
"default": "Predvolené",
"nxdomain": "NXDOMAIN",
"null_ip": "Nulová IP adresa",
"custom_ip": "Vlastná IP adresa",
@ -203,13 +197,15 @@
"rate_limit_desc": "Počet požiadaviek za sekundu, ktoré môže jeden klient vykonať (0: neobmedzene)",
"blocking_ipv4_desc": "IP adresa, ktorá sa má vrátiť v prípade blokovanej žiadosti A",
"blocking_ipv6_desc": "IP adresa, ktorá sa má vrátiť v prípade blokovanej žiadosti AAAA",
"blocking_mode_desc": "<0>NXDOMAIN - Odpoveď s kódom NXDOMAIN;</0> <0>Null IP - Odpoveď s nulovou IP adresou (0,0.0,0 pre A; :: pre AAAA);</0> <0>Vlastná IP adresa - Odpoveď s manuálne nastavenou IP adresou.</0>",
"blocking_mode_default": "Predvolená hodnota: Odpovedať pomocou NXDOMAIN, ak je blokovaný pravidlom v štýle Adblock; odpovedať pomocou IP adresy určenej v pravidle, ak je blokovaná pravidlom v štýle /etc/hosts",
"blocking_mode_nxdomain": "NXDOMAIN: Odpovedať kódom NXDOMAIN",
"blocking_mode_null_ip": "Null IP: Odpoveď s nulovou IP adresou (0.0.0.0 pre A; :: pre AAAA)",
"blocking_mode_custom_ip": "Vlastná IP adresa: Odpovedzte s manuálne nastavenou IP adresou",
"upstream_dns_client_desc": "Ak ponecháte toto pole prázdne, AdGuard Home použije servery nakonfigurované v <0>nastaveniach DNS</0>.",
"source_label": "Zdroj",
"found_in_known_domain_db": "Nájdené v databáze známych domén.",
"category_label": "Kategória",
"rule_label": "Pravidlo",
"filter_label": "Filter",
"unknown_filter": "Neznámy filter {{filterId}}",
"install_welcome_title": "Vitajte na stránkach AdGuard Home!",
"install_welcome_desc": "Doména AdGuard Home je celosieťový DNS server pre blokovanie reklám a sledovačov. Jeho cieľom je, aby ste ovládali celú Vašu sieť a všetky Vaše zariadenia, pričom sa nevyžaduje použitie akéhokoľvek programu na strane klienta.",
@ -321,7 +317,7 @@
"client_edit": "Upraviť klienta",
"client_identifier": "Identifikátor",
"ip_address": "IP adresa",
"client_identifier_desc": "Klienti môžu byť identifikovaní podľa IP adresy alebo MAC adresy. Upozorňujeme, že používanie MAC ako identifikátora je možné len vtedy, ak je AdGuard Home tiež <0>DHCP server</0>",
"client_identifier_desc": "Klienti môžu byť identifikovaní podľa IP adresy, CIDR alebo MAC adresy. Upozorňujeme, že používanie MAC ako identifikátora je možné len vtedy, ak je AdGuard Home tiež <0>DHCP server</0>",
"form_enter_ip": "Zadajte IP adresu",
"form_enter_mac": "Zadajte MAC adresu",
"form_enter_id": "Zadajte identifikátor",
@ -333,7 +329,6 @@
"client_updated": "\"{{key}}\" klienta bol úspešne aktualizovaný",
"clients_not_found": "Nebol nájdený žiaden klient",
"client_confirm_delete": "Naozaj chcete vymazať \"{{key}}\" klienta?",
"filter_confirm_delete": "Naozaj chcete vymazať tento filter?",
"auto_clients_title": "Klienti (runtime)",
"auto_clients_desc": "Údaje o klientoch, ktorí používajú AdGuard Home, ale nie sú uložení v konfigurácii",
"access_title": "Nastavenia prístupu",
@ -399,7 +394,6 @@
"interval_days_plural": "{{count}} dní",
"domain": "Doména",
"answer": "Odpoveď",
"filter_added_successfully": "Filter bol úspešne pridaný",
"statistics_configuration": "Konfigurácia štatistiky",
"statistics_retention": "Štatistika za obdobie",
"statistics_retention_desc": "Ak znížite hodnotu intervalu, niektoré údaje sa stratia",
@ -431,5 +425,33 @@
"try_again": "Skúste znova",
"domain_desc": "Zadajte meno domény alebo zástupný znak, ktorý chcete prepísať.",
"example_rewrite_domain": "prepísať odpovede iba pre toto meno domény.",
"example_rewrite_wildcard": "prepísať odpovede pre všetky subdomény <0>example.org</0>."
"example_rewrite_wildcard": "prepísať odpovede pre všetky subdomény <0>example.org</0>.",
"disable_ipv6": "Vypnúť IPv6",
"disable_ipv6_desc": "Ak je táto funkcia zapnutá, všetky dotazy DNS na adresy IPv6 (typ AAAA) budú zrušené.",
"tags_title": "Tagy",
"tags_desc": "Môžete vybrať tagy ktoré zodpovedajú klientovi. Tagy môžu byť súčasťou filtračných pravidiel a umožňujú Vám použiť ich presnejšie. <0>Viac informácií</0>",
"form_select_tags": "Zvoľte tagy klienta",
"check_title": "Skontrolujte filtráciu",
"check_desc": "Skontrolujte, či je názov hostiteľa filtrovaný",
"check": "Kontrola",
"form_enter_host": "Zadajte meno hostiteľa",
"filtered_custom_rules": "Filtrované podľa vlastných filtračných pravidiel",
"host_whitelisted": "Hostiteľ je na bielej listine",
"check_ip": "IP adresy: {{ip}}",
"check_cname": "CNAME: {{cname}}",
"check_reason": "Dôvod: {{reason}}",
"check_rule": "Pravidlo: {{rule}}",
"check_service": "Meno služby: {{service}}",
"check_not_found": "Nenašlo sa vo Vašom zozname filtrov",
"client_confirm_block": "Naozaj chcete zablokovať klienta \"{{ip}}\"?",
"client_confirm_unblock": "Naozaj chcete odblokovať klienta \"{{ip}}\"?",
"client_blocked": "Klient \"{{ip}}\" úspešne zablokovaný",
"client_unblocked": "Klient \"{{ip}}\" úspešne odblokovaný",
"static_ip": "Statická IP adresa",
"static_ip_desc": "AdGuard Home je server, takže na správne fungovanie potrebuje statickú IP adresu. V opačnom prípade môže smerovač tomuto zariadeniu prideliť inú IP adresu.",
"set_static_ip": "Nastaviť statickú IP adresu",
"install_static_ok": "Dobré správy! Statická IP adresa je už nakonfigurovaná",
"install_static_error": "AdGuard Home ho nemôže automaticky nakonfigurovať pre toto sieťové rozhranie. Vyhľadajte návod, ako to urobiť manuálne.",
"install_static_configure": "Zistili sme, že sa používa dynamická IP adresa — <0>{{ip}}</0>. Chcete ju použiť ako svoju statickú adresu?",
"confirm_static_ip": "AdGuard Home nakonfiguruje {{ip}} ako statickú IP adresu. Chcete pokračovať?"
}

View File

@ -122,22 +122,17 @@
"enabled_save_search_toast": "Omogočeno varno iskanje",
"enabled_table_header": "Omogočeno",
"name_table_header": "Ime",
"filter_url_table_header": "Filter URL",
"rules_count_table_header": "Število pravil",
"last_time_updated_table_header": "Zadnjič posodobljeno",
"actions_table_header": "Akcij",
"edit_table_action": "Uredi",
"delete_table_action": "Izbriši",
"filters_and_hosts": "Filtri in seznami zaviranja gostiteljev",
"filters_and_hosts_hint": "AdGuard Home razume osnovna pravila zaviranja oglasov in sintakso datotek gostiteljev.",
"no_filters_added": "Ni dodanih filtrov",
"add_filter_btn": "Dodaj filter",
"cancel_btn": "Prekliči",
"enter_name_hint": "Vnesite ime",
"enter_url_hint": "Vnesite URL",
"check_updates_btn": "Preveri posodobitve",
"new_filter_btn": "Nova naročnina filtra",
"enter_valid_filter_url": "Vnesite veljaven URL za naročnino filtra ali datoteko gostiteljev.",
"check_updates_btn": "Preveri obstoj posodobitev",
"form_error_url_format": "Neveljaven format Url",
"custom_filter_rules": "Pravila filtriranja po meri",
"custom_filter_rules_hint": "V vrstico vnesite eno pravilo. Uporabite lahko pravila zaviranja oglasov ali sintakso gostiteljskih datotek.",
"examples_title": "Primeri",
@ -147,13 +142,12 @@
"example_comment": "! Tukaj je komentar",
"example_comment_meaning": "samo komentar",
"example_comment_hash": "# Tudi komentar",
"example_regex_meaning": "onemogoči dostop do domen, ki se ujemajo z <0>določenim regularnemim izrazom</0>",
"example_regex_meaning": "onemogoča dostop do domen, ki se ujemajo z določenim regularnim izrazom",
"example_upstream_regular": "redni DNS (nad UDP)",
"example_upstream_dot": "šifriran <0>DNS-prek-TLS</0>",
"example_upstream_doh": "šifriran <0>DNS-prek-HTTPS</0>",
"example_upstream_sdns": "lahko uporabite <0>DNS Žige</0> za reševalce <1>DNSCrypt</1> ali <2>DNS-prek-HTTPS</2>",
"example_upstream_tcp": "redni DNS (nad TCP)",
"all_filters_up_to_date_toast": "Vsi filtri so že posodobljeni",
"updated_upstream_dns_toast": "Posodobljeni Zagonske strežnike DNS",
"dns_test_ok_toast": "Navedeni strežniki DNS delujejo pravilno",
"dns_test_not_ok_toast": "Ni mogoče uporabiti: strežnika \"{{key}}\". Preverite, ali ste ga pravilno napisali",
@ -173,7 +167,6 @@
"next_btn": "Naslednja",
"loading_table_status": "Nalaganje...",
"page_table_footer_text": "Stran",
"of_table_footer_text": "od",
"rows_table_footer_text": "vrstic",
"updated_custom_filtering_toast": "Posodobljena pravila filtriranja po meri",
"rule_removed_from_custom_filtering_toast": "Pravilo je odstranjeno iz pravil filtriranja po meri",
@ -191,6 +184,7 @@
"query_log_retention_confirm": "Ali ste prepričani, da želite spremeniti zadrževanje dnevnika poizvedb? Če zmanjšate vrednost intervala, bodo nekateri podatki izgubljeni",
"dns_config": "Konfiguracija strežnika DNS",
"blocking_mode": "Način zaviranja",
"default": "Privzeto",
"nxdomain": "NXDOMAIN",
"null_ip": "Prazen IP",
"custom_ip": "IP po meri",
@ -203,13 +197,15 @@
"rate_limit_desc": "Število zahtev na sekundo, ki jih lahko pošlje posamezni odjemalec (0: neomejeno)",
"blocking_ipv4_desc": "IP naslov, ki mora biti vrnjen za onemogočeno zahtevo A",
"blocking_ipv6_desc": "IP naslov, ki mora biti vrnjen za onemogočeno zahtevo AAAA",
"blocking_mode_desc": "<0>NXDOMAIN Odziva se s kodo NXDOMAIN;</0> <0>Prazen IP Odziva se z ničelnim naslovom IP (0,0.0,0 za A; :: za AAAA);</0> <0>IP po meri - Odziva se z ročno nastavljenim IP naslovom.</0>",
"blocking_mode_default": "Privzeto: odziv z NXDOMAIN, kadar je onemogočen s slogom pravila zaviranja oglasov; odziv z navedenim naslovom IP v pravilu, kadar je onemogočen s pravilom /etc/gostitelji",
"blocking_mode_nxdomain": "NXDOMAIN: Odziv s kodo NXDOMAIN",
"blocking_mode_null_ip": "Prazen IP: Odziv z ničelnim naslovom IP (0.0.0.0 za A; :: za AAAA)",
"blocking_mode_custom_ip": "IP po meri: Odziv z ročno nastavljenim naslovom IP",
"upstream_dns_client_desc": "Če pustite to polje prazno, bo AdGuard Home uporabil strežnike, konfigurirane v <0>nastavitvah DNS</0>.",
"source_label": "Vir",
"found_in_known_domain_db": "Najdeno v zbirki podatkov znanih domen.",
"category_label": "Kategorija",
"rule_label": "Pravilo",
"filter_label": "Filter",
"unknown_filter": "Neznan filter {{filterId}}",
"install_welcome_title": "Dobrodošli v AdGuard Home!",
"install_welcome_desc": "AdGuard Home je omrežni strežnik DNS, ki zavira oglase in sledilce v celotnem omrežju. Njegov namen je omogočanje nadzora nad celotnim omrežjem in vsemi vašimi napravami in ne zahteva uporabo odjemalskega programa.",
@ -321,7 +317,7 @@
"client_edit": "Uredi odjemalca",
"client_identifier": "Identifikator",
"ip_address": "IP naslov",
"client_identifier_desc": "Odjemalce je mogoče identificirati po naslovu IP, CIDR, MAC. Upoštevajte, da je uporaba MAC kot identifikatorja mogoča le, če je AdGuard Home tudi <0>DHCP strežnik</0>",
"client_identifier_desc": "Odjemalce je mogoče identificirati po naslovu IP, CIDR, MAC naslovu. Upoštevajte, da je uporaba MAC kot identifikatorja mogoča le, če je AdGuard Home tudi <0>strežnik DHCP</0>",
"form_enter_ip": "Vnesite IP",
"form_enter_mac": "Vnesite MAC",
"form_enter_id": "Vnesi identifikatorja",
@ -333,7 +329,6 @@
"client_updated": "Odjemalec \"{{key}}\" je bil uspešno posodobljen",
"clients_not_found": "Odjemalcev ni bilo mogoče najti",
"client_confirm_delete": "Ali ste prepričani, da želite izbrisati odjemalca \"{{key}}\"?",
"filter_confirm_delete": "Ali ste prepričani, da želite izbrisati filter?",
"auto_clients_title": "Odjemalci (čas izvajanja)",
"auto_clients_desc": "Podatki o odjemalcih, ki uporabljajo AdGuard Home, vendar niso shranjeni v konfiguraciji",
"access_title": "Nastavitve dostopa",
@ -372,6 +367,7 @@
"rewrite_desc": "Omogoča enostavno konfiguriranje odgovora DNS po meri za določeno ime domene.",
"rewrite_applied": "Uporabljeno Pravilo za prepisovanje",
"dns_rewrites": "Prepisovanja NDS",
"form_domain": "Vnesite domeno ali nadomestni znak",
"form_answer": "Vnesite IP naslov ali ime domene",
"form_error_domain_format": "Neveljavna oblika domene",
"form_error_answer_format": "Neveljavna oblika odgovora",
@ -398,7 +394,6 @@
"interval_days_plural": "{{count}} dni",
"domain": "Domena",
"answer": "Odgovor",
"filter_added_successfully": "Filter je bil uspešno dodan",
"statistics_configuration": "Konfiguracija statistike",
"statistics_retention": "Statistika zadrževanja",
"statistics_retention_desc": "Če zmanjšate vrednost intervala, bodo nekateri podatki izgubljeni",
@ -430,5 +425,33 @@
"try_again": "Poskusi ponovno",
"domain_desc": "Vnesite ime domene ali nadomestni znak, ki ga želite prepisati.",
"example_rewrite_domain": "prepiše odgovore samo za to ime domene.",
"example_rewrite_wildcard": "prepiše odgovore za vse poddomene <0>example.org</0>."
"example_rewrite_wildcard": "prepiše odgovore za vse poddomene <0>example.org</0>.",
"disable_ipv6": "Onemogoči IPv6",
"disable_ipv6_desc": "Če je ta funkcija omogočena, bodo vse poizvedbe DNS za naslove IPv6 (vrste AAAA) izpadle.",
"tags_title": "Oznake",
"tags_desc": "Izberete lahko oznake, ki ustrezajo odjemalcu. Oznake lahko vključite v pravila filtriranja in vam omogočajo, da jih natančneje uporabite. <0>Več o tem</0>",
"form_select_tags": "Izberite odjemalske oznake",
"check_title": "Preveri filtriranje",
"check_desc": "Preverite, ali je ime gostitelja filtrirano",
"check": "Preveri",
"form_enter_host": "Vnesite ime gostitelja",
"filtered_custom_rules": "Filtrirano s pravili filtriranja po meri",
"host_whitelisted": "Gostitelj je na seznamu dovoljenih",
"check_ip": "IP naslovi: {{ip}}",
"check_cname": "CNAME: {{cname}}",
"check_reason": "Razlog: {{reason}}",
"check_rule": "Pravilo: {{rule}}",
"check_service": "Ime storitve: {{service}}",
"check_not_found": "Ni najdeno na vašem seznamu filtrov",
"client_confirm_block": "Ali ste prepričani, da želite onemogočiti odjemalca \"{{ip}}\"?",
"client_confirm_unblock": "Ali ste prepričani, da želite omogočiti odjemalca \"{{ip}}\"?",
"client_blocked": "Odjemalec \"{{ip}}\" je uspešno onemogočen",
"client_unblocked": "Odjemalec \"{{ip}}\" je uspešno omogočen",
"static_ip": "Statičen IP naslov",
"static_ip_desc": "AdGuard Home je strežnik, zato za pravilno delovanje potrebuje statičen IP naslov. V nasprotnem primeru lahko vaš usmerjevalnik tej napravi v nekem trenutku dodeli drug IP naslov.",
"set_static_ip": "Nastavi statičen IP naslov",
"install_static_ok": "Dobra novica! Statičen IP naslov je že konfiguriran",
"install_static_error": "AdGuard Home tega omrežnega vmesnika ne more samodejno konfigurirati. Poiščite navodila, kako to storiti ročno.",
"install_static_configure": "Zaznali smo, da je uporabljen dinamičen IP naslov — <0>{{ip}}</0>. Ali ga želite uporabiti kot svoj statičen naslov?",
"confirm_static_ip": "AdGuard Home bo konfiguriral {{ip}}, da bo postal vas statičen IP naslov. Ali želite nadaljevati?"
}

View File

@ -122,22 +122,17 @@
"enabled_save_search_toast": "Uključeno sigurno pretraživanje",
"enabled_table_header": "Uključeno",
"name_table_header": "Ime",
"filter_url_table_header": "URL do filtera",
"rules_count_table_header": "Broj pravila",
"last_time_updated_table_header": "Poslednji put ažurirano",
"actions_table_header": "Radnje",
"edit_table_action": "Izmeni",
"delete_table_action": "Izbriši",
"filters_and_hosts": "Blok lista filtera i hostova",
"filters_and_hosts_hint": "AdGuard Home razume osnovna pravila blokiranja reklama i sintaksu hosts datoteke.",
"no_filters_added": "Filteri nisu dodati",
"add_filter_btn": "Dodaj filter",
"cancel_btn": "Otkaži",
"enter_name_hint": "Unesite ime",
"enter_url_hint": "Unesite URL",
"check_updates_btn": "Proveri ažuriranja",
"new_filter_btn": "Nova pretplata na filter",
"enter_valid_filter_url": "Unesite važeći URL do pretplate na filter ili važeću hosts datoteku.",
"form_error_url_format": "Nevažeći format Url-a",
"custom_filter_rules": "Prilagođena pravila filtriranja",
"custom_filter_rules_hint": "Unesite jedno pravilo po redu. Možete koristiti pravila blokatora reklama ili sintaksu hosts datoteke.",
"examples_title": "Primeri",
@ -153,7 +148,6 @@
"example_upstream_doh": "šifrovano <0>DNS-over-HTTPS</0>",
"example_upstream_sdns": "možete koristiti <0>DNS brojeve</0> za <1>DNSCrypt</1> ili <2>DNS-over-HTTPS</2>",
"example_upstream_tcp": "uobičajeni DNS (preko TCP)",
"all_filters_up_to_date_toast": "Svi filteri su već ažurirani",
"updated_upstream_dns_toast": "Ažurirani upstream DNS serveri",
"dns_test_ok_toast": "Dati DNS serveri rade ispravno",
"dns_test_not_ok_toast": "Server \"{{key}}\": se ne može koristiti. Proverite da li ste ga ispravno uneli",
@ -173,7 +167,6 @@
"next_btn": "Sledeće",
"loading_table_status": "Učitavanje...",
"page_table_footer_text": "Stranica",
"of_table_footer_text": "od",
"rows_table_footer_text": "redovi",
"updated_custom_filtering_toast": "Ažurirana prilagođena pravila filtriranja",
"rule_removed_from_custom_filtering_toast": "Pravilo uklonjeno iz prilagođenih pravila filtriranja",
@ -191,6 +184,7 @@
"query_log_retention_confirm": "Jeste li sigurni da želite da promenite zadržavanje dnevnika unosa? Ako smanjite vrednost intervala, neki podaci će biti izgubljeni",
"dns_config": "Konfiguracija DNS servera",
"blocking_mode": "Način blokiranja",
"default": "Podrazumevano",
"nxdomain": "NXDOMAIN",
"null_ip": "Null IP",
"custom_ip": "Prilagođeni IP",
@ -203,13 +197,15 @@
"rate_limit_desc": "Broj zahteva po sekundi koje pojedinačni klijent dozvoljava (0: neograničeno)",
"blocking_ipv4_desc": "IP adresa koja će biti vraćena za blokirane zahteve",
"blocking_ipv6_desc": "IP adresa koja će biti vraćena za blokirane AAAA zahteve",
"blocking_mode_desc": "<0>NXDOMAIN odgovara sa NXDOMAIN code;</0> <0>Null IP odgovara sa nulom IP adresom (0.0.0.0 za A; :: za AAAA);</0> <0>Prilagođeni IP - odgovara sa ručno podešenom IP adresom",
"blocking_mode_default": "Podrazumevano: Odgovara sa NXDOMAIN kada je blokirano od Adblock-style pravila; odgovara sa IP adresom koja je određena u pravilu kada je blokiran od /etc/hosts-style pravila",
"blocking_mode_nxdomain": "NXDOMAIN: Odgovara sa NXDOMAIN kodom",
"blocking_mode_null_ip": "Null IP: Odgovara sa zero IP adresom (0.0.0.0 za A; :: za AAAA)",
"blocking_mode_custom_ip": "Prilagođeni IP: Odgovara sa ručno podešenom IP adresom",
"upstream_dns_client_desc": "AKo ovo polje ostavite prazno, AdGuard Home će koristiti servere konfigurisane u <0>DNS postavkama</0>.",
"source_label": "Izvor",
"found_in_known_domain_db": "Pronađeno u poznatim bazama podataka domena.",
"category_label": "Kategorija",
"rule_label": "Pravilo",
"filter_label": "Filter",
"unknown_filter": "Nepoznat filter {{filterId}}",
"install_welcome_title": "Dobrodošli u AdGuard home!",
"install_welcome_desc": "AdGuard Home je mrežni DNS server, blokator reklama i praćenja. Dopušta vam da kontrolišete svoju čitavu mrežu i sve vaše uređaje i ne zahteva korišćenje nikakvog klijentskog programa.",
@ -333,7 +329,6 @@
"client_updated": "Klijent \"{{key}}\" uspešno ažuriran",
"clients_not_found": "Nema pronađenih klijenata",
"client_confirm_delete": "Jeste li sigurni da želite da izbrišete klijenta \"{{key}}\"?",
"filter_confirm_delete": "Jeste li sigurni da želite da izbrišete filter?",
"auto_clients_title": "Klijenti (runtime)",
"auto_clients_desc": "Podaci o klijentima koji koriste AdGuard Home, ali nisu sačuvani u konfiguraciji",
"access_title": "Postavke pristupa",
@ -399,7 +394,6 @@
"interval_days_plural": "{{count}} dana",
"domain": "Domen",
"answer": "Odgovor",
"filter_added_successfully": "Filter je uspešno dodat",
"statistics_configuration": "Konfiguracija statistike",
"statistics_retention": "Zadržavanje statistike",
"statistics_retention_desc": "Ako smanjite vrednost intervala, neki podaci će biti izgubljeni",
@ -431,5 +425,33 @@
"try_again": "Pokušaj ponovo",
"domain_desc": "Unesite domen ili džoker koji želite da prepišete.",
"example_rewrite_domain": "prepiši odgovore samo za ovaj domen.",
"example_rewrite_wildcard": "prepiši odgovore za sve poddomene na <0>example.org</0>."
"example_rewrite_wildcard": "prepiši odgovore za sve poddomene na <0>example.org</0>.",
"disable_ipv6": "Isključi IPv6",
"disable_ipv6_desc": "Ako je ovo uključeno, svi DNS unosi za IPv6 adrese (type AAAA) će biti odbačeni.",
"tags_title": "Oznake",
"tags_desc": "Možete izabrati oznake koje odgovaraju klijentu. Oznake mogu biti uključene u pravila filtriranja i dozvoljavaju vam da ih preciznije primenite. <0>Saznajte više</0>",
"form_select_tags": "Izaberite oznake klijenta",
"check_title": "Proverite filtriranje",
"check_desc": "Proverite da li je host filtriran",
"check": "Proveri",
"form_enter_host": "Unesite host",
"filtered_custom_rules": "Filtrirano od strane prilagođenog pravila",
"host_whitelisted": "Host je na beloj listi",
"check_ip": "IP adrese: {{ip}}",
"check_cname": "CNAME: {{cname}}",
"check_reason": "Razlog: {{reason}}",
"check_rule": "Pravilo: {{rule}}",
"check_service": "Ime usluge: {{service}}",
"check_not_found": "Nije pronađeno na vašoj listi filtera",
"client_confirm_block": "Jeste li sigurni da želite da blokirate klijent \"{{ip}}\"?",
"client_confirm_unblock": "Jeste li sigurni da želite da odblokirate klijent \"{{ip}}\"?",
"client_blocked": "Klijent \"{{ip}}\" uspešno blokiran",
"client_unblocked": "Klijent \"{{ip}}\" uspešno odblokiran",
"static_ip": "Statička IP adresa",
"static_ip_desc": "AdGuard Home je server pa mu je zbog toga potrebna statička IP aadresa kako bi ispravno radio. Ako je nema, u nekim slučajevima, vaš ruter može dodeliti drugu IP adresu ovom uređaju.",
"set_static_ip": "Postavite statičku IP adresu",
"install_static_ok": "Dobre vesti! Statička IP adresa je već konfigurisana",
"install_static_error": "AdGuard Home se ne može automatski konfigurisati za ovo mrežno okruženje. Pogledajte uputstvo kako da to ručno uradite.",
"install_static_configure": "Otkrili smo da se koristi dinamička IP adresa — <0>{{ip}}</0>. Želite li da je koristite kao vašu statičku adresu?",
"confirm_static_ip": "AdGuard Home će konfigurisati {{ip}} da bude vaša statička IP adresa. Želite li da nastavite?"
}

View File

@ -116,22 +116,15 @@
"enabled_save_search_toast": "Säker webbsökning inkopplat",
"enabled_table_header": "Inkopplat",
"name_table_header": "Namn",
"filter_url_table_header": "Filtrerar URL",
"rules_count_table_header": "Regelantal",
"last_time_updated_table_header": "Uppdaterades senast",
"actions_table_header": "Åtgärder",
"edit_table_action": "Redigera",
"delete_table_action": "Ta bort",
"filters_and_hosts": "Filtrerings- och värdlistor för blockering",
"filters_and_hosts_hint": "AdGuard tillämpar grundläggande annonsblockeringsregler och värdfiltersyntaxer",
"no_filters_added": "Inga filter tillagda",
"add_filter_btn": "Lägg till filter",
"cancel_btn": "Avbryt",
"enter_name_hint": "Skriv in namn",
"enter_url_hint": "Skriv in URL",
"check_updates_btn": "Sök efter uppdateringar",
"new_filter_btn": "Nytt filterabonemang",
"enter_valid_filter_url": "Skriv in en giltigt URL till ett filterabonnemang eller värdfil.",
"custom_filter_rules": "Egna filterregler",
"custom_filter_rules_hint": "Skriv en regel per rad. Du kan använda antingen annonsblockeringsregler eller värdfilssyntax.",
"examples_title": "Exempel",
@ -147,7 +140,6 @@
"example_upstream_doh": "krypterat <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a>",
"example_upstream_sdns": "Du kan använda <a href='https://dnscrypt.info/stamps/' target='_blank'>DNS-stamps</a> för <a href='https://dnscrypt.info/' target='_blank'>DNSCrypt</a> eller <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-över-HTTPS</a>\n-resolvers",
"example_upstream_tcp": "vanlig DNS (över UDP)",
"all_filters_up_to_date_toast": "Alla filter är redan aktuella",
"updated_upstream_dns_toast": "Uppdaterade uppströms-dns-servrar",
"dns_test_ok_toast": "Angivna DNS servrar fungerar korrekt",
"dns_test_not_ok_toast": "Server \"{{key}}\": kunde inte användas. Var snäll och kolla att du skrivit in rätt",
@ -167,7 +159,6 @@
"next_btn": "Nästa",
"loading_table_status": "Läser in...",
"page_table_footer_text": "Sida",
"of_table_footer_text": "av",
"rows_table_footer_text": "rader",
"updated_custom_filtering_toast": "Uppdaterade de egna filterreglerna",
"rule_removed_from_custom_filtering_toast": "Regel borttagen från de egna filterreglerna",
@ -187,7 +178,6 @@
"found_in_known_domain_db": "Hittad i domändatabas.",
"category_label": "Kategori",
"rule_label": "Regel",
"filter_label": "Filter",
"unknown_filter": "Okänt filter {{filterId}}",
"install_welcome_title": "Välkommen till AdGuard Home!",
"install_welcome_desc": "AdGuard Home är en DNS-server för nätverkstäckande annons- och spårningsblockering. Dess syfte är att de dig kontroll över hela nätverket och alla dina enheter, utan behov av att använda klientbaserade program.",
@ -297,7 +287,6 @@
"client_edit": "Redigera klient",
"client_identifier": "Identifikator",
"ip_address": "IP-adress",
"client_identifier_desc": "Klienter kan identifieras genom IP-adresser eller MAC-adresser. Notera att användning av MAC som identifierare bara är möjligt om AdGuard Home också är en <0>DHCP-server</0>",
"form_enter_ip": "Skriv in IP",
"form_enter_mac": "Skriv in MAC",
"form_client_name": "Skriv in klientnamn",
@ -307,7 +296,6 @@
"client_updated": "Klient \"{{key}}\" har uppdaterats",
"clients_not_found": "Inga klienter hittade",
"client_confirm_delete": "Är du säker på att du vill ta bort klient \"{{key}}\"?",
"filter_confirm_delete": "Är du säker på att du ska ta bort filtret?",
"auto_clients_title": "Klienter (körtid)",
"auto_clients_desc": "Data från klienter som använder AdGuard Home, men inte är sparade i konfigurationen",
"access_title": "Åtkomstinställningar",

View File

@ -121,22 +121,15 @@
"enabled_save_search_toast": "Güvenli arama çalışıyor",
"enabled_table_header": "Etkin",
"name_table_header": "İsim",
"filter_url_table_header": "Filtre URL'si",
"rules_count_table_header": "Kural sayısı",
"last_time_updated_table_header": "Son güncelleme",
"actions_table_header": "Eylemler",
"edit_table_action": "Düzenle",
"delete_table_action": "Sil",
"filters_and_hosts": "Filtreler ve kullanıcının engelleme listeleri",
"filters_and_hosts_hint": "AdGuard Home temel reklam engelleme kurallarını ve hosts dosyalarının söz dizim kurallarını anlamaktadır.",
"no_filters_added": "Eklenmiş filtre yok",
"add_filter_btn": "Filtre ekle",
"cancel_btn": "İptal",
"enter_name_hint": "İsim girin",
"enter_url_hint": "URL'yi girin",
"check_updates_btn": "Güncellemeleri denetle",
"new_filter_btn": "Yeni Filtre Aboneliği",
"enter_valid_filter_url": "Filtre aboneliği veya bir hosts dosyası için geçerli bir URL girin.",
"custom_filter_rules": "İsteğe bağlı filtreleme kuralları",
"custom_filter_rules_hint": "Her satıra bir kural girin. Reklama engelleme kuralı veya hosts dosyası söz dizimi kullanabilirsiniz.",
"examples_title": "Örnekler",
@ -152,7 +145,6 @@
"example_upstream_doh": "<0>DNS-over-HTTPS</0> şifrelemesi",
"example_upstream_sdns": "<1>DNSCrypt</1> veya <2>DNS-over-HTTPS</2> çözücüleri için <0>DNS Damgaları</0> kullanabilirsiniz.",
"example_upstream_tcp": "normal DNS (TCP üzerinden)",
"all_filters_up_to_date_toast": "Tüm filtreler güncel durumda",
"updated_upstream_dns_toast": "Üst DNS sunucuları güncellendi",
"dns_test_ok_toast": "Belirtilmiş DNS sunucuları düzgün çalışıyor",
"dns_test_not_ok_toast": "Sunucu \"{{key}}\": kullanılamıyor, lütfen doğru yazdığınızdan emin olun",
@ -172,7 +164,6 @@
"next_btn": "Sonraki",
"loading_table_status": "Yükleniyor...",
"page_table_footer_text": "Sayfa",
"of_table_footer_text": "/",
"rows_table_footer_text": "satır",
"updated_custom_filtering_toast": "İsteğe bağlı filtreleme kuralları güncellendi",
"rule_removed_from_custom_filtering_toast": "Kural isteğe bağlı filtreleme kurallarından kaldırıldı",
@ -202,13 +193,11 @@
"rate_limit_desc": "Tek bir istemcinin saniye başına yapmasına izin verilen istek sayısı (0: sınırsız)",
"blocking_ipv4_desc": "Engellenen bir A isteği için geri döndürülecek IP adresi",
"blocking_ipv6_desc": "Engellenen bir AAAA isteği için geri döndürülecek IP adresi",
"blocking_mode_desc": "<0>NXDOMAIN NXDOMAIN ile yanıtla code;</0> <0> Boş IP Sıfır IP adresi ile cevap verin (A için 0.0.0.0; :: AAAA için); </0> <0> Özel IP - Elle ayarlanmış bir IP adresi ile cevap verin.</0>",
"upstream_dns_client_desc": "Bu alanı boş tutarsanız, AdGuard Home, <0>DNS ayarlarında</0> yapılandırılmış sunucuları kullanır.",
"source_label": "Kaynak",
"found_in_known_domain_db": "Bilinen alan adları veri tabanı içinde bulundu",
"category_label": "Kategori",
"rule_label": "Kural",
"filter_label": "Filtre",
"unknown_filter": "Bilinmeyen filtre {{filterId}}",
"install_welcome_title": "AdGuard Home'a hoşgeldiniz!",
"install_welcome_desc": "AdGuard Home, ağ genelinde reklam ve izleyicileri engelleyen bir DNS sunucusudur. Tüm ağınızı ve tüm cihazlarınızı kontrol etmenize yarayan bir araçtır, istemci tarafında bir program kullanmanıza gerek duymaz.",
@ -320,7 +309,6 @@
"client_edit": "İstemciyi düzenle",
"client_identifier": "Tanımlayıcı",
"ip_address": "IP adresi",
"client_identifier_desc": "İstemciler IP adresleri veya MAC adresleri ile tanımlanabilir. Lütfen not edin, MAC adresi ile tanımlamayı kullanmak için AdGuard Home'un <0>DHCP Sunucusu</0> olması gerekir.",
"form_enter_ip": "IP Girin",
"form_enter_mac": "MAC Girin",
"form_enter_id": "Tanımlayıcı girin",
@ -332,7 +320,6 @@
"client_updated": "\"{{key}}\" istemcisi başarıyla güncellendi",
"clients_not_found": "İstemci bulunamadı",
"client_confirm_delete": "\"{{key}}\" istemcisini silmek istediğinizden emin misiniz?",
"filter_confirm_delete": "Filtreyi silmek istediğinizden emin misiniz?",
"auto_clients_title": "İstemciler (çalışma zamanı)",
"auto_clients_desc": "AdGuard Home'u kullanan, ancak yapılandırmada saklanmayan istemcilerdeki veriler",
"access_title": "Erişim ayarları",
@ -398,7 +385,6 @@
"interval_days_plural": "{{count}} gün",
"domain": "Alan adı",
"answer": "Cevap",
"filter_added_successfully": "Filtre başarıyla eklendi",
"statistics_configuration": "İstatistik yapılandırması",
"statistics_retention": "İstatistikleri depolama",
"statistics_retention_desc": "Zaman değerini azaltırsanız bazı veriler kaybolacaktır",

View File

@ -116,22 +116,15 @@
"enabled_save_search_toast": "Đã bật tìm kiếm an toàn",
"enabled_table_header": "Kích hoạt",
"name_table_header": "Tên",
"filter_url_table_header": "URL bộ lọc",
"rules_count_table_header": "Số quy tắc",
"last_time_updated_table_header": "Cập nhật cuối",
"actions_table_header": "Thao tác",
"edit_table_action": "Chỉnh sửa",
"delete_table_action": "Xoá",
"filters_and_hosts": "Danh sách bộ lọc và hosts",
"filters_and_hosts_hint": "AdGuard home hiểu các quy tắc chặn quảng cáo đơn giản và cú pháp file hosts",
"no_filters_added": "Không có bộ lọc nào được thêm",
"add_filter_btn": "Thêm bộ lọc",
"cancel_btn": "Huỷ",
"enter_name_hint": "Nhập tên",
"enter_url_hint": "Nhập URL",
"check_updates_btn": "Kiểm tra cập nhật",
"new_filter_btn": "Đăng ký bộ lọc mới",
"enter_valid_filter_url": "Nhập URL hợp lệ của bộ lọc hoặc file hosts",
"custom_filter_rules": "Quy tắc lọc tuỳ chỉnh",
"custom_filter_rules_hint": "Nhập mỗi quy tắc 1 dòng. Có thể sử dụng quy tắc chặn quảng cáo hoặc cú pháp file host",
"examples_title": "Ví dụ",
@ -147,7 +140,6 @@
"example_upstream_doh": "được mã hoá <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a>",
"example_upstream_sdns": "bạn có thể sử dụng <a href='https://dnscrypt.info/stamps/' target='_blank'>DNS Stamps</a> for <a href='https://dnscrypt.info/' target='_blank'>DNSCrypt</a> hoặc<a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a> ",
"example_upstream_tcp": "DNS thông thường(dùng TCP)",
"all_filters_up_to_date_toast": "Tất cả bộ lọc đã được cập nhật",
"updated_upstream_dns_toast": "Đã cập nhật máy chủ DNS tìm kiếm",
"dns_test_ok_toast": "Máy chủ DNS có thể sử dụng",
"dns_test_not_ok_toast": "Máy chủ \"\"': không thể sử dụng, vui lòng kiểm tra lại",
@ -167,7 +159,6 @@
"next_btn": "Trang sau",
"loading_table_status": "Đang tải...",
"page_table_footer_text": "Trang",
"of_table_footer_text": "của",
"rows_table_footer_text": "hàng",
"updated_custom_filtering_toast": "Đã cập nhật quy tắc lọc tuỳ chỉnh",
"rule_removed_from_custom_filtering_toast": "Quy tắc đã được xoá khỏi quy tắc lọc tuỳ chỉnh",
@ -187,7 +178,6 @@
"found_in_known_domain_db": "Tìm thấy trong cơ sở dữ liệu tên miền",
"category_label": "Thể loại",
"rule_label": "Quy tắc",
"filter_label": "Bộ lọc",
"unknown_filter": "Bộ lọc không rõ {{filterId}}",
"install_welcome_title": "Chào mừng bạn đến với AdGuard Home!",
"install_welcome_desc": "AdGuard Home là một máy chủ DNS chặn quảng cáo và theo dõi trên toàn mạng. Mục đích của nó là cho phép bạn kiểm soát toàn bộ mạng và tất cả các thiết bị của mình và không yêu cầu sử dụng chương trình phía máy khách.",
@ -297,7 +287,6 @@
"client_edit": "Chỉnh Sửa Máy Khách",
"client_identifier": "Định danh",
"ip_address": "Địa chỉ IP",
"client_identifier_desc": "Các máy khách có thể được xác định bằng địa chỉ IP hoặc địa chỉ MAC. Xin lưu ý rằng chỉ có thể sử dụng MAC làm định danh nếu AdGuard Home cũng là <0>máy chủ DHCP</0>",
"form_enter_ip": "Nhập IP",
"form_enter_mac": "Nhập MAC",
"form_client_name": "Nhập tên máy khách",
@ -307,7 +296,6 @@
"client_updated": "Máy khách \"{{key}}\" đã cập nhật thành công",
"clients_not_found": "Không tìm thấy máy khách",
"client_confirm_delete": "Bạn có chắc chắn muốn xóa máy khách \"{{key}}\" không?",
"filter_confirm_delete": "Bạn có chắc chắn muốn xóa bộ lọc?",
"auto_clients_title": "Máy khách (thời gian chạy)",
"auto_clients_desc": "Dữ liệu trên các máy khách sử dụng AdGuard Home, nhưng không được lưu trong cấu hình",
"access_title": "Cài đặt truy cập",
@ -373,7 +361,6 @@
"interval_days_plural": "{{count}} ngày",
"domain": "Tên miền",
"answer": "Trả lời",
"filter_added_successfully": "Bộ lọc đã được thêm thành công",
"statistics_configuration": "Cấu hình thống kê",
"statistics_retention": "Duy trì thống kê",
"statistics_retention_desc": "Nếu bạn giảm giá trị khoảng, một số dữ liệu sẽ bị mất",

View File

@ -122,22 +122,15 @@
"enabled_save_search_toast": "安全搜索已启用",
"enabled_table_header": "已启用",
"name_table_header": "名称",
"filter_url_table_header": "过滤器地址",
"rules_count_table_header": "规则数",
"last_time_updated_table_header": "上次更新时间",
"actions_table_header": "活跃状态",
"edit_table_action": "编辑",
"delete_table_action": "删除",
"filters_and_hosts": "过滤器和 Hosts 拦截清单",
"filters_and_hosts_hint": "AdGuard Home 可以解析基础的 adblock 规则和 Hosts 语法。",
"no_filters_added": "未添加任何过滤器",
"add_filter_btn": "添加过滤器",
"cancel_btn": "取消",
"enter_name_hint": "输入名称",
"enter_url_hint": "输入 URL",
"check_updates_btn": "检查更新",
"new_filter_btn": "订阅新的过滤器",
"enter_valid_filter_url": "输入一个过滤器订阅或 Hosts 文件的有效 URL",
"custom_filter_rules": "自定义过滤器规则",
"custom_filter_rules_hint": "请确保每行只输入一条规则。你可以输入符合 adblock 语法或 Hosts 语法的规则。",
"examples_title": "范例",
@ -153,7 +146,6 @@
"example_upstream_doh": "加密 <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a>",
"example_upstream_sdns": "你可以使用 <a href='https://dnscrypt.info/' target='_blank'>DNSCrypt</a> 的 <a href='https://dnscrypt.info/stamps/' target='_blank'>DNS Stamps</a> 或者 <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a> 解析器",
"example_upstream_tcp": "常规 DNS基于 TCP ",
"all_filters_up_to_date_toast": "所有过滤器已更新至最新",
"updated_upstream_dns_toast": "上游 DNS 已更新",
"dns_test_ok_toast": "指定的 DNS 服务器现已正常运行",
"dns_test_not_ok_toast": "服务器 \"{{key}}\":无法使用,请检查你输入的是否正确",
@ -173,7 +165,6 @@
"next_btn": "下一页",
"loading_table_status": "加载中……",
"page_table_footer_text": "页",
"of_table_footer_text": "在",
"rows_table_footer_text": "行",
"updated_custom_filtering_toast": "自定义过滤规则已更新",
"rule_removed_from_custom_filtering_toast": "规则已从自定义过滤规则列表中移除",
@ -203,13 +194,11 @@
"rate_limit_desc": "每个客户端每秒钟查询次数的限制 (0不限制)",
"blocking_ipv4_desc": "拦截 A 记录请求返回的 IP 地址",
"blocking_ipv6_desc": "拦截 AAAA 记录请求返回的 IP 地址",
"blocking_mode_desc": "<0>无效域名 返回 NXDOMAIN 响应;</0> <0>无效 IP 返回零 IP 地址A记录0.0.0.0AAAA记录::</0> <0>自定义 IP 返回手动设置的 IP 地址。</0>",
"upstream_dns_client_desc": "如果将此字段留空AdGuard Home 将使用在<0>DNS设置</0>中配置的服务器。",
"source_label": "源",
"found_in_known_domain_db": "成功在已知域名数据库中查询到",
"category_label": "类别",
"rule_label": "规则",
"filter_label": "过滤器",
"unknown_filter": "未知过滤器 {{filterId}}",
"install_welcome_title": "欢迎使用 AdGuard Home",
"install_welcome_desc": "AdGuard Home 是一个可在特定网络范围内拦截所有广告和跟踪器的 DNS 服务器。它的目的是让您控制整个网络和您的所有设备,且不需要使用任何客户端程序。",
@ -321,7 +310,6 @@
"client_edit": "编辑客户端",
"client_identifier": "标识符",
"ip_address": "IP 地址",
"client_identifier_desc": "客户端可通过 IP 地址或 MAC 地址识别。请注意,如 AdGuard Home 也是 <0>DHCP 服务器</0>,则仅能将 MAC 用作标识符",
"form_enter_ip": "输入 IP",
"form_enter_mac": "输入 MAC",
"form_enter_id": "输入标识符",
@ -333,7 +321,6 @@
"client_updated": "客户端 \"{{key}}\" 更新成功",
"clients_not_found": "未找到客户端",
"client_confirm_delete": "您确定要删除客户端 \"{{key}}\"",
"filter_confirm_delete": "您确定是要删除过滤器?",
"auto_clients_title": "客户端(运行时间)",
"auto_clients_desc": "使用 Adguard Home 但未存储在配置中的客户端上的数据",
"access_title": "访问设置",
@ -399,7 +386,6 @@
"interval_days_plural": "{{count}} 天",
"domain": "域",
"answer": "应答",
"filter_added_successfully": "已成功添加过滤器",
"statistics_configuration": "统计配置",
"statistics_retention": "统计保留",
"statistics_retention_desc": "如果您减少该间隔的数值, 某些数据可能会丢失",

View File

@ -105,6 +105,11 @@
"no_servers_specified": "無已明確指定的伺服器",
"general_settings": "一般的設定",
"dns_settings": "DNS 設定",
"dns_blocklists": "DNS 封鎖清單",
"dns_allowlists": "DNS 允許清單",
"dns_blocklists_desc": "AdGuard Home 將封鎖與封鎖清單相符的網域。",
"dns_allowlists_desc": "來自 DNS 允許清單的網域將被允許,即使它們在任何的封鎖清單中。",
"custom_filtering_rules": "自訂的過濾規則",
"encryption_settings": "加密設定",
"dhcp_settings": "動態主機設定協定DHCP設定",
"upstream_dns": "上游的 DNS 伺服器",
@ -122,22 +127,22 @@
"enabled_save_search_toast": "已啟用安全搜尋",
"enabled_table_header": "已啟用",
"name_table_header": "名稱",
"filter_url_table_header": "過濾器網址",
"list_url_table_header": "列出網址",
"rules_count_table_header": "規則總數",
"last_time_updated_table_header": "最近的更新時間",
"actions_table_header": "動作",
"edit_table_action": "編輯",
"delete_table_action": "刪除",
"filters_and_hosts": "過濾器和主機封鎖清單",
"filters_and_hosts_hint": "AdGuard Home 懂得基本的廣告封鎖規則和主機檔案語法。",
"no_filters_added": "無已加入的過濾器",
"add_filter_btn": "增加過濾器",
"cancel_btn": "取消",
"enter_name_hint": "輸入名稱",
"enter_url_hint": "輸入網址",
"check_updates_btn": "檢查更新",
"new_filter_btn": "新的過濾器訂閱",
"enter_valid_filter_url": "輸入關於過濾器訂閱或主機檔案之有效的網址。",
"new_blocklist": "新的封鎖清單",
"new_allowlist": "新的允許清單",
"edit_blocklist": "編輯封鎖清單",
"edit_allowlist": "編輯允許清單",
"form_error_url_format": "無效的網址格式",
"custom_filter_rules": "自訂的過濾規則",
"custom_filter_rules_hint": "於一行上輸入一個規則。您可使用廣告封鎖規則或主機檔案語法。",
"examples_title": "範例",
@ -153,7 +158,7 @@
"example_upstream_doh": "加密的 <0>DNS-over-HTTPS</0>",
"example_upstream_sdns": "您可使用關於 <1>DNSCrypt</1> 或 <2>DNS-over-HTTPS</2> 解析器之 <0>DNS 戳記</0>",
"example_upstream_tcp": "一般的 DNS透過 TCP",
"all_filters_up_to_date_toast": "所有的過濾器已是最新的",
"all_lists_up_to_date_toast": "所有的清單已是最新的",
"updated_upstream_dns_toast": "已更新上游的 DNS 伺服器",
"dns_test_ok_toast": "已明確指定的 DNS 伺服器正在正確地運作",
"dns_test_not_ok_toast": "伺服器 \"{{key}}\":無法被使用,請檢查您已正確地填寫它",
@ -164,7 +169,7 @@
"type_table_header": "類型",
"response_table_header": "回應",
"client_table_header": "用戶端",
"empty_response_status": "空的",
"empty_response_status": "空的",
"show_all_filter_type": "顯示全部",
"show_filtered_type": "顯示已過濾的",
"no_logs_found": "無已發現之記錄",
@ -173,7 +178,6 @@
"next_btn": "下一頁",
"loading_table_status": "正在載入…",
"page_table_footer_text": "頁面",
"of_table_footer_text": "之",
"rows_table_footer_text": "列",
"updated_custom_filtering_toast": "已更新自訂的過濾規則",
"rule_removed_from_custom_filtering_toast": "規則從自訂的過濾規則中被移除",
@ -191,6 +195,7 @@
"query_log_retention_confirm": "您確定您想要更改查詢記錄保留嗎?如果您減少該間隔值,某些資料將被丟失",
"dns_config": "DNS 伺服器配置",
"blocking_mode": "封鎖模式",
"default": "預設",
"nxdomain": "不存在的網域NXDOMAIN",
"null_ip": "無效的 IP",
"custom_ip": "自訂的 IP",
@ -203,13 +208,15 @@
"rate_limit_desc": "單一的用戶端被允許傳送的每秒請求之數量0無限制的",
"blocking_ipv4_desc": "要被返回給已封鎖的 A 請求之 IP 位址",
"blocking_ipv6_desc": "要被返回給已封鎖的 AAAA 請求之 IP 位址",
"blocking_mode_desc": "<0>不存在的網域NXDOMAIN 以 NXDOMAIN 碼回覆;</0> <0>無效的 IP 以零值 IP 位址0.0.0.0 供 A:: 供 AAAA回覆</0> <0>自訂的 IP - 以手動地被設定的 IP 位址回覆。</0>",
"blocking_mode_default": "預設:當被廣告封鎖樣式的規則封鎖時,以 NXDOMAIN 回覆;當被 /etc/hosts 樣式的規則封鎖時,以在該規則中之已明確指定的 IP 位址回覆",
"blocking_mode_nxdomain": "不存在的網域NXDOMAIN以 NXDOMAIN 碼回覆",
"blocking_mode_null_ip": "無效的 IP以零值 IP 位址0.0.0.0 供 A:: 供 AAAA回覆",
"blocking_mode_custom_ip": "自訂的 IP以一組手動地被設定的 IP 位址回覆",
"upstream_dns_client_desc": "如果您將該欄位留空AdGuard Home 將使用在 <0>DNS 設定</0>中被配置的伺服器。",
"source_label": "來源",
"found_in_known_domain_db": "在已知的域名資料庫中被發現。",
"category_label": "類別",
"rule_label": "規則",
"filter_label": "過濾器",
"unknown_filter": "未知的過濾器 {{filterId}}",
"install_welcome_title": "歡迎至 AdGuard Home",
"install_welcome_desc": "AdGuard Home 是全網路範圍廣告和追蹤器封鎖的 DNS 伺服器。它的目的為讓您控制您的整個網路和所有您的裝置,且不需要使用用戶端程式。",
@ -308,7 +315,7 @@
"dns_providers": "這裡是一個從中選擇之<0>已知的 DNS 供應商之清單</0>。",
"update_now": "立即更新",
"update_failed": "自動更新已失敗。請<a href='https://github.com/AdguardTeam/AdGuardHome/wiki/Getting-Started#update'>遵循這些步驟</a>以手動地更新。",
"processing_update": "請等待AdGuard Home 正被更新",
"processing_update": "請稍候AdGuard Home 正被更新",
"clients_title": "用戶端",
"clients_desc": "配置被連線到 AdGuard Home 的裝置",
"settings_global": "全域的",
@ -321,7 +328,7 @@
"client_edit": "編輯用戶端",
"client_identifier": "識別碼",
"ip_address": "IP 位址",
"client_identifier_desc": "用戶端可被 IP 位址、無類別網域間路由CIDR或媒體存取控制MAC位址識別。請注意僅若 AdGuard Home 也是<0>動態主機設定協定DHCP伺服器</0>,使用 MAC 作為識別碼是可能的",
"client_identifier_desc": "用戶端可被 IP 位址、無類別網域間路由CIDR或媒體存取控制MAC位址識別。請注意只要 AdGuard Home 也是<0>動態主機設定協定DHCP伺服器</0>,使用 MAC 作為識別碼是可能的",
"form_enter_ip": "輸入 IP",
"form_enter_mac": "輸入媒體存取控制MAC",
"form_enter_id": "輸入識別碼",
@ -333,7 +340,7 @@
"client_updated": "用戶端 \"{{key}}\" 被成功地更新",
"clients_not_found": "無已發現之用戶端",
"client_confirm_delete": "您確定您想要刪除用戶端 \"{{key}}\" 嗎?",
"filter_confirm_delete": "您確定您想要刪除該過濾器嗎?",
"list_confirm_delete": "您確定您想要刪除該清單嗎?",
"auto_clients_title": "用戶端(執行時期)",
"auto_clients_desc": "使用 AdGuard Home 但未被儲存在配置中之關於用戶端的資料",
"access_title": "存取設定",
@ -399,7 +406,8 @@
"interval_days_plural": "{{count}} 日",
"domain": "網域",
"answer": "回應",
"filter_added_successfully": "該過濾器已被成功地加入",
"filter_added_successfully": "該清單已被成功地加入",
"filter_updated": "該清單已被成功地更新",
"statistics_configuration": "統計資料配置",
"statistics_retention": "統計資料保留",
"statistics_retention_desc": "如果您減少該間隔值,某些資料將被丟失",
@ -431,5 +439,37 @@
"try_again": "再次嘗試",
"domain_desc": "輸入您想要被改寫的域名或萬用字元wildcard。",
"example_rewrite_domain": "僅對於此域名改寫回應。",
"example_rewrite_wildcard": "對於所有的 <0>example.org</0> 子網域改寫回應。"
"example_rewrite_wildcard": "對於所有的 <0>example.org</0> 子網域改寫回應。",
"disable_ipv6": "禁用 IPv6",
"disable_ipv6_desc": "如果此功能被啟用,所有對於 IPv6 位址(類型 AAAA的 DNS 查詢將被丟棄。",
"autofix_warning_text": "如果您點擊\"修復\"AdGuard Home 將配置您的系統使用 AdGuard Home DNS 伺服器。",
"autofix_warning_result": "因此,預設下,來自您的系統之所有的 DNS 請求將被 AdGuard Home 處理。",
"tags_title": "標記",
"tags_desc": "您可選擇對應該用戶端的標記。標記可被包括在過濾規則中並允許您更準確地套用它們。<0>了解更多</0>",
"form_select_tags": "選擇用戶端標記",
"check_title": "檢查該過濾",
"check_desc": "檢查該主機名稱是否被過濾",
"check": "檢查",
"form_enter_host": "輸入主機名稱",
"filtered_custom_rules": "被自訂的過濾規則過濾",
"host_whitelisted": "該主機被列入白名單",
"check_ip": "IP 位址:{{ip}}",
"check_cname": "正規名稱CNAME{{cname}}",
"check_reason": "原因:{{reason}}",
"check_rule": "規則:{{rule}}",
"check_service": "服務名稱:{{service}}",
"check_not_found": "未在您的過濾器清單中被找到",
"client_confirm_block": "您確定您想要封鎖該用戶端 \"{{ip}}\" 嗎?",
"client_confirm_unblock": "您確定您想要解除封鎖該用戶端 \"{{ip}}\" 嗎?",
"client_blocked": "用戶端 \"{{ip}}\" 被成功地封鎖",
"client_unblocked": "用戶端 \"{{ip}}\" 被成功地解除封鎖",
"static_ip": "靜態 IP 位址",
"static_ip_desc": "AdGuard Home 是一台伺服器,因此它需要一組靜態 IP 位址以正確地運作。否則,在某些時候,您的路由器可能分配一組不同的 IP 位址給此裝置。",
"set_static_ip": "設定一組靜態 IP 位址",
"install_static_ok": "好消息!該靜態 IP 位址已被配置",
"install_static_error": "AdGuard Home 無法自動地配置它供此網路介面。請尋找有關如何手動地完成這個的用法說明。",
"install_static_configure": "我們已偵測到一組動態 IP 位址被使用 — <0>{{ip}}</0>。您想要使用它作為您的靜態位址嗎?",
"confirm_static_ip": "AdGuard Home 將配置 {{ip}} 為您的靜態 IP 位址。您想要繼續嗎?",
"list_updated": "{{count}} 清單被更新",
"list_updated_plural": "{{count}} 清單被更新"
}

View File

@ -1,5 +1,6 @@
import { createAction } from 'redux-actions';
import { showLoading, hideLoading } from 'react-redux-loading-bar';
import { t } from 'i18next';
import { normalizeFilteringStatus, normalizeRulesTextarea } from '../helpers/helpers';
import { addErrorToast, addSuccessToast } from './index';
@ -44,10 +45,10 @@ export const addFilterRequest = createAction('ADD_FILTER_REQUEST');
export const addFilterFailure = createAction('ADD_FILTER_FAILURE');
export const addFilterSuccess = createAction('ADD_FILTER_SUCCESS');
export const addFilter = (url, name) => async (dispatch) => {
export const addFilter = (url, name, whitelist = false) => async (dispatch) => {
dispatch(addFilterRequest());
try {
await apiClient.addFilter(url, name);
await apiClient.addFilter({ url, name, whitelist });
dispatch(addFilterSuccess(url));
dispatch(toggleFilteringModal());
dispatch(addSuccessToast('filter_added_successfully'));
@ -62,10 +63,10 @@ export const removeFilterRequest = createAction('REMOVE_FILTER_REQUEST');
export const removeFilterFailure = createAction('REMOVE_FILTER_FAILURE');
export const removeFilterSuccess = createAction('REMOVE_FILTER_SUCCESS');
export const removeFilter = url => async (dispatch) => {
export const removeFilter = (url, whitelist = false) => async (dispatch) => {
dispatch(removeFilterRequest());
try {
await apiClient.removeFilter(url);
await apiClient.removeFilter({ url, whitelist });
dispatch(removeFilterSuccess(url));
dispatch(getFilteringStatus());
} catch (error) {
@ -78,10 +79,10 @@ export const toggleFilterRequest = createAction('FILTER_TOGGLE_REQUEST');
export const toggleFilterFailure = createAction('FILTER_TOGGLE_FAILURE');
export const toggleFilterSuccess = createAction('FILTER_TOGGLE_SUCCESS');
export const toggleFilterStatus = (url, data) => async (dispatch) => {
export const toggleFilterStatus = (url, data, whitelist = false) => async (dispatch) => {
dispatch(toggleFilterRequest());
try {
await apiClient.setFilterUrl({ url, data });
await apiClient.setFilterUrl({ url, data, whitelist });
dispatch(toggleFilterSuccess(url));
dispatch(getFilteringStatus());
} catch (error) {
@ -94,10 +95,10 @@ export const editFilterRequest = createAction('EDIT_FILTER_REQUEST');
export const editFilterFailure = createAction('EDIT_FILTER_FAILURE');
export const editFilterSuccess = createAction('EDIT_FILTER_SUCCESS');
export const editFilter = (url, data) => async (dispatch) => {
export const editFilter = (url, data, whitelist = false) => async (dispatch) => {
dispatch(editFilterRequest());
try {
await apiClient.setFilterUrl({ url, data });
await apiClient.setFilterUrl({ url, data, whitelist });
dispatch(editFilterSuccess(url));
dispatch(toggleFilteringModal());
dispatch(addSuccessToast('filter_updated'));
@ -116,17 +117,14 @@ export const refreshFilters = () => async (dispatch) => {
dispatch(refreshFiltersRequest());
dispatch(showLoading());
try {
const refreshText = await apiClient.refreshFilters();
const data = await apiClient.refreshFilters();
const { updated } = data;
dispatch(refreshFiltersSuccess());
if (refreshText.includes('OK')) {
if (refreshText.includes('OK 0')) {
dispatch(addSuccessToast('all_filters_up_to_date_toast'));
} else {
dispatch(addSuccessToast(refreshText.replace(/OK /g, '')));
}
if (updated > 0) {
dispatch(addSuccessToast(t('list_updated', { count: updated })));
} else {
dispatch(addErrorToast({ error: refreshText }));
dispatch(addSuccessToast('all_lists_up_to_date_toast'));
}
dispatch(getFilteringStatus());

View File

@ -94,15 +94,14 @@ class Api {
return this.makeRequest(path, method);
}
addFilter(url, name) {
addFilter(config) {
const { path, method } = this.FILTERING_ADD_FILTER;
const config = {
data: {
name,
url,
},
const parameters = {
data: config,
headers: { 'Content-Type': 'application/json' },
};
return this.makeRequest(path, method, config);
return this.makeRequest(path, method, parameters);
}
removeFilter(config) {

View File

@ -12,7 +12,11 @@ import './index.css';
import Header from '../../containers/Header';
import Dashboard from '../../containers/Dashboard';
import Settings from '../../containers/Settings';
import Filters from '../../containers/Filters';
import CustomRules from '../../containers/CustomRules';
import DnsBlocklist from '../../containers/DnsBlocklist';
import DnsAllowlist from '../../containers/DnsAllowlist';
import DnsRewrites from '../../containers/DnsRewrites';
import Dns from '../../containers/Dns';
import Encryption from '../../containers/Encryption';
@ -108,7 +112,10 @@ class App extends Component {
<Route path="/encryption" component={Encryption} />
<Route path="/dhcp" component={Dhcp} />
<Route path="/clients" component={Clients} />
<Route path="/filters" component={Filters} />
<Route path="/filters" component={DnsBlocklist} />
<Route path="/dns_allowlists" component={DnsAllowlist} />
<Route path="/dns_rewrites" component={DnsRewrites} />
<Route path="/custom_rules" component={CustomRules} />
<Route path="/logs" component={Logs} />
<Route path="/guide" component={SetupGuide} />
</Fragment>

View File

@ -0,0 +1,39 @@
import React from 'react';
import PropTypes from 'prop-types';
import { withNamespaces, Trans } from 'react-i18next';
const Actions = ({
handleAdd, handleRefresh, processingRefreshFilters, whitelist,
}) => (
<div className="card-actions">
<button
className="btn btn-success btn-standard mr-2 btn-large"
type="submit"
onClick={handleAdd}
>
{whitelist ? (
<Trans>add_allowlist</Trans>
) : (
<Trans>add_blocklist</Trans>
)}
</button>
<button
className="btn btn-primary btn-standard"
type="submit"
onClick={handleRefresh}
disabled={processingRefreshFilters}
>
<Trans>check_updates_btn</Trans>
</button>
</div>
);
Actions.propTypes = {
handleAdd: PropTypes.func.isRequired,
handleRefresh: PropTypes.func.isRequired,
processingRefreshFilters: PropTypes.bool.isRequired,
whitelist: PropTypes.bool,
};
export default withNamespaces()(Actions);

View File

@ -14,12 +14,13 @@ import {
} from '../../../helpers/helpers';
import { FILTERED } from '../../../helpers/constants';
const getFilterName = (id, filters, t) => {
const getFilterName = (id, filters, whitelistFilters, t) => {
if (id === 0) {
return t('filtered_custom_rules');
}
const filter = filters.find(filter => filter.id === id);
const filter = filters.find(filter => filter.id === id)
|| whitelistFilters.find(filter => filter.id === id);
if (filter && filter.name) {
return t('query_log_filtered', { filter: filter.name });
@ -43,14 +44,9 @@ const getTitle = (reason, filterName, t, onlyFiltered) => {
if (checkWhiteList(reason)) {
return (
<Fragment>
<div>
{t('host_whitelisted')}
</div>
<div>
{filterName}
</div>
</Fragment>
<div>
{filterName}
</div>
);
}
@ -90,6 +86,7 @@ const getColor = (reason) => {
const Info = ({
filters,
whitelistFilters,
hostname,
reason,
filter_id,
@ -99,7 +96,7 @@ const Info = ({
ip_addrs,
t,
}) => {
const filterName = getFilterName(filter_id, filters, t);
const filterName = getFilterName(filter_id, filters, whitelistFilters, t);
const onlyFiltered = checkSafeSearch(reason)
|| checkSafeBrowsing(reason)
|| checkParental(reason);
@ -149,6 +146,7 @@ const Info = ({
Info.propTypes = {
filters: PropTypes.array.isRequired,
whitelistFilters: PropTypes.array.isRequired,
hostname: PropTypes.string.isRequired,
reason: PropTypes.string.isRequired,
filter_id: PropTypes.number,

View File

@ -17,6 +17,7 @@ const Check = (props) => {
processing,
check,
filters,
whitelistFilters,
} = props;
const {
@ -62,6 +63,7 @@ const Check = (props) => {
<hr/>
<Info
filters={filters}
whitelistFilters={whitelistFilters}
hostname={hostname}
reason={reason}
filter_id={filter_id}
@ -87,6 +89,7 @@ Check.propTypes = {
processing: PropTypes.bool.isRequired,
check: PropTypes.object.isRequired,
filters: PropTypes.array.isRequired,
whitelistFilters: PropTypes.array.isRequired,
};
export default flow([

View File

@ -0,0 +1,95 @@
import React, { Component, Fragment } from 'react';
import PropTypes from 'prop-types';
import { Trans, withNamespaces } from 'react-i18next';
import Card from '../ui/Card';
import PageTitle from '../ui/PageTitle';
import Examples from './Examples';
import Check from './Check';
class CustomRules extends Component {
componentDidMount() {
this.props.getFilteringStatus();
}
handleChange = (e) => {
const { value } = e.currentTarget;
this.handleRulesChange(value);
};
handleSubmit = (e) => {
e.preventDefault();
this.handleRulesSubmit();
};
handleRulesChange = (value) => {
this.props.handleRulesChange({ userRules: value });
};
handleRulesSubmit = () => {
this.props.setRules(this.props.filtering.userRules);
};
handleCheck = (values) => {
this.props.checkHost(values);
}
render() {
const {
t,
filtering: {
filters,
whitelistFilters,
userRules,
processingCheck,
check,
},
} = this.props;
return (
<Fragment>
<PageTitle title={t('custom_filtering_rules')} />
<Card
subtitle={t('custom_filter_rules_hint')}
>
<form onSubmit={this.handleSubmit}>
<textarea
className="form-control form-control--textarea-large"
value={userRules}
onChange={this.handleChange}
/>
<div className="card-actions">
<button
className="btn btn-success btn-standard btn-large"
type="submit"
onClick={this.handleSubmit}
>
<Trans>apply_btn</Trans>
</button>
</div>
</form>
<hr />
<Examples />
</Card>
<Check
filters={filters}
whitelistFilters={whitelistFilters}
check={check}
onSubmit={this.handleCheck}
processing={processingCheck}
/>
</Fragment>
);
}
}
CustomRules.propTypes = {
filtering: PropTypes.object.isRequired,
setRules: PropTypes.func.isRequired,
checkHost: PropTypes.func.isRequired,
getFilteringStatus: PropTypes.func.isRequired,
handleRulesChange: PropTypes.func.isRequired,
t: PropTypes.func.isRequired,
};
export default withNamespaces()(CustomRules);

View File

@ -0,0 +1,130 @@
import React, { Component, Fragment } from 'react';
import PropTypes from 'prop-types';
import { withNamespaces } from 'react-i18next';
import PageTitle from '../ui/PageTitle';
import Card from '../ui/Card';
import Modal from './Modal';
import Actions from './Actions';
import Table from './Table';
import { MODAL_TYPE } from '../../helpers/constants';
import { getCurrentFilter } from '../../helpers/helpers';
class DnsAllowlist extends Component {
componentDidMount() {
this.props.getFilteringStatus();
}
handleSubmit = (values) => {
const { name, url } = values;
const { filtering } = this.props;
const whitelist = true;
if (filtering.modalType === MODAL_TYPE.EDIT) {
this.props.editFilter(filtering.modalFilterUrl, values, whitelist);
} else {
this.props.addFilter(url, name, whitelist);
}
};
handleDelete = (url) => {
if (window.confirm(this.props.t('list_confirm_delete'))) {
const whitelist = true;
this.props.removeFilter(url, whitelist);
}
};
toggleFilter = (url, data) => {
const whitelist = true;
this.props.toggleFilterStatus(url, data, whitelist);
};
render() {
const {
t,
toggleFilteringModal,
refreshFilters,
addFilter,
toggleFilterStatus,
filtering: {
whitelistFilters,
isModalOpen,
isFilterAdded,
processingRefreshFilters,
processingRemoveFilter,
processingAddFilter,
processingConfigFilter,
processingFilters,
modalType,
modalFilterUrl,
},
} = this.props;
const currentFilterData = getCurrentFilter(modalFilterUrl, whitelistFilters);
const loading = processingFilters
|| processingAddFilter
|| processingRemoveFilter
|| processingRefreshFilters;
const whitelist = true;
return (
<Fragment>
<PageTitle
title={t('dns_allowlists')}
subtitle={t('dns_allowlists_desc')}
/>
<div className="content">
<div className="row">
<div className="col-md-12">
<Card subtitle={t('filters_and_hosts_hint')}>
<Table
filters={whitelistFilters}
loading={loading}
processingConfigFilter={processingConfigFilter}
toggleFilteringModal={toggleFilteringModal}
toggleFilterStatus={toggleFilterStatus}
handleDelete={this.handleDelete}
toggleFilter={this.toggleFilter}
whitelist={whitelist}
/>
<Actions
handleAdd={() => toggleFilteringModal({ type: MODAL_TYPE.ADD })}
handleRefresh={refreshFilters}
processingRefreshFilters={processingRefreshFilters}
whitelist={whitelist}
/>
</Card>
</div>
</div>
</div>
<Modal
isOpen={isModalOpen}
toggleModal={toggleFilteringModal}
addFilter={addFilter}
isFilterAdded={isFilterAdded}
processingAddFilter={processingAddFilter}
processingConfigFilter={processingConfigFilter}
handleSubmit={this.handleSubmit}
modalType={modalType}
currentFilterData={currentFilterData}
whitelist={whitelist}
/>
</Fragment>
);
}
}
DnsAllowlist.propTypes = {
getFilteringStatus: PropTypes.func.isRequired,
filtering: PropTypes.object.isRequired,
removeFilter: PropTypes.func.isRequired,
toggleFilterStatus: PropTypes.func.isRequired,
addFilter: PropTypes.func.isRequired,
toggleFilteringModal: PropTypes.func.isRequired,
handleRulesChange: PropTypes.func.isRequired,
refreshFilters: PropTypes.func.isRequired,
editFilter: PropTypes.func.isRequired,
t: PropTypes.func.isRequired,
};
export default withNamespaces()(DnsAllowlist);

View File

@ -0,0 +1,121 @@
import React, { Component, Fragment } from 'react';
import PropTypes from 'prop-types';
import { withNamespaces } from 'react-i18next';
import PageTitle from '../ui/PageTitle';
import Card from '../ui/Card';
import Modal from './Modal';
import Actions from './Actions';
import Table from './Table';
import { MODAL_TYPE } from '../../helpers/constants';
import { getCurrentFilter } from '../../helpers/helpers';
class DnsBlocklist extends Component {
componentDidMount() {
this.props.getFilteringStatus();
}
handleSubmit = (values) => {
const { name, url } = values;
const { filtering } = this.props;
if (filtering.modalType === MODAL_TYPE.EDIT) {
this.props.editFilter(filtering.modalFilterUrl, values);
} else {
this.props.addFilter(url, name);
}
};
handleDelete = (url) => {
if (window.confirm(this.props.t('list_confirm_delete'))) {
this.props.removeFilter(url);
}
};
toggleFilter = (url, data) => {
this.props.toggleFilterStatus(url, data);
};
render() {
const {
t,
toggleFilteringModal,
refreshFilters,
addFilter,
filtering: {
filters,
isModalOpen,
isFilterAdded,
processingRefreshFilters,
processingRemoveFilter,
processingAddFilter,
processingConfigFilter,
processingFilters,
modalType,
modalFilterUrl,
},
} = this.props;
const currentFilterData = getCurrentFilter(modalFilterUrl, filters);
const loading = processingFilters
|| processingAddFilter
|| processingRemoveFilter
|| processingRefreshFilters;
return (
<Fragment>
<PageTitle
title={t('dns_blocklists')}
subtitle={t('dns_blocklists_desc')}
/>
<div className="content">
<div className="row">
<div className="col-md-12">
<Card subtitle={t('filters_and_hosts_hint')}>
<Table
filters={filters}
loading={loading}
processingConfigFilter={processingConfigFilter}
toggleFilteringModal={toggleFilteringModal}
handleDelete={this.handleDelete}
toggleFilter={this.toggleFilter}
/>
<Actions
handleAdd={() => toggleFilteringModal({ type: MODAL_TYPE.ADD })}
handleRefresh={refreshFilters}
processingRefreshFilters={processingRefreshFilters}
/>
</Card>
</div>
</div>
</div>
<Modal
isOpen={isModalOpen}
toggleModal={toggleFilteringModal}
addFilter={addFilter}
isFilterAdded={isFilterAdded}
processingAddFilter={processingAddFilter}
processingConfigFilter={processingConfigFilter}
handleSubmit={this.handleSubmit}
modalType={modalType}
currentFilterData={currentFilterData}
/>
</Fragment>
);
}
}
DnsBlocklist.propTypes = {
getFilteringStatus: PropTypes.func.isRequired,
filtering: PropTypes.object.isRequired,
removeFilter: PropTypes.func.isRequired,
toggleFilterStatus: PropTypes.func.isRequired,
addFilter: PropTypes.func.isRequired,
toggleFilteringModal: PropTypes.func.isRequired,
handleRulesChange: PropTypes.func.isRequired,
refreshFilters: PropTypes.func.isRequired,
editFilter: PropTypes.func.isRequired,
t: PropTypes.func.isRequired,
};
export default withNamespaces()(DnsBlocklist);

View File

@ -0,0 +1,54 @@
import React, { Fragment } from 'react';
import { withNamespaces, Trans } from 'react-i18next';
const Examples = () => (
<Fragment>
<div className="list leading-loose">
<Trans>examples_title</Trans>:
<ol className="leading-loose">
<li>
<code>||example.org^</code> &nbsp;
<Trans>example_meaning_filter_block</Trans>
</li>
<li>
<code> @@||example.org^</code> &nbsp;
<Trans>example_meaning_filter_whitelist</Trans>
</li>
<li>
<code>127.0.0.1 example.org</code> &nbsp;
<Trans>example_meaning_host_block</Trans>
</li>
<li>
<code><Trans>example_comment</Trans></code> &nbsp;
<Trans>example_comment_meaning</Trans>
</li>
<li>
<code><Trans>example_comment_hash</Trans></code> &nbsp;
<Trans>example_comment_meaning</Trans>
</li>
<li>
<code>/REGEX/</code> &nbsp;
<Trans>example_regex_meaning</Trans>
</li>
</ol>
</div>
<p className="mt-1">
<Trans
components={[
<a
href="https://github.com/AdguardTeam/AdGuardHome/wiki/Hosts-Blocklists"
target="_blank"
rel="noopener noreferrer"
key="0"
>
link
</a>,
]}
>
filtering_rules_learn_more
</Trans>
</p>
</Fragment>
);
export default withNamespaces()(Examples);

View File

@ -13,6 +13,7 @@ const Form = (props) => {
handleSubmit,
processingAddFilter,
processingConfigFilter,
whitelist,
} = props;
return (
@ -41,7 +42,11 @@ const Form = (props) => {
/>
</div>
<div className="form__description">
<Trans>enter_valid_filter_url</Trans>
{whitelist ? (
<Trans>enter_valid_allowlist</Trans>
) : (
<Trans>enter_valid_blocklist</Trans>
)}
</div>
</div>
<div className="modal-footer">
@ -70,6 +75,7 @@ Form.propTypes = {
handleSubmit: PropTypes.func.isRequired,
processingAddFilter: PropTypes.bool.isRequired,
processingConfigFilter: PropTypes.bool.isRequired,
whitelist: PropTypes.bool,
};
export default flow([

View File

@ -22,8 +22,21 @@ class Modal extends Component {
handleSubmit,
modalType,
currentFilterData,
whitelist,
} = this.props;
const newListTitle = whitelist ? (
<Trans>new_allowlist</Trans>
) : (
<Trans>new_blocklist</Trans>
);
const editListTitle = whitelist ? (
<Trans>edit_allowlist</Trans>
) : (
<Trans>edit_blocklist</Trans>
);
return (
<ReactModal
className="Modal__Bootstrap modal-dialog modal-dialog-centered"
@ -35,9 +48,9 @@ class Modal extends Component {
<div className="modal-header">
<h4 className="modal-title">
{modalType === MODAL_TYPE.EDIT ? (
<Trans>edit_filter_title</Trans>
editListTitle
) : (
<Trans>new_filter_btn</Trans>
newListTitle
)}
</h4>
<button type="button" className="close" onClick={this.closeModal}>
@ -50,6 +63,7 @@ class Modal extends Component {
processingAddFilter={processingAddFilter}
processingConfigFilter={processingConfigFilter}
closeModal={this.closeModal}
whitelist={whitelist}
/>
</div>
</ReactModal>
@ -68,6 +82,7 @@ Modal.propTypes = {
modalType: PropTypes.string.isRequired,
currentFilterData: PropTypes.object.isRequired,
t: PropTypes.func.isRequired,
whitelist: PropTypes.bool,
};
export default withNamespaces()(Modal);

View File

@ -4,7 +4,7 @@ import { Field, reduxForm } from 'redux-form';
import { Trans, withNamespaces } from 'react-i18next';
import flow from 'lodash/flow';
import { renderInputField, required, domain, answer } from '../../../../helpers/form';
import { renderInputField, required, domain, answer } from '../../../helpers/form';
const Form = (props) => {
const {

View File

@ -0,0 +1,92 @@
import React, { Component, Fragment } from 'react';
import PropTypes from 'prop-types';
import { Trans, withNamespaces } from 'react-i18next';
import Table from './Table';
import Modal from './Modal';
import Card from '../../ui/Card';
import PageTitle from '../../ui/PageTitle';
class Rewrites extends Component {
componentDidMount() {
this.props.getRewritesList();
}
handleSubmit = (values) => {
this.props.addRewrite(values);
};
handleDelete = (values) => {
// eslint-disable-next-line no-alert
if (window.confirm(this.props.t('rewrite_confirm_delete', { key: values.domain }))) {
this.props.deleteRewrite(values);
}
};
render() {
const {
t,
rewrites,
toggleRewritesModal,
} = this.props;
const {
list,
isModalOpen,
processing,
processingAdd,
processingDelete,
} = rewrites;
return (
<Fragment>
<PageTitle
title={t('dns_rewrites')}
subtitle={t('rewrite_desc')}
/>
<Card
id="rewrites"
bodyType="card-body box-body--settings"
>
<Fragment>
<Table
list={list}
processing={processing}
processingAdd={processingAdd}
processingDelete={processingDelete}
handleDelete={this.handleDelete}
/>
<button
type="button"
className="btn btn-success btn-standard mt-3"
onClick={() => toggleRewritesModal()}
disabled={processingAdd}
>
<Trans>rewrite_add</Trans>
</button>
<Modal
isModalOpen={isModalOpen}
toggleRewritesModal={toggleRewritesModal}
handleSubmit={this.handleSubmit}
processingAdd={processingAdd}
processingDelete={processingDelete}
/>
</Fragment>
</Card>
</Fragment>
);
}
}
Rewrites.propTypes = {
t: PropTypes.func.isRequired,
getRewritesList: PropTypes.func.isRequired,
toggleRewritesModal: PropTypes.func.isRequired,
addRewrite: PropTypes.func.isRequired,
deleteRewrite: PropTypes.func.isRequired,
rewrites: PropTypes.object.isRequired,
};
export default withNamespaces()(Rewrites);

View File

@ -0,0 +1,157 @@
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import ReactTable from 'react-table';
import { withNamespaces, Trans } from 'react-i18next';
import CellWrap from '../ui/CellWrap';
import { MODAL_TYPE } from '../../helpers/constants';
import { formatDetailedDateTime } from '../../helpers/helpers';
class Table extends Component {
getDateCell = row => CellWrap(row, formatDetailedDateTime);
renderCheckbox = ({ original }) => {
const { processingConfigFilter, toggleFilter } = this.props;
const { url, name, enabled } = original;
const data = { name, url, enabled: !enabled };
return (
<label className="checkbox">
<input
type="checkbox"
className="checkbox__input"
onChange={() => toggleFilter(url, data)}
checked={enabled}
disabled={processingConfigFilter}
/>
<span className="checkbox__label" />
</label>
);
};
columns = [
{
Header: <Trans>enabled_table_header</Trans>,
accessor: 'enabled',
Cell: this.renderCheckbox,
width: 90,
className: 'text-center',
},
{
Header: <Trans>name_table_header</Trans>,
accessor: 'name',
minWidth: 200,
Cell: CellWrap,
},
{
Header: <Trans>list_url_table_header</Trans>,
accessor: 'url',
minWidth: 200,
Cell: ({ value }) => (
<div className="logs__row logs__row--overflow">
<a
href={value}
target="_blank"
rel="noopener noreferrer"
className="link logs__text"
>
{value}
</a>
</div>
),
},
{
Header: <Trans>rules_count_table_header</Trans>,
accessor: 'rulesCount',
className: 'text-center',
minWidth: 100,
Cell: props => props.value.toLocaleString(),
},
{
Header: <Trans>last_time_updated_table_header</Trans>,
accessor: 'lastUpdated',
className: 'text-center',
minWidth: 150,
Cell: this.getDateCell,
},
{
Header: <Trans>actions_table_header</Trans>,
accessor: 'url',
className: 'text-center',
width: 100,
sortable: false,
Cell: (row) => {
const { value } = row;
const { t, toggleFilteringModal, handleDelete } = this.props;
return (
<div className="logs__row logs__row--center">
<button
type="button"
className="btn btn-icon btn-outline-primary btn-sm mr-2"
title={t('edit_table_action')}
onClick={() =>
toggleFilteringModal({
type: MODAL_TYPE.EDIT,
url: value,
})
}
>
<svg className="icons">
<use xlinkHref="#edit" />
</svg>
</button>
<button
type="button"
className="btn btn-icon btn-outline-secondary btn-sm"
onClick={() => handleDelete(value)}
title={t('delete_table_action')}
>
<svg className="icons">
<use xlinkHref="#delete" />
</svg>
</button>
</div>
);
},
},
];
render() {
const {
loading, filters, t, whitelist,
} = this.props;
return (
<ReactTable
data={filters}
columns={this.columns}
showPagination={true}
defaultPageSize={10}
loading={loading}
minRows={6}
previousText={t('previous_btn')}
nextText={t('next_btn')}
loadingText={t('loading_table_status')}
pageText={t('page_table_footer_text')}
ofText="/"
rowsText={t('rows_table_footer_text')}
noDataText={whitelist ? t('no_whitelist_added') : t('no_blocklist_added')}
/>
);
}
}
Table.propTypes = {
filters: PropTypes.array.isRequired,
loading: PropTypes.bool.isRequired,
processingConfigFilter: PropTypes.bool.isRequired,
toggleFilteringModal: PropTypes.func.isRequired,
handleDelete: PropTypes.func.isRequired,
toggleFilter: PropTypes.func.isRequired,
t: PropTypes.func.isRequired,
whitelist: PropTypes.bool,
};
export default withNamespaces()(Table);

View File

@ -1,95 +0,0 @@
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { Trans, withNamespaces } from 'react-i18next';
import Card from '../ui/Card';
class UserRules extends Component {
handleChange = (e) => {
const { value } = e.currentTarget;
this.props.handleRulesChange(value);
};
handleSubmit = (e) => {
e.preventDefault();
this.props.handleRulesSubmit();
};
render() {
const { t, userRules } = this.props;
return (
<Card title={t('custom_filter_rules')} subtitle={t('custom_filter_rules_hint')}>
<form onSubmit={this.handleSubmit}>
<textarea
className="form-control form-control--textarea-large"
value={userRules}
onChange={this.handleChange}
/>
<div className="card-actions">
<button
className="btn btn-success btn-standard btn-large"
type="submit"
onClick={this.handleSubmit}
>
<Trans>apply_btn</Trans>
</button>
</div>
</form>
<hr />
<div className="list leading-loose">
<Trans>examples_title</Trans>:
<ol className="leading-loose">
<li>
<code>||example.org^</code> &nbsp;
<Trans>example_meaning_filter_block</Trans>
</li>
<li>
<code> @@||example.org^</code> &nbsp;
<Trans>example_meaning_filter_whitelist</Trans>
</li>
<li>
<code>127.0.0.1 example.org</code> &nbsp;
<Trans>example_meaning_host_block</Trans>
</li>
<li>
<code><Trans>example_comment</Trans></code> &nbsp;
<Trans>example_comment_meaning</Trans>
</li>
<li>
<code><Trans>example_comment_hash</Trans></code> &nbsp;
<Trans>example_comment_meaning</Trans>
</li>
<li>
<code>/REGEX/</code> &nbsp;
<Trans>example_regex_meaning</Trans>
</li>
</ol>
</div>
<p className="mt-1">
<Trans
components={[
<a
href="https://github.com/AdguardTeam/AdGuardHome/wiki/Hosts-Blocklists"
target="_blank"
rel="noopener noreferrer"
key="0"
>
link
</a>,
]}
>
filtering_rules_learn_more
</Trans>
</p>
</Card>
);
}
}
UserRules.propTypes = {
userRules: PropTypes.string.isRequired,
handleRulesChange: PropTypes.func.isRequired,
handleRulesSubmit: PropTypes.func.isRequired,
t: PropTypes.func.isRequired,
};
export default withNamespaces()(UserRules);

View File

@ -1,305 +0,0 @@
import React, { Component, Fragment } from 'react';
import ReactTable from 'react-table';
import PropTypes from 'prop-types';
import { Trans, withNamespaces } from 'react-i18next';
import PageTitle from '../ui/PageTitle';
import Card from '../ui/Card';
import CellWrap from '../ui/CellWrap';
import UserRules from './UserRules';
import Modal from './Modal';
import Check from './Check';
import { formatDetailedDateTime } from '../../helpers/helpers';
import { MODAL_TYPE } from '../../helpers/constants';
class Filters extends Component {
componentDidMount() {
this.props.getFilteringStatus();
}
handleRulesChange = (value) => {
this.props.handleRulesChange({ userRules: value });
};
handleRulesSubmit = () => {
this.props.setRules(this.props.filtering.userRules);
};
handleSubmit = (values) => {
const { name, url } = values;
const { filtering } = this.props;
if (filtering.modalType === MODAL_TYPE.EDIT) {
const data = { ...values };
this.props.editFilter(filtering.modalFilterUrl, data);
} else {
this.props.addFilter(url, name);
}
}
renderCheckbox = ({ original }) => {
const { processingConfigFilter } = this.props.filtering;
const { url, name, enabled } = original;
const data = { name, url, enabled: !enabled };
return (
<label className="checkbox">
<input
type="checkbox"
className="checkbox__input"
onChange={() => this.props.toggleFilterStatus(url, data)}
checked={enabled}
disabled={processingConfigFilter}
/>
<span className="checkbox__label" />
</label>
);
};
handleDelete = (url) => {
// eslint-disable-next-line no-alert
if (window.confirm(this.props.t('filter_confirm_delete'))) {
this.props.removeFilter({ url });
}
};
getDateCell = row => CellWrap(row, formatDetailedDateTime);
getFilter = (url, filters) => {
const filter = filters.find(item => url === item.url);
if (filter) {
const { enabled, name, url } = filter;
return { enabled, name, url };
}
return { name: '', url: '' };
};
handleCheck = (values) => {
this.props.checkHost(values);
}
columns = [
{
Header: <Trans>enabled_table_header</Trans>,
accessor: 'enabled',
Cell: this.renderCheckbox,
width: 90,
className: 'text-center',
},
{
Header: <Trans>name_table_header</Trans>,
accessor: 'name',
minWidth: 200,
Cell: CellWrap,
},
{
Header: <Trans>filter_url_table_header</Trans>,
accessor: 'url',
minWidth: 200,
Cell: ({ value }) => (
<div className="logs__row logs__row--overflow">
<a
href={value}
target="_blank"
rel="noopener noreferrer"
className="link logs__text"
>
{value}
</a>
</div>
),
},
{
Header: <Trans>rules_count_table_header</Trans>,
accessor: 'rulesCount',
className: 'text-center',
minWidth: 100,
Cell: props => props.value.toLocaleString(),
},
{
Header: <Trans>last_time_updated_table_header</Trans>,
accessor: 'lastUpdated',
className: 'text-center',
minWidth: 150,
Cell: this.getDateCell,
},
{
Header: <Trans>actions_table_header</Trans>,
accessor: 'url',
className: 'text-center',
width: 100,
sortable: false,
Cell: (row) => {
const { value } = row;
const { t, toggleFilteringModal } = this.props;
return (
<div className="logs__row logs__row--center">
<button
type="button"
className="btn btn-icon btn-outline-primary btn-sm mr-2"
title={t('edit_table_action')}
onClick={() =>
toggleFilteringModal({
type: MODAL_TYPE.EDIT,
url: value,
})
}
>
<svg className="icons">
<use xlinkHref="#edit" />
</svg>
</button>
<button
type="button"
className="btn btn-icon btn-outline-secondary btn-sm"
onClick={() => this.handleDelete(value)}
title={this.props.t('delete_table_action')}
>
<svg className="icons">
<use xlinkHref="#delete" />
</svg>
</button>
</div>
);
},
},
];
render() {
const {
filtering, t, toggleFilteringModal, refreshFilters, addFilter,
} = this.props;
const {
filters,
userRules,
isModalOpen,
isFilterAdded,
processingRefreshFilters,
processingRemoveFilter,
processingAddFilter,
processingConfigFilter,
processingFilters,
modalType,
modalFilterUrl,
processingCheck,
check,
} = filtering;
const currentFilterData = this.getFilter(modalFilterUrl, filters);
return (
<Fragment>
<PageTitle title={t('filters')} />
<div className="content">
<div className="row">
<div className="col-md-12">
<Card
title={t('filters_and_hosts')}
subtitle={t('filters_and_hosts_hint')}
>
<ReactTable
data={filters}
columns={this.columns}
showPagination={true}
defaultPageSize={10}
loading={
processingFilters ||
processingAddFilter ||
processingRemoveFilter ||
processingRefreshFilters
}
minRows={4}
previousText={t('previous_btn')}
nextText={t('next_btn')}
loadingText={t('loading_table_status')}
pageText={t('page_table_footer_text')}
ofText="/"
rowsText={t('rows_table_footer_text')}
noDataText={t('no_filters_added')}
/>
<div className="card-actions">
<button
className="btn btn-success btn-standard mr-2 btn-large"
type="submit"
onClick={() =>
toggleFilteringModal({ type: MODAL_TYPE.ADD })
}
>
<Trans>add_filter_btn</Trans>
</button>
<button
className="btn btn-primary btn-standard"
type="submit"
onClick={refreshFilters}
disabled={processingRefreshFilters}
>
<Trans>check_updates_btn</Trans>
</button>
</div>
</Card>
</div>
<div className="col-md-12">
<UserRules
userRules={userRules}
handleRulesChange={this.handleRulesChange}
handleRulesSubmit={this.handleRulesSubmit}
/>
</div>
<div className="col-md-12">
<Check
filters={filters}
check={check}
onSubmit={this.handleCheck}
processing={processingCheck}
/>
</div>
</div>
</div>
<Modal
isOpen={isModalOpen}
toggleModal={toggleFilteringModal}
addFilter={addFilter}
isFilterAdded={isFilterAdded}
processingAddFilter={processingAddFilter}
processingConfigFilter={processingConfigFilter}
handleSubmit={this.handleSubmit}
modalType={modalType}
currentFilterData={currentFilterData}
/>
</Fragment>
);
}
}
Filters.propTypes = {
setRules: PropTypes.func,
getFilteringStatus: PropTypes.func.isRequired,
filtering: PropTypes.shape({
userRules: PropTypes.string.isRequired,
filters: PropTypes.array.isRequired,
isModalOpen: PropTypes.bool.isRequired,
isFilterAdded: PropTypes.bool.isRequired,
processingFilters: PropTypes.bool.isRequired,
processingAddFilter: PropTypes.bool.isRequired,
processingRefreshFilters: PropTypes.bool.isRequired,
processingConfigFilter: PropTypes.bool.isRequired,
processingRemoveFilter: PropTypes.bool.isRequired,
modalType: PropTypes.string.isRequired,
processingCheck: PropTypes.bool.isRequired,
}),
removeFilter: PropTypes.func.isRequired,
toggleFilterStatus: PropTypes.func.isRequired,
addFilter: PropTypes.func.isRequired,
toggleFilteringModal: PropTypes.func.isRequired,
handleRulesChange: PropTypes.func.isRequired,
refreshFilters: PropTypes.func.isRequired,
editFilter: PropTypes.func.isRequired,
checkHost: PropTypes.func.isRequired,
t: PropTypes.func.isRequired,
};
export default withNamespaces()(Filters);

View File

@ -5,33 +5,39 @@ import enhanceWithClickOutside from 'react-click-outside';
import classnames from 'classnames';
import { Trans, withNamespaces } from 'react-i18next';
import { SETTINGS_URLS } from '../../helpers/constants';
import { SETTINGS_URLS, FILTERS_URLS, MENU_URLS } from '../../helpers/constants';
import Dropdown from '../ui/Dropdown';
const MENU_ITEMS = [
{
route: '', exact: true, xlinkHref: 'dashboard', text: 'dashboard', order: 0,
route: MENU_URLS.root, exact: true, icon: 'dashboard', text: 'dashboard', order: 0,
},
// Settings dropdown should have visual order 1
// Filters dropdown should have visual order 2
{
route: 'filters', xlinkHref: 'filters', text: 'filters', order: 2,
route: MENU_URLS.logs, icon: 'log', text: 'query_log', order: 3,
},
{
route: 'logs', xlinkHref: 'log', text: 'query_log', order: 3,
},
{
route: 'guide', xlinkHref: 'setup', text: 'setup_guide', order: 4,
route: MENU_URLS.guide, icon: 'setup', text: 'setup_guide', order: 4,
},
];
const DROPDOWN_ITEMS = [
{ route: 'settings', text: 'general_settings' },
{ route: 'dns', text: 'dns_settings' },
{ route: 'encryption', text: 'encryption_settings' },
{ route: 'clients', text: 'client_settings' },
{ route: 'dhcp', text: 'dhcp_settings' },
const SETTINGS_ITEMS = [
{ route: SETTINGS_URLS.settings, text: 'general_settings' },
{ route: SETTINGS_URLS.dns, text: 'dns_settings' },
{ route: SETTINGS_URLS.encryption, text: 'encryption_settings' },
{ route: SETTINGS_URLS.clients, text: 'client_settings' },
{ route: SETTINGS_URLS.dhcp, text: 'dhcp_settings' },
];
const FILTERS_ITEMS = [
{ route: FILTERS_URLS.dns_blocklists, text: 'dns_blocklists' },
{ route: FILTERS_URLS.dns_allowlists, text: 'dns_allowlists' },
{ route: FILTERS_URLS.dns_rewrites, text: 'dns_rewrites' },
{ route: FILTERS_URLS.custom_rules, text: 'custom_filtering_rules' },
];
class Menu extends Component {
@ -43,50 +49,82 @@ class Menu extends Component {
this.props.toggleMenuOpen();
};
getActiveClassForSettings = () => {
getActiveClassForDropdown = (URLS) => {
const { pathname } = this.props.location;
const isSettingsPage = SETTINGS_URLS.some(item => item === pathname);
const isActivePage = Object.values(URLS).some(item => item === pathname);
return isSettingsPage ? 'active' : '';
return isActivePage ? 'active' : '';
};
getNavLink = ({
route, exact, text, order, className, icon,
}) => (
<NavLink
to={route}
key={route}
exact={exact || false}
className={`order-${order} ${className}`}
onClick={this.toggleMenu}
>
{icon && (
<svg className="nav-icon">
<use xlinkHref={`#${icon}`} />
</svg>
)}
<Trans>{text}</Trans>
</NavLink>
);
getDropdown = ({
label, order, URLS, icon, ITEMS,
}) =>
(
<Dropdown
label={this.props.t(label)}
baseClassName={`dropdown nav-item order-${order}`}
controlClassName={`nav-link ${this.getActiveClassForDropdown(URLS)}`}
icon={icon}>
{ITEMS.map(item => (
this.getNavLink({
...item,
order,
className: 'dropdown-item',
})))}
</Dropdown>
);
render() {
const menuClass = classnames({
'header__column mobile-menu': true,
'mobile-menu--active': this.props.isMenuOpen,
});
const dropdownControlClass = `nav-link ${this.getActiveClassForSettings()}`;
return (
<Fragment>
<div className={menuClass}>
<ul className="nav nav-tabs border-0 flex-column flex-lg-row flex-nowrap">
{MENU_ITEMS.map(({
route, text, exact, xlinkHref, order,
}) => (
<li className={`nav-item order-${order}`} key={text} onClick={this.toggleMenu}>
<NavLink to={`/${route}`} exact={exact || false} className="nav-link">
<svg className="nav-icon">
<use xlinkHref={`#${xlinkHref}`} />
</svg>
<Trans>{text}</Trans>
</NavLink>
{MENU_ITEMS.map(item => (
<li
className={`nav-item order-${item.order}`}
key={item.text}
onClick={this.toggleMenu}
>
{this.getNavLink({ ...item, className: 'nav-link' })}
</li>
))}
<Dropdown
label={this.props.t('settings')}
baseClassName="dropdown nav-item order-1"
controlClassName={dropdownControlClass}
icon="settings"
>
{DROPDOWN_ITEMS.map(({ route, text }) => (
<NavLink to={`/${route}`} className="dropdown-item" key={text}
onClick={this.toggleMenu}>
<Trans>{text}</Trans>
</NavLink>
))}
</Dropdown>
{this.getDropdown({
order: 1,
label: 'settings',
icon: 'settings',
URLS: SETTINGS_URLS,
ITEMS: SETTINGS_ITEMS,
})}
{this.getDropdown({
order: 2,
label: 'filters',
icon: 'filters',
URLS: FILTERS_URLS,
ITEMS: FILTERS_ITEMS,
})}
</ul>
</div>
</Fragment>

View File

@ -140,12 +140,13 @@ class Logs extends Component {
})
);
getFilterName = (filters, filterId, t) => {
getFilterName = (filters, whitelistFilters, filterId, t) => {
if (filterId === CUSTOM_FILTERING_RULES_ID) {
return t('custom_filter_rules');
}
const filter = filters.find(filter => filter.id === filterId);
const filter = filters.find(filter => filter.id === filterId)
|| whitelistFilters.find(filter => filter.id === filterId);
let filterName = '';
if (filter) {
@ -164,7 +165,7 @@ class Logs extends Component {
reason, filterId, rule, status, originalAnswer,
} = original;
const { t, filtering } = this.props;
const { filters } = filtering;
const { filters, whitelistFilters } = filtering;
const isFiltered = checkFiltered(reason);
const isBlackList = checkBlackList(reason);
@ -177,7 +178,7 @@ class Logs extends Component {
const parsedFilteredReason = t('query_log_filtered', { filter: filterKey });
const currentService = SERVICES.find(service => service.id === original.serviceName);
const serviceName = currentService && currentService.name;
const filterName = this.getFilterName(filters, filterId, t);
const filterName = this.getFilterName(filters, whitelistFilters, filterId, t);
if (isBlockedCnameIp) {
const normalizedAnswer = this.normalizeResponse(originalAnswer);
@ -188,6 +189,7 @@ class Logs extends Component {
<span className="logs__text">
<Trans>blocked_by_response</Trans>
</span>
{this.renderTooltip(isFiltered, rule, filterName)}
</div>
<div className="logs__list-wrap">
{this.renderResponseList(normalizedAnswer, status)}
@ -242,7 +244,7 @@ class Logs extends Component {
</div>
{isRewrite ? (
<div className="logs__action">
<Link to="/dns#rewrites" className="btn btn-sm btn-outline-primary">
<Link to="/dns_rewrites" className="btn btn-sm btn-outline-primary">
<Trans>configure</Trans>
</Link>
</div>

View File

@ -1,83 +0,0 @@
import React, { Component, Fragment } from 'react';
import PropTypes from 'prop-types';
import { Trans, withNamespaces } from 'react-i18next';
import Table from './Table';
import Modal from './Modal';
import Card from '../../../ui/Card';
class Rewrites extends Component {
handleSubmit = (values) => {
this.props.addRewrite(values);
};
handleDelete = (values) => {
// eslint-disable-next-line no-alert
if (window.confirm(this.props.t('rewrite_confirm_delete', { key: values.domain }))) {
this.props.deleteRewrite(values);
}
};
render() {
const {
t,
rewrites,
toggleRewritesModal,
} = this.props;
const {
list,
isModalOpen,
processing,
processingAdd,
processingDelete,
} = rewrites;
return (
<Card
id="rewrites"
title={t('dns_rewrites')}
subtitle={t('rewrite_desc')}
bodyType="card-body box-body--settings"
>
<Fragment>
<Table
list={list}
processing={processing}
processingAdd={processingAdd}
processingDelete={processingDelete}
handleDelete={this.handleDelete}
/>
<button
type="button"
className="btn btn-success btn-standard mt-3"
onClick={() => toggleRewritesModal()}
disabled={processingAdd}
>
<Trans>rewrite_add</Trans>
</button>
<Modal
isModalOpen={isModalOpen}
toggleRewritesModal={toggleRewritesModal}
handleSubmit={this.handleSubmit}
processingAdd={processingAdd}
processingDelete={processingDelete}
/>
</Fragment>
</Card>
);
}
}
Rewrites.propTypes = {
t: PropTypes.func.isRequired,
getRewritesList: PropTypes.func.isRequired,
toggleRewritesModal: PropTypes.func.isRequired,
addRewrite: PropTypes.func.isRequired,
deleteRewrite: PropTypes.func.isRequired,
rewrites: PropTypes.object.isRequired,
};
export default withNamespaces()(Rewrites);

View File

@ -4,7 +4,6 @@ import { withNamespaces } from 'react-i18next';
import Upstream from './Upstream';
import Access from './Access';
import Rewrites from './Rewrites';
import Config from './Config';
import PageTitle from '../../ui/PageTitle';
import Loading from '../../ui/Loading';
@ -13,7 +12,6 @@ class Dns extends Component {
componentDidMount() {
this.props.getDnsSettings();
this.props.getAccessList();
this.props.getRewritesList();
this.props.getDnsConfig();
}
@ -23,25 +21,18 @@ class Dns extends Component {
dashboard,
settings,
access,
rewrites,
setAccessList,
testUpstream,
setUpstream,
getRewritesList,
addRewrite,
deleteRewrite,
toggleRewritesModal,
dnsConfig,
setDnsConfig,
} = this.props;
const isDataLoading = dashboard.processingDnsSettings
|| access.processing
|| rewrites.processing
|| dnsConfig.processingGetConfig;
const isDataReady = !dashboard.processingDnsSettings
&& !access.processing
&& !rewrites.processing
&& !dnsConfig.processingGetConfig;
return (
@ -64,13 +55,6 @@ class Dns extends Component {
testUpstream={testUpstream}
/>
<Access access={access} setAccessList={setAccessList} />
<Rewrites
rewrites={rewrites}
getRewritesList={getRewritesList}
addRewrite={addRewrite}
deleteRewrite={deleteRewrite}
toggleRewritesModal={toggleRewritesModal}
/>
</Fragment>
)}
</Fragment>
@ -86,11 +70,6 @@ Dns.propTypes = {
getAccessList: PropTypes.func.isRequired,
setAccessList: PropTypes.func.isRequired,
access: PropTypes.object.isRequired,
rewrites: PropTypes.object.isRequired,
getRewritesList: PropTypes.func.isRequired,
addRewrite: PropTypes.func.isRequired,
deleteRewrite: PropTypes.func.isRequired,
toggleRewritesModal: PropTypes.func.isRequired,
getDnsSettings: PropTypes.func.isRequired,
dnsConfig: PropTypes.object.isRequired,
setDnsConfig: PropTypes.func.isRequired,

View File

@ -3,28 +3,36 @@ import PropTypes from 'prop-types';
import './Card.css';
const Card = props => (
<div className={props.type ? `card ${props.type}` : 'card'} id={props.id ? props.id : ''}>
{props.title &&
<div className="card-header with-border">
<div className="card-inner">
<div className="card-title">
{props.title}
const Card = ({
type, id, title, subtitle, refresh, bodyType, children,
}) => (
<div className={type ? `card ${type}` : 'card'} id={id || ''}>
{(title || subtitle) && (
<div className="card-header with-border">
<div className="card-inner">
{title && (
<div className="card-title">
{title}
</div>
)}
{subtitle && (
<div
className="card-subtitle"
dangerouslySetInnerHTML={{ __html: subtitle }}
/>
)}
</div>
{props.subtitle &&
<div className="card-subtitle" dangerouslySetInnerHTML={{ __html: props.subtitle }} />
}
{refresh && (
<div className="card-options">
{refresh}
</div>
)}
</div>
{props.refresh &&
<div className="card-options">
{props.refresh}
</div>
}
</div>}
<div className={props.bodyType ? props.bodyType : 'card-body'}>
{props.children}
)}
<div className={bodyType || 'card-body'}>
{children}
</div>
</div>
);

View File

@ -1,8 +1,17 @@
.page-header {
flex-direction: column;
align-items: flex-start;
}
.page-subtitle {
margin-left: 0.7rem;
margin-left: 0;
font-size: 0.9rem;
}
.page-title {
line-height: 2.2rem;
}
.page-title__actions {
display: block;
}

View File

@ -7,9 +7,13 @@ const PageTitle = props => (
<div className="page-header">
<h1 className="page-title">
{props.title}
{props.subtitle && <span className="page-subtitle">{props.subtitle}</span>}
{props.children}
</h1>
{props.subtitle && (
<div className="page-subtitle">
{props.subtitle}
</div>
)}
</div>
);

View File

@ -28,7 +28,7 @@ class PopoverFilter extends Component {
)}
{filter && (
<div className="popover__list-item popover__list-item--nowrap">
<Trans>filter_label</Trans>: <strong>{filter}</strong>
<Trans>list_label</Trans>: <strong>{filter}</strong>
</div>
)}
{service && (

View File

@ -10143,6 +10143,7 @@ body.fixed-header .page {
display: flex;
-ms-flex-align: center;
align-items: center;
flex-direction: column;
margin: 1.5rem 0 1.5rem;
-ms-flex-wrap: wrap;
flex-wrap: wrap;

View File

@ -0,0 +1,26 @@
import { connect } from 'react-redux';
import {
setRules,
getFilteringStatus,
handleRulesChange,
checkHost,
} from '../actions/filtering';
import CustomRules from '../components/Filters/CustomRules';
const mapStateToProps = (state) => {
const { filtering } = state;
const props = { filtering };
return props;
};
const mapDispatchToProps = {
setRules,
getFilteringStatus,
handleRulesChange,
checkHost,
};
export default connect(
mapStateToProps,
mapDispatchToProps,
)(CustomRules);

View File

@ -9,9 +9,8 @@ import {
refreshFilters,
handleRulesChange,
editFilter,
checkHost,
} from '../actions/filtering';
import Filters from '../components/Filters';
import DnsAllowlist from '../components/Filters/DnsAllowlist';
const mapStateToProps = (state) => {
const { filtering } = state;
@ -29,10 +28,9 @@ const mapDispatchToProps = {
refreshFilters,
handleRulesChange,
editFilter,
checkHost,
};
export default connect(
mapStateToProps,
mapDispatchToProps,
)(Filters);
)(DnsAllowlist);

View File

@ -0,0 +1,36 @@
import { connect } from 'react-redux';
import {
setRules,
getFilteringStatus,
addFilter,
removeFilter,
toggleFilterStatus,
toggleFilteringModal,
refreshFilters,
handleRulesChange,
editFilter,
} from '../actions/filtering';
import DnsBlocklist from '../components/Filters/DnsBlocklist';
const mapStateToProps = (state) => {
const { filtering } = state;
const props = { filtering };
return props;
};
const mapDispatchToProps = {
setRules,
getFilteringStatus,
addFilter,
removeFilter,
toggleFilterStatus,
toggleFilteringModal,
refreshFilters,
handleRulesChange,
editFilter,
};
export default connect(
mapStateToProps,
mapDispatchToProps,
)(DnsBlocklist);

View File

@ -0,0 +1,26 @@
import { connect } from 'react-redux';
import {
getRewritesList,
addRewrite,
deleteRewrite,
toggleRewritesModal,
} from '../actions/rewrites';
import Rewrites from '../components/Filters/Rewrites';
const mapStateToProps = (state) => {
const { rewrites } = state;
const props = { rewrites };
return props;
};
const mapDispatchToProps = {
getRewritesList,
addRewrite,
deleteRewrite,
toggleRewritesModal,
};
export default connect(
mapStateToProps,
mapDispatchToProps,
)(Rewrites);

View File

@ -137,7 +137,26 @@ export const CLIENT_ID = {
IP: 'ip',
};
export const SETTINGS_URLS = ['/encryption', '/dhcp', '/dns', '/settings', '/clients'];
export const MENU_URLS = {
root: '/',
logs: '/logs',
guide: '/guide',
};
export const SETTINGS_URLS = {
encryption: '/encryption',
dhcp: '/dhcp',
dns: '/dns',
settings: '/settings',
clients: '/clients',
};
export const FILTERS_URLS = {
dns_blocklists: '/filters',
dns_allowlists: '/dns_allowlists',
dns_rewrites: '/dns_rewrites',
custom_rules: '/custom_rules',
};
export const SERVICES = [
{

View File

@ -122,37 +122,39 @@ export const addClientInfo = (data, clients, param) => (
})
);
export const normalizeFilters = filters => (
filters ? filters.map((filter) => {
const {
id,
url,
enabled,
last_updated,
name = 'Default name',
rules_count: rules_count = 0,
} = filter;
return {
id,
url,
enabled,
lastUpdated: last_updated,
name,
rulesCount: rules_count,
};
}) : []
);
export const normalizeFilteringStatus = (filteringStatus) => {
const {
enabled, filters, user_rules: userRules, interval,
enabled, filters, user_rules: userRules, interval, whitelist_filters,
} = filteringStatus;
const newFilters = filters
? filters.map((filter) => {
const {
id,
url,
enabled,
last_updated,
name = 'Default name',
rules_count: rules_count = 0,
} = filter;
return {
id,
url,
enabled,
lastUpdated: last_updated,
name,
rulesCount: rules_count,
};
})
: [];
const newUserRules = Array.isArray(userRules) ? userRules.join('\n') : '';
return {
enabled,
userRules: newUserRules,
filters: newFilters,
filters: normalizeFilters(filters),
whitelistFilters: normalizeFilters(whitelist_filters),
interval,
};
};
@ -436,3 +438,14 @@ export const checkSafeSearch = reason => reason === FILTERED_STATUS.FILTERED_SAF
export const checkSafeBrowsing = reason => reason === FILTERED_STATUS.FILTERED_SAFE_BROWSING;
export const checkParental = reason => reason === FILTERED_STATUS.FILTERED_PARENTAL;
export const checkBlockedService = reason => reason === FILTERED_STATUS.FILTERED_BLOCKED_SERVICE;
export const getCurrentFilter = (url, filters) => {
const filter = filters && filters.find(item => url === item.url);
if (filter) {
const { enabled, name, url } = filter;
return { enabled, name, url };
}
return { name: '', url: '' };
};

View File

@ -100,6 +100,7 @@ const filtering = handleActions(
processingCheck: false,
isFilterAdded: false,
filters: [],
whitelistFilters: [],
userRules: '',
interval: 24,
enabled: true,

View File

@ -73,14 +73,17 @@ type Stats struct {
// Parameters to pass to filters-initializer goroutine
type filtersInitializerParams struct {
filters map[int]string
allowFilters []Filter
blockFilters []Filter
}
// Dnsfilter holds added rules and performs hostname matches against the rules
type Dnsfilter struct {
rulesStorage *filterlist.RuleStorage
filteringEngine *urlfilter.DNSEngine
engineLock sync.RWMutex
rulesStorage *filterlist.RuleStorage
filteringEngine *urlfilter.DNSEngine
rulesStorageWhite *filterlist.RuleStorage
filteringEngineWhite *urlfilter.DNSEngine
engineLock sync.RWMutex
parentalServer string // access via methods
safeBrowsingServer string // access via methods
@ -178,10 +181,11 @@ func (d *Dnsfilter) WriteDiskConfig(c *Config) {
// SetFilters - set new filters (synchronously or asynchronously)
// When filters are set asynchronously, the old filters continue working until the new filters are ready.
// In this case the caller must ensure that the old filter files are intact.
func (d *Dnsfilter) SetFilters(filters map[int]string, async bool) error {
func (d *Dnsfilter) SetFilters(blockFilters []Filter, allowFilters []Filter, async bool) error {
if async {
params := filtersInitializerParams{
filters: filters,
allowFilters: allowFilters,
blockFilters: blockFilters,
}
d.filtersInitializerLock.Lock() // prevent multiple writers from adding more than 1 task
@ -201,7 +205,7 @@ func (d *Dnsfilter) SetFilters(filters map[int]string, async bool) error {
return nil
}
err := d.initFiltering(filters)
err := d.initFiltering(allowFilters, blockFilters)
if err != nil {
log.Error("Can't initialize filtering subsystem: %s", err)
return err
@ -214,7 +218,7 @@ func (d *Dnsfilter) SetFilters(filters map[int]string, async bool) error {
func (d *Dnsfilter) filtersInitializer() {
for {
params := <-d.filtersInitializerChan
err := d.initFiltering(params.filters)
err := d.initFiltering(params.allowFilters, params.blockFilters)
if err != nil {
log.Error("Can't initialize filtering subsystem: %s", err)
continue
@ -224,9 +228,16 @@ func (d *Dnsfilter) filtersInitializer() {
// Close - close the object
func (d *Dnsfilter) Close() {
d.reset()
}
func (d *Dnsfilter) reset() {
if d.rulesStorage != nil {
_ = d.rulesStorage.Close()
}
if d.rulesStorageWhite != nil {
d.rulesStorageWhite.Close()
}
}
type dnsFilterContext struct {
@ -415,43 +426,42 @@ func fileExists(fn string) bool {
return true
}
// Initialize urlfilter objects
func (d *Dnsfilter) initFiltering(filters map[int]string) error {
func createFilteringEngine(filters []Filter) (*filterlist.RuleStorage, *urlfilter.DNSEngine, error) {
listArray := []filterlist.RuleList{}
for id, dataOrFilePath := range filters {
for _, f := range filters {
var list filterlist.RuleList
if id == 0 {
if f.ID == 0 {
list = &filterlist.StringRuleList{
ID: 0,
RulesText: dataOrFilePath,
RulesText: string(f.Data),
IgnoreCosmetic: true,
}
} else if !fileExists(dataOrFilePath) {
} else if !fileExists(f.FilePath) {
list = &filterlist.StringRuleList{
ID: id,
ID: int(f.ID),
IgnoreCosmetic: true,
}
} else if runtime.GOOS == "windows" {
// On Windows we don't pass a file to urlfilter because
// it's difficult to update this file while it's being used.
data, err := ioutil.ReadFile(dataOrFilePath)
data, err := ioutil.ReadFile(f.FilePath)
if err != nil {
return fmt.Errorf("ioutil.ReadFile(): %s: %s", dataOrFilePath, err)
return nil, nil, fmt.Errorf("ioutil.ReadFile(): %s: %s", f.FilePath, err)
}
list = &filterlist.StringRuleList{
ID: id,
ID: int(f.ID),
RulesText: string(data),
IgnoreCosmetic: true,
}
} else {
var err error
list, err = filterlist.NewFileRuleList(id, dataOrFilePath, true)
list, err = filterlist.NewFileRuleList(int(f.ID), f.FilePath, true)
if err != nil {
return fmt.Errorf("filterlist.NewFileRuleList(): %s: %s", dataOrFilePath, err)
return nil, nil, fmt.Errorf("filterlist.NewFileRuleList(): %s: %s", f.FilePath, err)
}
}
listArray = append(listArray, list)
@ -459,16 +469,28 @@ func (d *Dnsfilter) initFiltering(filters map[int]string) error {
rulesStorage, err := filterlist.NewRuleStorage(listArray)
if err != nil {
return fmt.Errorf("filterlist.NewRuleStorage(): %s", err)
return nil, nil, fmt.Errorf("filterlist.NewRuleStorage(): %s", err)
}
filteringEngine := urlfilter.NewDNSEngine(rulesStorage)
return rulesStorage, filteringEngine, nil
}
// Initialize urlfilter objects
func (d *Dnsfilter) initFiltering(allowFilters, blockFilters []Filter) error {
d.engineLock.Lock()
if d.rulesStorage != nil {
d.rulesStorage.Close()
d.reset()
rulesStorage, filteringEngine, err := createFilteringEngine(blockFilters)
if err != nil {
return err
}
rulesStorageWhite, filteringEngineWhite, err := createFilteringEngine(allowFilters)
if err != nil {
return err
}
d.rulesStorage = rulesStorage
d.filteringEngine = filteringEngine
d.rulesStorageWhite = rulesStorageWhite
d.filteringEngineWhite = filteringEngineWhite
d.engineLock.Unlock()
log.Debug("initialized filtering engine")
@ -481,6 +503,26 @@ func (d *Dnsfilter) matchHost(host string, qtype uint16, ctags []string) (Result
// Keep in mind that this lock must be held no just when calling Match()
// but also while using the rules returned by it.
defer d.engineLock.RUnlock()
if d.filteringEngineWhite != nil {
rr, ok := d.filteringEngineWhite.Match(host, ctags)
if ok {
var rule rules.Rule
if rr.NetworkRule != nil {
rule = rr.NetworkRule
} else if rr.HostRulesV4 != nil {
rule = rr.HostRulesV4[0]
} else if rr.HostRulesV6 != nil {
rule = rr.HostRulesV6[0]
}
log.Debug("Filtering: found whitelist rule for host '%s': '%s' list_id: %d",
host, rule.Text(), rule.GetFilterListID())
res := makeResult(rule, NotFilteredWhiteList)
return res, nil
}
}
if d.filteringEngine == nil {
return Result{}, nil
}
@ -493,37 +535,28 @@ func (d *Dnsfilter) matchHost(host string, qtype uint16, ctags []string) (Result
if rr.NetworkRule != nil {
log.Debug("Filtering: found rule for host '%s': '%s' list_id: %d",
host, rr.NetworkRule.Text(), rr.NetworkRule.GetFilterListID())
res := Result{}
res.FilterID = int64(rr.NetworkRule.GetFilterListID())
res.Rule = rr.NetworkRule.Text()
res.Reason = FilteredBlackList
res.IsFiltered = true
reason := FilteredBlackList
if rr.NetworkRule.Whitelist {
res.Reason = NotFilteredWhiteList
res.IsFiltered = false
reason = NotFilteredWhiteList
}
res := makeResult(rr.NetworkRule, reason)
return res, nil
}
if qtype == dns.TypeA && rr.HostRulesV4 != nil {
rule := rr.HostRulesV4[0] // note that we process only 1 matched rule
res := Result{}
res.FilterID = int64(rule.GetFilterListID())
res.Rule = rule.Text()
res.Reason = FilteredBlackList
res.IsFiltered = true
log.Debug("Filtering: found rule for host '%s': '%s' list_id: %d",
host, rule.Text(), rule.GetFilterListID())
res := makeResult(rule, FilteredBlackList)
res.IP = rule.IP.To4()
return res, nil
}
if qtype == dns.TypeAAAA && rr.HostRulesV6 != nil {
rule := rr.HostRulesV6[0] // note that we process only 1 matched rule
res := Result{}
res.FilterID = int64(rule.GetFilterListID())
res.Rule = rule.Text()
res.Reason = FilteredBlackList
res.IsFiltered = true
log.Debug("Filtering: found rule for host '%s': '%s' list_id: %d",
host, rule.Text(), rule.GetFilterListID())
res := makeResult(rule, FilteredBlackList)
res.IP = rule.IP
return res, nil
}
@ -531,17 +564,15 @@ func (d *Dnsfilter) matchHost(host string, qtype uint16, ctags []string) (Result
if rr.HostRulesV4 != nil || rr.HostRulesV6 != nil {
// Question Type doesn't match the host rules
// Return the first matched host rule, but without an IP address
res := Result{}
res.Reason = FilteredBlackList
res.IsFiltered = true
var rule rules.Rule
if rr.HostRulesV4 != nil {
rule = rr.HostRulesV4[0]
} else if rr.HostRulesV6 != nil {
rule = rr.HostRulesV6[0]
}
res.FilterID = int64(rule.GetFilterListID())
res.Rule = rule.Text()
log.Debug("Filtering: found rule for host '%s': '%s' list_id: %d",
host, rule.Text(), rule.GetFilterListID())
res := makeResult(rule, FilteredBlackList)
res.IP = net.IP{}
return res, nil
}
@ -549,8 +580,20 @@ func (d *Dnsfilter) matchHost(host string, qtype uint16, ctags []string) (Result
return Result{}, nil
}
// Construct Result object
func makeResult(rule rules.Rule, reason Reason) Result {
res := Result{}
res.FilterID = int64(rule.GetFilterListID())
res.Rule = rule.Text()
res.Reason = reason
if reason == FilteredBlackList {
res.IsFiltered = true
}
return res
}
// New creates properly initialized DNS Filter that is ready to be used
func New(c *Config, filters map[int]string) *Dnsfilter {
func New(c *Config, blockFilters []Filter) *Dnsfilter {
if c != nil {
cacheConf := cache.Config{
@ -588,8 +631,8 @@ func New(c *Config, filters map[int]string) *Dnsfilter {
d.prepareRewrites()
}
if filters != nil {
err := d.initFiltering(filters)
if blockFilters != nil {
err := d.initFiltering(nil, blockFilters)
if err != nil {
log.Error("Can't initialize filtering subsystem: %s", err)
d.Close()

View File

@ -42,7 +42,7 @@ func _Func() string {
return path.Base(f.Name())
}
func NewForTest(c *Config, filters map[int]string) *Dnsfilter {
func NewForTest(c *Config, filters []Filter) *Dnsfilter {
setts = RequestFilteringSettings{}
setts.FilteringEnabled = true
if c != nil {
@ -106,8 +106,9 @@ func TestEtcHostsMatching(t *testing.T) {
::1 host2
`,
addr, addr6)
filters := make(map[int]string)
filters[0] = text
filters := []Filter{Filter{
ID: 0, Data: []byte(text),
}}
d := NewForTest(nil, filters)
defer d.Close()
@ -404,8 +405,9 @@ var tests = []struct {
func TestMatching(t *testing.T) {
for _, test := range tests {
t.Run(fmt.Sprintf("%s-%s", test.testname, test.hostname), func(t *testing.T) {
filters := make(map[int]string)
filters[0] = test.rules
filters := []Filter{Filter{
ID: 0, Data: []byte(test.rules),
}}
d := NewForTest(nil, filters)
defer d.Close()
@ -423,6 +425,38 @@ func TestMatching(t *testing.T) {
}
}
func TestWhitelist(t *testing.T) {
rules := `||host1^
||host2^
`
filters := []Filter{Filter{
ID: 0, Data: []byte(rules),
}}
whiteRules := `||host1^
||host3^
`
whiteFilters := []Filter{Filter{
ID: 0, Data: []byte(whiteRules),
}}
d := NewForTest(nil, filters)
d.SetFilters(filters, whiteFilters, false)
defer d.Close()
// matched by white filter
ret, err := d.CheckHost("host1", dns.TypeA, &setts)
assert.True(t, err == nil)
assert.True(t, !ret.IsFiltered && ret.Reason == NotFilteredWhiteList)
assert.True(t, ret.Rule == "||host1^")
// not matched by white filter, but matched by block filter
ret, err = d.CheckHost("host2", dns.TypeA, &setts)
assert.True(t, err == nil)
assert.True(t, ret.IsFiltered && ret.Reason == FilteredBlackList)
assert.True(t, ret.Rule == "||host2^")
}
// CLIENT SETTINGS
func applyClientSettings(setts *RequestFilteringSettings) {
@ -441,8 +475,9 @@ func applyClientSettings(setts *RequestFilteringSettings) {
// then apply per-client settings and check behaviour once again
func TestClientSettings(t *testing.T) {
var r Result
filters := make(map[int]string)
filters[0] = "||example.org^\n"
filters := []Filter{Filter{
ID: 0, Data: []byte("||example.org^\n"),
}}
d := NewForTest(&Config{ParentalEnabled: true, SafeBrowsingEnabled: false}, filters)
defer d.Close()

View File

@ -455,8 +455,9 @@ func TestNullBlockedRequest(t *testing.T) {
func TestBlockedCustomIP(t *testing.T) {
rules := "||nxdomain.example.org^\n||null.example.org^\n127.0.0.1 host.example.org\n@@||whitelist.example.org^\n||127.0.0.255\n"
filters := map[int]string{}
filters[0] = rules
filters := []dnsfilter.Filter{dnsfilter.Filter{
ID: 0, Data: []byte(rules),
}}
c := dnsfilter.Config{}
f := dnsfilter.New(&c, filters)
@ -597,8 +598,9 @@ func createTestServer(t *testing.T) *Server {
127.0.0.1 host.example.org
@@||whitelist.example.org^
||127.0.0.255`
filters := map[int]string{}
filters[0] = rules
filters := []dnsfilter.Filter{dnsfilter.Filter{
ID: 0, Data: []byte(rules),
}}
c := dnsfilter.Config{}
c.SafeBrowsingEnabled = true
c.SafeBrowsingCacheSize = 1000

View File

@ -58,11 +58,14 @@ type configuration struct {
// An active session is automatically refreshed once a day.
WebSessionTTLHours uint32 `yaml:"web_session_ttl"`
DNS dnsConfig `yaml:"dns"`
TLS tlsConfig `yaml:"tls"`
Filters []filter `yaml:"filters"`
UserRules []string `yaml:"user_rules"`
DHCP dhcpd.ServerConfig `yaml:"dhcp"`
DNS dnsConfig `yaml:"dns"`
TLS tlsConfig `yaml:"tls"`
Filters []filter `yaml:"filters"`
WhitelistFilters []filter `yaml:"whitelist_filters"`
UserRules []string `yaml:"user_rules"`
DHCP dhcpd.ServerConfig `yaml:"dhcp"`
// Note: this array is filled only before file read/write and then it's cleared
Clients []clientObject `yaml:"clients"`

View File

@ -28,8 +28,9 @@ func IsValidURL(rawurl string) bool {
}
type filterAddJSON struct {
Name string `json:"name"`
URL string `json:"url"`
Name string `json:"name"`
URL string `json:"url"`
Whitelist bool `json:"whitelist"`
}
func handleFilteringAddURL(w http.ResponseWriter, r *http.Request) {
@ -56,6 +57,7 @@ func handleFilteringAddURL(w http.ResponseWriter, r *http.Request) {
Enabled: true,
URL: fj.URL,
Name: fj.Name,
white: fj.Whitelist,
}
f.ID = assignUniqueFilterID()
@ -82,7 +84,6 @@ func handleFilteringAddURL(w http.ResponseWriter, r *http.Request) {
}
// URL is deemed valid, append it to filters, update config, write new filter file and tell dns to reload it
// TODO: since we directly feed filters in-memory, revisit if writing configs is always necessary
if !filterAdd(f) {
httpError(w, http.StatusBadRequest, "Filter URL already added -- %s", f.URL)
return
@ -100,7 +101,8 @@ func handleFilteringAddURL(w http.ResponseWriter, r *http.Request) {
func handleFilteringRemoveURL(w http.ResponseWriter, r *http.Request) {
type request struct {
URL string `json:"url"`
URL string `json:"url"`
Whitelist bool `json:"whitelist"`
}
req := request{}
err := json.NewDecoder(r.Body).Decode(&req)
@ -117,7 +119,11 @@ func handleFilteringRemoveURL(w http.ResponseWriter, r *http.Request) {
// go through each element and delete if url matches
config.Lock()
newFilters := []filter{}
for _, filter := range config.Filters {
filters := &config.Filters
if req.Whitelist {
filters = &config.WhitelistFilters
}
for _, filter := range *filters {
if filter.URL != req.URL {
newFilters = append(newFilters, filter)
} else {
@ -128,7 +134,7 @@ func handleFilteringRemoveURL(w http.ResponseWriter, r *http.Request) {
}
}
// Update the configuration after removing filter files
config.Filters = newFilters
*filters = newFilters
config.Unlock()
onConfigModified()
@ -145,8 +151,9 @@ type filterURLJSON struct {
}
type filterURLReq struct {
URL string `json:"url"`
Data filterURLJSON `json:"data"`
URL string `json:"url"`
Whitelist bool `json:"whitelist"`
Data filterURLJSON `json:"data"`
}
func handleFilteringSetURL(w http.ResponseWriter, r *http.Request) {
@ -167,7 +174,7 @@ func handleFilteringSetURL(w http.ResponseWriter, r *http.Request) {
Name: fj.Data.Name,
URL: fj.Data.URL,
}
status := filterSetProperties(fj.URL, f)
status := filterSetProperties(fj.URL, f, fj.Whitelist)
if (status & statusFound) == 0 {
http.Error(w, "URL doesn't exist", http.StatusBadRequest)
return
@ -210,14 +217,27 @@ func handleFilteringSetRules(w http.ResponseWriter, r *http.Request) {
}
func handleFilteringRefresh(w http.ResponseWriter, r *http.Request) {
type Resp struct {
Updated int `json:"updated"`
}
resp := Resp{}
var err error
Context.controlLock.Unlock()
nUpdated, err := refreshFilters()
resp.Updated, err = refreshFilters()
Context.controlLock.Lock()
if err != nil {
httpError(w, http.StatusInternalServerError, "%s", err)
return
}
fmt.Fprintf(w, "OK %d filters updated\n", nUpdated)
js, err := json.Marshal(resp)
if err != nil {
httpError(w, http.StatusInternalServerError, "json encode: %s", err)
return
}
w.Header().Set("Content-Type", "application/json")
_, _ = w.Write(js)
}
type filterJSON struct {
@ -230,10 +250,27 @@ type filterJSON struct {
}
type filteringConfig struct {
Enabled bool `json:"enabled"`
Interval uint32 `json:"interval"` // in hours
Filters []filterJSON `json:"filters"`
UserRules []string `json:"user_rules"`
Enabled bool `json:"enabled"`
Interval uint32 `json:"interval"` // in hours
Filters []filterJSON `json:"filters"`
WhitelistFilters []filterJSON `json:"whitelist_filters"`
UserRules []string `json:"user_rules"`
}
func filterToJSON(f filter) filterJSON {
fj := filterJSON{
ID: f.ID,
Enabled: f.Enabled,
URL: f.URL,
Name: f.Name,
RulesCount: uint32(f.RulesCount),
}
if !f.LastUpdated.IsZero() {
fj.LastUpdated = f.LastUpdated.Format(time.RFC3339)
}
return fj
}
// Get filtering configuration
@ -243,20 +280,13 @@ func handleFilteringStatus(w http.ResponseWriter, r *http.Request) {
resp.Enabled = config.DNS.FilteringEnabled
resp.Interval = config.DNS.FiltersUpdateIntervalHours
for _, f := range config.Filters {
fj := filterJSON{
ID: f.ID,
Enabled: f.Enabled,
URL: f.URL,
Name: f.Name,
RulesCount: uint32(f.RulesCount),
}
if !f.LastUpdated.IsZero() {
fj.LastUpdated = f.LastUpdated.Format(time.RFC3339)
}
fj := filterToJSON(f)
resp.Filters = append(resp.Filters, fj)
}
for _, f := range config.WhitelistFilters {
fj := filterToJSON(f)
resp.WhitelistFilters = append(resp.WhitelistFilters, fj)
}
resp.UserRules = config.UserRules
config.RUnlock()

View File

@ -10,6 +10,7 @@ import (
"strconv"
"strings"
"sync"
"sync/atomic"
"time"
"github.com/AdguardTeam/AdGuardHome/dnsfilter"
@ -26,9 +27,11 @@ var (
)
func initFiltering() {
loadFilters()
loadFilters(config.Filters)
loadFilters(config.WhitelistFilters)
deduplicateFilters()
updateUniqueFilterID(config.Filters)
updateUniqueFilterID(config.WhitelistFilters)
}
func startFiltering() {
@ -55,6 +58,7 @@ type filter struct {
RulesCount int `yaml:"-"`
LastUpdated time.Time `yaml:"-"`
checksum uint32 // checksum of the file data
white bool
dnsfilter.Filter `yaml:",inline"`
}
@ -78,13 +82,18 @@ const (
// Update properties for a filter specified by its URL
// Return status* flags.
func filterSetProperties(url string, newf filter) int {
func filterSetProperties(url string, newf filter, whitelist bool) int {
r := 0
config.Lock()
defer config.Unlock()
for i := range config.Filters {
f := &config.Filters[i]
filters := &config.Filters
if whitelist {
filters = &config.WhitelistFilters
}
for i := range *filters {
f := &(*filters)[i]
if f.URL != url {
continue
}
@ -134,41 +143,44 @@ func filterExists(url string) bool {
return r
}
// Return TRUE if a filter with this URL exists
func filterExistsNoLock(url string) bool {
r := false
for i := range config.Filters {
if config.Filters[i].URL == url {
r = true
break
for _, f := range config.Filters {
if f.URL == url {
return true
}
}
return r
for _, f := range config.WhitelistFilters {
if f.URL == url {
return true
}
}
return false
}
// Add a filter
// Return FALSE if a filter with this URL exists
func filterAdd(f filter) bool {
config.Lock()
defer config.Unlock()
// Check for duplicates
for i := range config.Filters {
if config.Filters[i].URL == f.URL {
config.Unlock()
return false
}
if filterExistsNoLock(f.URL) {
return false
}
config.Filters = append(config.Filters, f)
config.Unlock()
if f.white {
config.WhitelistFilters = append(config.WhitelistFilters, f)
} else {
config.Filters = append(config.Filters, f)
}
return true
}
// Load filters from the disk
// And if any filter has zero ID, assign a new one
func loadFilters() {
for i := range config.Filters {
filter := &config.Filters[i] // otherwise we're operating on a copy
func loadFilters(array []filter) {
for i := range array {
filter := &array[i] // otherwise we're operating on a copy
if filter.ID == 0 {
filter.ID = assignUniqueFilterID()
}
@ -223,8 +235,7 @@ func periodicallyRefreshFilters() {
intval := 5 // use a dynamically increasing time interval
for {
isNetworkErr := false
if config.DNS.FiltersUpdateIntervalHours != 0 && refreshStatus == 0 {
refreshStatus = 1
if config.DNS.FiltersUpdateIntervalHours != 0 && atomic.CompareAndSwapUint32(&refreshStatus, 0, 1) {
refreshLock.Lock()
_, isNetworkErr = refreshFiltersIfNecessary(false)
refreshLock.Unlock()
@ -247,11 +258,10 @@ func periodicallyRefreshFilters() {
// Refresh filters
func refreshFilters() (int, error) {
if refreshStatus != 0 { // we could use atomic cmpxchg here, but it's not really required
if !atomic.CompareAndSwapUint32(&refreshStatus, 0, 1) {
return 0, fmt.Errorf("Filters update procedure is already running")
}
refreshStatus = 1
refreshLock.Lock()
nUpdated, _ := refreshFiltersIfNecessary(true)
refreshLock.Unlock()
@ -561,21 +571,39 @@ func (filter *filter) LastTimeUpdated() time.Time {
}
func enableFilters(async bool) {
var filters map[int]string
var filters []dnsfilter.Filter
var whiteFilters []dnsfilter.Filter
if config.DNS.FilteringEnabled {
// convert array of filters
filters = make(map[int]string)
userFilter := userFilter()
filters[int(userFilter.ID)] = string(userFilter.Data)
f := dnsfilter.Filter{
ID: userFilter.ID,
Data: userFilter.Data,
}
filters = append(filters, f)
for _, filter := range config.Filters {
if !filter.Enabled {
continue
}
filters[int(filter.ID)] = filter.Path()
f := dnsfilter.Filter{
ID: filter.ID,
FilePath: filter.Path(),
}
filters = append(filters, f)
}
for _, filter := range config.WhitelistFilters {
if !filter.Enabled {
continue
}
f := dnsfilter.Filter{
ID: filter.ID,
FilePath: filter.Path(),
}
whiteFilters = append(whiteFilters, f)
}
}
_ = Context.dnsFilter.SetFilters(filters, async)
_ = Context.dnsFilter.SetFilters(filters, whiteFilters, async)
}

View File

@ -572,7 +572,9 @@ paths:
If you ever find yourself using `force` to make something work that otherwise wont, this is a bug and report it accordingly.
responses:
200:
description: OK with how many filters were actually updated
description: OK
schema:
$ref: "#/definitions/FilterRefreshResponse"
/filtering/set_rules:
post:
@ -1230,6 +1232,13 @@ definitions:
type: "string"
description: "Set if reason=ReasonRewrite"
FilterRefreshResponse:
type: "object"
description: "/filtering/refresh response data"
properties:
updated:
type: "integer"
GetVersionRequest:
type: "object"
description: "/version.json request data"