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 .DS_Store
/.vscode /.vscode
/.idea .idea
/AdGuardHome /AdGuardHome
/AdGuardHome.exe /AdGuardHome.exe
/AdGuardHome.yaml /AdGuardHome.yaml

View file

@ -55,7 +55,10 @@ Contents:
* Filters update mechanism * Filters update mechanism
* API: Get filtering parameters * API: Get filtering parameters
* API: Set filtering parameters * API: Set filtering parameters
* API: Refresh filters
* API: Add Filter
* API: Set URL parameters * API: Set URL parameters
* API: Delete URL
* API: Domain Check * API: Domain Check
* Log-in page * Log-in page
* API: Log in * 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":["...", ...] "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 ### API: Set filtering parameters
@ -1382,6 +1399,38 @@ Response:
200 OK 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 ### API: Set URL parameters
Request: Request:
@ -1390,6 +1439,7 @@ Request:
{ {
"url": "..." "url": "..."
"whitelist": true
"data": { "data": {
"name": "..." "name": "..."
"url": "..." "url": "..."
@ -1402,6 +1452,22 @@ Response:
200 OK 200 OK
### API: Delete URL
Request:
POST /control/filtering/remove_url
{
"url": "..."
"whitelist": true
}
Response:
200 OK
### API: Domain Check ### API: Domain Check
Check if host name is filtered. Check if host name is filtered.

View file

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

View file

@ -122,22 +122,17 @@
"enabled_save_search_toast": "Vypnuté bezpečné vyhledávání", "enabled_save_search_toast": "Vypnuté bezpečné vyhledávání",
"enabled_table_header": "Zapnuto", "enabled_table_header": "Zapnuto",
"name_table_header": "Název", "name_table_header": "Název",
"filter_url_table_header": "URL filtru",
"rules_count_table_header": "Počet pravidel", "rules_count_table_header": "Počet pravidel",
"last_time_updated_table_header": "Čas poslední aktualizace", "last_time_updated_table_header": "Čas poslední aktualizace",
"actions_table_header": "Akce", "actions_table_header": "Akce",
"edit_table_action": "Upravit", "edit_table_action": "Upravit",
"delete_table_action": "Vymazat", "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ů.", "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", "cancel_btn": "Zrušit",
"enter_name_hint": "Zadejte název", "enter_name_hint": "Zadejte název",
"enter_url_hint": "Zadejte URL", "enter_url_hint": "Zadejte URL",
"check_updates_btn": "Zkontrolovat aktualizace", "check_updates_btn": "Zkontrolovat aktualizace",
"new_filter_btn": "Odběr nového filtru", "form_error_url_format": "Neplatný formát URL",
"enter_valid_filter_url": "Zadejte platnou URL pro odběr filtru nebo hostitelského souboru.",
"custom_filter_rules": "Vlastní pravidla filtrování", "custom_filter_rules": "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ů.", "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", "examples_title": "Příklady",
@ -153,7 +148,6 @@
"example_upstream_doh": "šifrovaný <0>DNS přes HTTPS</0>", "example_upstream_doh": "šifrovaný <0>DNS přes HTTPS</0>",
"example_upstream_sdns": "můžete použít <0>DNS razítka</0> pro <1>DNSCrypt</1> nebo <2>DNS přes HTTPS</2> řešitele", "example_upstream_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)", "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", "updated_upstream_dns_toast": "Aktualizované upstream DNS servery",
"dns_test_ok_toast": "Specifikované DNS servery pracují správně", "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", "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ší", "next_btn": "Další",
"loading_table_status": "Načítání...", "loading_table_status": "Načítání...",
"page_table_footer_text": "Stránka", "page_table_footer_text": "Stránka",
"of_table_footer_text": "z",
"rows_table_footer_text": "řádky", "rows_table_footer_text": "řádky",
"updated_custom_filtering_toast": "Aktualizovaná vlastní pravidla filtrování", "updated_custom_filtering_toast": "Aktualizovaná vlastní pravidla filtrování",
"rule_removed_from_custom_filtering_toast": "Pravidlo odstraněno z vlastních pravidel filtrování", "rule_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", "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", "dns_config": "Konfigurace serveru DNS",
"blocking_mode": "Režim blokování", "blocking_mode": "Režim blokování",
"default": "Výchozí",
"nxdomain": "NXDOMAIN", "nxdomain": "NXDOMAIN",
"null_ip": "Nulová IP", "null_ip": "Nulová IP",
"custom_ip": "Vlastní 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)", "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_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_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>.", "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", "source_label": "Zdroj",
"found_in_known_domain_db": "Nalezeno v databázi známých domén", "found_in_known_domain_db": "Nalezeno v databázi známých domén",
"category_label": "Kategorie", "category_label": "Kategorie",
"rule_label": "Pravidlo", "rule_label": "Pravidlo",
"filter_label": "Filtr",
"unknown_filter": "Neznámý filtr {{filterId}}", "unknown_filter": "Neznámý filtr {{filterId}}",
"install_welcome_title": "Vítejte v AdGuard Home!", "install_welcome_title": "Vítejte v AdGuard Home!",
"install_welcome_desc": "AdGuard Home je síťový DNS server pro blokování reklam a slídičů. Jeho cílem je, abyste ovládali celou Vaši síť a všechny Vaše zařízení, přičemž se nevyžaduje použití jakéhokoliv programu na straně klienta.", "install_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_edit": "Upravit klienta",
"client_identifier": "Identifikátor", "client_identifier": "Identifikátor",
"ip_address": "IP adresa", "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_ip": "Zadejte IP",
"form_enter_mac": "Zadejte MAC", "form_enter_mac": "Zadejte MAC",
"form_enter_id": "Zadejte identifikátor", "form_enter_id": "Zadejte identifikátor",
@ -333,7 +329,6 @@
"client_updated": "Klient \"{{key}}\" byl úspěšně aktualizován", "client_updated": "Klient \"{{key}}\" byl úspěšně aktualizován",
"clients_not_found": "Nenalezeni žádní klienti", "clients_not_found": "Nenalezeni žádní klienti",
"client_confirm_delete": "Opravdu chcete odstranit klienta \"{{key}}\"?", "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_title": "Klienti (doba spuštění)",
"auto_clients_desc": "Data o klientech, kteří používají AdGuard Home, ale nejsou uloženi v konfiguraci", "auto_clients_desc": "Data o klientech, kteří používají AdGuard Home, ale nejsou uloženi v konfiguraci",
"access_title": "Nastavení přístupu", "access_title": "Nastavení přístupu",
@ -399,7 +394,6 @@
"interval_days_plural": "Dny: {{count}}", "interval_days_plural": "Dny: {{count}}",
"domain": "Doména", "domain": "Doména",
"answer": "Odpověď", "answer": "Odpověď",
"filter_added_successfully": "Filtr byl úspěšně přidán",
"statistics_configuration": "Konfigurace statistik", "statistics_configuration": "Konfigurace statistik",
"statistics_retention": "Uchovávání statistik", "statistics_retention": "Uchovávání statistik",
"statistics_retention_desc": "Pokud hodnotu intervalu snížíte, některá data budou ztracena", "statistics_retention_desc": "Pokud hodnotu intervalu snížíte, některá data budou ztracena",
@ -431,5 +425,33 @@
"try_again": "Zkusit znovu", "try_again": "Zkusit znovu",
"domain_desc": "Zadejte název domény nebo zástupný znak, který chcete přepsat.", "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_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_save_search_toast": "Sikker søgning aktiveret",
"enabled_table_header": "Aktiveret", "enabled_table_header": "Aktiveret",
"name_table_header": "Navn", "name_table_header": "Navn",
"filter_url_table_header": "Filter URL",
"rules_count_table_header": "Antal regler", "rules_count_table_header": "Antal regler",
"last_time_updated_table_header": "Sidst opdateret", "last_time_updated_table_header": "Sidst opdateret",
"actions_table_header": "Handlinger", "actions_table_header": "Handlinger",
"edit_table_action": "Rediger", "edit_table_action": "Rediger",
"delete_table_action": "Slet", "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.", "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", "cancel_btn": "Annuller",
"enter_name_hint": "Indtast navn", "enter_name_hint": "Indtast navn",
"enter_url_hint": "Indtast URL", "enter_url_hint": "Indtast URL",
"check_updates_btn": "Søg efter opdateringer", "check_updates_btn": "Søg efter opdateringer",
"new_filter_btn": "Nyt filterabonnement", "form_error_url_format": "Ugyldigt url-format",
"enter_valid_filter_url": "Indtast en gyldig URL til et filterabonnementet eller en værtsfil.",
"custom_filter_rules": "Brugerdefinerede filtreringsregler", "custom_filter_rules": "Brugerdefinerede filtreringsregler",
"custom_filter_rules_hint": "Indtast en regel per linje. Du kan enten bruge annonceblokeringsregler eller værtsfilsyntaks.", "custom_filter_rules_hint": "Indtast en regel per linje. Du kan enten bruge annonceblokeringsregler eller værtsfilsyntaks.",
"examples_title": "Eksempler", "examples_title": "Eksempler",
@ -153,7 +148,6 @@
"example_upstream_doh": "krypteret <0>DNS-over-HTTPS</0>", "example_upstream_doh": "krypteret <0>DNS-over-HTTPS</0>",
"example_upstream_sdns": "du kan bruge <0>DNS Stamps<0> til <1>DNSCrypt>/1> eller <2>DNS-over-HTTPS</2> resolvers", "example_upstream_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)", "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", "updated_upstream_dns_toast": "Opdaterede upstream DNS-servere",
"dns_test_ok_toast": "De angivne DNS-servere fungerer korrekt", "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", "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", "next_btn": "Næste",
"loading_table_status": "Indlæser...", "loading_table_status": "Indlæser...",
"page_table_footer_text": "Side", "page_table_footer_text": "Side",
"of_table_footer_text": "af",
"rows_table_footer_text": "rækker", "rows_table_footer_text": "rækker",
"updated_custom_filtering_toast": "De brugerdefinerede filtreringsregler er blevet opdateret", "updated_custom_filtering_toast": "De brugerdefinerede filtreringsregler er blevet opdateret",
"rule_removed_from_custom_filtering_toast": "Regel fjernet fra de brugerdefinerede filtreringsregler", "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", "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", "dns_config": "DNS-serverkonfiguration",
"blocking_mode": "Blokeringstilstand", "blocking_mode": "Blokeringstilstand",
"default": "Standard",
"nxdomain": "NXDOMAIN", "nxdomain": "NXDOMAIN",
"null_ip": "Null IP", "null_ip": "Null IP",
"custom_ip": "Tilpasset 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)", "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_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_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>.", "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", "source_label": "Kilde",
"found_in_known_domain_db": "Fundet i databasen med kendte domæner.", "found_in_known_domain_db": "Fundet i databasen med kendte domæner.",
"category_label": "Kategori", "category_label": "Kategori",
"rule_label": "Regel", "rule_label": "Regel",
"filter_label": "Filter",
"unknown_filter": "Ukendt filter {{filterId}}", "unknown_filter": "Ukendt filter {{filterId}}",
"install_welcome_title": "Velkommen til AdGuard Home!", "install_welcome_title": "Velkommen til AdGuard Home!",
"install_welcome_desc": "AdGuard Home er en netværksbaseret annonce-og-tracker blokerende DNS-server. Formålet er at lade dig kontrollere hele dit netværk og alle dine enheder, og det kræver ikke at man bruger klientsoftware.", "install_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_edit": "Rediger Klient",
"client_identifier": "Identifikator", "client_identifier": "Identifikator",
"ip_address": "IP-adresse", "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_ip": "Indtast IP",
"form_enter_mac": "Indtast MAC", "form_enter_mac": "Indtast MAC",
"form_enter_id": "Indtast identifikator", "form_enter_id": "Indtast identifikator",
@ -333,7 +329,6 @@
"client_updated": "Klient \"{{key}}\" succesfuldt opdateret", "client_updated": "Klient \"{{key}}\" succesfuldt opdateret",
"clients_not_found": "Ingen klienter fundet", "clients_not_found": "Ingen klienter fundet",
"client_confirm_delete": "Er du sikker på, at du vil slette klient \"{{key}}\"?", "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_title": "Klienter (runtime)",
"auto_clients_desc": "Data om de klienter, der bruger AdGuard Home, men ikke gemt i konfigurationen", "auto_clients_desc": "Data om de klienter, der bruger AdGuard Home, men ikke gemt i konfigurationen",
"access_title": "Adgangsindstillinger", "access_title": "Adgangsindstillinger",
@ -399,7 +394,6 @@
"interval_days_plural": "{{count}} dage", "interval_days_plural": "{{count}} dage",
"domain": "Domæne", "domain": "Domæne",
"answer": "Svar", "answer": "Svar",
"filter_added_successfully": "Filtret er blevet tilføjet",
"statistics_configuration": "Konfiguration af statistik", "statistics_configuration": "Konfiguration af statistik",
"statistics_retention": "Tilbageholdelse af statistikker", "statistics_retention": "Tilbageholdelse af statistikker",
"statistics_retention_desc": "Hvis du mindsker intervalværdien, vil nogle data gå tabt", "statistics_retention_desc": "Hvis du mindsker intervalværdien, vil nogle data gå tabt",
@ -431,5 +425,33 @@
"try_again": "Prøv igen", "try_again": "Prøv igen",
"domain_desc": "Indtast det domænenavn eller wildcard, du ønsker skal omskrives.", "domain_desc": "Indtast det domænenavn eller wildcard, du ønsker skal omskrives.",
"example_rewrite_domain": "omskriv kun svar for dette domænenavn.", "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_save_search_toast": "SafeSearch aktiviert",
"enabled_table_header": "Aktiviert", "enabled_table_header": "Aktiviert",
"name_table_header": "Name", "name_table_header": "Name",
"filter_url_table_header": "Filter-URL",
"rules_count_table_header": "Anzahl Regeln", "rules_count_table_header": "Anzahl Regeln",
"last_time_updated_table_header": "Letztes Update", "last_time_updated_table_header": "Letztes Update",
"actions_table_header": "Aktionen", "actions_table_header": "Aktionen",
"edit_table_action": "Bearbeiten", "edit_table_action": "Bearbeiten",
"delete_table_action": "Löschen", "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.", "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", "cancel_btn": "Abbrechen",
"enter_name_hint": "Name eingeben", "enter_name_hint": "Name eingeben",
"enter_url_hint": "URL 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": "Benutzerdefinierte Filterregeln",
"custom_filter_rules_hint": "Geben Sie pro Zeile eine Regel ein. Sie können entweder Werbefilterregeln oder Host-Datei-Syntax verwenden.", "custom_filter_rules_hint": "Geben Sie pro Zeile eine Regel ein. Sie können entweder Werbefilterregeln oder Host-Datei-Syntax verwenden.",
"examples_title": "Beispiele", "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_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_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)", "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", "updated_upstream_dns_toast": "Upstream-DNS-Server wurden aktualisiert",
"dns_test_ok_toast": "Angegebene DNS-Server arbeiten ordnungsgemäß", "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", "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", "next_btn": "Nächste",
"loading_table_status": "Laden...", "loading_table_status": "Laden...",
"page_table_footer_text": "Seite", "page_table_footer_text": "Seite",
"of_table_footer_text": "von",
"rows_table_footer_text": "Reihen", "rows_table_footer_text": "Reihen",
"updated_custom_filtering_toast": "Die benutzerdefinierten Filterregeln wurden aktualisiert", "updated_custom_filtering_toast": "Die benutzerdefinierten Filterregeln wurden aktualisiert",
"rule_removed_from_custom_filtering_toast": "Regel wurde aus den benutzerdefinierten Filterregeln entfernt", "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)", "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_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_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.", "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", "source_label": "Quelle",
"found_in_known_domain_db": "In der Datenbank der bekannten Domains gefunden.", "found_in_known_domain_db": "In der Datenbank der bekannten Domains gefunden.",
"category_label": "Kategorie", "category_label": "Kategorie",
"rule_label": "Regel", "rule_label": "Regel",
"filter_label": "Filter",
"unknown_filter": "Unbekannter Filter {{filterId}}", "unknown_filter": "Unbekannter Filter {{filterId}}",
"install_welcome_title": "Willkommen bei AdGuard Home!", "install_welcome_title": "Willkommen bei AdGuard Home!",
"install_welcome_desc": "AdGuard Home ist ein netzwerkweiter Werbung- und Tracking sperrender DNS-Server. Sein Zweck ist es, Ihnen die Kontrolle über Ihr gesamtes Netzwerk und alle Ihre Geräte zu ermöglichen, und es ist nicht erforderlich, eine clientseitige Anwendung zu verwenden.", "install_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_edit": "Client bearbeiten",
"client_identifier": "Bezeichner", "client_identifier": "Bezeichner",
"ip_address": "IP-Adresse", "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_ip": "IP-Adresse eingeben",
"form_enter_mac": "MAC-Adresse eingeben", "form_enter_mac": "MAC-Adresse eingeben",
"form_enter_id": "Kennung eingeben", "form_enter_id": "Kennung eingeben",
@ -333,7 +321,6 @@
"client_updated": "Client „{{key}}” erfolgreich aktualisiert", "client_updated": "Client „{{key}}” erfolgreich aktualisiert",
"clients_not_found": "Keine Clients gefunden", "clients_not_found": "Keine Clients gefunden",
"client_confirm_delete": "Möchten Sie den Client „{{key}}” wirklich löschen?", "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_title": "Clients (Laufzeit)",
"auto_clients_desc": "Daten zu den Clients, die AdGuard Home verwenden, aber nicht in der Konfiguration gespeichert sind", "auto_clients_desc": "Daten zu den Clients, die AdGuard Home verwenden, aber nicht in der Konfiguration gespeichert sind",
"access_title": "Zugriffsrechte", "access_title": "Zugriffsrechte",
@ -399,7 +386,6 @@
"interval_days_plural": "{{count}} Tage", "interval_days_plural": "{{count}} Tage",
"domain": "Domain", "domain": "Domain",
"answer": "Antwort", "answer": "Antwort",
"filter_added_successfully": "Der Filter wurde erfolgreich hinzugefügt",
"statistics_configuration": "Statistikkonfiguration", "statistics_configuration": "Statistikkonfiguration",
"statistics_retention": "Statistiken speichern", "statistics_retention": "Statistiken speichern",
"statistics_retention_desc": "Wenn Sie Intervallwert verringern, werden einige Daten verloren gehen", "statistics_retention_desc": "Wenn Sie Intervallwert verringern, werden einige Daten verloren gehen",

View file

@ -105,6 +105,11 @@
"no_servers_specified": "No servers specified", "no_servers_specified": "No servers specified",
"general_settings": "General settings", "general_settings": "General settings",
"dns_settings": "DNS 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", "encryption_settings": "Encryption settings",
"dhcp_settings": "DHCP settings", "dhcp_settings": "DHCP settings",
"upstream_dns": "Upstream DNS servers", "upstream_dns": "Upstream DNS servers",
@ -122,23 +127,27 @@
"enabled_save_search_toast": "Enabled safe search", "enabled_save_search_toast": "Enabled safe search",
"enabled_table_header": "Enabled", "enabled_table_header": "Enabled",
"name_table_header": "Name", "name_table_header": "Name",
"filter_url_table_header": "Filter URL", "list_url_table_header": "List URL",
"rules_count_table_header": "Rules count", "rules_count_table_header": "Rules count",
"last_time_updated_table_header": "Last time updated", "last_time_updated_table_header": "Last time updated",
"actions_table_header": "Actions", "actions_table_header": "Actions",
"edit_table_action": "Edit", "edit_table_action": "Edit",
"delete_table_action": "Delete", "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.", "filters_and_hosts_hint": "AdGuard Home understands basic adblock rules and hosts files syntax.",
"no_filters_added": "No filters added", "no_blocklist_added": "No blocklists added",
"add_filter_btn": "Add filter", "no_whitelist_added": "No allowlists added",
"add_blocklist": "Add blocklist",
"add_allowlist": "Add allowlist",
"cancel_btn": "Cancel", "cancel_btn": "Cancel",
"enter_name_hint": "Enter name", "enter_name_hint": "Enter name",
"enter_url_hint": "Enter URL", "enter_url_hint": "Enter URL",
"check_updates_btn": "Check updates", "check_updates_btn": "Check for updates",
"new_filter_btn": "New filter subscription", "new_blocklist": "New blocklist",
"edit_filter_title": "Edit filter", "new_allowlist": "New allowlist",
"enter_valid_filter_url": "Enter a valid URL to a filter subscription or a hosts file.", "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", "form_error_url_format": "Invalid url format",
"custom_filter_rules": "Custom filtering rules", "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.", "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_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_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)", "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", "updated_upstream_dns_toast": "Updated the upstream DNS servers",
"dns_test_ok_toast": "Specified DNS servers are working correctly", "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", "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", "next_btn": "Next",
"loading_table_status": "Loading...", "loading_table_status": "Loading...",
"page_table_footer_text": "Page", "page_table_footer_text": "Page",
"of_table_footer_text": "of",
"rows_table_footer_text": "rows", "rows_table_footer_text": "rows",
"updated_custom_filtering_toast": "Updated the custom filtering rules", "updated_custom_filtering_toast": "Updated the custom filtering rules",
"rule_removed_from_custom_filtering_toast": "Rule removed from 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.", "found_in_known_domain_db": "Found in the known domains database.",
"category_label": "Category", "category_label": "Category",
"rule_label": "Rule", "rule_label": "Rule",
"filter_label": "Filter", "list_label": "List",
"unknown_filter": "Unknown filter {{filterId}}", "unknown_filter": "Unknown filter {{filterId}}",
"install_welcome_title": "Welcome to AdGuard Home!", "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.", "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", "client_updated": "Client \"{{key}}\" successfully updated",
"clients_not_found": "No clients found", "clients_not_found": "No clients found",
"client_confirm_delete": "Are you sure you want to delete client \"{{key}}\"?", "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_title": "Clients (runtime)",
"auto_clients_desc": "Data on the clients that use AdGuard Home, but not stored in the configuration", "auto_clients_desc": "Data on the clients that use AdGuard Home, but not stored in the configuration",
"access_title": "Access settings", "access_title": "Access settings",
@ -405,8 +413,8 @@
"interval_days_plural": "{{count}} days", "interval_days_plural": "{{count}} days",
"domain": "Domain", "domain": "Domain",
"answer": "Answer", "answer": "Answer",
"filter_added_successfully": "The filter has been successfully added", "filter_added_successfully": "The list has been successfully added",
"filter_updated": "The filter successfully updated", "filter_updated": "The list has been successfully updated",
"statistics_configuration": "Statistics configuration", "statistics_configuration": "Statistics configuration",
"statistics_retention": "Statistics retention", "statistics_retention": "Statistics retention",
"statistics_retention_desc": "If you decrease the interval value, some data will be lost", "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.", "example_rewrite_wildcard": "rewrite responses for all <0>example.org</0> subdomains.",
"disable_ipv6": "Disable IPv6", "disable_ipv6": "Disable IPv6",
"disable_ipv6_desc": "If this feature is enabled, all DNS queries for IPv6 addresses (type AAAA) will be dropped.", "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_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 to /run/systemd/resolve/resolv.conf</0> <0>Stop DNSStubListener (reload systemd-resolved service)</0>", "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 AdGuardHome by default.", "autofix_warning_result": "As a result all DNS requests from your system will be processed by AdGuard Home by default.",
"tags_title": "Tags", "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>", "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", "form_select_tags": "Select client tags",
@ -469,5 +477,7 @@
"install_static_ok": "Good news! The static IP address is already configured", "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_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?", "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", "enabled_dhcp": "Servidor DHCP habilitado",
"disabled_dhcp": "Servidor DHCP deshabilitado", "disabled_dhcp": "Servidor DHCP deshabilitado",
"dhcp_title": "Servidor DHCP (experimental)", "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_enable": "Habilitar servidor DHCP",
"dhcp_disable": "Deshabilitar 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 %.", "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_ip_addresses": "Direcciones IP",
"dhcp_table_hostname": "Nombre del host", "dhcp_table_hostname": "Nombre del host",
"dhcp_table_expires": "Expira", "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_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_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_added": "Asignación estática \"{{key}}\" añadido correctamente",
"dhcp_lease_deleted": "Asignación estática \"{{key}}\" eliminado correctamente", "dhcp_lease_deleted": "Asignación estática \"{{key}}\" eliminado correctamente",
"dhcp_new_static_lease": "Nueva asignación estática", "dhcp_new_static_lease": "Nueva asignación estática",
@ -122,22 +122,17 @@
"enabled_save_search_toast": "Búsqueda segura habilitada", "enabled_save_search_toast": "Búsqueda segura habilitada",
"enabled_table_header": "Habilitado", "enabled_table_header": "Habilitado",
"name_table_header": "Nombre", "name_table_header": "Nombre",
"filter_url_table_header": "URL del filtro",
"rules_count_table_header": "Número de reglas", "rules_count_table_header": "Número de reglas",
"last_time_updated_table_header": "Última actualización", "last_time_updated_table_header": "Última actualización",
"actions_table_header": "Acciones", "actions_table_header": "Acciones",
"edit_table_action": "Editar", "edit_table_action": "Editar",
"delete_table_action": "Eliminar", "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.", "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", "cancel_btn": "Cancelar",
"enter_name_hint": "Ingrese el nombre", "enter_name_hint": "Ingrese el nombre",
"enter_url_hint": "Ingrese la URL", "enter_url_hint": "Ingrese la URL",
"check_updates_btn": "Buscar actualizaciones", "check_updates_btn": "Buscar actualizaciones",
"new_filter_btn": "Nueva suscripción a filtro", "form_error_url_format": "Formato de URL no válido",
"enter_valid_filter_url": "Ingrese una URL válida para suscribirse a un filtro o archivo hosts.",
"custom_filter_rules": "Reglas de filtrado personalizado", "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.", "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", "examples_title": "Ejemplos",
@ -153,7 +148,6 @@
"example_upstream_doh": "cifrado <0>DNS mediante HTTPS</0>", "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_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)", "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", "updated_upstream_dns_toast": "Servidores DNS de subida actualizados",
"dns_test_ok_toast": "Los servidores DNS especificados funcionan correctamente", "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", "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", "next_btn": "Siguiente",
"loading_table_status": "Cargando...", "loading_table_status": "Cargando...",
"page_table_footer_text": "Página", "page_table_footer_text": "Página",
"of_table_footer_text": "de",
"rows_table_footer_text": "filas", "rows_table_footer_text": "filas",
"updated_custom_filtering_toast": "Reglas de filtrado personalizado actualizadas", "updated_custom_filtering_toast": "Reglas de filtrado personalizado actualizadas",
"rule_removed_from_custom_filtering_toast": "Regla eliminada de las reglas de filtrado personalizado", "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", "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", "dns_config": "Configuración del servidor DNS",
"blocking_mode": "Modo de bloqueo", "blocking_mode": "Modo de bloqueo",
"default": "Predeterminado",
"nxdomain": "NXDOMAIN", "nxdomain": "NXDOMAIN",
"null_ip": "IP nulo", "null_ip": "IP nulo",
"custom_ip": "IP personalizada", "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)", "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_ipv4_desc": "Dirección IP devolverá una petición A bloqueada",
"blocking_ipv6_desc": "Dirección IP devolverá una petición AAAA 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>.", "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", "source_label": "Fuente",
"found_in_known_domain_db": "Encontrado en la base de datos de dominios conocidos.", "found_in_known_domain_db": "Encontrado en la base de datos de dominios conocidos.",
"category_label": "Categoría", "category_label": "Categoría",
"rule_label": "Regla", "rule_label": "Regla",
"filter_label": "Filtro",
"unknown_filter": "Filtro desconocido {{filterId}}", "unknown_filter": "Filtro desconocido {{filterId}}",
"install_welcome_title": "¡Bienvenido a AdGuard Home!", "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_title": "Interfaz web de administración",
"install_settings_listen": "Interfaz de escucha", "install_settings_listen": "Interfaz de escucha",
"install_settings_port": "Puerto", "install_settings_port": "Puerto",
@ -267,7 +263,7 @@
"encryption_config_saved": "Configuración de cifrado guardado", "encryption_config_saved": "Configuración de cifrado guardado",
"encryption_server": "Nombre del servidor", "encryption_server": "Nombre del servidor",
"encryption_server_enter": "Ingrese su nombre de dominio", "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": "Redireccionar a HTTPS automáticamente",
"encryption_redirect_desc": "Si está marcado, AdGuard Home redireccionará automáticamente de HTTP a las direcciones HTTPS.", "encryption_redirect_desc": "Si está marcado, AdGuard Home redireccionará automáticamente de HTTP a las direcciones HTTPS.",
"encryption_https": "Puerto HTTPS", "encryption_https": "Puerto HTTPS",
@ -275,12 +271,12 @@
"encryption_dot": "Puerto DNS mediante TLS", "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_dot_desc": "Si este puerto está configurado, AdGuard Home ejecutará un servidor DNS mediante TLS en este puerto.",
"encryption_certificates": "Certificados", "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_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": "Copie/pegue aquí su certificado codificado PEM.", "encryption_certificates_input": "Copia/pega aquí tu certificado codificado PEM.",
"encryption_status": "Estado", "encryption_status": "Estado",
"encryption_expire": "Expira", "encryption_expire": "Expira",
"encryption_key": "Clave privada", "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": "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_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", "encryption_chain_valid": "La cadena de certificado es válida",
@ -291,8 +287,8 @@
"encryption_issuer": "Emisor", "encryption_issuer": "Emisor",
"encryption_hostnames": "Nombres de hosts", "encryption_hostnames": "Nombres de hosts",
"encryption_reset": "¿Está seguro de que desea restablecer la configuración de cifrado?", "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_expiring_certificate": "Tu 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_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_range": "Ingrese el valor del puerto en el rango de 80 a 65535",
"form_error_port_unsafe": "Este es un puerto inseguro", "form_error_port_unsafe": "Este es un puerto inseguro",
"form_error_equal": "No debería ser igual", "form_error_equal": "No debería ser igual",
@ -333,7 +329,6 @@
"client_updated": "Cliente \"{{key}}\" actualizado correctamente", "client_updated": "Cliente \"{{key}}\" actualizado correctamente",
"clients_not_found": "No se han encontrado clientes", "clients_not_found": "No se han encontrado clientes",
"client_confirm_delete": "¿Está seguro de que desea eliminar el cliente \"{{key}}\"?", "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_title": "Clientes (activos)",
"auto_clients_desc": "Datos de los clientes que utilizan AdGuard Home, pero no se almacenan en la configuración", "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", "access_title": "Configuración de acceso",
@ -399,7 +394,6 @@
"interval_days_plural": "{{count}} días", "interval_days_plural": "{{count}} días",
"domain": "Dominio", "domain": "Dominio",
"answer": "Respuesta", "answer": "Respuesta",
"filter_added_successfully": "El filtro ha sido añadido correctamente",
"statistics_configuration": "Configuración de estadísticas", "statistics_configuration": "Configuración de estadísticas",
"statistics_retention": "Retención de estadísticas", "statistics_retention": "Retención de estadísticas",
"statistics_retention_desc": "Si disminuye el valor del intervalo, algunos datos estarán perdidos", "statistics_retention_desc": "Si disminuye el valor del intervalo, algunos datos estarán perdidos",
@ -431,5 +425,33 @@
"try_again": "Volver a intentar", "try_again": "Volver a intentar",
"domain_desc": "Ingrese el nombre de dominio o comodín que desea reescribir.", "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_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_save_search_toast": "جستجوی اَمن فعال شده",
"enabled_table_header": "فعال شده", "enabled_table_header": "فعال شده",
"name_table_header": "نام", "name_table_header": "نام",
"filter_url_table_header": "فیلتر آدرس",
"rules_count_table_header": "تعداد دستور", "rules_count_table_header": "تعداد دستور",
"last_time_updated_table_header": "زمان آخرین بروزرسانی", "last_time_updated_table_header": "زمان آخرین بروزرسانی",
"actions_table_header": "اقدامات", "actions_table_header": "اقدامات",
"edit_table_action": "ويرايش", "edit_table_action": "ويرايش",
"delete_table_action": "حذف", "delete_table_action": "حذف",
"filters_and_hosts": "فیلترها و میزبان های لیست سیاه",
"filters_and_hosts_hint": "AdGuard Home دستورات پایه مسدودساز تبلیغ و نحو فایل های میزبان را درک می کند.", "filters_and_hosts_hint": "AdGuard Home دستورات پایه مسدودساز تبلیغ و نحو فایل های میزبان را درک می کند.",
"no_filters_added": "فیلتری اضافه نشده است",
"add_filter_btn": "افزودن فیلتر",
"cancel_btn": "لغو", "cancel_btn": "لغو",
"enter_name_hint": "نام را وارد کنید", "enter_name_hint": "نام را وارد کنید",
"enter_url_hint": "آدرس را وارد کنید...", "enter_url_hint": "آدرس را وارد کنید...",
"check_updates_btn": "بررسی بروز رسانی",
"new_filter_btn": "اشتراک فیلتر جدید",
"enter_valid_filter_url": "آدرس معتبر برای اشتراک در فیلتر یا فایل میزبان وارد کنید.",
"custom_filter_rules": "دستورات فیلترینگ دستی", "custom_filter_rules": "دستورات فیلترینگ دستی",
"custom_filter_rules_hint": "یک دستور در خط وارد کنید.میتوانید از دستورات مسدودساز تبلیغ یا نحو فایل های میزبان استفاده کنید.", "custom_filter_rules_hint": "یک دستور در خط وارد کنید.میتوانید از دستورات مسدودساز تبلیغ یا نحو فایل های میزبان استفاده کنید.",
"examples_title": "مثال ها", "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_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_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)", "example_upstream_tcp": "DNS عادی (بر TCP)",
"all_filters_up_to_date_toast": "همه فیلترها از قبل بروز رسانی شده است",
"updated_upstream_dns_toast": "سرورهای DNS جریان ارسالی بروز رسانی شده است", "updated_upstream_dns_toast": "سرورهای DNS جریان ارسالی بروز رسانی شده است",
"dns_test_ok_toast": "سرورهای DNS تعیین شده بدرستی کار می کنند", "dns_test_ok_toast": "سرورهای DNS تعیین شده بدرستی کار می کنند",
"dns_test_not_ok_toast": "سرور \"{{key}}\": نمیتواند مورد استفاده قرار گیرد،لطفا بررسی کنید آن را بدرستی نوشته اید", "dns_test_not_ok_toast": "سرور \"{{key}}\": نمیتواند مورد استفاده قرار گیرد،لطفا بررسی کنید آن را بدرستی نوشته اید",
@ -172,7 +164,6 @@
"next_btn": "بعدی", "next_btn": "بعدی",
"loading_table_status": "بارگیری...", "loading_table_status": "بارگیری...",
"page_table_footer_text": "صفحه", "page_table_footer_text": "صفحه",
"of_table_footer_text": "از",
"rows_table_footer_text": "سطر", "rows_table_footer_text": "سطر",
"updated_custom_filtering_toast": "دستورات فیلترینگ دستی بروز رسانی شده است", "updated_custom_filtering_toast": "دستورات فیلترینگ دستی بروز رسانی شده است",
"rule_removed_from_custom_filtering_toast": "دستور از دستورات فیلترینگ دستی حذف شد", "rule_removed_from_custom_filtering_toast": "دستور از دستورات فیلترینگ دستی حذف شد",
@ -202,13 +193,11 @@
"rate_limit_desc": "تعداد درخواست های بر ثانیه مجازی که یک کلاینت میتواند بسازد (0: نامحدود)", "rate_limit_desc": "تعداد درخواست های بر ثانیه مجازی که یک کلاینت میتواند بسازد (0: نامحدود)",
"blocking_ipv4_desc": "آدرس آی پی برگشت داده شده برای درخواست مسدود شده A", "blocking_ipv4_desc": "آدرس آی پی برگشت داده شده برای درخواست مسدود شده A",
"blocking_ipv6_desc": "آدرس آی پی برگشت داده شده برای درخواست مسدود شده AAAA", "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> استفاده می کند.", "upstream_dns_client_desc": "اگر این فیلد را خالی نگه دارید، AdGuard Home از سرور پیکربندی شده در <0> تنظیماتDNS </0> استفاده می کند.",
"source_label": "منبع", "source_label": "منبع",
"found_in_known_domain_db": "در پایگاه داده دامنه های شناخته شده پیدا شد", "found_in_known_domain_db": "در پایگاه داده دامنه های شناخته شده پیدا شد",
"category_label": "دسته بندی", "category_label": "دسته بندی",
"rule_label": "دستور", "rule_label": "دستور",
"filter_label": "فیلتر",
"unknown_filter": "فیلتر ناشناخته {{filterId}}", "unknown_filter": "فیلتر ناشناخته {{filterId}}",
"install_welcome_title": "به AdGuard Home خوش آمدید!", "install_welcome_title": "به AdGuard Home خوش آمدید!",
"install_welcome_desc": "AdGuard Home یک شبکه گسترده و ردیاب و مسدوساز تبلیغ با سرور DNS است.هدف آن این است که به شما اجازه کنترل کل شبکه و همه دستگاه های شما را بدهد و آن نیازی به برنامه سمت-کاربر ندارد.", "install_welcome_desc": "AdGuard Home یک شبکه گسترده و ردیاب و مسدوساز تبلیغ با سرور DNS است.هدف آن این است که به شما اجازه کنترل کل شبکه و همه دستگاه های شما را بدهد و آن نیازی به برنامه سمت-کاربر ندارد.",
@ -320,7 +309,6 @@
"client_edit": "ویرایش کلاینت", "client_edit": "ویرایش کلاینت",
"client_identifier": "احراز با", "client_identifier": "احراز با",
"ip_address": "آدرس آی پی", "ip_address": "آدرس آی پی",
"client_identifier_desc": "کلاینت میتواند با آدرس آی پی یا آدرس مَک احراز شود. لطفا توجه کنید،که استفاده از مَک بعنوان عامل احراز زمانی امکان دارد که AdGuard Home نیز <0>سرور DHCP </0> باشد",
"form_enter_ip": "آی پی را وارد کنید", "form_enter_ip": "آی پی را وارد کنید",
"form_enter_mac": "مَک را وارد کنید", "form_enter_mac": "مَک را وارد کنید",
"form_enter_id": "خطای احرازکننده", "form_enter_id": "خطای احرازکننده",
@ -332,7 +320,6 @@
"client_updated": "کلاینت \"{{key}}\" با موفقیت بروز رسانی شد", "client_updated": "کلاینت \"{{key}}\" با موفقیت بروز رسانی شد",
"clients_not_found": "کلاینتی یافت نشد", "clients_not_found": "کلاینتی یافت نشد",
"client_confirm_delete": "آیا واقعا میخواهید \"{{key}}\" کلاینت را حذف کنید؟", "client_confirm_delete": "آیا واقعا میخواهید \"{{key}}\" کلاینت را حذف کنید؟",
"filter_confirm_delete": "آیا واقعا میخواهید فیلتر را حذف کنید؟",
"auto_clients_title": "کلاینت ها (زمان اِجرا)", "auto_clients_title": "کلاینت ها (زمان اِجرا)",
"auto_clients_desc": "داده در کلاینت ها که از AdGuard Home استفاده می کند،اما در پیکربندی ذخیره نمی شود", "auto_clients_desc": "داده در کلاینت ها که از AdGuard Home استفاده می کند،اما در پیکربندی ذخیره نمی شود",
"access_title": "تنظیمات دسترسی", "access_title": "تنظیمات دسترسی",
@ -398,7 +385,6 @@
"interval_days_plural": "{{count}} روز", "interval_days_plural": "{{count}} روز",
"domain": "دامنه", "domain": "دامنه",
"answer": "پاسخ", "answer": "پاسخ",
"filter_added_successfully": "فیلتر با موفقیت اضافه شد",
"statistics_configuration": "پیکربندی آمارها", "statistics_configuration": "پیکربندی آمارها",
"statistics_retention": "مدت حفظ آمارها", "statistics_retention": "مدت حفظ آمارها",
"statistics_retention_desc": "اگر مقدار فاصله را کاهش دهید،برخی داده ها از بین خواهد رفت", "statistics_retention_desc": "اگر مقدار فاصله را کاهش دهید،برخی داده ها از بین خواهد رفت",

View file

@ -121,22 +121,15 @@
"enabled_save_search_toast": "Recherche sécurisée activée", "enabled_save_search_toast": "Recherche sécurisée activée",
"enabled_table_header": "Activé", "enabled_table_header": "Activé",
"name_table_header": "Nom", "name_table_header": "Nom",
"filter_url_table_header": "URL du filtre",
"rules_count_table_header": "Nombre des règles", "rules_count_table_header": "Nombre des règles",
"last_time_updated_table_header": "Dernière mise à jour", "last_time_updated_table_header": "Dernière mise à jour",
"actions_table_header": "Actions", "actions_table_header": "Actions",
"edit_table_action": "Modifier", "edit_table_action": "Modifier",
"delete_table_action": "Supprimer", "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.", "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", "cancel_btn": "Annuler",
"enter_name_hint": "Saisir nom", "enter_name_hint": "Saisir nom",
"enter_url_hint": "Saisir URL", "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": "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.", "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", "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_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_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)", "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", "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_ok_toast": "Les serveurs DNS spécifiés fonctionnent correctement",
"dns_test_not_ok_toast": "Impossible d'utiliser le serveur \"{{key}}\": veuillez vérifier si le nom saisi est bien correct", "dns_test_not_ok_toast": "Impossible d'utiliser le serveur \"{{key}}\": veuillez vérifier si le nom saisi est bien correct",
@ -172,7 +164,6 @@
"next_btn": "Suivant", "next_btn": "Suivant",
"loading_table_status": "Chargement en cours ...", "loading_table_status": "Chargement en cours ...",
"page_table_footer_text": "Page", "page_table_footer_text": "Page",
"of_table_footer_text": "de",
"rows_table_footer_text": "lignes", "rows_table_footer_text": "lignes",
"updated_custom_filtering_toast": "Règles de filtrage d'utilisateur mises à jour", "updated_custom_filtering_toast": "Règles de filtrage d'utilisateur mises à jour",
"rule_removed_from_custom_filtering_toast": "Règle retirée des règles d'utilisateur", "rule_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é)", "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_ipv4_desc": "Adresse IP à renvoyer pour une demande A bloquée",
"blocking_ipv6_desc": "Adresse IP à renvoyer pour une demande AAAA 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>.", "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", "source_label": "Source",
"found_in_known_domain_db": "Trouvé dans la base de données des domaines connus", "found_in_known_domain_db": "Trouvé dans la base de données des domaines connus",
"category_label": "Catégorie", "category_label": "Catégorie",
"rule_label": "Règle", "rule_label": "Règle",
"filter_label": "Filtre",
"unknown_filter": "Filtre inconnu {{filterId}}", "unknown_filter": "Filtre inconnu {{filterId}}",
"install_welcome_title": "Bienvenue sur AdGuard Home !", "install_welcome_title": "Bienvenue sur AdGuard Home !",
"install_welcome_desc": "AdGuard Home est un seveur DNS pour bloquer les pubs et traceurs sur tout un réseau. Son but est de vous donner le contrôle sur l'ensemble de votre réseau et tous vos appareils sans programme côté client supplémentaire.", "install_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_edit": "Modifier le client",
"client_identifier": "Identifiant", "client_identifier": "Identifiant",
"ip_address": "Adresse IP", "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_ip": "Saisissez l'IP",
"form_enter_mac": "Saisissez MAC", "form_enter_mac": "Saisissez MAC",
"form_enter_id": "Entrer identifiant", "form_enter_id": "Entrer identifiant",
@ -293,7 +281,6 @@
"client_updated": "Le client \"{{key}}\" a été mis à jour", "client_updated": "Le client \"{{key}}\" a été mis à jour",
"clients_not_found": "Aucun client trouvé", "clients_not_found": "Aucun client trouvé",
"client_confirm_delete": "Voulez-vous vraiment supprimer le client \"{{key}}\" ?", "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_title": "Clients (exécution)",
"auto_clients_desc": "Les données des clients qu'utilisent AdGuard Home, mais non stockées dans la configuration", "auto_clients_desc": "Les données des clients qu'utilisent AdGuard Home, mais non stockées dans la configuration",
"access_title": "Paramètres d'accès", "access_title": "Paramètres d'accès",
@ -359,7 +346,6 @@
"interval_days_plural": "{{count}} jours", "interval_days_plural": "{{count}} jours",
"domain": "Domaine", "domain": "Domaine",
"answer": "Réponse", "answer": "Réponse",
"filter_added_successfully": "Le filtre a été ajouté",
"statistics_configuration": "Configuration des statistiques", "statistics_configuration": "Configuration des statistiques",
"statistics_retention": "Maintien des statistiques", "statistics_retention": "Maintien des statistiques",
"statistics_retention_desc": "Si vous baissez la valeur de l'intervalle, des données seront perdues", "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_save_search_toast": "Pencarian aman diaktifkan",
"enabled_table_header": "Diaktifkan", "enabled_table_header": "Diaktifkan",
"name_table_header": "Nama", "name_table_header": "Nama",
"filter_url_table_header": "URL penyaringan",
"rules_count_table_header": "Jumlah Aturan", "rules_count_table_header": "Jumlah Aturan",
"last_time_updated_table_header": "Terakhir diperbaharui", "last_time_updated_table_header": "Terakhir diperbaharui",
"actions_table_header": "Aksi", "actions_table_header": "Aksi",
"edit_table_action": "Ubah", "edit_table_action": "Ubah",
"delete_table_action": "Hapus", "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.", "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", "cancel_btn": "Batal",
"enter_name_hint": "Masukkan nama", "enter_name_hint": "Masukkan nama",
"enter_url_hint": "Masukkan URL", "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": "Aturan penyaringan khusus",
"custom_filter_rules_hint": "Masukkan satu aturan dalam sebuah baris. Anda dapat menggunakan baik aturan adblock maupun sintaks file hosts.", "custom_filter_rules_hint": "Masukkan satu aturan dalam sebuah baris. Anda dapat menggunakan baik aturan adblock maupun sintaks file hosts.",
"examples_title": "Contoh", "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_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_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)", "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", "updated_upstream_dns_toast": "Server DNS hulu terbarui",
"dns_test_ok_toast": "Server DNS yang ditentukan bekerja dengan benar", "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", "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", "next_btn": "Selanjutnya",
"loading_table_status": "Memuat...", "loading_table_status": "Memuat...",
"page_table_footer_text": "Halaman", "page_table_footer_text": "Halaman",
"of_table_footer_text": "dari",
"rows_table_footer_text": "baris", "rows_table_footer_text": "baris",
"updated_custom_filtering_toast": "Perbarui aturan penyaringan khusus", "updated_custom_filtering_toast": "Perbarui aturan penyaringan khusus",
"rule_removed_from_custom_filtering_toast": "Aturan dihapus dari 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", "found_in_known_domain_db": "Ditemukan di database domain dikenal",
"category_label": "Kategori", "category_label": "Kategori",
"rule_label": "Aturan", "rule_label": "Aturan",
"filter_label": "Penyaringan",
"unknown_filter": "Penyaringan {{filterId}} tidak dikenal", "unknown_filter": "Penyaringan {{filterId}} tidak dikenal",
"install_welcome_title": "Selamat datang di AdGuard Home!", "install_welcome_title": "Selamat datang di AdGuard Home!",
"install_welcome_desc": "AdGuard Home adalah sebuah server DNS pemblokiran iklan dan pelacak di jaringan. Tujuannya adalah memungkinkan anda mengkontrol seluruh jaringan dan semua perangkat anda, dan ini tidak membutuhkan aplikasi tambahan di klien", "install_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_edit": "Ubah Klien",
"client_identifier": "Identifikasi", "client_identifier": "Identifikasi",
"ip_address": "Alamat IP", "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_ip": "Masukkan IP",
"form_enter_mac": "Masukkan MAC", "form_enter_mac": "Masukkan MAC",
"form_client_name": "Masukkan nama klien", "form_client_name": "Masukkan nama klien",
@ -308,7 +297,6 @@
"client_updated": "Klien \"{{key}}\" berhasil diperbarui", "client_updated": "Klien \"{{key}}\" berhasil diperbarui",
"clients_not_found": "Tidak ada klien ditemukan", "clients_not_found": "Tidak ada klien ditemukan",
"client_confirm_delete": "Apakah anda yakin ingin menghapus klien \"{{key}}\"?", "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_title": "Klien (waktu berjalan)",
"auto_clients_desc": "Data pada klien yang menggunakan AdGuard Home, tetapi tidak disimpan dalam konfigurasi", "auto_clients_desc": "Data pada klien yang menggunakan AdGuard Home, tetapi tidak disimpan dalam konfigurasi",
"access_title": "Pengaturan akses", "access_title": "Pengaturan akses",
@ -373,7 +361,6 @@
"interval_days_plural": "{{count}} hari", "interval_days_plural": "{{count}} hari",
"domain": "Domain", "domain": "Domain",
"answer": "Jawab", "answer": "Jawab",
"filter_added_successfully": "Filter telah berhasil ditambahkan",
"statistics_configuration": "Konfigurasi statistik", "statistics_configuration": "Konfigurasi statistik",
"statistics_retention": "Statistik disimpan", "statistics_retention": "Statistik disimpan",
"statistics_retention_desc": "Jika Anda menurunkan nilai interval, beberapa data akan hilang", "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_save_search_toast": "Abilita Ricerca Sicura",
"enabled_table_header": "Attivo", "enabled_table_header": "Attivo",
"name_table_header": "Nome", "name_table_header": "Nome",
"filter_url_table_header": "URL filtro",
"rules_count_table_header": "Numero regole", "rules_count_table_header": "Numero regole",
"last_time_updated_table_header": "Ultimo aggiornamento", "last_time_updated_table_header": "Ultimo aggiornamento",
"actions_table_header": "Azioni", "actions_table_header": "Azioni",
"edit_table_action": "Modifica", "edit_table_action": "Modifica",
"delete_table_action": "Elimina", "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", "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", "cancel_btn": "Annulla",
"enter_name_hint": "Inserisci nome", "enter_name_hint": "Inserisci nome",
"enter_url_hint": "Inserisci URL", "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": "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.", "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", "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_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_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)", "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", "updated_upstream_dns_toast": "Server DNS upstream aggiornati",
"dns_test_ok_toast": "I server DNS specificati funzionano correttamente", "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", "dns_test_not_ok_toast": "Server \"{{key}}\": non può essere usato, assicurati di averlo digitato correttamente",
@ -163,7 +155,6 @@
"next_btn": "Successivo", "next_btn": "Successivo",
"loading_table_status": "Caricamento...", "loading_table_status": "Caricamento...",
"page_table_footer_text": "Pagina", "page_table_footer_text": "Pagina",
"of_table_footer_text": "di",
"rows_table_footer_text": "righe", "rows_table_footer_text": "righe",
"updated_custom_filtering_toast": "Le regole dei filtri personalizzate sono state aggiornate", "updated_custom_filtering_toast": "Le regole dei filtri personalizzate sono state aggiornate",
"rule_removed_from_custom_filtering_toast": "Regola rimossa dalle regole dei filtri personalizzate", "rule_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.", "found_in_known_domain_db": "Trovato nel database dei domini conosciuti.",
"category_label": "Categoria", "category_label": "Categoria",
"rule_label": "Regola", "rule_label": "Regola",
"filter_label": "Filtro",
"unknown_filter": "Filtro sconosciuto {{filterId}}", "unknown_filter": "Filtro sconosciuto {{filterId}}",
"install_welcome_title": "Benvenuto nella Home di AdGuard!", "install_welcome_title": "Benvenuto nella Home di AdGuard!",
"install_welcome_desc": "AdGuard Home è un server DNS che blocca annunci e tracker in tutta la rete. Il suo scopo è quello di consentire di controllare l'intera rete e tutti i dispositivi, e non richiede l'utilizzo di un programma sul lato client.", "install_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", "client_updated": "Client \"{{key}}\" aggiornato correttamente",
"clients_not_found": "Nessun client trovato", "clients_not_found": "Nessun client trovato",
"client_confirm_delete": "Sei sicuro di voler eliminare il client \"{{key}}\"?", "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_title": "Clienti (tempo di esecuzione)",
"auto_clients_desc": "Dati dei clienti che utilizzano AdGuard Home, ma che non sono salvati nella configurazione", "auto_clients_desc": "Dati dei clienti che utilizzano AdGuard Home, ma che non sono salvati nella configurazione",
"access_title": "Impostazioni di accesso", "access_title": "Impostazioni di accesso",
@ -367,7 +356,6 @@
"interval_days_plural": "{{count}} giorni", "interval_days_plural": "{{count}} giorni",
"domain": "Dominio", "domain": "Dominio",
"answer": "Risposta", "answer": "Risposta",
"filter_added_successfully": "Il filtro è stato aggiunto correttamente",
"statistics_configuration": "Configurazione delle statistiche", "statistics_configuration": "Configurazione delle statistiche",
"statistics_retention": "Conservazione statistiche", "statistics_retention": "Conservazione statistiche",
"statistics_retention_desc": "Se si diminuisce il valore di intervallo, alcuni dati saranno persi", "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_save_search_toast": "セーフサーチを有効にしました",
"enabled_table_header": "有効", "enabled_table_header": "有効",
"name_table_header": "名称", "name_table_header": "名称",
"filter_url_table_header": "フィルタのURL",
"rules_count_table_header": "ルール数", "rules_count_table_header": "ルール数",
"last_time_updated_table_header": "最終更新時刻", "last_time_updated_table_header": "最終更新時刻",
"actions_table_header": "操作", "actions_table_header": "操作",
"edit_table_action": "編集する", "edit_table_action": "編集する",
"delete_table_action": "削除する", "delete_table_action": "削除する",
"filters_and_hosts": "フィルタとhostsブロックリスト",
"filters_and_hosts_hint": "AdGuard Homeは、基本的な広告ブロックルールとhostsファイルの構文を理解します。", "filters_and_hosts_hint": "AdGuard Homeは、基本的な広告ブロックルールとhostsファイルの構文を理解します。",
"no_filters_added": "フィルタは追加されませんでした",
"add_filter_btn": "フィルタを追加する",
"cancel_btn": "キャンセル", "cancel_btn": "キャンセル",
"enter_name_hint": "名称を入力", "enter_name_hint": "名称を入力",
"enter_url_hint": "URLを入力", "enter_url_hint": "URLを入力",
"check_updates_btn": "アップデートを確認する",
"new_filter_btn": "新しいフィルタ・サブスクリプション",
"enter_valid_filter_url": "フィルタ・サブスクリプションもしくはhostsファイルの有効なURLを入力してください。",
"custom_filter_rules": "カスタム・フィルタリングルール", "custom_filter_rules": "カスタム・フィルタリングルール",
"custom_filter_rules_hint": "1つの行に1つのルールを入力してください。 広告ブロックルールやhostsファイル構文を使用できます。", "custom_filter_rules_hint": "1つの行に1つのルールを入力してください。 広告ブロックルールやhostsファイル構文を使用できます。",
"examples_title": "例", "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_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_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での問い合わせ", "example_upstream_tcp": "通常のDNSTCPでの問い合わせ",
"all_filters_up_to_date_toast": "すべてのフィルタは既に最新です",
"updated_upstream_dns_toast": "上流DNSサーバを更新しました", "updated_upstream_dns_toast": "上流DNSサーバを更新しました",
"dns_test_ok_toast": "指定されたDNSサーバは正しく動作しています", "dns_test_ok_toast": "指定されたDNSサーバは正しく動作しています",
"dns_test_not_ok_toast": "サーバ \"{{key}}\": 使用できませんでした。正しく入力されているかどうかを確認してください", "dns_test_not_ok_toast": "サーバ \"{{key}}\": 使用できませんでした。正しく入力されているかどうかを確認してください",
@ -173,7 +165,6 @@
"next_btn": "次へ", "next_btn": "次へ",
"loading_table_status": "読み込み中…", "loading_table_status": "読み込み中…",
"page_table_footer_text": "ページ", "page_table_footer_text": "ページ",
"of_table_footer_text": "",
"rows_table_footer_text": "行", "rows_table_footer_text": "行",
"updated_custom_filtering_toast": "カスタム・フィルタリングルールを更新しました", "updated_custom_filtering_toast": "カスタム・フィルタリングルールを更新しました",
"rule_removed_from_custom_filtering_toast": "ルールをカスタム・フィルタリングルールから除去しました", "rule_removed_from_custom_filtering_toast": "ルールをカスタム・フィルタリングルールから除去しました",
@ -203,13 +194,11 @@
"rate_limit_desc": "単一のクライアントに許可される1秒あたりのリクエスト数0無制限", "rate_limit_desc": "単一のクライアントに許可される1秒あたりのリクエスト数0無制限",
"blocking_ipv4_desc": "ブロックされたAリクエストに対して応答されるIPアドレス", "blocking_ipv4_desc": "ブロックされたAリクエストに対して応答されるIPアドレス",
"blocking_ipv6_desc": "ブロックされたAAAAリクエストに対して応答される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>で構成されたサーバを使用します。", "upstream_dns_client_desc": "このフィールドを未入力のままにすると、AdGuard Homeは<0>DNS設定</0>で構成されたサーバを使用します。",
"source_label": "ソース", "source_label": "ソース",
"found_in_known_domain_db": "既知のドメインデータベースに見つかりました。", "found_in_known_domain_db": "既知のドメインデータベースに見つかりました。",
"category_label": "カテゴリ", "category_label": "カテゴリ",
"rule_label": "ルール", "rule_label": "ルール",
"filter_label": "フィルタ",
"unknown_filter": "不明なフィルタ {{filterId}}", "unknown_filter": "不明なフィルタ {{filterId}}",
"install_welcome_title": "ようこそ、AdGuard Home へ!", "install_welcome_title": "ようこそ、AdGuard Home へ!",
"install_welcome_desc": "AdGuard Homeは、ネットワーク全体で広告と追跡をブロックするDNSサーバです。その目的は、ネットワークとデバイスのすべてをあなたが制御できるようにすることであり、クライアント側のプログラムを使用する必要はありません。", "install_welcome_desc": "AdGuard Homeは、ネットワーク全体で広告と追跡をブロックするDNSサーバです。その目的は、ネットワークとデバイスのすべてをあなたが制御できるようにすることであり、クライアント側のプログラムを使用する必要はありません。",
@ -321,7 +310,6 @@
"client_edit": "クライアントの編集", "client_edit": "クライアントの編集",
"client_identifier": "識別子", "client_identifier": "識別子",
"ip_address": "IPアドレス", "ip_address": "IPアドレス",
"client_identifier_desc": "クライアントはIPアドレスまたはMACアドレスで識別できます。AdGuard Homeが<0>DHCPサーバ</0>でもある場合にのみ、識別子としてMACを使用することが可能であることにご注意ください。",
"form_enter_ip": "IPアドレスを入力してください", "form_enter_ip": "IPアドレスを入力してください",
"form_enter_mac": "MACアドレスを入力してください", "form_enter_mac": "MACアドレスを入力してください",
"form_enter_id": "識別子を入力してください", "form_enter_id": "識別子を入力してください",
@ -333,7 +321,6 @@
"client_updated": "クライアント \"{{key}}\" の更新に成功しました", "client_updated": "クライアント \"{{key}}\" の更新に成功しました",
"clients_not_found": "クライアント情報はありません", "clients_not_found": "クライアント情報はありません",
"client_confirm_delete": "クライアント \"{{key}}\" を削除してもよろしいですか?", "client_confirm_delete": "クライアント \"{{key}}\" を削除してもよろしいですか?",
"filter_confirm_delete": "フィルターを削除してもよろしいですか?",
"auto_clients_title": "クライアント(実行時)", "auto_clients_title": "クライアント(実行時)",
"auto_clients_desc": "AdGuard Homeで使用しているが設定に保存されていないクライアント上のデータ", "auto_clients_desc": "AdGuard Homeで使用しているが設定に保存されていないクライアント上のデータ",
"access_title": "アクセス設定", "access_title": "アクセス設定",
@ -399,7 +386,6 @@
"interval_days_plural": "{{count}}日", "interval_days_plural": "{{count}}日",
"domain": "ドメイン", "domain": "ドメイン",
"answer": "応答", "answer": "応答",
"filter_added_successfully": "フィルタの追加に成功しました",
"statistics_configuration": "統計設定", "statistics_configuration": "統計設定",
"statistics_retention": "統計保持", "statistics_retention": "統計保持",
"statistics_retention_desc": "期間を短くすると、一部のデータが失われます", "statistics_retention_desc": "期間を短くすると、一部のデータが失われます",

View file

@ -25,6 +25,7 @@
"form_error_mac_format": "잘못된 MAC 형식", "form_error_mac_format": "잘못된 MAC 형식",
"form_error_client_id_format": "잘못된 클라이언트 ID 형식", "form_error_client_id_format": "잘못된 클라이언트 ID 형식",
"form_error_positive": "0보다 커야 합니다", "form_error_positive": "0보다 커야 합니다",
"form_error_negative": "반드시 0 이상이여야 합니다",
"dhcp_form_gateway_input": "게이트웨이 IP", "dhcp_form_gateway_input": "게이트웨이 IP",
"dhcp_form_subnet_input": "서브넷 마스크", "dhcp_form_subnet_input": "서브넷 마스크",
"dhcp_form_range_title": "IP 주소 범위", "dhcp_form_range_title": "IP 주소 범위",
@ -121,22 +122,15 @@
"enabled_save_search_toast": "세이프서치 활성화됨", "enabled_save_search_toast": "세이프서치 활성화됨",
"enabled_table_header": "활성화됨", "enabled_table_header": "활성화됨",
"name_table_header": "이름", "name_table_header": "이름",
"filter_url_table_header": "필터 주소",
"rules_count_table_header": "규칙 개수", "rules_count_table_header": "규칙 개수",
"last_time_updated_table_header": "마지막 업데이트", "last_time_updated_table_header": "마지막 업데이트",
"actions_table_header": "가능한 동작", "actions_table_header": "가능한 동작",
"edit_table_action": "편집", "edit_table_action": "편집",
"delete_table_action": "삭제", "delete_table_action": "삭제",
"filters_and_hosts": "필터와 호스트 차단목록",
"filters_and_hosts_hint": "AdGuard Home은 기본적인 광고 차단 규칙과 호스트 파일 문법을 읽을 수 있습니다", "filters_and_hosts_hint": "AdGuard Home은 기본적인 광고 차단 규칙과 호스트 파일 문법을 읽을 수 있습니다",
"no_filters_added": "추가된 필터 없음",
"add_filter_btn": "필터 추가",
"cancel_btn": "취소", "cancel_btn": "취소",
"enter_name_hint": "이름을 입력하세요", "enter_name_hint": "이름을 입력하세요",
"enter_url_hint": "주소를 입력하세요", "enter_url_hint": "주소를 입력하세요",
"check_updates_btn": "업데이트 확인",
"new_filter_btn": "새로운 필터 구독",
"enter_valid_filter_url": "호스트 파일 또는 필터 구독에 올바른 URL 을 입력하세요.",
"custom_filter_rules": "커스텀 필터링 규칙", "custom_filter_rules": "커스텀 필터링 규칙",
"custom_filter_rules_hint": "한 라인에 한 규칙만 입력하세요. 광고 차단 규칙과 호스트 파일 문법 중 하나를 사용할 수 있습니다", "custom_filter_rules_hint": "한 라인에 한 규칙만 입력하세요. 광고 차단 규칙과 호스트 파일 문법 중 하나를 사용할 수 있습니다",
"examples_title": "예시", "examples_title": "예시",
@ -152,7 +146,6 @@
"example_upstream_doh": "암호화 된 <0>DNS-over-HTTPS</0>", "example_upstream_doh": "암호화 된 <0>DNS-over-HTTPS</0>",
"example_upstream_sdns": "<1>DNSCrypt</1>나 <2>DNS-over-HTTPS</2> 리졸버를 위해 <0>DNS 스탬프</0>를 사용할 수 있습니다", "example_upstream_sdns": "<1>DNSCrypt</1>나 <2>DNS-over-HTTPS</2> 리졸버를 위해 <0>DNS 스탬프</0>를 사용할 수 있습니다",
"example_upstream_tcp": "사용자 지정 DNS (TCP를 통한 접속)", "example_upstream_tcp": "사용자 지정 DNS (TCP를 통한 접속)",
"all_filters_up_to_date_toast": "모든 필터는 이미 최신입니다",
"updated_upstream_dns_toast": "업스트림 DNS 서버를 업데이트하였습니다", "updated_upstream_dns_toast": "업스트림 DNS 서버를 업데이트하였습니다",
"dns_test_ok_toast": "특정 DNS 서버들은 정상적으로 동작 중입니다", "dns_test_ok_toast": "특정 DNS 서버들은 정상적으로 동작 중입니다",
"dns_test_not_ok_toast": "서버 \"{{key}}\": 사용할 수 없습니다, 제대로 작성했는지 확인하세요.", "dns_test_not_ok_toast": "서버 \"{{key}}\": 사용할 수 없습니다, 제대로 작성했는지 확인하세요.",
@ -172,7 +165,6 @@
"next_btn": "다음", "next_btn": "다음",
"loading_table_status": "로딩중...", "loading_table_status": "로딩중...",
"page_table_footer_text": "페이지", "page_table_footer_text": "페이지",
"of_table_footer_text": "/",
"rows_table_footer_text": "행", "rows_table_footer_text": "행",
"updated_custom_filtering_toast": "사용자 정의 필터링 규칙 업데이트", "updated_custom_filtering_toast": "사용자 정의 필터링 규칙 업데이트",
"rule_removed_from_custom_filtering_toast": "사용자 정의 필터링 규칙에서 규칙 제거", "rule_removed_from_custom_filtering_toast": "사용자 정의 필터링 규칙에서 규칙 제거",
@ -188,11 +180,30 @@
"query_log_disabled": "쿼리 로그가 비활성화되어 있으며 <0>설정</0>에서 설정할 수 있습니다", "query_log_disabled": "쿼리 로그가 비활성화되어 있으며 <0>설정</0>에서 설정할 수 있습니다",
"query_log_strict_search": "검색을 제한하려면 쌍따옴표를 사용해주세요", "query_log_strict_search": "검색을 제한하려면 쌍따옴표를 사용해주세요",
"query_log_retention_confirm": "정말로 쿼리 로그 저장 기간을 변경하시겠습니까? 저장 주기를 낮출 경우, 일부 데이터가 손실됩니다", "query_log_retention_confirm": "정말로 쿼리 로그 저장 기간을 변경하시겠습니까? 저장 주기를 낮출 경우, 일부 데이터가 손실됩니다",
"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": "소스", "source_label": "소스",
"found_in_known_domain_db": "알려진 도메인 데이터베이스에서 발견됨.", "found_in_known_domain_db": "알려진 도메인 데이터베이스에서 발견됨.",
"category_label": "카테고리", "category_label": "카테고리",
"rule_label": "규칙", "rule_label": "규칙",
"filter_label": "필터",
"unknown_filter": "알려지지 않은 필터 {{filterId}}", "unknown_filter": "알려지지 않은 필터 {{filterId}}",
"install_welcome_title": "AdGuard Home에 오신 것을 환영합니다!", "install_welcome_title": "AdGuard Home에 오신 것을 환영합니다!",
"install_welcome_desc": "AdGuard Home은 광범위한 네트워크 광고와 추적 DNS 서버를 차단 합니다. 그것의 목적은 당신이 당신의 전체 네트워크와 당신의 모든 기기를 제어하는 것이며, 그것은 클라이언트의 프로그램을 사용할 필요가 없습니다.", "install_welcome_desc": "AdGuard Home은 광범위한 네트워크 광고와 추적 DNS 서버를 차단 합니다. 그것의 목적은 당신이 당신의 전체 네트워크와 당신의 모든 기기를 제어하는 것이며, 그것은 클라이언트의 프로그램을 사용할 필요가 없습니다.",
@ -304,7 +315,6 @@
"client_edit": "클라이언트 수정", "client_edit": "클라이언트 수정",
"client_identifier": "식별자", "client_identifier": "식별자",
"ip_address": "IP 주소", "ip_address": "IP 주소",
"client_identifier_desc": "사용자는 IP 주소 또는 MAC 주소로 식별할 수 있지만 AdGuard Home이 <0>DHCP 서버인 </0> 경우에만 사용자는 MAC 주소로 식별할 수 있습니다.",
"form_enter_ip": "IP 입력", "form_enter_ip": "IP 입력",
"form_enter_mac": "MAC 입력", "form_enter_mac": "MAC 입력",
"form_enter_id": "식별자 입력", "form_enter_id": "식별자 입력",
@ -316,7 +326,6 @@
"client_updated": "클라이언트 \"{{key}}\"가 정상적으로 업데이트되었습니다", "client_updated": "클라이언트 \"{{key}}\"가 정상적으로 업데이트되었습니다",
"clients_not_found": "클라이언트 없음", "clients_not_found": "클라이언트 없음",
"client_confirm_delete": "정말 클라이언트 \"{{key}}\" 삭제하시겠습니까?", "client_confirm_delete": "정말 클라이언트 \"{{key}}\" 삭제하시겠습니까?",
"filter_confirm_delete": "정말 이 필터를 삭제하시겠습니까?",
"auto_clients_title": "클라이언트 (런타임)", "auto_clients_title": "클라이언트 (런타임)",
"auto_clients_desc": "AdGuard Home을 사용하지만 구성에 저장되지 않은 클라이언트의 데이터입니다.", "auto_clients_desc": "AdGuard Home을 사용하지만 구성에 저장되지 않은 클라이언트의 데이터입니다.",
"access_title": "접근 설정", "access_title": "접근 설정",
@ -382,7 +391,6 @@
"interval_days_plural": "{{count}} 일", "interval_days_plural": "{{count}} 일",
"domain": "도메인", "domain": "도메인",
"answer": "응답", "answer": "응답",
"filter_added_successfully": "필터가 성공적으로 추가되었습니다.",
"statistics_configuration": "통계 구성", "statistics_configuration": "통계 구성",
"statistics_retention": "통계 저장 기간", "statistics_retention": "통계 저장 기간",
"statistics_retention_desc": "값을 줄이면 설정한 값보다 오래된 데이터가 소멸됩니다.", "statistics_retention_desc": "값을 줄이면 설정한 값보다 오래된 데이터가 소멸됩니다.",
@ -414,5 +422,7 @@
"try_again": "다시 시도해주세요", "try_again": "다시 시도해주세요",
"domain_desc": "다시 작성할 도메인 이름 또는 와일드카드를 입력합니다.", "domain_desc": "다시 작성할 도메인 이름 또는 와일드카드를 입력합니다.",
"example_rewrite_domain": "이 도메인 이름에 대한 응답을 변경합니다.", "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_ip6_format": "Ongeldig IPv6 formaat",
"form_error_ip_format": "Ongeldig IPv4 formaat", "form_error_ip_format": "Ongeldig IPv4 formaat",
"form_error_mac_format": "Ongeldig MAC 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", "form_error_positive": "Moet groter zijn dan 0",
"dhcp_form_gateway_input": "Gateway IP", "dhcp_form_gateway_input": "Gateway IP",
"dhcp_form_subnet_input": "Subnet mask", "dhcp_form_subnet_input": "Subnet mask",
@ -120,22 +121,17 @@
"enabled_save_search_toast": "Veilig zoeken ingeschakeld", "enabled_save_search_toast": "Veilig zoeken ingeschakeld",
"enabled_table_header": "Ingeschakeld", "enabled_table_header": "Ingeschakeld",
"name_table_header": "Naam", "name_table_header": "Naam",
"filter_url_table_header": "Filter URL",
"rules_count_table_header": "Aantal regels", "rules_count_table_header": "Aantal regels",
"last_time_updated_table_header": "Laatste update", "last_time_updated_table_header": "Laatste update",
"actions_table_header": "Actie", "actions_table_header": "Actie",
"edit_table_action": "Bewerk", "edit_table_action": "Bewerk",
"delete_table_action": "Verwijderen", "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.", "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", "cancel_btn": "Annuleren",
"enter_name_hint": "Voeg naam toe", "enter_name_hint": "Voeg naam toe",
"enter_url_hint": "Voeg URL toe", "enter_url_hint": "Voeg URL toe",
"check_updates_btn": "Controleer op updates", "check_updates_btn": "Controleer op updates",
"new_filter_btn": "Nieuw filter abonnement", "form_error_url_format": "Ongeldig URL formaat",
"enter_valid_filter_url": "Voer een geldige URL in voor een filterabonnement of een hosts-bestand.",
"custom_filter_rules": "Aangepaste filterregels", "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.", "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", "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_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_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)", "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", "updated_upstream_dns_toast": "De upstream DNS-servers zijn bijgewerkt",
"dns_test_ok_toast": "Opgegeven DNS-servers werken correct", "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", "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", "next_btn": "Volgende",
"loading_table_status": "Laden...", "loading_table_status": "Laden...",
"page_table_footer_text": "Pagina", "page_table_footer_text": "Pagina",
"of_table_footer_text": "van",
"rows_table_footer_text": "rijen", "rows_table_footer_text": "rijen",
"updated_custom_filtering_toast": "Aangepaste filter regels zijn bijgewerkt", "updated_custom_filtering_toast": "Aangepaste filter regels zijn bijgewerkt",
"rule_removed_from_custom_filtering_toast": "Regel verwijderd uit de aangepaste filterregels", "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.", "found_in_known_domain_db": "Gevonden in de bekende domeingegevensbank.",
"category_label": "Categorie", "category_label": "Categorie",
"rule_label": "Regel", "rule_label": "Regel",
"filter_label": "Filter",
"unknown_filter": "Onbekend filter {{filterId}}", "unknown_filter": "Onbekend filter {{filterId}}",
"install_welcome_title": "Welkom bij AdGuard Home!", "install_welcome_title": "Welkom bij AdGuard Home!",
"install_welcome_desc": "AdGuard Home is een netwerk DNS server die advertenties en trackers blokkeert. Het doel is om jou controle te geven over je gehele netwerk en al je apparaten, en er hoeft geen client-side programma te worden gebruikt.", "install_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_edit": "Wijzig gebruiker",
"client_identifier": "Identificeer via", "client_identifier": "Identificeer via",
"ip_address": "IP adres", "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_ip": "Vul IP in",
"form_enter_mac": "Vul MAC in", "form_enter_mac": "Vul MAC in",
"form_enter_id": "ID invoeren", "form_enter_id": "ID invoeren",
@ -316,7 +309,6 @@
"client_updated": "Gebruiker \"{{key}}\" met succes ge-updated", "client_updated": "Gebruiker \"{{key}}\" met succes ge-updated",
"clients_not_found": "Geen gebruikers gevonden", "clients_not_found": "Geen gebruikers gevonden",
"client_confirm_delete": "Ben je zeker dat je deze gebruiker \"{{key}}\" wilt verwijderen?", "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_title": "Gebruikers (runtime)",
"auto_clients_desc": "Data over gebruikers die AdGuard Home gebruiken, maar niet geconfigureerd zijn", "auto_clients_desc": "Data over gebruikers die AdGuard Home gebruiken, maar niet geconfigureerd zijn",
"access_title": "Toegangs instellingen", "access_title": "Toegangs instellingen",
@ -355,6 +347,7 @@
"rewrite_desc": "Hiermee kunt u eenvoudig aangepaste DNS-antwoorden configureren voor een specifieke domeinnaam.", "rewrite_desc": "Hiermee kunt u eenvoudig aangepaste DNS-antwoorden configureren voor een specifieke domeinnaam.",
"rewrite_applied": "Toegepaste herschrijf regel", "rewrite_applied": "Toegepaste herschrijf regel",
"dns_rewrites": "DNS herschrijvingen", "dns_rewrites": "DNS herschrijvingen",
"form_domain": "Vul domein of wildcard in",
"form_answer": "Vul IP adres of domeinnaam in", "form_answer": "Vul IP adres of domeinnaam in",
"form_error_domain_format": "Ongeldige domeinnaam", "form_error_domain_format": "Ongeldige domeinnaam",
"form_error_answer_format": "Ongeldig antwoord", "form_error_answer_format": "Ongeldig antwoord",
@ -381,7 +374,6 @@
"interval_days_plural": "{{count}} dagen", "interval_days_plural": "{{count}} dagen",
"domain": "Domein", "domain": "Domein",
"answer": "Antwoord", "answer": "Antwoord",
"filter_added_successfully": "Het filter is succesvol toegevoegd",
"statistics_configuration": "Statistieken configuratie", "statistics_configuration": "Statistieken configuratie",
"statistics_retention": "Statistieken retentie", "statistics_retention": "Statistieken retentie",
"statistics_retention_desc": "Als je de interval waarde vermindert, zullen sommige gegevens verloren gaan", "statistics_retention_desc": "Als je de interval waarde vermindert, zullen sommige gegevens verloren gaan",
@ -410,5 +402,17 @@
"whois": "Whois", "whois": "Whois",
"filtering_rules_learn_more": "<0>Meer informatie</0> over het maken van uw eigen hosts-blocklists.", "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", "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_save_search_toast": "Skrudde på barnevennlige søk",
"enabled_table_header": "Skrudd på", "enabled_table_header": "Skrudd på",
"name_table_header": "Navn", "name_table_header": "Navn",
"filter_url_table_header": "Filterets URL",
"rules_count_table_header": "Antall oppføringer", "rules_count_table_header": "Antall oppføringer",
"last_time_updated_table_header": "Senest oppdatert", "last_time_updated_table_header": "Senest oppdatert",
"actions_table_header": "Handlinger", "actions_table_header": "Handlinger",
"edit_table_action": "Rediger", "edit_table_action": "Rediger",
"delete_table_action": "Slett", "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.", "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", "cancel_btn": "Avbryt",
"enter_name_hint": "Skriv inn navn", "enter_name_hint": "Skriv inn navn",
"enter_url_hint": "Skriv inn nettadresse", "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": "Selvvalgte filtreringsregler",
"custom_filter_rules_hint": "Skriv inn én oppføring per linje. Du kan bruke adblock-oppføringer, «hosts»-filsyntaks, eller rå domener.", "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", "examples_title": "Eksempler",
@ -146,7 +139,6 @@
"example_upstream_doh": "kryptert <0>DNS-over-HTTPS</0>", "example_upstream_doh": "kryptert <0>DNS-over-HTTPS</0>",
"example_upstream_sdns": "du kan bruke <0>DNS-stempler</0> med <1>DNSCrypt</1> eller <2>DNS-over-HTTPS</2>-behandlere", "example_upstream_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)", "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", "updated_upstream_dns_toast": "Oppdaterte oppstrøms-DNS-tjenerne",
"dns_test_ok_toast": "De spesifiserte DNS-tjenerne fungerer riktig", "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", "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", "next_btn": "Neste",
"loading_table_status": "Laster inn …", "loading_table_status": "Laster inn …",
"page_table_footer_text": "Side", "page_table_footer_text": "Side",
"of_table_footer_text": "av",
"rows_table_footer_text": "rekker", "rows_table_footer_text": "rekker",
"updated_custom_filtering_toast": "Oppdaterte de selvvalgte filtreringsreglene", "updated_custom_filtering_toast": "Oppdaterte de selvvalgte filtreringsreglene",
"rule_removed_from_custom_filtering_toast": "Oppføringen ble fjernet fra 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.", "found_in_known_domain_db": "Funnet i databasen over kjente domener.",
"category_label": "Kategori", "category_label": "Kategori",
"rule_label": "Oppføring", "rule_label": "Oppføring",
"filter_label": "Filter",
"unknown_filter": "Ukjent filter {{filterId}}", "unknown_filter": "Ukjent filter {{filterId}}",
"install_welcome_title": "Velkommen til AdGuard Home!", "install_welcome_title": "Velkommen til AdGuard Home!",
"install_welcome_desc": "AdGuard Home er en nettverksdekkende reklame-og-sporings-blokkerende DNS-tjener. Formålet dens er å la deg styre hele nettverket ditt og alle dine enheter, og den krever ikke at klientene bruker spesifikke programmer.", "install_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_edit": "Rediger klienten",
"client_identifier": "Identifikator", "client_identifier": "Identifikator",
"ip_address": "IP-adresse", "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_ip": "Skriv inn IP",
"form_enter_mac": "Skriv inn MAC", "form_enter_mac": "Skriv inn MAC",
"form_client_name": "Skriv inn klientnavnet", "form_client_name": "Skriv inn klientnavnet",
@ -306,7 +295,6 @@
"client_updated": "Klienten «{{key}}» ble vellykket oppdatert", "client_updated": "Klienten «{{key}}» ble vellykket oppdatert",
"clients_not_found": "Ingen klienter ble funnet", "clients_not_found": "Ingen klienter ble funnet",
"client_confirm_delete": "Er du sikker på at du vil slette klienten «{{key}}»?", "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_title": "Klienter (kjørende)",
"auto_clients_desc": "Loggføring over klientene som bruker AdGuard Home, men som ikke har blitt lagret i oppsettet", "auto_clients_desc": "Loggføring over klientene som bruker AdGuard Home, men som ikke har blitt lagret i oppsettet",
"access_title": "Tilgangsinnstillinger", "access_title": "Tilgangsinnstillinger",
@ -372,7 +360,6 @@
"interval_days_plural": "{{count}} dager", "interval_days_plural": "{{count}} dager",
"domain": "Domene", "domain": "Domene",
"answer": "Svar", "answer": "Svar",
"filter_added_successfully": "Filteret har blitt vellykket lagt til",
"statistics_configuration": "Statistikk-oppsett", "statistics_configuration": "Statistikk-oppsett",
"statistics_retention": "Statistikkbeholding", "statistics_retention": "Statistikkbeholding",
"statistics_retention_desc": "Hvis du reduserer intervallverdien, vil noen av dataene gå tapt", "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_save_search_toast": "Włączone bezpieczne wyszukiwanie",
"enabled_table_header": "Włączone", "enabled_table_header": "Włączone",
"name_table_header": "Nazwa", "name_table_header": "Nazwa",
"filter_url_table_header": "Filtruj adres URL",
"rules_count_table_header": "Licznik reguł", "rules_count_table_header": "Licznik reguł",
"last_time_updated_table_header": "Ostatni raz zaktualizowany", "last_time_updated_table_header": "Ostatni raz zaktualizowany",
"actions_table_header": "Akcje", "actions_table_header": "Akcje",
"edit_table_action": "Edytuj", "edit_table_action": "Edytuj",
"delete_table_action": "Usuń", "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.", "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", "cancel_btn": "Anuluj",
"enter_name_hint": "Wprowadź nazwę", "enter_name_hint": "Wprowadź nazwę",
"enter_url_hint": "Wprowadź adres URL ", "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": "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.", "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", "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_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_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)", "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", "updated_upstream_dns_toast": "Zaktualizowano wyższe serwery DNS",
"dns_test_ok_toast": "Określone serwery DNS działają poprawnie", "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", "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", "next_btn": "Następny",
"loading_table_status": "Wczytuję...", "loading_table_status": "Wczytuję...",
"page_table_footer_text": "Strona", "page_table_footer_text": "Strona",
"of_table_footer_text": "z",
"rows_table_footer_text": "rzędy", "rows_table_footer_text": "rzędy",
"updated_custom_filtering_toast": "Zaktualizowano niestandardowe reguły filtrowania", "updated_custom_filtering_toast": "Zaktualizowano niestandardowe reguły filtrowania",
"rule_removed_from_custom_filtering_toast": "Reguła usunięta z niestandardowych reguł 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)", "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_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_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>.", "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", "source_label": "Źródło",
"found_in_known_domain_db": "Znaleziono w bazie danych znanych domen.", "found_in_known_domain_db": "Znaleziono w bazie danych znanych domen.",
"category_label": "Kategoria", "category_label": "Kategoria",
"rule_label": "Reguła", "rule_label": "Reguła",
"filter_label": "Filtr",
"unknown_filter": "Nieznany filtr {{filterId}}", "unknown_filter": "Nieznany filtr {{filterId}}",
"install_welcome_title": "Witamy w AdGuard Home!", "install_welcome_title": "Witamy w AdGuard Home!",
"install_welcome_desc": "AdGuard Home to w pełni funkcjonalny serwer DNS do blokowania reklam i śledzenia. Jego celem jest kontrolowanie całej sieci i wszystkich urządzeń, bez konieczności korzystania z jakiegokolwiek programu po stronie klienta.", "install_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_edit": "Edytuj klienta",
"client_identifier": "Identyfikator", "client_identifier": "Identyfikator",
"ip_address": "Adres IP", "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_ip": "Wpisz adres IP",
"form_enter_mac": "Wpisz adres MAC", "form_enter_mac": "Wpisz adres MAC",
"form_enter_id": "Wprowadź identyfikator", "form_enter_id": "Wprowadź identyfikator",
@ -333,7 +321,6 @@
"client_updated": "Klient \"{{key}}\" został pomyślnie zaktualizowany", "client_updated": "Klient \"{{key}}\" został pomyślnie zaktualizowany",
"clients_not_found": "Nie znaleziono klientów", "clients_not_found": "Nie znaleziono klientów",
"client_confirm_delete": "Czy na pewno chcesz usunąć klienta \"{{key}}\"?", "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_title": "Klienci (czas uruchamiania)",
"auto_clients_desc": "Dane klientów, które używają AdGuard Home, ale nie są przechowywane w konfiguracji", "auto_clients_desc": "Dane klientów, które używają AdGuard Home, ale nie są przechowywane w konfiguracji",
"access_title": "Ustawienia dostępu", "access_title": "Ustawienia dostępu",
@ -399,7 +386,6 @@
"interval_days_plural": "{{count}} dni", "interval_days_plural": "{{count}} dni",
"domain": "Domena", "domain": "Domena",
"answer": "Odpowiedź", "answer": "Odpowiedź",
"filter_added_successfully": "Pomyślnie dodano filtr",
"statistics_configuration": "Konfiguracja statystyk", "statistics_configuration": "Konfiguracja statystyk",
"statistics_retention": "Przechowywanie statystyk", "statistics_retention": "Przechowywanie statystyk",
"statistics_retention_desc": "Jeśli zmniejszysz wartość interwału, niektóre dane zostaną utracone", "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_save_search_toast": "Pesquisa segura ativada",
"enabled_table_header": "Ativado", "enabled_table_header": "Ativado",
"name_table_header": "Nome", "name_table_header": "Nome",
"filter_url_table_header": "URL do filtro",
"rules_count_table_header": "Quantidade de regras", "rules_count_table_header": "Quantidade de regras",
"last_time_updated_table_header": "Última atualização", "last_time_updated_table_header": "Última atualização",
"actions_table_header": "Ações", "actions_table_header": "Ações",
"edit_table_action": "Editar", "edit_table_action": "Editar",
"delete_table_action": "Excluir", "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.", "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", "cancel_btn": "Cancelar",
"enter_name_hint": "Digite o nome", "enter_name_hint": "Digite o nome",
"enter_url_hint": "Digite a URL", "enter_url_hint": "Digite a URL",
"check_updates_btn": "Verificar atualizações", "check_updates_btn": "Verificar atualizações",
"new_filter_btn": "Nova inscrição de filtro", "form_error_url_format": "Formato da url inválida",
"enter_valid_filter_url": "Digite a URL válida para efetuar a inscrição de filtro ou um arquivo de hosts.",
"custom_filter_rules": "Regras de filtragem personalizadas", "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.", "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", "examples_title": "Exemplos",
@ -153,7 +148,6 @@
"example_upstream_doh": "<0>DNS-sobre-HTTPS</0> criptografado", "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_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)", "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", "updated_upstream_dns_toast": "Atualizado os servidores DNS upstream",
"dns_test_ok_toast": "Os servidores DNS especificados estão funcionando corretamente", "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", "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", "next_btn": "Próximo",
"loading_table_status": "Carregando", "loading_table_status": "Carregando",
"page_table_footer_text": "Página", "page_table_footer_text": "Página",
"of_table_footer_text": "de",
"rows_table_footer_text": "linhas", "rows_table_footer_text": "linhas",
"updated_custom_filtering_toast": "Regras de filtragem personalizadas atualizadas", "updated_custom_filtering_toast": "Regras de filtragem personalizadas atualizadas",
"rule_removed_from_custom_filtering_toast": "Regra removida das regras de filtragem personalizadas", "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", "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", "dns_config": "Configuração do servidor DNS",
"blocking_mode": "Modo de bloqueio", "blocking_mode": "Modo de bloqueio",
"default": "Padrão",
"nxdomain": "NXDOMAIN", "nxdomain": "NXDOMAIN",
"null_ip": "IP nulo", "null_ip": "IP nulo",
"custom_ip": "IP personalizado", "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)", "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_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_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>.", "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", "source_label": "Fonte",
"found_in_known_domain_db": "Encontrado no banco de dados de domínios conhecidos.", "found_in_known_domain_db": "Encontrado no banco de dados de domínios conhecidos.",
"category_label": "Categoria", "category_label": "Categoria",
"rule_label": "Regra", "rule_label": "Regra",
"filter_label": "Filtro",
"unknown_filter": "Filtro desconhecido {{filterId}}", "unknown_filter": "Filtro desconhecido {{filterId}}",
"install_welcome_title": "Bem-vindo(a) ao AdGuard Home!", "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.", "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", "client_updated": "Cliente \"{{key}}\" atualizado com sucesso",
"clients_not_found": "Nenhum cliente foi encontrado", "clients_not_found": "Nenhum cliente foi encontrado",
"client_confirm_delete": "Você tem certeza de que deseja excluir o cliente \"{{key}}\"?", "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_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", "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", "access_title": "Configurações de acessos",
@ -399,7 +394,6 @@
"interval_days_plural": "{{count}} dias", "interval_days_plural": "{{count}} dias",
"domain": "Domínio", "domain": "Domínio",
"answer": "Resposta", "answer": "Resposta",
"filter_added_successfully": "O filtro foi adicionado com sucesso",
"statistics_configuration": "Configurações de estatísticas", "statistics_configuration": "Configurações de estatísticas",
"statistics_retention": "Permanência das estatísticas", "statistics_retention": "Permanência das estatísticas",
"statistics_retention_desc": "Se você diminuir o valor do intervalo, alguns dados serão perdidos", "statistics_retention_desc": "Se você diminuir o valor do intervalo, alguns dados serão perdidos",
@ -431,5 +425,33 @@
"try_again": "Tente novamente", "try_again": "Tente novamente",
"domain_desc": "Digite o nome do domínio ou wildcard que pretende reescrever.", "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_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_save_search_toast": "Pesquisa segura activada",
"enabled_table_header": "Activados", "enabled_table_header": "Activados",
"name_table_header": "Nome", "name_table_header": "Nome",
"filter_url_table_header": "URL do filtro",
"rules_count_table_header": "Total de Regras", "rules_count_table_header": "Total de Regras",
"last_time_updated_table_header": "Última actualização", "last_time_updated_table_header": "Última actualização",
"actions_table_header": "Acções", "actions_table_header": "Acções",
"edit_table_action": "Editar", "edit_table_action": "Editar",
"delete_table_action": "Apagar", "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.", "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", "cancel_btn": "Cancelar",
"enter_name_hint": "Insira o nome", "enter_name_hint": "Insira o nome",
"enter_url_hint": "Insira URL", "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": "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.", "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", "examples_title": "Exemplos",
@ -152,7 +145,6 @@
"example_upstream_doh": "<0>DNS-sobre-HTTPS</0> criptografado", "example_upstream_doh": "<0>DNS-sobre-HTTPS</0> criptografado",
"example_upstream_sdns": "pode usar <0>DNS Stamps</0>para o <1>DNSCrypt</1>ou usar os resolvedores <2>DNS-sobre-HTTPS</2>", "example_upstream_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)", "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", "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_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", "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", "next_btn": "Seguinte",
"loading_table_status": "A carregar...", "loading_table_status": "A carregar...",
"page_table_footer_text": "Página", "page_table_footer_text": "Página",
"of_table_footer_text": "de",
"rows_table_footer_text": "linhas", "rows_table_footer_text": "linhas",
"updated_custom_filtering_toast": "Regras de filtragem personalizadas actualizadas", "updated_custom_filtering_toast": "Regras de filtragem personalizadas actualizadas",
"rule_removed_from_custom_filtering_toast": "Regra removida das regras de filtragem personalizadas", "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)", "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_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_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>.", "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", "source_label": "Fonte",
"found_in_known_domain_db": "Encontrado no banco de dados de domínios conhecido.", "found_in_known_domain_db": "Encontrado no banco de dados de domínios conhecido.",
"category_label": "Categoria", "category_label": "Categoria",
"rule_label": "Regra", "rule_label": "Regra",
"filter_label": "Filtro",
"unknown_filter": "Filtro desconhecido {{filterId}}", "unknown_filter": "Filtro desconhecido {{filterId}}",
"install_welcome_title": "Bem-vindo ao AdGuard Home!", "install_welcome_title": "Bem-vindo ao AdGuard Home!",
"install_welcome_desc": "O AdGuard Home é um servidor de DNS para bloqueio de anúncios e monitorização em toda a rede. A sua finalidade é permitir que controle toda a sua rede e os seus dispositivos sem precisar de ter um programa instalado.", "install_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_edit": "Editar cliente",
"client_identifier": "Identificador", "client_identifier": "Identificador",
"ip_address": "Endereço de IP", "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_ip": "Insira IP",
"form_enter_mac": "Insira o endereço MAC", "form_enter_mac": "Insira o endereço MAC",
"form_enter_id": "Inserir identificador", "form_enter_id": "Inserir identificador",
@ -332,7 +320,6 @@
"client_updated": "Cliente \"{{key}}\" actualizado com sucesso", "client_updated": "Cliente \"{{key}}\" actualizado com sucesso",
"clients_not_found": "Nenhum cliente foi encontrado", "clients_not_found": "Nenhum cliente foi encontrado",
"client_confirm_delete": "Tem a certeza de que deseja excluir o cliente \"{{key}}\"?", "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_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", "auto_clients_desc": "Dados dos clientes que usam o AdGuard Home, que não são armazenados na configuração",
"access_title": "Configurações de acesso", "access_title": "Configurações de acesso",
@ -397,7 +384,6 @@
"interval_days_plural": "{{count}} dias", "interval_days_plural": "{{count}} dias",
"domain": "Domínio", "domain": "Domínio",
"answer": "Resposta", "answer": "Resposta",
"filter_added_successfully": "O filtro foi adicionado com sucesso",
"statistics_configuration": "Configuração das estatísticas", "statistics_configuration": "Configuração das estatísticas",
"statistics_retention": "Retenção de estatísticas", "statistics_retention": "Retenção de estatísticas",
"statistics_retention_desc": "Se diminuir o valor do intervalo, alguns dados serão perdidos", "statistics_retention_desc": "Se diminuir o valor do intervalo, alguns dados serão perdidos",

View file

@ -101,6 +101,11 @@
"no_servers_specified": "Нет указанных серверов", "no_servers_specified": "Нет указанных серверов",
"general_settings": "Основные настройки", "general_settings": "Основные настройки",
"dns_settings": "Настройки DNS", "dns_settings": "Настройки DNS",
"dns_blocklists": "Черные списки DNS",
"dns_allowlists": "Белые списки DNS",
"dns_blocklists_desc": "AdGuard Home будет блокировать домены из черных списков.",
"dns_allowlists_desc": "Домены из белых списков DNS будут разрешены, даже если они находятся в любом из черных списков.",
"custom_filtering_rules": "Пользовательские правила фильтрации",
"encryption_settings": "Настройки шифрования", "encryption_settings": "Настройки шифрования",
"dhcp_settings": "Настройки DHCP", "dhcp_settings": "Настройки DHCP",
"upstream_dns": "Upstream DNS-серверы", "upstream_dns": "Upstream DNS-серверы",
@ -118,22 +123,28 @@
"enabled_save_search_toast": "Безопасный поиск вкл.", "enabled_save_search_toast": "Безопасный поиск вкл.",
"enabled_table_header": "Вкл.", "enabled_table_header": "Вкл.",
"name_table_header": "Имя", "name_table_header": "Имя",
"filter_url_table_header": "URL фильтра", "list_url_table_header": "URL-адрес списка",
"rules_count_table_header": "Количество правил:", "rules_count_table_header": "Количество правил:",
"last_time_updated_table_header": "Последнее обновление", "last_time_updated_table_header": "Последнее обновление",
"actions_table_header": "Действия", "actions_table_header": "Действия",
"edit_table_action": "Редактировать", "edit_table_action": "Редактировать",
"delete_table_action": "Удалить", "delete_table_action": "Удалить",
"filters_and_hosts": "Фильтры и черные списки hosts",
"filters_and_hosts_hint": "AdGuard Home распознает базовые правила блокировки и синтаксис файлов hosts.", "filters_and_hosts_hint": "AdGuard Home распознает базовые правила блокировки и синтаксис файлов hosts.",
"no_filters_added": "Фильтры не добавлены", "no_blocklist_added": "Черные списки не добавлены",
"add_filter_btn": "Добавить фильтр", "no_whitelist_added": "Белые списки не добавлены",
"add_blocklist": "Добавить черный список",
"add_allowlist": "Добавить белый список",
"cancel_btn": "Отмена", "cancel_btn": "Отмена",
"enter_name_hint": "Введите имя", "enter_name_hint": "Введите имя",
"enter_url_hint": "Введите URL", "enter_url_hint": "Введите URL",
"check_updates_btn": "Проверить обновления", "check_updates_btn": "Проверить обновления",
"new_filter_btn": "Добавление нового фильтра", "new_blocklist": "Новый черный список",
"enter_valid_filter_url": "Введите действующий URL для подписки на фильтр или файл hosts.", "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": "Пользовательское правило фильтрации",
"custom_filter_rules_hint": "Вводите по одному правилу на строчку. Вы можете использовать правила блокировки или синтаксис файлов hosts.", "custom_filter_rules_hint": "Вводите по одному правилу на строчку. Вы можете использовать правила блокировки или синтаксис файлов hosts.",
"examples_title": "Примеры", "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_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_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)", "example_upstream_tcp": "обычный DNS (поверх TCP)",
"all_filters_up_to_date_toast": "Все фильтры обновлены", "all_lists_up_to_date_toast": "Все списки уже обновлены",
"updated_upstream_dns_toast": "Upstream DNS-серверы обновлены", "updated_upstream_dns_toast": "Upstream DNS-серверы обновлены",
"dns_test_ok_toast": "Указанные серверы DNS работают корректно", "dns_test_ok_toast": "Указанные серверы DNS работают корректно",
"dns_test_not_ok_toast": "Сервер \"{{key}}\": невозможно использовать, проверьте правильность написания", "dns_test_not_ok_toast": "Сервер \"{{key}}\": невозможно использовать, проверьте правильность написания",
@ -169,7 +180,6 @@
"next_btn": "Вперёд", "next_btn": "Вперёд",
"loading_table_status": "Загрузка...", "loading_table_status": "Загрузка...",
"page_table_footer_text": "Страница", "page_table_footer_text": "Страница",
"of_table_footer_text": "из",
"rows_table_footer_text": "строк", "rows_table_footer_text": "строк",
"updated_custom_filtering_toast": "Внесены изменения в пользовательские правила", "updated_custom_filtering_toast": "Внесены изменения в пользовательские правила",
"rule_removed_from_custom_filtering_toast": "Правило удалено из авторского списка правил фильтрации", "rule_removed_from_custom_filtering_toast": "Правило удалено из авторского списка правил фильтрации",
@ -187,6 +197,7 @@
"query_log_retention_confirm": "Вы уверены, что хотите изменить срок хранения запросов? При сокращении интервала данные могут быть утеряны", "query_log_retention_confirm": "Вы уверены, что хотите изменить срок хранения запросов? При сокращении интервала данные могут быть утеряны",
"dns_config": "Настройки DNS-сервера", "dns_config": "Настройки DNS-сервера",
"blocking_mode": "Режим блокировки", "blocking_mode": "Режим блокировки",
"default": "Стандартный",
"nxdomain": "NXDOMAIN", "nxdomain": "NXDOMAIN",
"null_ip": "Нулевой IP", "null_ip": "Нулевой IP",
"custom_ip": "Свой IP", "custom_ip": "Свой IP",
@ -199,13 +210,16 @@
"rate_limit_desc": "Ограничение на количество запросов в секунду для каждого клиента (0 — неограниченно)", "rate_limit_desc": "Ограничение на количество запросов в секунду для каждого клиента (0 — неограниченно)",
"blocking_ipv4_desc": "IP-адрес, возвращаемый при блокировке A-запроса", "blocking_ipv4_desc": "IP-адрес, возвращаемый при блокировке A-запроса",
"blocking_ipv6_desc": "IP-адрес, возвращаемый при блокировке AAAA-запроса", "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>.", "upstream_dns_client_desc": "Если оставить поле пустым, AdGuard Home будет обращаться к серверам, указанным в <0>настройках DNS</0>.",
"source_label": "Источник", "source_label": "Источник",
"found_in_known_domain_db": "Найден в базе известных доменов.", "found_in_known_domain_db": "Найден в базе известных доменов.",
"category_label": "Категория", "category_label": "Категория",
"rule_label": "Правило", "rule_label": "Правило",
"filter_label": "Фильтр", "list_label": "Список",
"unknown_filter": "Неизвестный фильтр {{filterId}}", "unknown_filter": "Неизвестный фильтр {{filterId}}",
"install_welcome_title": "Добро пожаловать в AdGuard Home!", "install_welcome_title": "Добро пожаловать в AdGuard Home!",
"install_welcome_desc": "AdGuard Home это DNS-сервер, блокирующий рекламу и трекинг. Его цель дать вам возможность контролировать всю вашу сеть и все подключенные устройства. Он не требует установки клиентских программ.", "install_welcome_desc": "AdGuard Home это DNS-сервер, блокирующий рекламу и трекинг. Его цель дать вам возможность контролировать всю вашу сеть и все подключенные устройства. Он не требует установки клиентских программ.",
@ -329,7 +343,7 @@
"client_updated": "Клиент \"{{key}}\" успешно обновлен", "client_updated": "Клиент \"{{key}}\" успешно обновлен",
"clients_not_found": "Клиентов не найдено", "clients_not_found": "Клиентов не найдено",
"client_confirm_delete": "Вы уверены, что хотите удалить клиента \"{{key}}\"?", "client_confirm_delete": "Вы уверены, что хотите удалить клиента \"{{key}}\"?",
"filter_confirm_delete": "Вы уверены, что хотите удалить фильтр?", "list_confirm_delete": "Вы уверены, что хотите удалить этот список?",
"auto_clients_title": "Клиенты (runtime)", "auto_clients_title": "Клиенты (runtime)",
"auto_clients_desc": "Данные о клиентах, которые используют AdGuard Home, но не хранятся в настройках", "auto_clients_desc": "Данные о клиентах, которые используют AdGuard Home, но не хранятся в настройках",
"access_title": "Настройки доступа", "access_title": "Настройки доступа",
@ -393,7 +407,8 @@
"interval_24_hour": "24 часа", "interval_24_hour": "24 часа",
"domain": "Домен", "domain": "Домен",
"answer": "Ответ", "answer": "Ответ",
"filter_added_successfully": "Фильтр успешно добавлен", "filter_added_successfully": "Список успешно добавлен",
"filter_updated": "Список успешно обновлен",
"statistics_configuration": "Конфигурация статистики", "statistics_configuration": "Конфигурация статистики",
"statistics_retention": "Сохранение статистики", "statistics_retention": "Сохранение статистики",
"statistics_retention_desc": "Если вы уменьшите значение интервала, некоторые данные могут быть утеряны", "statistics_retention_desc": "Если вы уменьшите значение интервала, некоторые данные могут быть утеряны",
@ -435,5 +450,38 @@
"for_last_days_2": "за последние {{count}} дней", "for_last_days_2": "за последние {{count}} дней",
"number_of_dns_query_days_0": "Количество DNS-запросов за {{count}} день", "number_of_dns_query_days_0": "Количество DNS-запросов за {{count}} день",
"number_of_dns_query_days_1": "Количество 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_save_search_toast": "Zapnuté bezpečné vyhľadávanie",
"enabled_table_header": "Zapnuté", "enabled_table_header": "Zapnuté",
"name_table_header": "Meno", "name_table_header": "Meno",
"filter_url_table_header": "URL adresa filtra",
"rules_count_table_header": "Počet pravidiel", "rules_count_table_header": "Počet pravidiel",
"last_time_updated_table_header": "Posledná aktualizácia", "last_time_updated_table_header": "Posledná aktualizácia",
"actions_table_header": "Akcie", "actions_table_header": "Akcie",
"edit_table_action": "Úprava", "edit_table_action": "Úprava",
"delete_table_action": "Vymazať", "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.", "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ť", "cancel_btn": "Zrušiť",
"enter_name_hint": "Zadajte meno", "enter_name_hint": "Zadajte meno",
"enter_url_hint": "Zadajte URL adresu", "enter_url_hint": "Zadajte URL adresu",
"check_updates_btn": "Skontrolovať aktualizácie", "check_updates_btn": "Skontrolovať aktualizácie",
"new_filter_btn": "Odber nového filtra", "form_error_url_format": "Neplatný URL formát",
"enter_valid_filter_url": "Zadajte platnú URL adresu na odber filtra alebo zoznamov adries.",
"custom_filter_rules": "Vlastné filtračné pravidlá", "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.", "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", "examples_title": "Príklady",
@ -153,7 +148,6 @@
"example_upstream_doh": "šifrované <0>DNS-over-HTTPS</0>", "example_upstream_doh": "šifrované <0>DNS-over-HTTPS</0>",
"example_upstream_sdns": "môžete použiť <0>DNS pečiatky</0> pre <1>DNSCrypt</1> alebo <2>DNS-over-HTTPS</2>", "example_upstream_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)", "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", "updated_upstream_dns_toast": "Aktualizované upstream DNS servery",
"dns_test_ok_toast": "Špecifikované DNS servery pracujú korektne", "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", "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", "next_btn": "Ďalšie",
"loading_table_status": "Načítavam...", "loading_table_status": "Načítavam...",
"page_table_footer_text": "Stránka", "page_table_footer_text": "Stránka",
"of_table_footer_text": "z",
"rows_table_footer_text": "riadky", "rows_table_footer_text": "riadky",
"updated_custom_filtering_toast": "Aktualizované vlastné filtračné pravidlá", "updated_custom_filtering_toast": "Aktualizované vlastné filtračné pravidlá",
"rule_removed_from_custom_filtering_toast": "Pravidlo odstránené z vlastných filtračných pravidiel", "rule_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", "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", "dns_config": "Konfigurácia DNS servera",
"blocking_mode": "Spôsob blokovania", "blocking_mode": "Spôsob blokovania",
"default": "Predvolené",
"nxdomain": "NXDOMAIN", "nxdomain": "NXDOMAIN",
"null_ip": "Nulová IP adresa", "null_ip": "Nulová IP adresa",
"custom_ip": "Vlastná 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)", "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_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_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>.", "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", "source_label": "Zdroj",
"found_in_known_domain_db": "Nájdené v databáze známych domén.", "found_in_known_domain_db": "Nájdené v databáze známych domén.",
"category_label": "Kategória", "category_label": "Kategória",
"rule_label": "Pravidlo", "rule_label": "Pravidlo",
"filter_label": "Filter",
"unknown_filter": "Neznámy filter {{filterId}}", "unknown_filter": "Neznámy filter {{filterId}}",
"install_welcome_title": "Vitajte na stránkach AdGuard Home!", "install_welcome_title": "Vitajte na stránkach AdGuard Home!",
"install_welcome_desc": "Doména AdGuard Home je celosieťový DNS server pre blokovanie reklám a sledovačov. Jeho cieľom je, aby ste ovládali celú Vašu sieť a všetky Vaše zariadenia, pričom sa nevyžaduje použitie akéhokoľvek programu na strane klienta.", "install_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_edit": "Upraviť klienta",
"client_identifier": "Identifikátor", "client_identifier": "Identifikátor",
"ip_address": "IP adresa", "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_ip": "Zadajte IP adresu",
"form_enter_mac": "Zadajte MAC adresu", "form_enter_mac": "Zadajte MAC adresu",
"form_enter_id": "Zadajte identifikátor", "form_enter_id": "Zadajte identifikátor",
@ -333,7 +329,6 @@
"client_updated": "\"{{key}}\" klienta bol úspešne aktualizovaný", "client_updated": "\"{{key}}\" klienta bol úspešne aktualizovaný",
"clients_not_found": "Nebol nájdený žiaden klient", "clients_not_found": "Nebol nájdený žiaden klient",
"client_confirm_delete": "Naozaj chcete vymazať \"{{key}}\" klienta?", "client_confirm_delete": "Naozaj chcete vymazať \"{{key}}\" klienta?",
"filter_confirm_delete": "Naozaj chcete vymazať tento filter?",
"auto_clients_title": "Klienti (runtime)", "auto_clients_title": "Klienti (runtime)",
"auto_clients_desc": "Údaje o klientoch, ktorí používajú AdGuard Home, ale nie sú uložení v konfigurácii", "auto_clients_desc": "Údaje o klientoch, ktorí používajú AdGuard Home, ale nie sú uložení v konfigurácii",
"access_title": "Nastavenia prístupu", "access_title": "Nastavenia prístupu",
@ -399,7 +394,6 @@
"interval_days_plural": "{{count}} dní", "interval_days_plural": "{{count}} dní",
"domain": "Doména", "domain": "Doména",
"answer": "Odpoveď", "answer": "Odpoveď",
"filter_added_successfully": "Filter bol úspešne pridaný",
"statistics_configuration": "Konfigurácia štatistiky", "statistics_configuration": "Konfigurácia štatistiky",
"statistics_retention": "Štatistika za obdobie", "statistics_retention": "Štatistika za obdobie",
"statistics_retention_desc": "Ak znížite hodnotu intervalu, niektoré údaje sa stratia", "statistics_retention_desc": "Ak znížite hodnotu intervalu, niektoré údaje sa stratia",
@ -431,5 +425,33 @@
"try_again": "Skúste znova", "try_again": "Skúste znova",
"domain_desc": "Zadajte meno domény alebo zástupný znak, ktorý chcete prepísať.", "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_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_save_search_toast": "Omogočeno varno iskanje",
"enabled_table_header": "Omogočeno", "enabled_table_header": "Omogočeno",
"name_table_header": "Ime", "name_table_header": "Ime",
"filter_url_table_header": "Filter URL",
"rules_count_table_header": "Število pravil", "rules_count_table_header": "Število pravil",
"last_time_updated_table_header": "Zadnjič posodobljeno", "last_time_updated_table_header": "Zadnjič posodobljeno",
"actions_table_header": "Akcij", "actions_table_header": "Akcij",
"edit_table_action": "Uredi", "edit_table_action": "Uredi",
"delete_table_action": "Izbriši", "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.", "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", "cancel_btn": "Prekliči",
"enter_name_hint": "Vnesite ime", "enter_name_hint": "Vnesite ime",
"enter_url_hint": "Vnesite URL", "enter_url_hint": "Vnesite URL",
"check_updates_btn": "Preveri posodobitve", "check_updates_btn": "Preveri obstoj posodobitev",
"new_filter_btn": "Nova naročnina filtra", "form_error_url_format": "Neveljaven format Url",
"enter_valid_filter_url": "Vnesite veljaven URL za naročnino filtra ali datoteko gostiteljev.",
"custom_filter_rules": "Pravila filtriranja po meri", "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.", "custom_filter_rules_hint": "V vrstico vnesite eno pravilo. Uporabite lahko pravila zaviranja oglasov ali sintakso gostiteljskih datotek.",
"examples_title": "Primeri", "examples_title": "Primeri",
@ -147,13 +142,12 @@
"example_comment": "! Tukaj je komentar", "example_comment": "! Tukaj je komentar",
"example_comment_meaning": "samo komentar", "example_comment_meaning": "samo komentar",
"example_comment_hash": "# Tudi 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_regular": "redni DNS (nad UDP)",
"example_upstream_dot": "šifriran <0>DNS-prek-TLS</0>", "example_upstream_dot": "šifriran <0>DNS-prek-TLS</0>",
"example_upstream_doh": "šifriran <0>DNS-prek-HTTPS</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_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)", "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", "updated_upstream_dns_toast": "Posodobljeni Zagonske strežnike DNS",
"dns_test_ok_toast": "Navedeni strežniki DNS delujejo pravilno", "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", "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", "next_btn": "Naslednja",
"loading_table_status": "Nalaganje...", "loading_table_status": "Nalaganje...",
"page_table_footer_text": "Stran", "page_table_footer_text": "Stran",
"of_table_footer_text": "od",
"rows_table_footer_text": "vrstic", "rows_table_footer_text": "vrstic",
"updated_custom_filtering_toast": "Posodobljena pravila filtriranja po meri", "updated_custom_filtering_toast": "Posodobljena pravila filtriranja po meri",
"rule_removed_from_custom_filtering_toast": "Pravilo je odstranjeno iz pravil 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", "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", "dns_config": "Konfiguracija strežnika DNS",
"blocking_mode": "Način zaviranja", "blocking_mode": "Način zaviranja",
"default": "Privzeto",
"nxdomain": "NXDOMAIN", "nxdomain": "NXDOMAIN",
"null_ip": "Prazen IP", "null_ip": "Prazen IP",
"custom_ip": "IP po meri", "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)", "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_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_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>.", "upstream_dns_client_desc": "Če pustite to polje prazno, bo AdGuard Home uporabil strežnike, konfigurirane v <0>nastavitvah DNS</0>.",
"source_label": "Vir", "source_label": "Vir",
"found_in_known_domain_db": "Najdeno v zbirki podatkov znanih domen.", "found_in_known_domain_db": "Najdeno v zbirki podatkov znanih domen.",
"category_label": "Kategorija", "category_label": "Kategorija",
"rule_label": "Pravilo", "rule_label": "Pravilo",
"filter_label": "Filter",
"unknown_filter": "Neznan filter {{filterId}}", "unknown_filter": "Neznan filter {{filterId}}",
"install_welcome_title": "Dobrodošli v AdGuard Home!", "install_welcome_title": "Dobrodošli v AdGuard Home!",
"install_welcome_desc": "AdGuard Home je omrežni strežnik DNS, ki zavira oglase in sledilce v celotnem omrežju. Njegov namen je omogočanje nadzora nad celotnim omrežjem in vsemi vašimi napravami in ne zahteva uporabo odjemalskega programa.", "install_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_edit": "Uredi odjemalca",
"client_identifier": "Identifikator", "client_identifier": "Identifikator",
"ip_address": "IP naslov", "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_ip": "Vnesite IP",
"form_enter_mac": "Vnesite MAC", "form_enter_mac": "Vnesite MAC",
"form_enter_id": "Vnesi identifikatorja", "form_enter_id": "Vnesi identifikatorja",
@ -333,7 +329,6 @@
"client_updated": "Odjemalec \"{{key}}\" je bil uspešno posodobljen", "client_updated": "Odjemalec \"{{key}}\" je bil uspešno posodobljen",
"clients_not_found": "Odjemalcev ni bilo mogoče najti", "clients_not_found": "Odjemalcev ni bilo mogoče najti",
"client_confirm_delete": "Ali ste prepričani, da želite izbrisati odjemalca \"{{key}}\"?", "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_title": "Odjemalci (čas izvajanja)",
"auto_clients_desc": "Podatki o odjemalcih, ki uporabljajo AdGuard Home, vendar niso shranjeni v konfiguraciji", "auto_clients_desc": "Podatki o odjemalcih, ki uporabljajo AdGuard Home, vendar niso shranjeni v konfiguraciji",
"access_title": "Nastavitve dostopa", "access_title": "Nastavitve dostopa",
@ -372,6 +367,7 @@
"rewrite_desc": "Omogoča enostavno konfiguriranje odgovora DNS po meri za določeno ime domene.", "rewrite_desc": "Omogoča enostavno konfiguriranje odgovora DNS po meri za določeno ime domene.",
"rewrite_applied": "Uporabljeno Pravilo za prepisovanje", "rewrite_applied": "Uporabljeno Pravilo za prepisovanje",
"dns_rewrites": "Prepisovanja NDS", "dns_rewrites": "Prepisovanja NDS",
"form_domain": "Vnesite domeno ali nadomestni znak",
"form_answer": "Vnesite IP naslov ali ime domene", "form_answer": "Vnesite IP naslov ali ime domene",
"form_error_domain_format": "Neveljavna oblika domene", "form_error_domain_format": "Neveljavna oblika domene",
"form_error_answer_format": "Neveljavna oblika odgovora", "form_error_answer_format": "Neveljavna oblika odgovora",
@ -398,7 +394,6 @@
"interval_days_plural": "{{count}} dni", "interval_days_plural": "{{count}} dni",
"domain": "Domena", "domain": "Domena",
"answer": "Odgovor", "answer": "Odgovor",
"filter_added_successfully": "Filter je bil uspešno dodan",
"statistics_configuration": "Konfiguracija statistike", "statistics_configuration": "Konfiguracija statistike",
"statistics_retention": "Statistika zadrževanja", "statistics_retention": "Statistika zadrževanja",
"statistics_retention_desc": "Če zmanjšate vrednost intervala, bodo nekateri podatki izgubljeni", "statistics_retention_desc": "Če zmanjšate vrednost intervala, bodo nekateri podatki izgubljeni",
@ -430,5 +425,33 @@
"try_again": "Poskusi ponovno", "try_again": "Poskusi ponovno",
"domain_desc": "Vnesite ime domene ali nadomestni znak, ki ga želite prepisati.", "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_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_save_search_toast": "Uključeno sigurno pretraživanje",
"enabled_table_header": "Uključeno", "enabled_table_header": "Uključeno",
"name_table_header": "Ime", "name_table_header": "Ime",
"filter_url_table_header": "URL do filtera",
"rules_count_table_header": "Broj pravila", "rules_count_table_header": "Broj pravila",
"last_time_updated_table_header": "Poslednji put ažurirano", "last_time_updated_table_header": "Poslednji put ažurirano",
"actions_table_header": "Radnje", "actions_table_header": "Radnje",
"edit_table_action": "Izmeni", "edit_table_action": "Izmeni",
"delete_table_action": "Izbriši", "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.", "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", "cancel_btn": "Otkaži",
"enter_name_hint": "Unesite ime", "enter_name_hint": "Unesite ime",
"enter_url_hint": "Unesite URL", "enter_url_hint": "Unesite URL",
"check_updates_btn": "Proveri ažuriranja", "check_updates_btn": "Proveri ažuriranja",
"new_filter_btn": "Nova pretplata na filter", "form_error_url_format": "Nevažeći format Url-a",
"enter_valid_filter_url": "Unesite važeći URL do pretplate na filter ili važeću hosts datoteku.",
"custom_filter_rules": "Prilagođena pravila filtriranja", "custom_filter_rules": "Prilagođena pravila filtriranja",
"custom_filter_rules_hint": "Unesite jedno pravilo po redu. Možete koristiti pravila blokatora reklama ili sintaksu hosts datoteke.", "custom_filter_rules_hint": "Unesite jedno pravilo po redu. Možete koristiti pravila blokatora reklama ili sintaksu hosts datoteke.",
"examples_title": "Primeri", "examples_title": "Primeri",
@ -153,7 +148,6 @@
"example_upstream_doh": "šifrovano <0>DNS-over-HTTPS</0>", "example_upstream_doh": "šifrovano <0>DNS-over-HTTPS</0>",
"example_upstream_sdns": "možete koristiti <0>DNS brojeve</0> za <1>DNSCrypt</1> ili <2>DNS-over-HTTPS</2>", "example_upstream_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)", "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", "updated_upstream_dns_toast": "Ažurirani upstream DNS serveri",
"dns_test_ok_toast": "Dati DNS serveri rade ispravno", "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", "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", "next_btn": "Sledeće",
"loading_table_status": "Učitavanje...", "loading_table_status": "Učitavanje...",
"page_table_footer_text": "Stranica", "page_table_footer_text": "Stranica",
"of_table_footer_text": "od",
"rows_table_footer_text": "redovi", "rows_table_footer_text": "redovi",
"updated_custom_filtering_toast": "Ažurirana prilagođena pravila filtriranja", "updated_custom_filtering_toast": "Ažurirana prilagođena pravila filtriranja",
"rule_removed_from_custom_filtering_toast": "Pravilo uklonjeno iz prilagođenih 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", "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", "dns_config": "Konfiguracija DNS servera",
"blocking_mode": "Način blokiranja", "blocking_mode": "Način blokiranja",
"default": "Podrazumevano",
"nxdomain": "NXDOMAIN", "nxdomain": "NXDOMAIN",
"null_ip": "Null IP", "null_ip": "Null IP",
"custom_ip": "Prilagođeni 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)", "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_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_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>.", "upstream_dns_client_desc": "AKo ovo polje ostavite prazno, AdGuard Home će koristiti servere konfigurisane u <0>DNS postavkama</0>.",
"source_label": "Izvor", "source_label": "Izvor",
"found_in_known_domain_db": "Pronađeno u poznatim bazama podataka domena.", "found_in_known_domain_db": "Pronađeno u poznatim bazama podataka domena.",
"category_label": "Kategorija", "category_label": "Kategorija",
"rule_label": "Pravilo", "rule_label": "Pravilo",
"filter_label": "Filter",
"unknown_filter": "Nepoznat filter {{filterId}}", "unknown_filter": "Nepoznat filter {{filterId}}",
"install_welcome_title": "Dobrodošli u AdGuard home!", "install_welcome_title": "Dobrodošli u AdGuard home!",
"install_welcome_desc": "AdGuard Home je mrežni DNS server, blokator reklama i praćenja. Dopušta vam da kontrolišete svoju čitavu mrežu i sve vaše uređaje i ne zahteva korišćenje nikakvog klijentskog programa.", "install_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", "client_updated": "Klijent \"{{key}}\" uspešno ažuriran",
"clients_not_found": "Nema pronađenih klijenata", "clients_not_found": "Nema pronađenih klijenata",
"client_confirm_delete": "Jeste li sigurni da želite da izbrišete klijenta \"{{key}}\"?", "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_title": "Klijenti (runtime)",
"auto_clients_desc": "Podaci o klijentima koji koriste AdGuard Home, ali nisu sačuvani u konfiguraciji", "auto_clients_desc": "Podaci o klijentima koji koriste AdGuard Home, ali nisu sačuvani u konfiguraciji",
"access_title": "Postavke pristupa", "access_title": "Postavke pristupa",
@ -399,7 +394,6 @@
"interval_days_plural": "{{count}} dana", "interval_days_plural": "{{count}} dana",
"domain": "Domen", "domain": "Domen",
"answer": "Odgovor", "answer": "Odgovor",
"filter_added_successfully": "Filter je uspešno dodat",
"statistics_configuration": "Konfiguracija statistike", "statistics_configuration": "Konfiguracija statistike",
"statistics_retention": "Zadržavanje statistike", "statistics_retention": "Zadržavanje statistike",
"statistics_retention_desc": "Ako smanjite vrednost intervala, neki podaci će biti izgubljeni", "statistics_retention_desc": "Ako smanjite vrednost intervala, neki podaci će biti izgubljeni",
@ -431,5 +425,33 @@
"try_again": "Pokušaj ponovo", "try_again": "Pokušaj ponovo",
"domain_desc": "Unesite domen ili džoker koji želite da prepišete.", "domain_desc": "Unesite domen ili džoker koji želite da prepišete.",
"example_rewrite_domain": "prepiši odgovore samo za ovaj domen.", "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_save_search_toast": "Säker webbsökning inkopplat",
"enabled_table_header": "Inkopplat", "enabled_table_header": "Inkopplat",
"name_table_header": "Namn", "name_table_header": "Namn",
"filter_url_table_header": "Filtrerar URL",
"rules_count_table_header": "Regelantal", "rules_count_table_header": "Regelantal",
"last_time_updated_table_header": "Uppdaterades senast", "last_time_updated_table_header": "Uppdaterades senast",
"actions_table_header": "Åtgärder", "actions_table_header": "Åtgärder",
"edit_table_action": "Redigera", "edit_table_action": "Redigera",
"delete_table_action": "Ta bort", "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", "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", "cancel_btn": "Avbryt",
"enter_name_hint": "Skriv in namn", "enter_name_hint": "Skriv in namn",
"enter_url_hint": "Skriv in URL", "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": "Egna filterregler",
"custom_filter_rules_hint": "Skriv en regel per rad. Du kan använda antingen annonsblockeringsregler eller värdfilssyntax.", "custom_filter_rules_hint": "Skriv en regel per rad. Du kan använda antingen annonsblockeringsregler eller värdfilssyntax.",
"examples_title": "Exempel", "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_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_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)", "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", "updated_upstream_dns_toast": "Uppdaterade uppströms-dns-servrar",
"dns_test_ok_toast": "Angivna DNS servrar fungerar korrekt", "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", "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", "next_btn": "Nästa",
"loading_table_status": "Läser in...", "loading_table_status": "Läser in...",
"page_table_footer_text": "Sida", "page_table_footer_text": "Sida",
"of_table_footer_text": "av",
"rows_table_footer_text": "rader", "rows_table_footer_text": "rader",
"updated_custom_filtering_toast": "Uppdaterade de egna filterreglerna", "updated_custom_filtering_toast": "Uppdaterade de egna filterreglerna",
"rule_removed_from_custom_filtering_toast": "Regel borttagen från 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.", "found_in_known_domain_db": "Hittad i domändatabas.",
"category_label": "Kategori", "category_label": "Kategori",
"rule_label": "Regel", "rule_label": "Regel",
"filter_label": "Filter",
"unknown_filter": "Okänt filter {{filterId}}", "unknown_filter": "Okänt filter {{filterId}}",
"install_welcome_title": "Välkommen till AdGuard Home!", "install_welcome_title": "Välkommen till AdGuard Home!",
"install_welcome_desc": "AdGuard Home är en DNS-server för nätverkstäckande annons- och spårningsblockering. Dess syfte är att de dig kontroll över hela nätverket och alla dina enheter, utan behov av att använda klientbaserade program.", "install_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_edit": "Redigera klient",
"client_identifier": "Identifikator", "client_identifier": "Identifikator",
"ip_address": "IP-adress", "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_ip": "Skriv in IP",
"form_enter_mac": "Skriv in MAC", "form_enter_mac": "Skriv in MAC",
"form_client_name": "Skriv in klientnamn", "form_client_name": "Skriv in klientnamn",
@ -307,7 +296,6 @@
"client_updated": "Klient \"{{key}}\" har uppdaterats", "client_updated": "Klient \"{{key}}\" har uppdaterats",
"clients_not_found": "Inga klienter hittade", "clients_not_found": "Inga klienter hittade",
"client_confirm_delete": "Är du säker på att du vill ta bort klient \"{{key}}\"?", "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_title": "Klienter (körtid)",
"auto_clients_desc": "Data från klienter som använder AdGuard Home, men inte är sparade i konfigurationen", "auto_clients_desc": "Data från klienter som använder AdGuard Home, men inte är sparade i konfigurationen",
"access_title": "Åtkomstinställningar", "access_title": "Åtkomstinställningar",

View file

@ -121,22 +121,15 @@
"enabled_save_search_toast": "Güvenli arama çalışıyor", "enabled_save_search_toast": "Güvenli arama çalışıyor",
"enabled_table_header": "Etkin", "enabled_table_header": "Etkin",
"name_table_header": "İsim", "name_table_header": "İsim",
"filter_url_table_header": "Filtre URL'si",
"rules_count_table_header": "Kural sayısı", "rules_count_table_header": "Kural sayısı",
"last_time_updated_table_header": "Son güncelleme", "last_time_updated_table_header": "Son güncelleme",
"actions_table_header": "Eylemler", "actions_table_header": "Eylemler",
"edit_table_action": "Düzenle", "edit_table_action": "Düzenle",
"delete_table_action": "Sil", "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.", "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", "cancel_btn": "İptal",
"enter_name_hint": "İsim girin", "enter_name_hint": "İsim girin",
"enter_url_hint": "URL'yi 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": "İ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.", "custom_filter_rules_hint": "Her satıra bir kural girin. Reklama engelleme kuralı veya hosts dosyası söz dizimi kullanabilirsiniz.",
"examples_title": "Örnekler", "examples_title": "Örnekler",
@ -152,7 +145,6 @@
"example_upstream_doh": "<0>DNS-over-HTTPS</0> şifrelemesi", "example_upstream_doh": "<0>DNS-over-HTTPS</0> şifrelemesi",
"example_upstream_sdns": "<1>DNSCrypt</1> veya <2>DNS-over-HTTPS</2> çözücüleri için <0>DNS Damgaları</0> kullanabilirsiniz.", "example_upstream_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)", "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", "updated_upstream_dns_toast": "Üst DNS sunucuları güncellendi",
"dns_test_ok_toast": "Belirtilmiş DNS sunucuları düzgün çalışıyor", "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", "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", "next_btn": "Sonraki",
"loading_table_status": "Yükleniyor...", "loading_table_status": "Yükleniyor...",
"page_table_footer_text": "Sayfa", "page_table_footer_text": "Sayfa",
"of_table_footer_text": "/",
"rows_table_footer_text": "satır", "rows_table_footer_text": "satır",
"updated_custom_filtering_toast": "İsteğe bağlı filtreleme kuralları güncellendi", "updated_custom_filtering_toast": "İsteğe bağlı filtreleme kuralları güncellendi",
"rule_removed_from_custom_filtering_toast": "Kural isteğe bağlı filtreleme kurallarından kaldırıldı", "rule_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)", "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_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_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.", "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", "source_label": "Kaynak",
"found_in_known_domain_db": "Bilinen alan adları veri tabanı içinde bulundu", "found_in_known_domain_db": "Bilinen alan adları veri tabanı içinde bulundu",
"category_label": "Kategori", "category_label": "Kategori",
"rule_label": "Kural", "rule_label": "Kural",
"filter_label": "Filtre",
"unknown_filter": "Bilinmeyen filtre {{filterId}}", "unknown_filter": "Bilinmeyen filtre {{filterId}}",
"install_welcome_title": "AdGuard Home'a hoşgeldiniz!", "install_welcome_title": "AdGuard Home'a hoşgeldiniz!",
"install_welcome_desc": "AdGuard Home, ağ genelinde reklam ve izleyicileri engelleyen bir DNS sunucusudur. Tüm ağınızı ve tüm cihazlarınızı kontrol etmenize yarayan bir araçtır, istemci tarafında bir program kullanmanıza gerek duymaz.", "install_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_edit": "İstemciyi düzenle",
"client_identifier": "Tanımlayıcı", "client_identifier": "Tanımlayıcı",
"ip_address": "IP adresi", "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_ip": "IP Girin",
"form_enter_mac": "MAC Girin", "form_enter_mac": "MAC Girin",
"form_enter_id": "Tanımlayıcı girin", "form_enter_id": "Tanımlayıcı girin",
@ -332,7 +320,6 @@
"client_updated": "\"{{key}}\" istemcisi başarıyla güncellendi", "client_updated": "\"{{key}}\" istemcisi başarıyla güncellendi",
"clients_not_found": "İstemci bulunamadı", "clients_not_found": "İstemci bulunamadı",
"client_confirm_delete": "\"{{key}}\" istemcisini silmek istediğinizden emin misiniz?", "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_title": "İstemciler (çalışma zamanı)",
"auto_clients_desc": "AdGuard Home'u kullanan, ancak yapılandırmada saklanmayan istemcilerdeki veriler", "auto_clients_desc": "AdGuard Home'u kullanan, ancak yapılandırmada saklanmayan istemcilerdeki veriler",
"access_title": "Erişim ayarları", "access_title": "Erişim ayarları",
@ -398,7 +385,6 @@
"interval_days_plural": "{{count}} gün", "interval_days_plural": "{{count}} gün",
"domain": "Alan adı", "domain": "Alan adı",
"answer": "Cevap", "answer": "Cevap",
"filter_added_successfully": "Filtre başarıyla eklendi",
"statistics_configuration": "İstatistik yapılandırması", "statistics_configuration": "İstatistik yapılandırması",
"statistics_retention": "İstatistikleri depolama", "statistics_retention": "İstatistikleri depolama",
"statistics_retention_desc": "Zaman değerini azaltırsanız bazı veriler kaybolacaktır", "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_save_search_toast": "Đã bật tìm kiếm an toàn",
"enabled_table_header": "Kích hoạt", "enabled_table_header": "Kích hoạt",
"name_table_header": "Tên", "name_table_header": "Tên",
"filter_url_table_header": "URL bộ lọc",
"rules_count_table_header": "Số quy tắc", "rules_count_table_header": "Số quy tắc",
"last_time_updated_table_header": "Cập nhật cuối", "last_time_updated_table_header": "Cập nhật cuối",
"actions_table_header": "Thao tác", "actions_table_header": "Thao tác",
"edit_table_action": "Chỉnh sửa", "edit_table_action": "Chỉnh sửa",
"delete_table_action": "Xoá", "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", "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ỷ", "cancel_btn": "Huỷ",
"enter_name_hint": "Nhập tên", "enter_name_hint": "Nhập tên",
"enter_url_hint": "Nhập URL", "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": "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", "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ụ", "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_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_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)", "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", "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_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", "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", "next_btn": "Trang sau",
"loading_table_status": "Đang tải...", "loading_table_status": "Đang tải...",
"page_table_footer_text": "Trang", "page_table_footer_text": "Trang",
"of_table_footer_text": "của",
"rows_table_footer_text": "hàng", "rows_table_footer_text": "hàng",
"updated_custom_filtering_toast": "Đã cập nhật quy tắc lọc tuỳ chỉnh", "updated_custom_filtering_toast": "Đã cập nhật quy tắc lọc tuỳ chỉnh",
"rule_removed_from_custom_filtering_toast": "Quy tắc đã được xoá khỏi quy tắc lọc tuỳ chỉnh", "rule_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", "found_in_known_domain_db": "Tìm thấy trong cơ sở dữ liệu tên miền",
"category_label": "Thể loại", "category_label": "Thể loại",
"rule_label": "Quy tắc", "rule_label": "Quy tắc",
"filter_label": "Bộ lọc",
"unknown_filter": "Bộ lọc không rõ {{filterId}}", "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_title": "Chào mừng bạn đến với AdGuard Home!",
"install_welcome_desc": "AdGuard Home là một máy chủ DNS chặn quảng cáo và theo dõi trên toàn mạng. Mục đích của nó là cho phép bạn kiểm soát toàn bộ mạng và tất cả các thiết bị của mình và không yêu cầu sử dụng chương trình phía máy khách.", "install_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_edit": "Chỉnh Sửa Máy Khách",
"client_identifier": "Định danh", "client_identifier": "Định danh",
"ip_address": "Địa chỉ IP", "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_ip": "Nhập IP",
"form_enter_mac": "Nhập MAC", "form_enter_mac": "Nhập MAC",
"form_client_name": "Nhập tên máy khách", "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", "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", "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?", "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_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", "auto_clients_desc": "Dữ liệu trên các máy khách sử dụng AdGuard Home, nhưng không được lưu trong cấu hình",
"access_title": "Cài đặt truy cập", "access_title": "Cài đặt truy cập",
@ -373,7 +361,6 @@
"interval_days_plural": "{{count}} ngày", "interval_days_plural": "{{count}} ngày",
"domain": "Tên miền", "domain": "Tên miền",
"answer": "Trả lời", "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_configuration": "Cấu hình thống kê",
"statistics_retention": "Duy trì thống kê", "statistics_retention": "Duy trì thống kê",
"statistics_retention_desc": "Nếu bạn giảm giá trị khoảng, một số dữ liệu sẽ bị mất", "statistics_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_save_search_toast": "安全搜索已启用",
"enabled_table_header": "已启用", "enabled_table_header": "已启用",
"name_table_header": "名称", "name_table_header": "名称",
"filter_url_table_header": "过滤器地址",
"rules_count_table_header": "规则数", "rules_count_table_header": "规则数",
"last_time_updated_table_header": "上次更新时间", "last_time_updated_table_header": "上次更新时间",
"actions_table_header": "活跃状态", "actions_table_header": "活跃状态",
"edit_table_action": "编辑", "edit_table_action": "编辑",
"delete_table_action": "删除", "delete_table_action": "删除",
"filters_and_hosts": "过滤器和 Hosts 拦截清单",
"filters_and_hosts_hint": "AdGuard Home 可以解析基础的 adblock 规则和 Hosts 语法。", "filters_and_hosts_hint": "AdGuard Home 可以解析基础的 adblock 规则和 Hosts 语法。",
"no_filters_added": "未添加任何过滤器",
"add_filter_btn": "添加过滤器",
"cancel_btn": "取消", "cancel_btn": "取消",
"enter_name_hint": "输入名称", "enter_name_hint": "输入名称",
"enter_url_hint": "输入 URL", "enter_url_hint": "输入 URL",
"check_updates_btn": "检查更新",
"new_filter_btn": "订阅新的过滤器",
"enter_valid_filter_url": "输入一个过滤器订阅或 Hosts 文件的有效 URL",
"custom_filter_rules": "自定义过滤器规则", "custom_filter_rules": "自定义过滤器规则",
"custom_filter_rules_hint": "请确保每行只输入一条规则。你可以输入符合 adblock 语法或 Hosts 语法的规则。", "custom_filter_rules_hint": "请确保每行只输入一条规则。你可以输入符合 adblock 语法或 Hosts 语法的规则。",
"examples_title": "范例", "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_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_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 ", "example_upstream_tcp": "常规 DNS基于 TCP ",
"all_filters_up_to_date_toast": "所有过滤器已更新至最新",
"updated_upstream_dns_toast": "上游 DNS 已更新", "updated_upstream_dns_toast": "上游 DNS 已更新",
"dns_test_ok_toast": "指定的 DNS 服务器现已正常运行", "dns_test_ok_toast": "指定的 DNS 服务器现已正常运行",
"dns_test_not_ok_toast": "服务器 \"{{key}}\":无法使用,请检查你输入的是否正确", "dns_test_not_ok_toast": "服务器 \"{{key}}\":无法使用,请检查你输入的是否正确",
@ -173,7 +165,6 @@
"next_btn": "下一页", "next_btn": "下一页",
"loading_table_status": "加载中……", "loading_table_status": "加载中……",
"page_table_footer_text": "页", "page_table_footer_text": "页",
"of_table_footer_text": "在",
"rows_table_footer_text": "行", "rows_table_footer_text": "行",
"updated_custom_filtering_toast": "自定义过滤规则已更新", "updated_custom_filtering_toast": "自定义过滤规则已更新",
"rule_removed_from_custom_filtering_toast": "规则已从自定义过滤规则列表中移除", "rule_removed_from_custom_filtering_toast": "规则已从自定义过滤规则列表中移除",
@ -203,13 +194,11 @@
"rate_limit_desc": "每个客户端每秒钟查询次数的限制 (0不限制)", "rate_limit_desc": "每个客户端每秒钟查询次数的限制 (0不限制)",
"blocking_ipv4_desc": "拦截 A 记录请求返回的 IP 地址", "blocking_ipv4_desc": "拦截 A 记录请求返回的 IP 地址",
"blocking_ipv6_desc": "拦截 AAAA 记录请求返回的 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>中配置的服务器。", "upstream_dns_client_desc": "如果将此字段留空AdGuard Home 将使用在<0>DNS设置</0>中配置的服务器。",
"source_label": "源", "source_label": "源",
"found_in_known_domain_db": "成功在已知域名数据库中查询到", "found_in_known_domain_db": "成功在已知域名数据库中查询到",
"category_label": "类别", "category_label": "类别",
"rule_label": "规则", "rule_label": "规则",
"filter_label": "过滤器",
"unknown_filter": "未知过滤器 {{filterId}}", "unknown_filter": "未知过滤器 {{filterId}}",
"install_welcome_title": "欢迎使用 AdGuard Home", "install_welcome_title": "欢迎使用 AdGuard Home",
"install_welcome_desc": "AdGuard Home 是一个可在特定网络范围内拦截所有广告和跟踪器的 DNS 服务器。它的目的是让您控制整个网络和您的所有设备,且不需要使用任何客户端程序。", "install_welcome_desc": "AdGuard Home 是一个可在特定网络范围内拦截所有广告和跟踪器的 DNS 服务器。它的目的是让您控制整个网络和您的所有设备,且不需要使用任何客户端程序。",
@ -321,7 +310,6 @@
"client_edit": "编辑客户端", "client_edit": "编辑客户端",
"client_identifier": "标识符", "client_identifier": "标识符",
"ip_address": "IP 地址", "ip_address": "IP 地址",
"client_identifier_desc": "客户端可通过 IP 地址或 MAC 地址识别。请注意,如 AdGuard Home 也是 <0>DHCP 服务器</0>,则仅能将 MAC 用作标识符",
"form_enter_ip": "输入 IP", "form_enter_ip": "输入 IP",
"form_enter_mac": "输入 MAC", "form_enter_mac": "输入 MAC",
"form_enter_id": "输入标识符", "form_enter_id": "输入标识符",
@ -333,7 +321,6 @@
"client_updated": "客户端 \"{{key}}\" 更新成功", "client_updated": "客户端 \"{{key}}\" 更新成功",
"clients_not_found": "未找到客户端", "clients_not_found": "未找到客户端",
"client_confirm_delete": "您确定要删除客户端 \"{{key}}\"", "client_confirm_delete": "您确定要删除客户端 \"{{key}}\"",
"filter_confirm_delete": "您确定是要删除过滤器?",
"auto_clients_title": "客户端(运行时间)", "auto_clients_title": "客户端(运行时间)",
"auto_clients_desc": "使用 Adguard Home 但未存储在配置中的客户端上的数据", "auto_clients_desc": "使用 Adguard Home 但未存储在配置中的客户端上的数据",
"access_title": "访问设置", "access_title": "访问设置",
@ -399,7 +386,6 @@
"interval_days_plural": "{{count}} 天", "interval_days_plural": "{{count}} 天",
"domain": "域", "domain": "域",
"answer": "应答", "answer": "应答",
"filter_added_successfully": "已成功添加过滤器",
"statistics_configuration": "统计配置", "statistics_configuration": "统计配置",
"statistics_retention": "统计保留", "statistics_retention": "统计保留",
"statistics_retention_desc": "如果您减少该间隔的数值, 某些数据可能会丢失", "statistics_retention_desc": "如果您减少该间隔的数值, 某些数据可能会丢失",

View file

@ -105,6 +105,11 @@
"no_servers_specified": "無已明確指定的伺服器", "no_servers_specified": "無已明確指定的伺服器",
"general_settings": "一般的設定", "general_settings": "一般的設定",
"dns_settings": "DNS 設定", "dns_settings": "DNS 設定",
"dns_blocklists": "DNS 封鎖清單",
"dns_allowlists": "DNS 允許清單",
"dns_blocklists_desc": "AdGuard Home 將封鎖與封鎖清單相符的網域。",
"dns_allowlists_desc": "來自 DNS 允許清單的網域將被允許,即使它們在任何的封鎖清單中。",
"custom_filtering_rules": "自訂的過濾規則",
"encryption_settings": "加密設定", "encryption_settings": "加密設定",
"dhcp_settings": "動態主機設定協定DHCP設定", "dhcp_settings": "動態主機設定協定DHCP設定",
"upstream_dns": "上游的 DNS 伺服器", "upstream_dns": "上游的 DNS 伺服器",
@ -122,22 +127,22 @@
"enabled_save_search_toast": "已啟用安全搜尋", "enabled_save_search_toast": "已啟用安全搜尋",
"enabled_table_header": "已啟用", "enabled_table_header": "已啟用",
"name_table_header": "名稱", "name_table_header": "名稱",
"filter_url_table_header": "過濾器網址", "list_url_table_header": "列出網址",
"rules_count_table_header": "規則總數", "rules_count_table_header": "規則總數",
"last_time_updated_table_header": "最近的更新時間", "last_time_updated_table_header": "最近的更新時間",
"actions_table_header": "動作", "actions_table_header": "動作",
"edit_table_action": "編輯", "edit_table_action": "編輯",
"delete_table_action": "刪除", "delete_table_action": "刪除",
"filters_and_hosts": "過濾器和主機封鎖清單",
"filters_and_hosts_hint": "AdGuard Home 懂得基本的廣告封鎖規則和主機檔案語法。", "filters_and_hosts_hint": "AdGuard Home 懂得基本的廣告封鎖規則和主機檔案語法。",
"no_filters_added": "無已加入的過濾器",
"add_filter_btn": "增加過濾器",
"cancel_btn": "取消", "cancel_btn": "取消",
"enter_name_hint": "輸入名稱", "enter_name_hint": "輸入名稱",
"enter_url_hint": "輸入網址", "enter_url_hint": "輸入網址",
"check_updates_btn": "檢查更新", "check_updates_btn": "檢查更新",
"new_filter_btn": "新的過濾器訂閱", "new_blocklist": "新的封鎖清單",
"enter_valid_filter_url": "輸入關於過濾器訂閱或主機檔案之有效的網址。", "new_allowlist": "新的允許清單",
"edit_blocklist": "編輯封鎖清單",
"edit_allowlist": "編輯允許清單",
"form_error_url_format": "無效的網址格式",
"custom_filter_rules": "自訂的過濾規則", "custom_filter_rules": "自訂的過濾規則",
"custom_filter_rules_hint": "於一行上輸入一個規則。您可使用廣告封鎖規則或主機檔案語法。", "custom_filter_rules_hint": "於一行上輸入一個規則。您可使用廣告封鎖規則或主機檔案語法。",
"examples_title": "範例", "examples_title": "範例",
@ -153,7 +158,7 @@
"example_upstream_doh": "加密的 <0>DNS-over-HTTPS</0>", "example_upstream_doh": "加密的 <0>DNS-over-HTTPS</0>",
"example_upstream_sdns": "您可使用關於 <1>DNSCrypt</1> 或 <2>DNS-over-HTTPS</2> 解析器之 <0>DNS 戳記</0>", "example_upstream_sdns": "您可使用關於 <1>DNSCrypt</1> 或 <2>DNS-over-HTTPS</2> 解析器之 <0>DNS 戳記</0>",
"example_upstream_tcp": "一般的 DNS透過 TCP", "example_upstream_tcp": "一般的 DNS透過 TCP",
"all_filters_up_to_date_toast": "所有的過濾器已是最新的", "all_lists_up_to_date_toast": "所有的清單已是最新的",
"updated_upstream_dns_toast": "已更新上游的 DNS 伺服器", "updated_upstream_dns_toast": "已更新上游的 DNS 伺服器",
"dns_test_ok_toast": "已明確指定的 DNS 伺服器正在正確地運作", "dns_test_ok_toast": "已明確指定的 DNS 伺服器正在正確地運作",
"dns_test_not_ok_toast": "伺服器 \"{{key}}\":無法被使用,請檢查您已正確地填寫它", "dns_test_not_ok_toast": "伺服器 \"{{key}}\":無法被使用,請檢查您已正確地填寫它",
@ -164,7 +169,7 @@
"type_table_header": "類型", "type_table_header": "類型",
"response_table_header": "回應", "response_table_header": "回應",
"client_table_header": "用戶端", "client_table_header": "用戶端",
"empty_response_status": "空的", "empty_response_status": "空的",
"show_all_filter_type": "顯示全部", "show_all_filter_type": "顯示全部",
"show_filtered_type": "顯示已過濾的", "show_filtered_type": "顯示已過濾的",
"no_logs_found": "無已發現之記錄", "no_logs_found": "無已發現之記錄",
@ -173,7 +178,6 @@
"next_btn": "下一頁", "next_btn": "下一頁",
"loading_table_status": "正在載入…", "loading_table_status": "正在載入…",
"page_table_footer_text": "頁面", "page_table_footer_text": "頁面",
"of_table_footer_text": "之",
"rows_table_footer_text": "列", "rows_table_footer_text": "列",
"updated_custom_filtering_toast": "已更新自訂的過濾規則", "updated_custom_filtering_toast": "已更新自訂的過濾規則",
"rule_removed_from_custom_filtering_toast": "規則從自訂的過濾規則中被移除", "rule_removed_from_custom_filtering_toast": "規則從自訂的過濾規則中被移除",
@ -191,6 +195,7 @@
"query_log_retention_confirm": "您確定您想要更改查詢記錄保留嗎?如果您減少該間隔值,某些資料將被丟失", "query_log_retention_confirm": "您確定您想要更改查詢記錄保留嗎?如果您減少該間隔值,某些資料將被丟失",
"dns_config": "DNS 伺服器配置", "dns_config": "DNS 伺服器配置",
"blocking_mode": "封鎖模式", "blocking_mode": "封鎖模式",
"default": "預設",
"nxdomain": "不存在的網域NXDOMAIN", "nxdomain": "不存在的網域NXDOMAIN",
"null_ip": "無效的 IP", "null_ip": "無效的 IP",
"custom_ip": "自訂的 IP", "custom_ip": "自訂的 IP",
@ -203,13 +208,15 @@
"rate_limit_desc": "單一的用戶端被允許傳送的每秒請求之數量0無限制的", "rate_limit_desc": "單一的用戶端被允許傳送的每秒請求之數量0無限制的",
"blocking_ipv4_desc": "要被返回給已封鎖的 A 請求之 IP 位址", "blocking_ipv4_desc": "要被返回給已封鎖的 A 請求之 IP 位址",
"blocking_ipv6_desc": "要被返回給已封鎖的 AAAA 請求之 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>中被配置的伺服器。", "upstream_dns_client_desc": "如果您將該欄位留空AdGuard Home 將使用在 <0>DNS 設定</0>中被配置的伺服器。",
"source_label": "來源", "source_label": "來源",
"found_in_known_domain_db": "在已知的域名資料庫中被發現。", "found_in_known_domain_db": "在已知的域名資料庫中被發現。",
"category_label": "類別", "category_label": "類別",
"rule_label": "規則", "rule_label": "規則",
"filter_label": "過濾器",
"unknown_filter": "未知的過濾器 {{filterId}}", "unknown_filter": "未知的過濾器 {{filterId}}",
"install_welcome_title": "歡迎至 AdGuard Home", "install_welcome_title": "歡迎至 AdGuard Home",
"install_welcome_desc": "AdGuard Home 是全網路範圍廣告和追蹤器封鎖的 DNS 伺服器。它的目的為讓您控制您的整個網路和所有您的裝置,且不需要使用用戶端程式。", "install_welcome_desc": "AdGuard Home 是全網路範圍廣告和追蹤器封鎖的 DNS 伺服器。它的目的為讓您控制您的整個網路和所有您的裝置,且不需要使用用戶端程式。",
@ -308,7 +315,7 @@
"dns_providers": "這裡是一個從中選擇之<0>已知的 DNS 供應商之清單</0>。", "dns_providers": "這裡是一個從中選擇之<0>已知的 DNS 供應商之清單</0>。",
"update_now": "立即更新", "update_now": "立即更新",
"update_failed": "自動更新已失敗。請<a href='https://github.com/AdguardTeam/AdGuardHome/wiki/Getting-Started#update'>遵循這些步驟</a>以手動地更新。", "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_title": "用戶端",
"clients_desc": "配置被連線到 AdGuard Home 的裝置", "clients_desc": "配置被連線到 AdGuard Home 的裝置",
"settings_global": "全域的", "settings_global": "全域的",
@ -321,7 +328,7 @@
"client_edit": "編輯用戶端", "client_edit": "編輯用戶端",
"client_identifier": "識別碼", "client_identifier": "識別碼",
"ip_address": "IP 位址", "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_ip": "輸入 IP",
"form_enter_mac": "輸入媒體存取控制MAC", "form_enter_mac": "輸入媒體存取控制MAC",
"form_enter_id": "輸入識別碼", "form_enter_id": "輸入識別碼",
@ -333,7 +340,7 @@
"client_updated": "用戶端 \"{{key}}\" 被成功地更新", "client_updated": "用戶端 \"{{key}}\" 被成功地更新",
"clients_not_found": "無已發現之用戶端", "clients_not_found": "無已發現之用戶端",
"client_confirm_delete": "您確定您想要刪除用戶端 \"{{key}}\" 嗎?", "client_confirm_delete": "您確定您想要刪除用戶端 \"{{key}}\" 嗎?",
"filter_confirm_delete": "您確定您想要刪除該過濾器嗎?", "list_confirm_delete": "您確定您想要刪除該清單嗎?",
"auto_clients_title": "用戶端(執行時期)", "auto_clients_title": "用戶端(執行時期)",
"auto_clients_desc": "使用 AdGuard Home 但未被儲存在配置中之關於用戶端的資料", "auto_clients_desc": "使用 AdGuard Home 但未被儲存在配置中之關於用戶端的資料",
"access_title": "存取設定", "access_title": "存取設定",
@ -399,7 +406,8 @@
"interval_days_plural": "{{count}} 日", "interval_days_plural": "{{count}} 日",
"domain": "網域", "domain": "網域",
"answer": "回應", "answer": "回應",
"filter_added_successfully": "該過濾器已被成功地加入", "filter_added_successfully": "該清單已被成功地加入",
"filter_updated": "該清單已被成功地更新",
"statistics_configuration": "統計資料配置", "statistics_configuration": "統計資料配置",
"statistics_retention": "統計資料保留", "statistics_retention": "統計資料保留",
"statistics_retention_desc": "如果您減少該間隔值,某些資料將被丟失", "statistics_retention_desc": "如果您減少該間隔值,某些資料將被丟失",
@ -431,5 +439,37 @@
"try_again": "再次嘗試", "try_again": "再次嘗試",
"domain_desc": "輸入您想要被改寫的域名或萬用字元wildcard。", "domain_desc": "輸入您想要被改寫的域名或萬用字元wildcard。",
"example_rewrite_domain": "僅對於此域名改寫回應。", "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 { createAction } from 'redux-actions';
import { showLoading, hideLoading } from 'react-redux-loading-bar'; import { showLoading, hideLoading } from 'react-redux-loading-bar';
import { t } from 'i18next';
import { normalizeFilteringStatus, normalizeRulesTextarea } from '../helpers/helpers'; import { normalizeFilteringStatus, normalizeRulesTextarea } from '../helpers/helpers';
import { addErrorToast, addSuccessToast } from './index'; 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 addFilterFailure = createAction('ADD_FILTER_FAILURE');
export const addFilterSuccess = createAction('ADD_FILTER_SUCCESS'); 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()); dispatch(addFilterRequest());
try { try {
await apiClient.addFilter(url, name); await apiClient.addFilter({ url, name, whitelist });
dispatch(addFilterSuccess(url)); dispatch(addFilterSuccess(url));
dispatch(toggleFilteringModal()); dispatch(toggleFilteringModal());
dispatch(addSuccessToast('filter_added_successfully')); 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 removeFilterFailure = createAction('REMOVE_FILTER_FAILURE');
export const removeFilterSuccess = createAction('REMOVE_FILTER_SUCCESS'); export const removeFilterSuccess = createAction('REMOVE_FILTER_SUCCESS');
export const removeFilter = url => async (dispatch) => { export const removeFilter = (url, whitelist = false) => async (dispatch) => {
dispatch(removeFilterRequest()); dispatch(removeFilterRequest());
try { try {
await apiClient.removeFilter(url); await apiClient.removeFilter({ url, whitelist });
dispatch(removeFilterSuccess(url)); dispatch(removeFilterSuccess(url));
dispatch(getFilteringStatus()); dispatch(getFilteringStatus());
} catch (error) { } catch (error) {
@ -78,10 +79,10 @@ export const toggleFilterRequest = createAction('FILTER_TOGGLE_REQUEST');
export const toggleFilterFailure = createAction('FILTER_TOGGLE_FAILURE'); export const toggleFilterFailure = createAction('FILTER_TOGGLE_FAILURE');
export const toggleFilterSuccess = createAction('FILTER_TOGGLE_SUCCESS'); 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()); dispatch(toggleFilterRequest());
try { try {
await apiClient.setFilterUrl({ url, data }); await apiClient.setFilterUrl({ url, data, whitelist });
dispatch(toggleFilterSuccess(url)); dispatch(toggleFilterSuccess(url));
dispatch(getFilteringStatus()); dispatch(getFilteringStatus());
} catch (error) { } catch (error) {
@ -94,10 +95,10 @@ export const editFilterRequest = createAction('EDIT_FILTER_REQUEST');
export const editFilterFailure = createAction('EDIT_FILTER_FAILURE'); export const editFilterFailure = createAction('EDIT_FILTER_FAILURE');
export const editFilterSuccess = createAction('EDIT_FILTER_SUCCESS'); 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()); dispatch(editFilterRequest());
try { try {
await apiClient.setFilterUrl({ url, data }); await apiClient.setFilterUrl({ url, data, whitelist });
dispatch(editFilterSuccess(url)); dispatch(editFilterSuccess(url));
dispatch(toggleFilteringModal()); dispatch(toggleFilteringModal());
dispatch(addSuccessToast('filter_updated')); dispatch(addSuccessToast('filter_updated'));
@ -116,17 +117,14 @@ export const refreshFilters = () => async (dispatch) => {
dispatch(refreshFiltersRequest()); dispatch(refreshFiltersRequest());
dispatch(showLoading()); dispatch(showLoading());
try { try {
const refreshText = await apiClient.refreshFilters(); const data = await apiClient.refreshFilters();
const { updated } = data;
dispatch(refreshFiltersSuccess()); dispatch(refreshFiltersSuccess());
if (refreshText.includes('OK')) { if (updated > 0) {
if (refreshText.includes('OK 0')) { dispatch(addSuccessToast(t('list_updated', { count: updated })));
dispatch(addSuccessToast('all_filters_up_to_date_toast'));
} else { } else {
dispatch(addSuccessToast(refreshText.replace(/OK /g, ''))); dispatch(addSuccessToast('all_lists_up_to_date_toast'));
}
} else {
dispatch(addErrorToast({ error: refreshText }));
} }
dispatch(getFilteringStatus()); dispatch(getFilteringStatus());

View file

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

View file

@ -12,7 +12,11 @@ import './index.css';
import Header from '../../containers/Header'; import Header from '../../containers/Header';
import Dashboard from '../../containers/Dashboard'; import Dashboard from '../../containers/Dashboard';
import Settings from '../../containers/Settings'; 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 Dns from '../../containers/Dns';
import Encryption from '../../containers/Encryption'; import Encryption from '../../containers/Encryption';
@ -108,7 +112,10 @@ class App extends Component {
<Route path="/encryption" component={Encryption} /> <Route path="/encryption" component={Encryption} />
<Route path="/dhcp" component={Dhcp} /> <Route path="/dhcp" component={Dhcp} />
<Route path="/clients" component={Clients} /> <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="/logs" component={Logs} />
<Route path="/guide" component={SetupGuide} /> <Route path="/guide" component={SetupGuide} />
</Fragment> </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'; } from '../../../helpers/helpers';
import { FILTERED } from '../../../helpers/constants'; import { FILTERED } from '../../../helpers/constants';
const getFilterName = (id, filters, t) => { const getFilterName = (id, filters, whitelistFilters, t) => {
if (id === 0) { if (id === 0) {
return t('filtered_custom_rules'); 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) { if (filter && filter.name) {
return t('query_log_filtered', { filter: filter.name }); return t('query_log_filtered', { filter: filter.name });
@ -43,14 +44,9 @@ const getTitle = (reason, filterName, t, onlyFiltered) => {
if (checkWhiteList(reason)) { if (checkWhiteList(reason)) {
return ( return (
<Fragment>
<div>
{t('host_whitelisted')}
</div>
<div> <div>
{filterName} {filterName}
</div> </div>
</Fragment>
); );
} }
@ -90,6 +86,7 @@ const getColor = (reason) => {
const Info = ({ const Info = ({
filters, filters,
whitelistFilters,
hostname, hostname,
reason, reason,
filter_id, filter_id,
@ -99,7 +96,7 @@ const Info = ({
ip_addrs, ip_addrs,
t, t,
}) => { }) => {
const filterName = getFilterName(filter_id, filters, t); const filterName = getFilterName(filter_id, filters, whitelistFilters, t);
const onlyFiltered = checkSafeSearch(reason) const onlyFiltered = checkSafeSearch(reason)
|| checkSafeBrowsing(reason) || checkSafeBrowsing(reason)
|| checkParental(reason); || checkParental(reason);
@ -149,6 +146,7 @@ const Info = ({
Info.propTypes = { Info.propTypes = {
filters: PropTypes.array.isRequired, filters: PropTypes.array.isRequired,
whitelistFilters: PropTypes.array.isRequired,
hostname: PropTypes.string.isRequired, hostname: PropTypes.string.isRequired,
reason: PropTypes.string.isRequired, reason: PropTypes.string.isRequired,
filter_id: PropTypes.number, filter_id: PropTypes.number,

View file

@ -17,6 +17,7 @@ const Check = (props) => {
processing, processing,
check, check,
filters, filters,
whitelistFilters,
} = props; } = props;
const { const {
@ -62,6 +63,7 @@ const Check = (props) => {
<hr/> <hr/>
<Info <Info
filters={filters} filters={filters}
whitelistFilters={whitelistFilters}
hostname={hostname} hostname={hostname}
reason={reason} reason={reason}
filter_id={filter_id} filter_id={filter_id}
@ -87,6 +89,7 @@ Check.propTypes = {
processing: PropTypes.bool.isRequired, processing: PropTypes.bool.isRequired,
check: PropTypes.object.isRequired, check: PropTypes.object.isRequired,
filters: PropTypes.array.isRequired, filters: PropTypes.array.isRequired,
whitelistFilters: PropTypes.array.isRequired,
}; };
export default flow([ 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, handleSubmit,
processingAddFilter, processingAddFilter,
processingConfigFilter, processingConfigFilter,
whitelist,
} = props; } = props;
return ( return (
@ -41,7 +42,11 @@ const Form = (props) => {
/> />
</div> </div>
<div className="form__description"> <div className="form__description">
<Trans>enter_valid_filter_url</Trans> {whitelist ? (
<Trans>enter_valid_allowlist</Trans>
) : (
<Trans>enter_valid_blocklist</Trans>
)}
</div> </div>
</div> </div>
<div className="modal-footer"> <div className="modal-footer">
@ -70,6 +75,7 @@ Form.propTypes = {
handleSubmit: PropTypes.func.isRequired, handleSubmit: PropTypes.func.isRequired,
processingAddFilter: PropTypes.bool.isRequired, processingAddFilter: PropTypes.bool.isRequired,
processingConfigFilter: PropTypes.bool.isRequired, processingConfigFilter: PropTypes.bool.isRequired,
whitelist: PropTypes.bool,
}; };
export default flow([ export default flow([

View file

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

View file

@ -4,7 +4,7 @@ import { Field, reduxForm } from 'redux-form';
import { Trans, withNamespaces } from 'react-i18next'; import { Trans, withNamespaces } from 'react-i18next';
import flow from 'lodash/flow'; 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 Form = (props) => {
const { 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 classnames from 'classnames';
import { Trans, withNamespaces } from 'react-i18next'; 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'; import Dropdown from '../ui/Dropdown';
const MENU_ITEMS = [ 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 // 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: MENU_URLS.guide, icon: 'setup', text: 'setup_guide', order: 4,
},
{
route: 'guide', xlinkHref: 'setup', text: 'setup_guide', order: 4,
}, },
]; ];
const DROPDOWN_ITEMS = [ const SETTINGS_ITEMS = [
{ route: 'settings', text: 'general_settings' }, { route: SETTINGS_URLS.settings, text: 'general_settings' },
{ route: 'dns', text: 'dns_settings' }, { route: SETTINGS_URLS.dns, text: 'dns_settings' },
{ route: 'encryption', text: 'encryption_settings' }, { route: SETTINGS_URLS.encryption, text: 'encryption_settings' },
{ route: 'clients', text: 'client_settings' }, { route: SETTINGS_URLS.clients, text: 'client_settings' },
{ route: 'dhcp', text: 'dhcp_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 { class Menu extends Component {
@ -43,50 +49,82 @@ class Menu extends Component {
this.props.toggleMenuOpen(); this.props.toggleMenuOpen();
}; };
getActiveClassForSettings = () => { getActiveClassForDropdown = (URLS) => {
const { pathname } = this.props.location; 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() { render() {
const menuClass = classnames({ const menuClass = classnames({
'header__column mobile-menu': true, 'header__column mobile-menu': true,
'mobile-menu--active': this.props.isMenuOpen, 'mobile-menu--active': this.props.isMenuOpen,
}); });
const dropdownControlClass = `nav-link ${this.getActiveClassForSettings()}`;
return ( return (
<Fragment> <Fragment>
<div className={menuClass}> <div className={menuClass}>
<ul className="nav nav-tabs border-0 flex-column flex-lg-row flex-nowrap"> <ul className="nav nav-tabs border-0 flex-column flex-lg-row flex-nowrap">
{MENU_ITEMS.map(({ {MENU_ITEMS.map(item => (
route, text, exact, xlinkHref, order, <li
}) => ( className={`nav-item order-${item.order}`}
<li className={`nav-item order-${order}`} key={text} onClick={this.toggleMenu}> key={item.text}
<NavLink to={`/${route}`} exact={exact || false} className="nav-link"> onClick={this.toggleMenu}
<svg className="nav-icon"> >
<use xlinkHref={`#${xlinkHref}`} /> {this.getNavLink({ ...item, className: 'nav-link' })}
</svg>
<Trans>{text}</Trans>
</NavLink>
</li> </li>
))} ))}
<Dropdown {this.getDropdown({
label={this.props.t('settings')} order: 1,
baseClassName="dropdown nav-item order-1" label: 'settings',
controlClassName={dropdownControlClass} icon: 'settings',
icon="settings" URLS: SETTINGS_URLS,
> ITEMS: SETTINGS_ITEMS,
{DROPDOWN_ITEMS.map(({ route, text }) => ( })}
<NavLink to={`/${route}`} className="dropdown-item" key={text} {this.getDropdown({
onClick={this.toggleMenu}> order: 2,
<Trans>{text}</Trans> label: 'filters',
</NavLink> icon: 'filters',
))} URLS: FILTERS_URLS,
</Dropdown> ITEMS: FILTERS_ITEMS,
})}
</ul> </ul>
</div> </div>
</Fragment> </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) { if (filterId === CUSTOM_FILTERING_RULES_ID) {
return t('custom_filter_rules'); 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 = ''; let filterName = '';
if (filter) { if (filter) {
@ -164,7 +165,7 @@ class Logs extends Component {
reason, filterId, rule, status, originalAnswer, reason, filterId, rule, status, originalAnswer,
} = original; } = original;
const { t, filtering } = this.props; const { t, filtering } = this.props;
const { filters } = filtering; const { filters, whitelistFilters } = filtering;
const isFiltered = checkFiltered(reason); const isFiltered = checkFiltered(reason);
const isBlackList = checkBlackList(reason); const isBlackList = checkBlackList(reason);
@ -177,7 +178,7 @@ class Logs extends Component {
const parsedFilteredReason = t('query_log_filtered', { filter: filterKey }); const parsedFilteredReason = t('query_log_filtered', { filter: filterKey });
const currentService = SERVICES.find(service => service.id === original.serviceName); const currentService = SERVICES.find(service => service.id === original.serviceName);
const serviceName = currentService && currentService.name; const serviceName = currentService && currentService.name;
const filterName = this.getFilterName(filters, filterId, t); const filterName = this.getFilterName(filters, whitelistFilters, filterId, t);
if (isBlockedCnameIp) { if (isBlockedCnameIp) {
const normalizedAnswer = this.normalizeResponse(originalAnswer); const normalizedAnswer = this.normalizeResponse(originalAnswer);
@ -188,6 +189,7 @@ class Logs extends Component {
<span className="logs__text"> <span className="logs__text">
<Trans>blocked_by_response</Trans> <Trans>blocked_by_response</Trans>
</span> </span>
{this.renderTooltip(isFiltered, rule, filterName)}
</div> </div>
<div className="logs__list-wrap"> <div className="logs__list-wrap">
{this.renderResponseList(normalizedAnswer, status)} {this.renderResponseList(normalizedAnswer, status)}
@ -242,7 +244,7 @@ class Logs extends Component {
</div> </div>
{isRewrite ? ( {isRewrite ? (
<div className="logs__action"> <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> <Trans>configure</Trans>
</Link> </Link>
</div> </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 Upstream from './Upstream';
import Access from './Access'; import Access from './Access';
import Rewrites from './Rewrites';
import Config from './Config'; import Config from './Config';
import PageTitle from '../../ui/PageTitle'; import PageTitle from '../../ui/PageTitle';
import Loading from '../../ui/Loading'; import Loading from '../../ui/Loading';
@ -13,7 +12,6 @@ class Dns extends Component {
componentDidMount() { componentDidMount() {
this.props.getDnsSettings(); this.props.getDnsSettings();
this.props.getAccessList(); this.props.getAccessList();
this.props.getRewritesList();
this.props.getDnsConfig(); this.props.getDnsConfig();
} }
@ -23,25 +21,18 @@ class Dns extends Component {
dashboard, dashboard,
settings, settings,
access, access,
rewrites,
setAccessList, setAccessList,
testUpstream, testUpstream,
setUpstream, setUpstream,
getRewritesList,
addRewrite,
deleteRewrite,
toggleRewritesModal,
dnsConfig, dnsConfig,
setDnsConfig, setDnsConfig,
} = this.props; } = this.props;
const isDataLoading = dashboard.processingDnsSettings const isDataLoading = dashboard.processingDnsSettings
|| access.processing || access.processing
|| rewrites.processing
|| dnsConfig.processingGetConfig; || dnsConfig.processingGetConfig;
const isDataReady = !dashboard.processingDnsSettings const isDataReady = !dashboard.processingDnsSettings
&& !access.processing && !access.processing
&& !rewrites.processing
&& !dnsConfig.processingGetConfig; && !dnsConfig.processingGetConfig;
return ( return (
@ -64,13 +55,6 @@ class Dns extends Component {
testUpstream={testUpstream} testUpstream={testUpstream}
/> />
<Access access={access} setAccessList={setAccessList} /> <Access access={access} setAccessList={setAccessList} />
<Rewrites
rewrites={rewrites}
getRewritesList={getRewritesList}
addRewrite={addRewrite}
deleteRewrite={deleteRewrite}
toggleRewritesModal={toggleRewritesModal}
/>
</Fragment> </Fragment>
)} )}
</Fragment> </Fragment>
@ -86,11 +70,6 @@ Dns.propTypes = {
getAccessList: PropTypes.func.isRequired, getAccessList: PropTypes.func.isRequired,
setAccessList: PropTypes.func.isRequired, setAccessList: PropTypes.func.isRequired,
access: PropTypes.object.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, getDnsSettings: PropTypes.func.isRequired,
dnsConfig: PropTypes.object.isRequired, dnsConfig: PropTypes.object.isRequired,
setDnsConfig: PropTypes.func.isRequired, setDnsConfig: PropTypes.func.isRequired,

View file

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

View file

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

View file

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

View file

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

View file

@ -10143,6 +10143,7 @@ body.fixed-header .page {
display: flex; display: flex;
-ms-flex-align: center; -ms-flex-align: center;
align-items: center; align-items: center;
flex-direction: column;
margin: 1.5rem 0 1.5rem; margin: 1.5rem 0 1.5rem;
-ms-flex-wrap: wrap; -ms-flex-wrap: wrap;
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, refreshFilters,
handleRulesChange, handleRulesChange,
editFilter, editFilter,
checkHost,
} from '../actions/filtering'; } from '../actions/filtering';
import Filters from '../components/Filters'; import DnsAllowlist from '../components/Filters/DnsAllowlist';
const mapStateToProps = (state) => { const mapStateToProps = (state) => {
const { filtering } = state; const { filtering } = state;
@ -29,10 +28,9 @@ const mapDispatchToProps = {
refreshFilters, refreshFilters,
handleRulesChange, handleRulesChange,
editFilter, editFilter,
checkHost,
}; };
export default connect( export default connect(
mapStateToProps, mapStateToProps,
mapDispatchToProps, 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', 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 = [ export const SERVICES = [
{ {

View file

@ -122,12 +122,8 @@ export const addClientInfo = (data, clients, param) => (
}) })
); );
export const normalizeFilteringStatus = (filteringStatus) => { export const normalizeFilters = filters => (
const { filters ? filters.map((filter) => {
enabled, filters, user_rules: userRules, interval,
} = filteringStatus;
const newFilters = filters
? filters.map((filter) => {
const { const {
id, id,
url, url,
@ -145,14 +141,20 @@ export const normalizeFilteringStatus = (filteringStatus) => {
name, name,
rulesCount: rules_count, rulesCount: rules_count,
}; };
}) }) : []
: []; );
export const normalizeFilteringStatus = (filteringStatus) => {
const {
enabled, filters, user_rules: userRules, interval, whitelist_filters,
} = filteringStatus;
const newUserRules = Array.isArray(userRules) ? userRules.join('\n') : ''; const newUserRules = Array.isArray(userRules) ? userRules.join('\n') : '';
return { return {
enabled, enabled,
userRules: newUserRules, userRules: newUserRules,
filters: newFilters, filters: normalizeFilters(filters),
whitelistFilters: normalizeFilters(whitelist_filters),
interval, 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 checkSafeBrowsing = reason => reason === FILTERED_STATUS.FILTERED_SAFE_BROWSING;
export const checkParental = reason => reason === FILTERED_STATUS.FILTERED_PARENTAL; export const checkParental = reason => reason === FILTERED_STATUS.FILTERED_PARENTAL;
export const checkBlockedService = reason => reason === FILTERED_STATUS.FILTERED_BLOCKED_SERVICE; 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, processingCheck: false,
isFilterAdded: false, isFilterAdded: false,
filters: [], filters: [],
whitelistFilters: [],
userRules: '', userRules: '',
interval: 24, interval: 24,
enabled: true, enabled: true,

View file

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

View file

@ -42,7 +42,7 @@ func _Func() string {
return path.Base(f.Name()) return path.Base(f.Name())
} }
func NewForTest(c *Config, filters map[int]string) *Dnsfilter { func NewForTest(c *Config, filters []Filter) *Dnsfilter {
setts = RequestFilteringSettings{} setts = RequestFilteringSettings{}
setts.FilteringEnabled = true setts.FilteringEnabled = true
if c != nil { if c != nil {
@ -106,8 +106,9 @@ func TestEtcHostsMatching(t *testing.T) {
::1 host2 ::1 host2
`, `,
addr, addr6) addr, addr6)
filters := make(map[int]string) filters := []Filter{Filter{
filters[0] = text ID: 0, Data: []byte(text),
}}
d := NewForTest(nil, filters) d := NewForTest(nil, filters)
defer d.Close() defer d.Close()
@ -404,8 +405,9 @@ var tests = []struct {
func TestMatching(t *testing.T) { func TestMatching(t *testing.T) {
for _, test := range tests { for _, test := range tests {
t.Run(fmt.Sprintf("%s-%s", test.testname, test.hostname), func(t *testing.T) { t.Run(fmt.Sprintf("%s-%s", test.testname, test.hostname), func(t *testing.T) {
filters := make(map[int]string) filters := []Filter{Filter{
filters[0] = test.rules ID: 0, Data: []byte(test.rules),
}}
d := NewForTest(nil, filters) d := NewForTest(nil, filters)
defer d.Close() 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 // CLIENT SETTINGS
func applyClientSettings(setts *RequestFilteringSettings) { func applyClientSettings(setts *RequestFilteringSettings) {
@ -441,8 +475,9 @@ func applyClientSettings(setts *RequestFilteringSettings) {
// then apply per-client settings and check behaviour once again // then apply per-client settings and check behaviour once again
func TestClientSettings(t *testing.T) { func TestClientSettings(t *testing.T) {
var r Result var r Result
filters := make(map[int]string) filters := []Filter{Filter{
filters[0] = "||example.org^\n" ID: 0, Data: []byte("||example.org^\n"),
}}
d := NewForTest(&Config{ParentalEnabled: true, SafeBrowsingEnabled: false}, filters) d := NewForTest(&Config{ParentalEnabled: true, SafeBrowsingEnabled: false}, filters)
defer d.Close() defer d.Close()

View file

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

View file

@ -60,8 +60,11 @@ type configuration struct {
DNS dnsConfig `yaml:"dns"` DNS dnsConfig `yaml:"dns"`
TLS tlsConfig `yaml:"tls"` TLS tlsConfig `yaml:"tls"`
Filters []filter `yaml:"filters"` Filters []filter `yaml:"filters"`
WhitelistFilters []filter `yaml:"whitelist_filters"`
UserRules []string `yaml:"user_rules"` UserRules []string `yaml:"user_rules"`
DHCP dhcpd.ServerConfig `yaml:"dhcp"` DHCP dhcpd.ServerConfig `yaml:"dhcp"`
// Note: this array is filled only before file read/write and then it's cleared // Note: this array is filled only before file read/write and then it's cleared

View file

@ -30,6 +30,7 @@ func IsValidURL(rawurl string) bool {
type filterAddJSON struct { type filterAddJSON struct {
Name string `json:"name"` Name string `json:"name"`
URL string `json:"url"` URL string `json:"url"`
Whitelist bool `json:"whitelist"`
} }
func handleFilteringAddURL(w http.ResponseWriter, r *http.Request) { func handleFilteringAddURL(w http.ResponseWriter, r *http.Request) {
@ -56,6 +57,7 @@ func handleFilteringAddURL(w http.ResponseWriter, r *http.Request) {
Enabled: true, Enabled: true,
URL: fj.URL, URL: fj.URL,
Name: fj.Name, Name: fj.Name,
white: fj.Whitelist,
} }
f.ID = assignUniqueFilterID() 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 // 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) { if !filterAdd(f) {
httpError(w, http.StatusBadRequest, "Filter URL already added -- %s", f.URL) httpError(w, http.StatusBadRequest, "Filter URL already added -- %s", f.URL)
return return
@ -101,6 +102,7 @@ func handleFilteringRemoveURL(w http.ResponseWriter, r *http.Request) {
type request struct { type request struct {
URL string `json:"url"` URL string `json:"url"`
Whitelist bool `json:"whitelist"`
} }
req := request{} req := request{}
err := json.NewDecoder(r.Body).Decode(&req) 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 // go through each element and delete if url matches
config.Lock() config.Lock()
newFilters := []filter{} 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 { if filter.URL != req.URL {
newFilters = append(newFilters, filter) newFilters = append(newFilters, filter)
} else { } else {
@ -128,7 +134,7 @@ func handleFilteringRemoveURL(w http.ResponseWriter, r *http.Request) {
} }
} }
// Update the configuration after removing filter files // Update the configuration after removing filter files
config.Filters = newFilters *filters = newFilters
config.Unlock() config.Unlock()
onConfigModified() onConfigModified()
@ -146,6 +152,7 @@ type filterURLJSON struct {
type filterURLReq struct { type filterURLReq struct {
URL string `json:"url"` URL string `json:"url"`
Whitelist bool `json:"whitelist"`
Data filterURLJSON `json:"data"` Data filterURLJSON `json:"data"`
} }
@ -167,7 +174,7 @@ func handleFilteringSetURL(w http.ResponseWriter, r *http.Request) {
Name: fj.Data.Name, Name: fj.Data.Name,
URL: fj.Data.URL, URL: fj.Data.URL,
} }
status := filterSetProperties(fj.URL, f) status := filterSetProperties(fj.URL, f, fj.Whitelist)
if (status & statusFound) == 0 { if (status & statusFound) == 0 {
http.Error(w, "URL doesn't exist", http.StatusBadRequest) http.Error(w, "URL doesn't exist", http.StatusBadRequest)
return return
@ -210,14 +217,27 @@ func handleFilteringSetRules(w http.ResponseWriter, r *http.Request) {
} }
func handleFilteringRefresh(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() Context.controlLock.Unlock()
nUpdated, err := refreshFilters() resp.Updated, err = refreshFilters()
Context.controlLock.Lock() Context.controlLock.Lock()
if err != nil { if err != nil {
httpError(w, http.StatusInternalServerError, "%s", err) httpError(w, http.StatusInternalServerError, "%s", err)
return 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 { type filterJSON struct {
@ -233,16 +253,11 @@ type filteringConfig struct {
Enabled bool `json:"enabled"` Enabled bool `json:"enabled"`
Interval uint32 `json:"interval"` // in hours Interval uint32 `json:"interval"` // in hours
Filters []filterJSON `json:"filters"` Filters []filterJSON `json:"filters"`
WhitelistFilters []filterJSON `json:"whitelist_filters"`
UserRules []string `json:"user_rules"` UserRules []string `json:"user_rules"`
} }
// Get filtering configuration func filterToJSON(f filter) filterJSON {
func handleFilteringStatus(w http.ResponseWriter, r *http.Request) {
resp := filteringConfig{}
config.RLock()
resp.Enabled = config.DNS.FilteringEnabled
resp.Interval = config.DNS.FiltersUpdateIntervalHours
for _, f := range config.Filters {
fj := filterJSON{ fj := filterJSON{
ID: f.ID, ID: f.ID,
Enabled: f.Enabled, Enabled: f.Enabled,
@ -255,8 +270,23 @@ func handleFilteringStatus(w http.ResponseWriter, r *http.Request) {
fj.LastUpdated = f.LastUpdated.Format(time.RFC3339) fj.LastUpdated = f.LastUpdated.Format(time.RFC3339)
} }
return fj
}
// Get filtering configuration
func handleFilteringStatus(w http.ResponseWriter, r *http.Request) {
resp := filteringConfig{}
config.RLock()
resp.Enabled = config.DNS.FilteringEnabled
resp.Interval = config.DNS.FiltersUpdateIntervalHours
for _, f := range config.Filters {
fj := filterToJSON(f)
resp.Filters = append(resp.Filters, fj) resp.Filters = append(resp.Filters, fj)
} }
for _, f := range config.WhitelistFilters {
fj := filterToJSON(f)
resp.WhitelistFilters = append(resp.WhitelistFilters, fj)
}
resp.UserRules = config.UserRules resp.UserRules = config.UserRules
config.RUnlock() config.RUnlock()

View file

@ -10,6 +10,7 @@ import (
"strconv" "strconv"
"strings" "strings"
"sync" "sync"
"sync/atomic"
"time" "time"
"github.com/AdguardTeam/AdGuardHome/dnsfilter" "github.com/AdguardTeam/AdGuardHome/dnsfilter"
@ -26,9 +27,11 @@ var (
) )
func initFiltering() { func initFiltering() {
loadFilters() loadFilters(config.Filters)
loadFilters(config.WhitelistFilters)
deduplicateFilters() deduplicateFilters()
updateUniqueFilterID(config.Filters) updateUniqueFilterID(config.Filters)
updateUniqueFilterID(config.WhitelistFilters)
} }
func startFiltering() { func startFiltering() {
@ -55,6 +58,7 @@ type filter struct {
RulesCount int `yaml:"-"` RulesCount int `yaml:"-"`
LastUpdated time.Time `yaml:"-"` LastUpdated time.Time `yaml:"-"`
checksum uint32 // checksum of the file data checksum uint32 // checksum of the file data
white bool
dnsfilter.Filter `yaml:",inline"` dnsfilter.Filter `yaml:",inline"`
} }
@ -78,13 +82,18 @@ const (
// Update properties for a filter specified by its URL // Update properties for a filter specified by its URL
// Return status* flags. // Return status* flags.
func filterSetProperties(url string, newf filter) int { func filterSetProperties(url string, newf filter, whitelist bool) int {
r := 0 r := 0
config.Lock() config.Lock()
defer config.Unlock() defer config.Unlock()
for i := range config.Filters { filters := &config.Filters
f := &config.Filters[i] if whitelist {
filters = &config.WhitelistFilters
}
for i := range *filters {
f := &(*filters)[i]
if f.URL != url { if f.URL != url {
continue continue
} }
@ -134,41 +143,44 @@ func filterExists(url string) bool {
return r return r
} }
// Return TRUE if a filter with this URL exists
func filterExistsNoLock(url string) bool { func filterExistsNoLock(url string) bool {
r := false for _, f := range config.Filters {
for i := range config.Filters { if f.URL == url {
if config.Filters[i].URL == url { return true
r = true
break
} }
} }
return r for _, f := range config.WhitelistFilters {
if f.URL == url {
return true
}
}
return false
} }
// Add a filter // Add a filter
// Return FALSE if a filter with this URL exists // Return FALSE if a filter with this URL exists
func filterAdd(f filter) bool { func filterAdd(f filter) bool {
config.Lock() config.Lock()
defer config.Unlock()
// Check for duplicates // Check for duplicates
for i := range config.Filters { if filterExistsNoLock(f.URL) {
if config.Filters[i].URL == f.URL {
config.Unlock()
return false return false
} }
}
if f.white {
config.WhitelistFilters = append(config.WhitelistFilters, f)
} else {
config.Filters = append(config.Filters, f) config.Filters = append(config.Filters, f)
config.Unlock() }
return true return true
} }
// Load filters from the disk // Load filters from the disk
// And if any filter has zero ID, assign a new one // And if any filter has zero ID, assign a new one
func loadFilters() { func loadFilters(array []filter) {
for i := range config.Filters { for i := range array {
filter := &config.Filters[i] // otherwise we're operating on a copy filter := &array[i] // otherwise we're operating on a copy
if filter.ID == 0 { if filter.ID == 0 {
filter.ID = assignUniqueFilterID() filter.ID = assignUniqueFilterID()
} }
@ -223,8 +235,7 @@ func periodicallyRefreshFilters() {
intval := 5 // use a dynamically increasing time interval intval := 5 // use a dynamically increasing time interval
for { for {
isNetworkErr := false isNetworkErr := false
if config.DNS.FiltersUpdateIntervalHours != 0 && refreshStatus == 0 { if config.DNS.FiltersUpdateIntervalHours != 0 && atomic.CompareAndSwapUint32(&refreshStatus, 0, 1) {
refreshStatus = 1
refreshLock.Lock() refreshLock.Lock()
_, isNetworkErr = refreshFiltersIfNecessary(false) _, isNetworkErr = refreshFiltersIfNecessary(false)
refreshLock.Unlock() refreshLock.Unlock()
@ -247,11 +258,10 @@ func periodicallyRefreshFilters() {
// Refresh filters // Refresh filters
func refreshFilters() (int, error) { 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") return 0, fmt.Errorf("Filters update procedure is already running")
} }
refreshStatus = 1
refreshLock.Lock() refreshLock.Lock()
nUpdated, _ := refreshFiltersIfNecessary(true) nUpdated, _ := refreshFiltersIfNecessary(true)
refreshLock.Unlock() refreshLock.Unlock()
@ -561,21 +571,39 @@ func (filter *filter) LastTimeUpdated() time.Time {
} }
func enableFilters(async bool) { func enableFilters(async bool) {
var filters map[int]string var filters []dnsfilter.Filter
var whiteFilters []dnsfilter.Filter
if config.DNS.FilteringEnabled { if config.DNS.FilteringEnabled {
// convert array of filters // convert array of filters
filters = make(map[int]string)
userFilter := userFilter() 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 { for _, filter := range config.Filters {
if !filter.Enabled { if !filter.Enabled {
continue 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. If you ever find yourself using `force` to make something work that otherwise wont, this is a bug and report it accordingly.
responses: responses:
200: 200:
description: OK with how many filters were actually updated description: OK
schema:
$ref: "#/definitions/FilterRefreshResponse"
/filtering/set_rules: /filtering/set_rules:
post: post:
@ -1230,6 +1232,13 @@ definitions:
type: "string" type: "string"
description: "Set if reason=ReasonRewrite" description: "Set if reason=ReasonRewrite"
FilterRefreshResponse:
type: "object"
description: "/filtering/refresh response data"
properties:
updated:
type: "integer"
GetVersionRequest: GetVersionRequest:
type: "object" type: "object"
description: "/version.json request data" description: "/version.json request data"