Full rework of the query log

Squashed commit of the following:

commit e8a72eb223551f17e637136713dae03accf8ab9e
Author: Andrey Meshkov <am@adguard.com>
Date:   Thu Jun 18 00:31:53 2020 +0300

    fix race in whois test

commit 801d28197f888fa21f83c9a0b49e3c9472c08513
Merge: 9d9787fd b1c951fb
Author: Andrey Meshkov <am@adguard.com>
Date:   Thu Jun 18 00:28:13 2020 +0300

    Merge branch 'master' into feature/1421

commit 9d9787fd79b17f76c7baed52c12ac462fd00a5e4
Merge: 4ce337ca 08e238ab
Author: Andrey Meshkov <am@adguard.com>
Date:   Thu Jun 18 00:27:32 2020 +0300

    Merge

commit 4ce337ca7aec163edf87a038bb25fb44e64f8613
Author: Andrey Meshkov <am@adguard.com>
Date:   Thu Jun 18 00:22:49 2020 +0300

    -(home): fix whois test

commit 08e238ab0e723b1e354f58245e9a8d5017b392c9
Author: ArtemBaskal <a.baskal@adguard.com>
Date:   Thu Jun 18 00:13:41 2020 +0300

    Add comments

commit 5f108065952bcc25dce1c2eee3f9401d2641a6e9
Author: ArtemBaskal <a.baskal@adguard.com>
Date:   Wed Jun 17 23:47:50 2020 +0300

    Make tooltip position absolute for touch

commit 4c30a583165e5d007d4b01b657de8751a7bd8c7b
Author: ArtemBaskal <a.baskal@adguard.com>
Date:   Wed Jun 17 20:39:44 2020 +0300

    Prevent scroll hide for touch devices

commit 62da97931f5921613762614717c62c77ddb6b8db
Author: ArtemBaskal <a.baskal@adguard.com>
Date:   Wed Jun 17 20:06:24 2020 +0300

    Review changes: ipad tooltip

commit 12dddcca8caca51c157b5d25dfa3ca03ba7f0c06
Author: ArtemBaskal <a.baskal@adguard.com>
Date:   Wed Jun 17 16:59:16 2020 +0300

    Add close tooltip event for ipad

commit 62191e41d5bf67317f9f1dc6c6af08cbabb4bf90
Author: ArtemBaskal <a.baskal@adguard.com>
Date:   Wed Jun 17 16:39:40 2020 +0300

    Add success toast on logs refresh

commit 2ebdd6a8124269d737c8060c3247aaf35d85cb8b
Author: ArtemBaskal <a.baskal@adguard.com>
Date:   Wed Jun 17 16:01:37 2020 +0300

    Fix pagination

commit 5820c92bacd93d05a3d66d42ee95f099e1c5d9e9
Author: ArtemBaskal <a.baskal@adguard.com>
Date:   Wed Jun 17 11:31:15 2020 +0300

    Revert "Render table in chunks"

    This reverts commit cdfcd849ccddc1bc35591edac7904129431470c9.

commit cdfcd849ccddc1bc35591edac7904129431470c9
Author: ArtemBaskal <a.baskal@adguard.com>
Date:   Tue Jun 16 18:42:18 2020 +0300

    Render table in chunks

commit cc8c5e64274bf6e806e2e8a4bf305af745c3ed2a
Author: ArtemBaskal <a.baskal@adguard.com>
Date:   Tue Jun 16 17:35:24 2020 +0300

    Add pagination button hover effect

commit f7e134091a1556784a5fea9d83c50353536126ef
Author: ArtemBaskal <a.baskal@adguard.com>
Date:   Tue Jun 16 16:28:00 2020 +0300

    Make loader position absolute

commit a7b887b57d903f1f7ac967b861b5cc677728efc4
Author: ArtemBaskal <a.baskal@adguard.com>
Date:   Tue Jun 16 15:42:20 2020 +0300

    Ignore clients find without params

commit ecb322fefd4a161d79f28d17fe27827ee91701e4
Author: ArtemBaskal <a.baskal@adguard.com>
Date:   Tue Jun 16 15:30:48 2020 +0300

    Styles changes

commit 9323ce3938bf04e1290eade09201ba0790a250c0
Author: ArtemBaskal <a.baskal@adguard.com>
Date:   Tue Jun 16 14:32:23 2020 +0300

    Review styles changes

commit e0faa04ba3643f01b2ca99524cdd52b0731725c7
Merge: 98576823 15e71435
Author: ArtemBaskal <a.baskal@adguard.com>
Date:   Tue Jun 16 12:08:45 2020 +0300

    Merge branch '1421-new-qlog-v2' into feature/1421

commit 9857682371e8d9a3a91933cfb58a26b3470675d9
Author: ArtemBaskal <a.baskal@adguard.com>
Date:   Mon Jun 15 18:32:02 2020 +0300

    Fix response cell

... and 88 more commits
This commit is contained in:
Artem Baskal 2020-06-18 00:36:19 +03:00
parent b1c951fb2c
commit e39fe1b913
81 changed files with 3415 additions and 1087 deletions

View File

@ -1236,7 +1236,7 @@ Request:
&search=...
&response_status="..."
`older_than` setting is used for paging. UI uses an empty value for `older_than` on the first request and gets the latest log entries. To get the older entries, UI sets `older_than` to the `oldest` value from the server's response.
`older_than` setting is used for paging. UI uses an empty value for `older_than` on the first request and gets the latest log entries. To get the older entries, UI sets `older_than` to the `oldest` value from the server's response.
If search settings are set, server returns only entries that match the specified request.

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

@ -12427,6 +12427,22 @@
"react-is": "^16.8.1"
}
},
"react-tooltip": {
"version": "4.2.6",
"resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-4.2.6.tgz",
"integrity": "sha512-KX/zCsPFCI8RuulzBX86U+Ur7FvgGNRBdb7dUu0ndo8Urinn48nANq9wfq4ABlehweQjPzLl7XdNAtLKza+I3w==",
"requires": {
"prop-types": "^15.7.2",
"uuid": "^7.0.3"
},
"dependencies": {
"uuid": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz",
"integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg=="
}
}
},
"react-transition-group": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.1.tgz",

2
client/package.json vendored
View File

@ -7,6 +7,7 @@
"watch": "cross-env BUILD_ENV=dev webpack --config webpack.dev.js --watch",
"build-prod": "cross-env BUILD_ENV=prod webpack --config webpack.prod.js",
"lint": "eslint src",
"lint:fix": "eslint src --fix",
"test": "jest",
"test:watch": "jest --watch"
},
@ -32,6 +33,7 @@
"react-router-hash-link": "^1.2.2",
"react-select": "^3.1.0",
"react-table": "^6.11.4",
"react-tooltip": "^4.2.6",
"react-transition-group": "^4.4.1",
"redux": "^4.0.5",
"redux-actions": "^2.6.5",

View File

@ -28,6 +28,7 @@
"dhcp_table_hostname": "Име на устройство",
"dhcp_table_expires": "История",
"dhcp_warning": "Ако искате да използвате вградения DHCP сървър, трябва да няма друг активен DHCP в мрежата Ви!",
"city": "Град",
"back": "Назад",
"dashboard": "Табло",
"settings": "Настройки",
@ -35,7 +36,7 @@
"query_log": "История на заявките",
"faq": "ЧЗВ",
"version": "версия",
"address": "адрес",
"address": "Адрес",
"on": "ВКЛЮЧЕНО",
"off": "ИЗКЛЮЧЕНО",
"copyright": "Авторско право",
@ -106,6 +107,7 @@
"example_comment": "! Това е коментар",
"example_comment_meaning": "пример за коментар",
"example_comment_hash": "# Това е също коментар",
"example_regex_meaning": "блокирай достъп до домейни който съвпадат със следното",
"example_upstream_regular": "класически DNS (UDP протокол)",
"example_upstream_dot": "криптиран <a href='https://en.wikipedia.org/wiki/DNS_over_TLS' target='_blank'>DNS-върху-TLS</a>",
"example_upstream_doh": "криптиран <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-върху-HTTPS</a>",
@ -114,9 +116,10 @@
"updated_upstream_dns_toast": "Глобалните DNS сървъри са обновени",
"dns_test_ok_toast": "Въведените DNS сървъри работят коректно",
"dns_test_not_ok_toast": "Сървър \"{{key}}\": не работи, моля проверете дали е въведен коректно",
"unblock_btn": "Отблокирай",
"block_btn": "Блокирай",
"unblock": "Отблокирай",
"block": "Блокирай",
"time_table_header": "Време",
"date": "Дата",
"domain_name_table_header": "Име на домейн",
"type_table_header": "Тип",
"response_table_header": "Отговор",
@ -226,5 +229,6 @@
"form_error_equal": "Не трябва да съвпада",
"form_error_password": "Паролата не съвпада",
"reset_settings": "Изтрий всички настройки",
"update_announcement": "Има нова AdGuard Home {{version}}! <0>Цъкни тук</0> за повече информация."
"update_announcement": "Има нова AdGuard Home {{version}}! <0>Цъкни тук</0> за повече информация.",
"show_blocked_responses": "Блокирано"
}

View File

@ -37,6 +37,7 @@
"dhcp_interface_select": "Vybrat rozhraní DHCP",
"dhcp_hardware_address": "Hardwarová adresa",
"dhcp_ip_addresses": "IP adresa",
"ip": "IP adresa",
"dhcp_table_hostname": "Název hostitele",
"dhcp_table_expires": "Vyprší",
"dhcp_warning": "Pokud chcete server DHCP povolit, ujistěte se, že ve Vaší síti není žádný aktivní server DHCP. V opačném případě může dojít k přerušení internetu pro připojená zařízení!",
@ -49,17 +50,26 @@
"dhcp_static_leases_not_found": "Nebyly nalezeny žádné statické pronájmy DHCP",
"dhcp_add_static_lease": "Přidat statický pronájem",
"dhcp_reset": "Opravdu chcete resetovat konfiguraci DHCP?",
"country": "Země",
"city": "Město",
"delete_confirm": "Opravdu chcete odstranit \"{{key}}\"?",
"form_enter_hostname": "Zadejte název hostitele",
"error_details": "Podrobnosti chyby",
"response_details": "Detail odpovědi",
"request_details": "Detail požadavku",
"client_details": "Detaily klienta",
"details": "Detaily",
"back": "Zpět",
"dashboard": "Hlavní panel",
"settings": "Nastavení",
"filters": "Filtry",
"filter": "Filtr",
"query_log": "Protokol dotazů",
"empty_log": "Záznam dotazů je prázdný",
"faq": "FAQ",
"version": "Verze",
"address": "adresa",
"address": "Adresa",
"protocol": "Protokol",
"on": "ZAPNUTO",
"off": "VYPNUTO",
"copyright": "Autorská práva",
@ -113,7 +123,7 @@
"custom_filtering_rules": "Vlastní pravidla filtrování",
"encryption_settings": "Nastavení šifrování",
"dhcp_settings": "Nastavení DHCP",
"upstream_dns": "Upstream DNS servery",
"upstream_dns": "Odchozí DNS servery",
"upstream_dns_hint": "Pokud toto pole ponecháte prázdné, AdGuard Home použije <a href='https://www.quad9.net/' target='_blank'>Quad9</a> jako upstream.",
"test_upstream_btn": "Test upstreamů",
"upstreams": "Odesláno",
@ -132,8 +142,10 @@
"rules_count_table_header": "Počet pravidel",
"last_time_updated_table_header": "Čas poslední aktualizace",
"actions_table_header": "Akce",
"request_table_header": "Požadavek",
"edit_table_action": "Upravit",
"delete_table_action": "Vymazat",
"elapsed": "Uplynulý čas",
"filters_and_hosts_hint": "AdGuard Home zná základní pravidla blokování reklam a syntaxe hostsitelských souborů.",
"no_blocklist_added": "Nebyl přidán žádný seznam blokovaných",
"no_whitelist_added": "Nebyl přidán žádný seznam povolených",
@ -170,10 +182,12 @@
"updated_upstream_dns_toast": "Aktualizované upstream DNS servery",
"dns_test_ok_toast": "Specifikované DNS servery pracují správně",
"dns_test_not_ok_toast": "Server \"{{key}}\": nemohl být použit, zkontrolujte, zda jste ho správně napsali",
"unblock_btn": "Odblokovat",
"block_btn": "Blokovat",
"unblock": "Odblokovat",
"block": "Blokovat",
"time_table_header": "Čas",
"date": "Datum",
"domain_name_table_header": "Název domény",
"domain_or_client": "Doména nebo klient",
"type_table_header": "Typ",
"response_table_header": "Odezva",
"client_table_header": "Klient",
@ -211,6 +225,7 @@
"custom_ip": "Vlastní IP",
"blocking_ipv4": "Blokování IPv4",
"blocking_ipv6": "Blokování IPv6",
"plain_dns": "Čisté DNS",
"form_enter_rate_limit": "Zadejte rychlostní limit",
"rate_limit": "Rychlostní limit",
"edns_enable": "Povolit klientskou podsíť EDNS",
@ -229,6 +244,7 @@
"rule_label": "Pravidlo",
"list_label": "Seznam",
"unknown_filter": "Neznámý filtr {{filterId}}",
"known_tracker": "Známý slídič",
"install_welcome_title": "Vítejte v AdGuard Home!",
"install_welcome_desc": "AdGuard Home je síťový DNS server pro blokování reklam a slídičů. Jeho cílem je, abyste ovládali celou Vaši síť a všechny Vaše zařízení, přičemž se nevyžaduje použití jakéhokoliv programu na straně klienta.",
"install_settings_title": "Administrátorské webové rozhraní",
@ -257,7 +273,7 @@
"install_devices_router_list_1": "Otevřete předvolby pro router. Obvykle k němu můžete přistupovat z prohlížeče prostřednictvím adresy URL (např. http://192.168.0.1/ nebo http://192.168.1.1/). Můžete být vyzváni k zadání hesla. Pokud si ho nepamatujete, můžete heslo resetovat stisknutím tlačítka na samotném routeru. Některé routery vyžadují specifickou aplikaci, která by v takovém případě měla být již nainstalována v počítači/telefonu.",
"install_devices_router_list_2": "Vyhledejte nastavení DHCP/DNS. Hledejte zkratku DNS vedle pole, které umožňuje vložit dvě nebo tři sady čísel, každé rozděleno do čtyř skupin s jedním až třemi číslicemi.",
"install_devices_router_list_3": "Zadejte adresy Vašeho serveru AdGuard Home.",
"install_devices_router_list_4": "Na některých typech routerů nemůžete nastavit vlastní DNS server. V tomto případě může AdGuard Home pomoct pokud jej nastavíte jako DHCP server. V ostatních případech byste si v manuálu k Vašemu routeru měli zjistit, jak nastavit vlastní DNS servery.",
"install_devices_router_list_4": "Na některých typech routerů nemůžete nastavit vlastní DNS server. V tomto případě může AdGuard Home pomoci, pokud jej nastavíte jako <0>DHCP server</0>. V ostatních případech byste si v manuálu k Vašemu routeru měli zjistit, jak nastavit vlastní DNS servery.",
"install_devices_windows_list_1": "Otevřete ovládací panel prostřednictvím nabídky Start nebo vyhledání v systému Windows.",
"install_devices_windows_list_2": "Přejděte na kategorii Síť a Internet a poté na Centrum sítí a sdílení.",
"install_devices_windows_list_3": "Na levé straně obrazovky najděte možnost Změnit nastavení adaptéru a klepněte na něj.",
@ -346,6 +362,7 @@
"form_enter_id": "Zadejte identifikátor",
"form_add_id": "Přidat identifikátor",
"form_client_name": "Zadejte název klienta",
"name": "Název",
"client_global_settings": "Použít globální nastavení",
"client_deleted": "Klient \"{{key}}\" byl úspěšně odstraněn",
"client_added": "Klient \"{{key}}\" byl úspěšně přidán",
@ -445,6 +462,7 @@
"location": "Umístění",
"orgname": "Název organizace",
"netname": "Název sítě",
"network": "Síť",
"descr": "Popis",
"whois": "Whois",
"filtering_rules_learn_more": "<0>Další informace</0> o vytváření vlastních seznamů hostitelů.",
@ -456,7 +474,7 @@
"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.",
"fastest_addr": "Nejrychlejší IP adresa",
"fastest_addr_desc": "Dotazovat všechny DNS servery a vrátit nejrychlejší IP adresu ze všech odpovědí",
"fastest_addr_desc": "Dotazovat všechny DNS servery a vrátit nejrychlejší IP adresu ze všech odpovědí. To zpomalí dotazy DNS, protože musíme čekat na odpovědi ze všech serverů DNS, ale celková konektivita se zlepší.",
"autofix_warning_text": "Pokud kliknete na „Opravit“, AdGuard Home nakonfiguruje váš systém tak, aby používal DNS server AdGuard Home.",
"autofix_warning_list": "Jsou prováděny následující úlohy: <0>Deaktivace systému DNSStubListener</0> <0>Nastavení adresy serveru DNS na 127.0.0.1</0> <0>Nahrazení cíle symbolického odkazu z /etc/resolv.conf do /run/systemd/resolve/resolv.conf</0> <0>Zastavení služby DNSStubListener (znovu načtení služby systemd-resolved)</0>",
"autofix_warning_result": "Výsledkem je, že všechny požadavky DNS z vašeho systému jsou ve výchozím nastavení zpracovány službou AdGuard Home.",
@ -489,5 +507,18 @@
"list_updated": "Byl aktualizován {{count}} seznam",
"list_updated_plural": "Aktualizované seznamy: {{count}}",
"dnssec_enable": "Zapnout DNSSEC",
"dnssec_enable_desc": "Nastavte příznak DNSSEC v následujících DNS dotazech a zkontrolujte výsledek (je potřebný překladač se zapnutým DNSSEC)"
"dnssec_enable_desc": "Nastavte příznak DNSSEC v následujících DNS dotazech a zkontrolujte výsledek (je potřebný překladač se zapnutým DNSSEC)",
"validated_with_dnssec": "Ověřeno pomocí DNSSEC",
"show_all_responses": "Všechny odpovědi",
"show_blocked_responses": "Zablokované",
"show_whitelisted_responses": "Povolené",
"blocked_safebrowsing": "Blokované bezpečné prohlížení",
"blocked_adult_websites": "Blokované stránky pro dospělé",
"blocked_threats": "Blokované hrozby",
"allowed": "Povoleno",
"filtered": "Filtrováno",
"rewritten": "Přepsáno",
"safe_search": "Bezpečné vyhledávání",
"blocklist": "Zakázaný",
"milliseconds_abbreviation": "ms"
}

View File

@ -3,6 +3,8 @@
"example_upstream_reserved": "Du kan specificere DNS upstream <0>for det(de) specifikke domæne(r)</0>",
"upstream_parallel": "Brug parallelle forespørgsler til at fremskynde behandlingen ved samtidig at spørge alle upstream servere",
"parallel_requests": "Parallelle forespørgsler",
"load_balancing": "Belastningsfordeling",
"load_balancing_desc": "Forespørg en server ad gangen. AdGuard Home bruger den vægtede tilfældige algoritme til at vælge serveren, så den hurtigste server bliver brugt oftere.",
"bootstrap_dns": "Bootstrap DNS-servere",
"bootstrap_dns_desc": "Bootstrap DNS-servere bliver brugt til at behandle IP-adresser af de DoH/DoT resolvere, som du angiver som upstream.",
"check_dhcp_servers": "Tjek for DHCP-servere",
@ -37,6 +39,7 @@
"dhcp_interface_select": "Vælg DHCP-interface",
"dhcp_hardware_address": "Hardware-adresse",
"dhcp_ip_addresses": "IP-adresser",
"ip": "IP",
"dhcp_table_hostname": "Værtsnavn",
"dhcp_table_expires": "Udløber",
"dhcp_warning": "Hvis du vil aktivere DHCP-serveren alligevel, skal du sørge for, at der ikke er nogen anden aktiv DHCP-server på dit netværk. Ellers kan det ødelægge internettet for tilsluttede enheder!",
@ -49,17 +52,24 @@
"dhcp_static_leases_not_found": "Ingen DHCP static leases fundet",
"dhcp_add_static_lease": "Tilføj static lease",
"dhcp_reset": "Er du sikker på, at du vil nulstille DHCP-konfigurationen?",
"country": "Land",
"delete_confirm": "Er du sikker på, at du vil slette \"{{key}}\"?",
"form_enter_hostname": "Indtast værtsnavn",
"error_details": "Fejloplysninger",
"request_details": "Anmod om detaljer",
"client_details": "Klientoplysninger",
"details": "Detaljer",
"back": "Tilbage",
"dashboard": "Kontrolpanel",
"settings": "Indstillinger",
"filters": "Filtre",
"filter": "Filter",
"query_log": "Forespørgselslog",
"empty_log": "Forespørgselsloggen er tom",
"faq": "FAQ",
"version": "Version",
"address": "adresse",
"address": "Adresse",
"protocol": "Protokol",
"on": "TÆNDT",
"off": "SLUKKET",
"copyright": "Copyright",
@ -132,8 +142,10 @@
"rules_count_table_header": "Antal regler",
"last_time_updated_table_header": "Sidst opdateret",
"actions_table_header": "Handlinger",
"request_table_header": "Forespørgsel",
"edit_table_action": "Rediger",
"delete_table_action": "Slet",
"elapsed": "Varighed",
"filters_and_hosts_hint": "AdGuard Home forstår de grundlæggende annonceblokeringsregler og værtsfilsyntaks.",
"no_blocklist_added": "Ingen blokeringslister tilføjet",
"no_whitelist_added": "Ingen lister over tilladte tilføjet",
@ -170,10 +182,12 @@
"updated_upstream_dns_toast": "Opdaterede upstream DNS-servere",
"dns_test_ok_toast": "De angivne DNS-servere fungerer korrekt",
"dns_test_not_ok_toast": "Server \"{{key}}\": kunne ikke bruges, kontroller venligst at du har skrevet det korrekt",
"unblock_btn": "Fjern blokering",
"block_btn": "Bloker",
"unblock": "Fjern blokering",
"block": "Bloker",
"time_table_header": "Tid",
"date": "Dato",
"domain_name_table_header": "Domænenavn",
"domain_or_client": "Domæne eller klient",
"type_table_header": "Type",
"response_table_header": "Svar",
"client_table_header": "Klient",
@ -211,6 +225,8 @@
"custom_ip": "Tilpasset IP",
"blocking_ipv4": "IPv4-blokering",
"blocking_ipv6": "IPv6-blokering",
"dns_over_https": "DNS-over-HTTPS",
"dns_over_tls": "DNS-over-TLS",
"form_enter_rate_limit": "Indtast hyppighedsgrænse",
"rate_limit": "Hyppighedsgrænse",
"edns_enable": "Aktiver EDNS Client Subnet",
@ -229,6 +245,7 @@
"rule_label": "Regel",
"list_label": "Liste",
"unknown_filter": "Ukendt filter {{filterId}}",
"known_tracker": "Kendt tracker",
"install_welcome_title": "Velkommen til AdGuard Home!",
"install_welcome_desc": "AdGuard Home er en netværksbaseret annonce-og-tracker blokerende DNS-server. Formålet er at lade dig kontrollere hele dit netværk og alle dine enheder, og det kræver ikke at man bruger klientsoftware.",
"install_settings_title": "Administrator Webgrænseflade",
@ -257,7 +274,7 @@
"install_devices_router_list_1": "Åbn præferencerne for din router. Normalt kan du få adgang til den fra din browser via en URL (som http://192.168.0.1/ eller http://192.168.1.1/). Du bliver muligvis bedt om at indtaste adgangskoden. Hvis du ikke kan huske den, kan du ofte nulstille adgangskoden ved at trykke på en knap på selve routeren. Nogle routere kræver et bestemt program, som i det tilfælde allerede skulle være installeret på din computer/telefon.",
"install_devices_router_list_2": "Find DHCP/DNS-indstillingerne. Kig efter DNS-bogstaverne ved siden af et felt, der tillader to eller tre sæt tal, hver opdelt i fire grupper med et til tre cifre.",
"install_devices_router_list_3": "Indtast dine AdGuard Home serveradresser der.",
"install_devices_router_list_4": "Du kan ikke opsætte en tilpasset DNS-server på nogle typer routere. I dette tilfælde kan det hjælpe, hvis du konfigurerer AdGuard Home som en DHCP-server. Du kan ellers søge efter manualen om, hvordan du tilpasser DNS-servere til din bestemte routermodel.",
"install_devices_router_list_4": "Du kan ikke opsætte en tilpasset DNS-server på nogle typer routere. I dette tilfælde kan det hjælpe, hvis du konfigurerer AdGuard Home som en <0>DHCP-server</0>. Du kan ellers søge efter manualen om, hvordan du tilpasser DNS-servere til din bestemte routermodel.",
"install_devices_windows_list_1": "Åbn Kontrolpanel gennem menuen Start eller Windows søgning.",
"install_devices_windows_list_2": "Gå til Netværk og internet kategorien og derefter til Netværks- og delingscenter.",
"install_devices_windows_list_3": "På venstre side af skærmen finder du Skift adapterindstillinger og klik på den.",
@ -346,6 +363,7 @@
"form_enter_id": "Indtast identifikator",
"form_add_id": "Tilføj identifikator",
"form_client_name": "Indtast klientnavn",
"name": "Navn",
"client_global_settings": "Brug globale indstillinger",
"client_deleted": "Klient \"{{key}}\" succesfuldt slettet",
"client_added": "Klient \"{{key}}\" succesfuldt tilføjet",
@ -445,6 +463,7 @@
"location": "Placering",
"orgname": "Organisationens navn",
"netname": "Netværksnavn",
"network": "Netværk",
"descr": "Beskrivelse",
"whois": "Whois",
"filtering_rules_learn_more": "<0>Lær mere</0> om at oprette dine egne værtslister.",
@ -456,7 +475,7 @@
"disable_ipv6": "Deaktiver IPv6",
"disable_ipv6_desc": "Hvis denne funktion er aktiveret, slettes alle DNS-forespørgsler til IPv6-adresser (type AAAA).",
"fastest_addr": "Hurtigste IP-adresse",
"fastest_addr_desc": "Forespørg alle DNS-servere, og returner den hurtigste IP-adresse blandt alle svar",
"fastest_addr_desc": "Forespørg alle DNS-servere, og returner den hurtigste IP-adresse blandt alle svar. Dette vil gøre DNS-forespørgslerne langsommere, da vi er nødt til at vente på svar fra alle DNS-servere, men forbedrer samlet set forbindelsen.",
"autofix_warning_text": "Hvis du klikker på \"Reparer\", vil AdGuardHome konfigurere dit system til at bruge AdGuardHome DNS-server.",
"autofix_warning_list": "Den vil udføre disse opgaver: <0>Deaktivering af DNSStubListener systemet</0> <0>Indstille DNS-serveradressen til 127.0.0.1</0> <0>Erstatte det symbolske linkmål for /etc/resolv.conf til /run/systemd/resolve/resolv.conf</0> <0>Stop DNSStubListener (genindlæs systemd-løst tjeneste)</0>",
"autofix_warning_result": "Som et resultat behandles alle DNS-anmodninger fra dit system som standard af AdGuard Home.",
@ -489,5 +508,19 @@
"list_updated": "{{count}} liste opdateret",
"list_updated_plural": "{{count}} lister opdateret",
"dnssec_enable": "Aktivér DNSSEC",
"dnssec_enable_desc": "Sæt DNSSEC-flag i de udgående DNS-forespørgsler, og kontroller resultatet (DNSSEC-aktiveret resolver er krævet)"
"dnssec_enable_desc": "Sæt DNSSEC-flag i de udgående DNS-forespørgsler, og kontroller resultatet (DNSSEC-aktiveret resolver er krævet)",
"validated_with_dnssec": "Valideret med DNSSEC",
"show_all_responses": "Alle svar",
"show_blocked_responses": "Blokeret",
"show_whitelisted_responses": "Hvidlistet",
"show_processed_responses": "Behandlet",
"blocked_safebrowsing": "Blokeret af Safebrowsing",
"blocked_adult_websites": "Blokerede Websteder for Voksne",
"blocked_threats": "Blokerede Trusler",
"allowed": "Tilladt",
"filtered": "Filtreret",
"rewritten": "Omskrevet",
"safe_search": "Sikker søgning",
"blocklist": "Blokeringsliste",
"milliseconds_abbreviation": "ms"
}

View File

@ -3,6 +3,8 @@
"example_upstream_reserved": "Sie können DNS-Upstream <0>für bestimmte Domain(s)</0> angeben",
"upstream_parallel": "Parallele Abfragen verwenden, um die Lösung zu beschleunigen, indem Sie alle Upstream-Server gleichzeitig abfragen",
"parallel_requests": "Parallele Abfragen",
"load_balancing": "Lastverteilung",
"load_balancing_desc": "Einen Server nach dem anderen abfragen. AdGuard Home verwendet den gewichteten Zufallsalgorithmus, um den Server so auszuwählen, dass der schnellste Server häufiger verwendet wird.",
"bootstrap_dns": "Bootstrap DNS-Server starten",
"bootstrap_dns_desc": "Bootstrap-DNS-Server werden verwendet, um IP-Adressen der DoH/DoT-Resolver aufzulösen, die Sie als Upstreams angeben.",
"check_dhcp_servers": "Auf DHCP-Server prüfen",
@ -37,6 +39,7 @@
"dhcp_interface_select": "DHCP-Benutzeroberfläche auswählen",
"dhcp_hardware_address": "Hardware-Adresse",
"dhcp_ip_addresses": "IP-Adressen",
"ip": "IP",
"dhcp_table_hostname": "Hostname",
"dhcp_table_expires": "Läuft ab",
"dhcp_warning": "Wenn Sie den DHCP-Server trotzdem aktivieren möchten, stellen Sie sicher, dass sich in Ihrem Netzwerk kein anderer aktiver DHCP-Server befindet. Andernfalls kann es bei angeschlossenen Geräten zu einem Ausfall des Internets kommen!",
@ -49,17 +52,24 @@
"dhcp_static_leases_not_found": "Keine statischen DHCP-Leases gefunden",
"dhcp_add_static_lease": "Statischen Lease hinzufügen",
"dhcp_reset": "Möchten Sie die DHCP-Konfiguration wirklich zurücksetzen?",
"country": "Land",
"city": "Stadt",
"delete_confirm": "Möchten Sie „{{key}}” wirklich löschen?",
"form_enter_hostname": "Gerätenamen eingeben",
"error_details": "Fehlerdetails",
"client_details": "Einzelheiten des Clients",
"details": "Details",
"back": "Zurück",
"dashboard": "Übersicht",
"settings": "Einstellungen",
"filters": "Filter",
"filter": "Filter",
"query_log": "Anfragenprotokoll",
"empty_log": "Abfrageprotokoll ist leer",
"faq": "FAQ",
"version": "Version",
"address": "Adresse",
"protocol": "Protokoll",
"on": "AN",
"off": "AUS",
"copyright": "Urheberrecht",
@ -132,8 +142,10 @@
"rules_count_table_header": "Anzahl Regeln",
"last_time_updated_table_header": "Letztes Update",
"actions_table_header": "Aktionen",
"request_table_header": "Anfrage",
"edit_table_action": "Bearbeiten",
"delete_table_action": "Löschen",
"elapsed": "Verstrichen",
"filters_and_hosts_hint": "AdGuard Home versteht grundlegende Werbefilterregeln und Host-Datei-Syntax.",
"no_blocklist_added": "Keine Sperrliste hinzugefügt",
"no_whitelist_added": "Keine Freigabeliste hinzugefügt",
@ -170,10 +182,11 @@
"updated_upstream_dns_toast": "Upstream-DNS-Server wurden aktualisiert",
"dns_test_ok_toast": "Angegebene DNS-Server arbeiten ordnungsgemäß",
"dns_test_not_ok_toast": "Server \"{{key}}\": konnte nicht verwendet werden, bitte überprüfen Sie die korrekte Schreibweise",
"unblock_btn": "Entblocken",
"block_btn": "Blockieren",
"block": "Blockieren",
"time_table_header": "Zeit",
"date": "Datum",
"domain_name_table_header": "Domainname",
"domain_or_client": "Domain oder Client",
"type_table_header": "Typ",
"response_table_header": "Antwort",
"client_table_header": "Client",
@ -211,6 +224,8 @@
"custom_ip": "Benutzerdefinierte IP",
"blocking_ipv4": "IPv4-Sperren",
"blocking_ipv6": "IPv6-Sperren",
"dns_over_https": "DNS-over-HTTPS (DNS-Abrage über HTTPS)",
"dns_over_tls": "DNS-over-TLS (DNS-Abrage über TLS)",
"form_enter_rate_limit": "Begrenzungswert eingeben",
"rate_limit": "Begrenzungswert",
"edns_enable": "EDNS Client Subnetz aktivieren",
@ -229,6 +244,7 @@
"rule_label": "Regel",
"list_label": "Liste",
"unknown_filter": "Unbekannter Filter {{filterId}}",
"known_tracker": "Bekannte Tracker",
"install_welcome_title": "Willkommen bei AdGuard Home!",
"install_welcome_desc": "AdGuard Home ist ein netzwerkweiter Werbung- und Tracking sperrender DNS-Server. Sein Zweck ist es, Ihnen die Kontrolle über Ihr gesamtes Netzwerk und alle Ihre Geräte zu ermöglichen, und es ist nicht erforderlich, eine clientseitige Anwendung zu verwenden.",
"install_settings_title": "Admin Weboberfläche",
@ -257,7 +273,7 @@
"install_devices_router_list_1": "Öffnen Sie die Einstellungen für Ihren Router. In der Regel können Sie von Ihrem Browser aus über eine URL (wie http://192.168.0.1/ oder http://192.168.1.1/) darauf zugreifen. Möglicherweise werden Sie aufgefordert, das Passwort einzugeben. Wenn Sie sich nicht mehr daran erinnern, können Sie das Passwort oft durch Drücken einer Taste auf dem Router selbst zurücksetzen. Einige Router benötigen eine bestimmte Anwendung, die in diesem Fall bereits auf Ihrem Computer/Telefon installiert sein sollte.",
"install_devices_router_list_2": "DHCP/DNS-Einstellungen suchen. Suchen Sie nach den DNS-Buchstaben neben einem Feld, das zwei oder drei Zahlensätze erlaubt, die jeweils in vier Gruppen von ein bis drei Ziffern unterteilt sind.",
"install_devices_router_list_3": "Geben Sie dort Ihre AdGuard Home Server-Adressen ein.",
"install_devices_router_list_4": "Sie können auf einigen Routern keine beliebigen DNS-Server festlegen. In diesem Fall kann es hilfreich sein, dass Sie AdGuard Home als DHCP-Server festlegen. Andernfalls sollten Sie nach einer Bedienungsanleitung zum Anpassen des DNS-Server für Ihr Router-Modell suchen.",
"install_devices_router_list_4": "Sie können auf einigen Routern keine beliebigen DNS-Server festlegen. In diesem Fall kann es hilfreich sein, dass Sie AdGuard Home als <0>DHCP-Server</0> festlegen. Andernfalls sollten Sie nach einer Bedienungsanleitung zum Anpassen des DNS-Server für Ihr Router-Modell suchen.",
"install_devices_windows_list_1": "Öffnen Sie die Systemsteuerung über das Startmenü oder die Windows-Suche.",
"install_devices_windows_list_2": "Öffnen Sie die Kategorie „Netzwerk und Internet” und dann „Netzwerk- und Freigabecenter”.",
"install_devices_windows_list_3": "Suchen Sie auf der linken Seite des Bildschirms nach „Adaptereinstellungen ändern” und klicken Sie darauf.",
@ -346,6 +362,7 @@
"form_enter_id": "Kennung eingeben",
"form_add_id": "Kennung hinzufügen",
"form_client_name": "Clientnamen eingeben",
"name": "Name",
"client_global_settings": "Allgemeine Einstellungen nutzen",
"client_deleted": "Client „{{key}}” erfolgreich entfernt",
"client_added": "Client „{{key}}” erfolgreich hinzugefügt",
@ -445,6 +462,7 @@
"location": "Ort",
"orgname": "Name der Organisation",
"netname": "Netzwerkname",
"network": "Netzwerk",
"descr": "Beschreibung",
"whois": "Whois",
"filtering_rules_learn_more": "<0>Erfahren Sie mehr</0> über die Erstellung eigener Hosts-Listen.",
@ -489,5 +507,19 @@
"list_updated": "{{count}} Liste aktualisiert",
"list_updated_plural": "{{count}} Listen aktualisiert",
"dnssec_enable": "DNSSEC aktivieren",
"dnssec_enable_desc": "DNSSEC-Flag in den ausgehenden DNS-Abfragen mitsenden und das Ergebnis überprüfen (DNSSEC-fähiger Resolver erforderlich)"
}
"dnssec_enable_desc": "DNSSEC-Flag in den ausgehenden DNS-Abfragen mitsenden und das Ergebnis überprüfen (DNSSEC-fähiger Resolver erforderlich)",
"validated_with_dnssec": "Bestätigt mit DNSSEC",
"show_all_responses": "Alle Antworten",
"show_blocked_responses": "Gesperrt",
"show_whitelisted_responses": "Auf der Positivliste",
"show_processed_responses": "Verarbeitet",
"blocked_safebrowsing": "Durch Internetsicherheit gesperrt",
"blocked_adult_websites": "Gesperrte jugendgefährdende Webseiten",
"blocked_threats": "Gesperrte Bedrohungen",
"allowed": "Zugelassen",
"filtered": "Gefiltert",
"rewritten": "Umgeschrieben",
"safe_search": "Sichere Suche",
"blocklist": "Sperrliste",
"milliseconds_abbreviation": "ms"
}

View File

@ -39,6 +39,7 @@
"dhcp_interface_select": "Select DHCP interface",
"dhcp_hardware_address": "Hardware address",
"dhcp_ip_addresses": "IP addresses",
"ip": "IP",
"dhcp_table_hostname": "Hostname",
"dhcp_table_expires": "Expires",
"dhcp_warning": "If you want to enable DHCP server anyway, make sure that there is no other active DHCP server in your network. Otherwise, it can break the Internet for connected devices!",
@ -51,17 +52,27 @@
"dhcp_static_leases_not_found": "No DHCP static leases found",
"dhcp_add_static_lease": "Add static lease",
"dhcp_reset": "Are you sure you want to reset DHCP config?",
"country": "Country",
"city": "City",
"delete_confirm": "Are you sure you want to delete \"{{key}}\"?",
"form_enter_hostname": "Enter hostname",
"error_details": "Error details",
"response_details": "Response details",
"request_details": "Request details",
"client_details": "Client details",
"details": "Details",
"back": "Back",
"dashboard": "Dashboard",
"settings": "Settings",
"filters": "Filters",
"filter": "Filter",
"query_log": "Query Log",
"compact": "Compact",
"nothing_found": "Nothing is found",
"faq": "FAQ",
"version": "Version",
"address": "address",
"address": "Address",
"protocol": "Protocol",
"on": "ON",
"off": "OFF",
"copyright": "Copyright",
@ -134,8 +145,10 @@
"rules_count_table_header": "Rules count",
"last_time_updated_table_header": "Last time updated",
"actions_table_header": "Actions",
"request_table_header": "Request",
"edit_table_action": "Edit",
"delete_table_action": "Delete",
"elapsed": "Elapsed",
"filters_and_hosts_hint": "AdGuard Home understands basic adblock rules and hosts files syntax.",
"no_blocklist_added": "No blocklists added",
"no_whitelist_added": "No allowlists added",
@ -172,12 +185,15 @@
"updated_upstream_dns_toast": "Updated the upstream DNS servers",
"dns_test_ok_toast": "Specified DNS servers are working correctly",
"dns_test_not_ok_toast": "Server \"{{key}}\": could not be used, please check that you've written it correctly",
"unblock_btn": "Unblock",
"block_btn": "Block",
"unblock": "Unblock",
"block": "Block",
"time_table_header": "Time",
"date": "Date",
"domain_name_table_header": "Domain name",
"domain_or_client": "Domain or client",
"type_table_header": "Type",
"response_table_header": "Response",
"response_code": "Response code",
"client_table_header": "Client",
"empty_response_status": "Empty",
"show_all_filter_type": "Show all",
@ -196,6 +212,7 @@
"query_log_filtered": "Filtered by {{filter}}",
"query_log_confirm_clear": "Are you sure you want to clear the entire query log?",
"query_log_cleared": "The query log has been successfully cleared",
"query_log_updated": "The query log has been successfully updated",
"query_log_clear": "Clear query logs",
"query_log_retention": "Query logs retention",
"query_log_enable": "Enable log",
@ -213,6 +230,9 @@
"custom_ip": "Custom IP",
"blocking_ipv4": "Blocking IPv4",
"blocking_ipv6": "Blocking IPv6",
"dns_over_https": "DNS-over-HTTPS",
"dns_over_tls": "DNS-over-TLS",
"plain_dns": "Plain DNS",
"form_enter_rate_limit": "Enter rate limit",
"rate_limit": "Rate limit",
"edns_enable": "Enable EDNS Client Subnet",
@ -225,12 +245,14 @@
"blocking_mode_null_ip": "Null IP: Respond with zero IP address (0.0.0.0 for A; :: for AAAA)",
"blocking_mode_custom_ip": "Custom IP: Respond with a manually set IP address",
"upstream_dns_client_desc": "If you keep this field empty, AdGuard Home will use the servers configured in the <0>DNS settings</0>.",
"tracker_source": "Tracker source",
"source_label": "Source",
"found_in_known_domain_db": "Found in the known domains database.",
"category_label": "Category",
"rule_label": "Rule",
"list_label": "List",
"unknown_filter": "Unknown filter {{filterId}}",
"known_tracker": "Known tracker",
"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_settings_title": "Admin Web Interface",
@ -348,6 +370,7 @@
"form_enter_id": "Enter identifier",
"form_add_id": "Add identifier",
"form_client_name": "Enter client name",
"name": "Name",
"client_global_settings": "Use global settings",
"client_deleted": "Client \"{{key}}\" successfully deleted",
"client_added": "Client \"{{key}}\" successfully added",
@ -447,6 +470,7 @@
"location": "Location",
"orgname": "Organization name",
"netname": "Network name",
"network": "Network",
"descr": "Description",
"whois": "Whois",
"filtering_rules_learn_more": "<0>Learn more</0> about creating your own hosts lists.",
@ -491,5 +515,19 @@
"list_updated": "{{count}} list updated",
"list_updated_plural": "{{count}} lists updated",
"dnssec_enable": "Enable DNSSEC",
"dnssec_enable_desc": "Set DNSSEC flag in the outcoming DNS queries and check the result (DNSSEC-enabled resolver is required)"
"dnssec_enable_desc": "Set DNSSEC flag in the outcoming DNS queries and check the result (DNSSEC-enabled resolver is required)",
"validated_with_dnssec": "Validated with DNSSEC",
"show_all_responses": "All responses",
"show_blocked_responses": "Blocked",
"show_whitelisted_responses": "Whitelisted",
"show_processed_responses": "Processed",
"blocked_safebrowsing": "Blocked Safebrowsing",
"blocked_adult_websites": "Blocked Adult Websites",
"blocked_threats": "Blocked Threats",
"allowed": "Allowed",
"filtered": "Filtered",
"rewritten": "Rewritten",
"safe_search": "Safe search",
"blocklist": "Blocklist",
"milliseconds_abbreviation": "ms"
}

View File

@ -3,6 +3,8 @@
"example_upstream_reserved": "puedes especificar el DNS de subida <0>para un dominio específico</0>",
"upstream_parallel": "Usar peticiones paralelas para acelerar la resolución al consultar simultáneamente a todos los servidores de subida",
"parallel_requests": "Peticiones paralelas",
"load_balancing": "Balanceo de carga",
"load_balancing_desc": "Consulta un servidor a la vez. AdGuard Home utilizará el algoritmo aleatorio ponderado para elegir el servidor más rápido y sea utilizado con más frecuencia.",
"bootstrap_dns": "Servidores DNS de arranque",
"bootstrap_dns_desc": "Los servidores DNS de arranque se utilizan para resolver las direcciones IP de los resolutores DoH/DoT que usted especifique como DNS de subida.",
"check_dhcp_servers": "Comprobar si hay servidores DHCP",
@ -37,6 +39,7 @@
"dhcp_interface_select": "Seleccione la interfaz DHCP",
"dhcp_hardware_address": "Dirección MAC",
"dhcp_ip_addresses": "Direcciones IP",
"ip": "IP",
"dhcp_table_hostname": "Nombre del host",
"dhcp_table_expires": "Expira",
"dhcp_warning": "Si de todos modos desea habilitar el servidor DHCP, asegúrese de que no hay otro servidor DHCP activo en tu red. ¡De lo contrario, puede dejar sin Internet a los dispositivos conectados!",
@ -49,17 +52,24 @@
"dhcp_static_leases_not_found": "No se han encontrado asignaciones DHCP estáticas",
"dhcp_add_static_lease": "Añadir asignación estática",
"dhcp_reset": "¿Está seguro de que desea restablecer la configuración DHCP?",
"country": "País",
"delete_confirm": "¿Está seguro de que desea eliminar \"{{key}}\"?",
"form_enter_hostname": "Ingresa el nombre del host",
"error_details": "Detalles del error",
"request_details": "Detalles de la petición",
"client_details": "Detalles del cliente",
"details": "Detalles",
"back": "Atrás",
"dashboard": "Panel de control",
"settings": "Configuración",
"filters": "Filtros",
"filter": "Filtro",
"query_log": "Registro de consultas",
"empty_log": "El registro de consultas está vacío",
"faq": "Preguntas frecuentes",
"version": "Versión",
"address": "dirección",
"address": "Dirección",
"protocol": "Protocolo",
"on": "Activo",
"off": "Inactivo",
"copyright": "Copyright",
@ -85,7 +95,7 @@
"top_clients": "Clientes más frecuentes",
"no_clients_found": "No se han encontrado clientes",
"general_statistics": "Estadísticas generales",
"number_of_dns_query_days": "Número de consultas DNS procesadas durante los últimos {{count}} días",
"number_of_dns_query_days": "Número de consultas DNS procesadas durante el último {{count}} día",
"number_of_dns_query_days_plural": "Número de consultas DNS procesadas durante los últimos {{count}} días",
"number_of_dns_query_24_hours": "Número de consultas DNS procesadas durante las últimas 24 horas",
"number_of_dns_query_blocked_24_hours": "Número de peticiones DNS bloqueadas por los filtros y listas de bloqueo de hosts",
@ -114,14 +124,14 @@
"encryption_settings": "Configuración de cifrado",
"dhcp_settings": "Configuración DHCP",
"upstream_dns": "Servidores DNS de subida",
"upstream_dns_hint": "Si mantiene este campo vacío, AdGuard Home utilizará <a href='https://www.quad9.net/' target='_blank'>Quad9</a> como DNS de subida.",
"upstream_dns_hint": "Si se mantiene este campo vacío, AdGuard Home utilizará <a href='https://www.quad9.net/' target='_blank'>Quad9</a> como DNS de subida.",
"test_upstream_btn": "Probar DNS de subida",
"upstreams": "DNS de subida",
"apply_btn": "Aplicar",
"disabled_filtering_toast": "Filtrado deshabilitado",
"enabled_filtering_toast": "Filtrado habilitado",
"disabled_safe_browsing_toast": "Búsqueda segura deshabilitada",
"enabled_safe_browsing_toast": "Búsqueda segura habilitada",
"disabled_safe_browsing_toast": "Navegación segura deshabilitada",
"enabled_safe_browsing_toast": "Navegación segura habilitada",
"disabled_parental_toast": "Control parental deshabilitado",
"enabled_parental_toast": "Control parental habilitado",
"disabled_safe_search_toast": "Búsqueda segura deshabilitada",
@ -132,8 +142,10 @@
"rules_count_table_header": "Número de reglas",
"last_time_updated_table_header": "Última actualización",
"actions_table_header": "Acciones",
"request_table_header": "Petición",
"edit_table_action": "Editar",
"delete_table_action": "Eliminar",
"elapsed": "Transcurrido",
"filters_and_hosts_hint": "AdGuard Home entiende las reglas básicas de bloqueo y la sintaxis de los archivos hosts.",
"no_blocklist_added": "No se han añadido listas de bloqueo",
"no_whitelist_added": "No se han añadido listas de permitido",
@ -170,10 +182,12 @@
"updated_upstream_dns_toast": "Servidores DNS de subida actualizados",
"dns_test_ok_toast": "Los servidores DNS especificados funcionan correctamente",
"dns_test_not_ok_toast": "Servidor \"{{key}}\": no se puede utilizar, por favor revise si lo ha escrito correctamente",
"unblock_btn": "Desbloquear",
"block_btn": "Bloquear",
"unblock": "Desbloquear",
"block": "Bloquear",
"time_table_header": "Hora",
"date": "Fecha",
"domain_name_table_header": "Nombre del dominio",
"domain_or_client": "Dominio o cliente",
"type_table_header": "Tipo",
"response_table_header": "Respuesta",
"client_table_header": "Cliente",
@ -211,6 +225,8 @@
"custom_ip": "IP personalizada",
"blocking_ipv4": "Bloqueo de IPv4",
"blocking_ipv6": "Bloqueo de IPv6",
"dns_over_https": "DNS mediante HTTPS",
"dns_over_tls": "DNS mediante TLS",
"form_enter_rate_limit": "Ingresa el límite de cantidad",
"rate_limit": "Límite de cantidad",
"edns_enable": "Habilitar subred de cliente EDNS",
@ -222,13 +238,14 @@
"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 se mantiene este campo vacío, AdGuard Home utilizará los servidores configurados en la <0>configuración del DNS</0>.",
"source_label": "Fuente",
"found_in_known_domain_db": "Encontrado en la base de datos de dominios conocidos.",
"category_label": "Categoría",
"rule_label": "Regla",
"list_label": "Lista",
"unknown_filter": "Filtro desconocido {{filterId}}",
"known_tracker": "Rastreador conocido",
"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 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",
@ -257,7 +274,7 @@
"install_devices_router_list_1": "Abre las preferencias de tu router. Por lo general, puedes acceder a él desde tu navegador a través de una URL (como http://192.168.0.1/ o http://192.168.1.1/). Es posible que se te pida que ingreses la contraseña. Si no lo recuerdas, a menudo puedes restablecer la contraseña presionando un botón en el router. Algunos routers requieren una aplicación específica, que en ese caso ya debería estar instalada en tu computadora/teléfono.",
"install_devices_router_list_2": "Busca la configuración de DHCP/DNS. Busca las letras DNS junto a un campo que permita ingresar dos o tres grupos de números, cada uno dividido en cuatro grupos de uno a tres dígitos.",
"install_devices_router_list_3": "Ingresa las direcciones de tu servidor AdGuard Home allí.",
"install_devices_router_list_4": "No se puede configurar un servidor DNS personalizado en algunos tipos de routers. En este caso puede ayudar si configuras AdGuard Home como un servidor DHCP. De lo contrario, deberías buscar el manual sobre cómo personalizar los servidores DNS para tu modelo de router en particular.",
"install_devices_router_list_4": "No se puede configurar un servidor DNS personalizado en algunos tipos de routers. En este caso puede ayudar si configuras AdGuard Home como un <0>servidor DHCP</0>. De lo contrario, deberías buscar el manual sobre cómo personalizar los servidores DNS para tu modelo de router en particular.",
"install_devices_windows_list_1": "Abre el Panel de control a través del menú Inicio o en el buscador de Windows.",
"install_devices_windows_list_2": "Ve a la categoría Redes e Internet, luego a Centro de redes y recursos compartidos.",
"install_devices_windows_list_3": "En el lado izquierdo de la pantalla, busca Cambiar configuración del adaptador y luego haz clic en él.",
@ -346,6 +363,7 @@
"form_enter_id": "Ingresa el identificador",
"form_add_id": "Añadir identificador",
"form_client_name": "Ingresa el nombre del cliente",
"name": "Nombre",
"client_global_settings": "Usar configuración global",
"client_deleted": "Cliente \"{{key}}\" eliminado correctamente",
"client_added": "Cliente \"{{key}}\" añadido correctamente",
@ -445,6 +463,7 @@
"location": "Ubicación",
"orgname": "Nombre de la organización",
"netname": "Nombre de la red",
"network": "Red",
"descr": "Descripción",
"whois": "Whois",
"filtering_rules_learn_more": "<0>Más información</0> sobre cómo crear tus propias listas de hosts.",
@ -456,8 +475,8 @@
"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).",
"fastest_addr": "Dirección IP más rápida",
"fastest_addr_desc": "Consulta todos los servidores DNS y devuelve la dirección IP más rápida de todas las respuestas",
"autofix_warning_text": "Si hace clic en \"Corregir\", AdGuard Home configurará tu sistema para utilizar el servidor DNS de AdGuard Home.",
"fastest_addr_desc": "Consulta todos los servidores DNS y devuelve la dirección IP más rápida de todas las respuestas. Esto ralentizará las consultas DNS, y se debe esperar las respuestas de todos los servidores DNS, pero mejora la conectividad general.",
"autofix_warning_text": "Si haces clic en \"Corregir\", AdGuard Home configurará tu sistema para utilizar el servidor DNS de AdGuard Home.",
"autofix_warning_list": "Realizará estas tareas: <0>Deshabilitar el sistema DNSStubListener</0> <0>Establecer la dirección del servidor DNS en 127.0.0.1</0> <0>Reemplazar el destino del enlace simbólico de /etc/resolv.conf por /run/systemd/resolve/resolv.conf</0> <0>Detener DNSStubListener (recargar el servicio systemd-resolved)</0>",
"autofix_warning_result": "Como resultado, todas las peticiones DNS de tu sistema serán procesadas por AdGuard Home de manera predeterminada.",
"tags_title": "Etiquetas",
@ -489,5 +508,19 @@
"list_updated": "{{count}} lista actualizada",
"list_updated_plural": "{{count}} listas actualizadas",
"dnssec_enable": "Habilitar DNSSEC",
"dnssec_enable_desc": "Establece el indicador DNSSEC en las consultas DNS salientes y comprueba el resultado (se requiere un resolutor habilitado para DNSSEC)"
"dnssec_enable_desc": "Establece el indicador DNSSEC en las consultas DNS salientes y comprueba el resultado (se requiere un resolutor habilitado para DNSSEC)",
"validated_with_dnssec": "Validado con DNSSEC",
"show_all_responses": "Todas las respuestas",
"show_blocked_responses": "Bloqueado",
"show_whitelisted_responses": "En lista blanca",
"show_processed_responses": "Procesado",
"blocked_safebrowsing": "Bloqueado por navegación segura",
"blocked_adult_websites": "Sitios web para adultos bloqueado",
"blocked_threats": "Amenazas bloqueadas",
"allowed": "Permitido",
"filtered": "Filtrado",
"rewritten": "Reescrito",
"safe_search": "Búsqueda segura",
"blocklist": "Lista de bloqueo",
"milliseconds_abbreviation": "ms"
}

View File

@ -37,6 +37,7 @@
"dhcp_interface_select": "رابط DHCP را انتخاب کنید",
"dhcp_hardware_address": "آدرس سخت افزار",
"dhcp_ip_addresses": "آدرس آی پی",
"ip": "IP",
"dhcp_table_hostname": "نام میزبان",
"dhcp_table_expires": "انقضاء",
"dhcp_warning": "اگر میخواهید DHCP سرور توکار را فعال کنید،مطمئن شوید DHCP سرور دیگری فعال نباشد.در غیر اینصورت،آن دسترسی به اینترنت را برای دستگاه های وصل شده قطع می کند!",
@ -49,17 +50,26 @@
"dhcp_static_leases_not_found": "هیچ اجاره DHCP ایستا یافت نشد",
"dhcp_add_static_lease": "افزودن اجاره ایستا",
"dhcp_reset": "آیا میخواهید پیکربندی DHCP را ریست کنید؟",
"country": "کشور",
"city": "شهر",
"delete_confirm": "آیا میخواهید \"{{key}}\" را حذف کنید؟",
"form_enter_hostname": "نام میزبان را وارد کنید",
"error_details": "جزئیات خطا",
"response_details": "جزئیات پاسخ",
"request_details": "درخواست جزئیات",
"client_details": "جزئیات کلاینت",
"details": "جزئیات",
"back": "قبلی",
"dashboard": "داشبورد",
"settings": "تنظيمات",
"filters": "فيلترها",
"filter": "فیلتر",
"query_log": "جستار وقایع",
"empty_log": "وقایع جستار خالی است",
"faq": "پرسش و پاسخ",
"version": "نسخه",
"address": "آدرس",
"protocol": "پروتکل",
"on": "روشن",
"off": "خاموش",
"copyright": "حق مالکیت",
@ -132,8 +142,10 @@
"rules_count_table_header": "تعداد دستور",
"last_time_updated_table_header": "زمان آخرین بروزرسانی",
"actions_table_header": "اقدامات",
"request_table_header": "درخواست",
"edit_table_action": "ويرايش",
"delete_table_action": "حذف",
"elapsed": "سپری شده",
"filters_and_hosts_hint": "AdGuard Home دستورات پایه مسدودساز تبلیغ و نحو فایل های میزبان را درک می کند.",
"no_blocklist_added": "به لیست سیاه اضافه نشد",
"no_whitelist_added": "به لیست مجاز اضافه نشد",
@ -170,10 +182,12 @@
"updated_upstream_dns_toast": "سرورهای DNS جریان ارسالی بروز رسانی شده است",
"dns_test_ok_toast": "سرورهای DNS تعیین شده بدرستی کار می کنند",
"dns_test_not_ok_toast": "سرور \"{{key}}\": نمیتواند مورد استفاده قرار گیرد،لطفا بررسی کنید آن را بدرستی نوشته اید",
"unblock_btn": "باز کن",
"block_btn": "مسدود کن",
"unblock": "رفع انسداد",
"block": "مسدود کردن",
"time_table_header": "زمان",
"date": "تاریخ",
"domain_name_table_header": "نام دامنه",
"domain_or_client": "دامنه یا کلاینت",
"type_table_header": "نوع",
"response_table_header": "پاسخ",
"client_table_header": "کلاینت",
@ -211,6 +225,8 @@
"custom_ip": "آی پی دستی",
"blocking_ipv4": "مسدودسازی IPv4",
"blocking_ipv6": "مسدودسازی IPv6",
"dns_over_https": "DNS-over-HTTPS",
"dns_over_tls": "DNS-over-TLS",
"form_enter_rate_limit": "میزان محدودیت را وارد کنید",
"rate_limit": "میزان محدودیت",
"edns_enable": "فعالسازی زیرشبکه کلاینت EDNS",
@ -229,6 +245,7 @@
"rule_label": "دستور",
"list_label": "لیست",
"unknown_filter": "فیلتر ناشناخته {{filterId}}",
"known_tracker": "ردیاب های شناخته شده",
"install_welcome_title": "به AdGuard Home خوش آمدید!",
"install_welcome_desc": "AdGuard Home یک شبکه گسترده و ردیاب و مسدوساز تبلیغ با سرور DNS است.هدف آن این است که به شما اجازه کنترل کل شبکه و همه دستگاه های شما را بدهد و آن نیازی به برنامه سمت-کاربر ندارد.",
"install_settings_title": "رابط وب آدمین",
@ -346,6 +363,7 @@
"form_enter_id": "خطای احرازکننده",
"form_add_id": "افزودن احرازکننده",
"form_client_name": "نام کلاینت را وارد کنید",
"name": "نام",
"client_global_settings": "استفاده از تنظیمات سراسری",
"client_deleted": "کلاینت \"{{key}}\" را با موفقیت حذف کرد",
"client_added": "کلاینت \"{{key}}\" را با موفقیت اضافه کرد",
@ -445,6 +463,7 @@
"location": "مکان",
"orgname": "نام سازمان",
"netname": "نام شبکه",
"network": "شبکه",
"descr": "توضيحات",
"whois": "هوئیز",
"filtering_rules_learn_more": "درباره ایجاد لیست سیاه میزبان برای خود <0>بیشتر بدانید</0>.",
@ -489,5 +508,19 @@
"list_updated": "{{count}} لیست بروز رسانی شد",
"list_updated_plural": "{{count}} لیست بروز رسانی شد",
"dnssec_enable": "فعالسازی DNSSEC",
"dnssec_enable_desc": "تنظیم نشان DNSSEC در جستارهای حاصل DNS و بررسی نتیجه (تفکیک کننده DNSSEC-فعال شده نیاز است)"
"dnssec_enable_desc": "تنظیم نشان DNSSEC در جستارهای حاصل DNS و بررسی نتیجه (تفکیک کننده DNSSEC-فعال شده نیاز است)",
"validated_with_dnssec": "معتبر سازی با DNSSEC",
"show_all_responses": "همه پاسخ ها",
"show_blocked_responses": "مسدود شده",
"show_whitelisted_responses": "لیست سفید",
"show_processed_responses": "پردازش شده",
"blocked_safebrowsing": "بستن وب گردی اَمن",
"blocked_adult_websites": "وبسایت غیراخلاقی مسدود شده",
"blocked_threats": "تهدیدات مسدود شده",
"allowed": "اجازه داده شده",
"filtered": "فیلتر شده",
"rewritten": "بازنویسی شده",
"safe_search": "جستجوی اَمن",
"blocklist": "لیست سیاه",
"milliseconds_abbreviation": "هـ ثـ"
}

View File

@ -3,6 +3,8 @@
"example_upstream_reserved": "Vous pouvez spécifier un DNS en amont <0>pour un/des domaine(s) spécifique(s)</0>",
"upstream_parallel": "Utiliser des requêtes parallèles pour accélérer la résolution en requêtant simultanément tous les serveurs upstream",
"parallel_requests": "Demandes en parallèle",
"load_balancing": "Équilibrage de charge",
"load_balancing_desc": "Interroger un serveur à la fois. AdGuard Home utilisera lalgorithme aléatoire pondéré pour choisir le serveur afin que celui le plus rapide soit utilisé plus souvent.",
"bootstrap_dns": "Serveurs DNS d'amorçage",
"bootstrap_dns_desc": "Les serveurs DNS d'amorçage sont utilisés pour résoudre les adresses IP des résolveurs DoH/DoT que vous spécifiez comme upstream.",
"check_dhcp_servers": "Rechercher les serveurs DHCP",
@ -37,6 +39,7 @@
"dhcp_interface_select": "Sélectionner l'interface du serveur DHCP",
"dhcp_hardware_address": "Adresse de la machine",
"dhcp_ip_addresses": "Adresses IP",
"ip": "IP",
"dhcp_table_hostname": "Nom de machine",
"dhcp_table_expires": "Expire le",
"dhcp_warning": "Si vous souhaitez tout de même activer le serveur DHCP, assurez-vous qu'il n'y a d'autre serveur DHCP actif sur votre réseau. Sinon, cela peut faire dysfonctionner Internet sur tous les appareils connectés au réseau !",
@ -49,17 +52,25 @@
"dhcp_static_leases_not_found": "Aucun bail statique DHCP trouvé",
"dhcp_add_static_lease": "Ajoutez un bail statique",
"dhcp_reset": "Voulez-vous vraiment réinitialiser votre configuration DHCP ?",
"country": "Pays",
"city": "Ville",
"delete_confirm": "Voulez-vous vraiment supprimer \"{{key}}\" ?",
"form_enter_hostname": "Saisissez un nom d'hôte",
"error_details": "Détails des erreurs",
"request_details": "Demander des détails",
"client_details": "Détails du client",
"details": "Détails",
"back": "Retour",
"dashboard": "Tableau de bord",
"settings": "Paramètres",
"filters": "Filtres",
"filter": "Filtre",
"query_log": "Journal des requêtes",
"empty_log": "Le journal des requêtes est vide",
"faq": "FAQ",
"version": "version",
"address": "addresse",
"address": "Addresse",
"protocol": "Protocole",
"on": "Activé",
"off": "Éteint",
"copyright": "Copyright",
@ -132,8 +143,10 @@
"rules_count_table_header": "Nombre des règles",
"last_time_updated_table_header": "Dernière mise à jour",
"actions_table_header": "Actions",
"request_table_header": "Requête",
"edit_table_action": "Modifier",
"delete_table_action": "Supprimer",
"elapsed": "Écoulé",
"filters_and_hosts_hint": "AdGuard Home comprend les règles basiques de blocage ainsi que la syntaxe des fichiers hosts.",
"no_blocklist_added": "Aucune liste de blocage ajoutée",
"no_whitelist_added": "Aucune liste dautorisation ajoutée",
@ -170,10 +183,12 @@
"updated_upstream_dns_toast": "Les serveurs DNS upstream sont mis à jour",
"dns_test_ok_toast": "Les serveurs DNS spécifiés fonctionnent correctement",
"dns_test_not_ok_toast": "Impossible d'utiliser le serveur \"{{key}}\": veuillez vérifier si le nom saisi est bien correct",
"unblock_btn": "Débloquer",
"block_btn": "Bloquer",
"unblock": "Débloquer",
"block": "Bloquer",
"time_table_header": "Temps",
"date": "Date",
"domain_name_table_header": "Nom de domaine",
"domain_or_client": "Domaine ou client",
"type_table_header": "Type",
"response_table_header": "Réponse",
"client_table_header": "Client",
@ -211,6 +226,8 @@
"custom_ip": "IP personnalisée",
"blocking_ipv4": "Blocage IPv4",
"blocking_ipv6": "Blocage IPv6",
"dns_over_https": "DNS-over-HTTPS",
"dns_over_tls": "DNS-over-TLS",
"form_enter_rate_limit": "Entrez la limite de taux",
"rate_limit": "Limite de taux",
"edns_enable": "Activer le sous-réseau du client EDNS",
@ -229,6 +246,7 @@
"rule_label": "Règle",
"list_label": "Liste",
"unknown_filter": "Filtre inconnu {{filterId}}",
"known_tracker": "Pisteur connu",
"install_welcome_title": "Bienvenue sur AdGuard Home !",
"install_welcome_desc": "AdGuard Home est un seveur DNS pour bloquer les pubs et traceurs sur tout un réseau. Son but est de vous donner le contrôle sur l'ensemble de votre réseau et tous vos appareils sans programme côté client supplémentaire.",
"install_settings_title": "Interface web administrateur",
@ -257,7 +275,7 @@
"install_devices_router_list_1": "Ouvrez les préférences de votre routeur. Normalement, vous pouvez y accéder depuis votre navigateur Web via une URL (exemple http://192.168.0.1/ ou http://192.168.1.1/). Vous devrez peut-être saisir le mot de passe. Si vous ne vous en rappelez plus, vous pouvez le réinitialiser en appuyant sur le bouton du routeur. Certains routeurs fonctionnent sous une application spécifique, qui devrait être déjà installée sur votre ordinateur/téléphone.",
"install_devices_router_list_2": "Trouvez les paramètres DHCP/DNS. Recherchez les lettres DNS près d'une zone qui permet la saisie de 2 ou 3 blocs de chiffres, chacun composé de 4 parties de 1 à 3 chiffres.",
"install_devices_router_list_3": "Saisissez vos adresses de serveur AdGuard Home ici.",
"install_devices_router_list_4": "Vous ne pouvez pas définir un serveur DNS personnalisé sur certains types de routeurs. Dans ce cas, cela peut être utile si vous configurez AdGuard Home en tant que serveur DHCP. Sinon, vous devez rechercher le manuel sur la façon de personnaliser les serveurs DNS pour votre modèle de routeur particulier.",
"install_devices_router_list_4": "Vous ne pouvez pas définir un serveur DNS personnalisé sur certains types de routeurs. Dans ce cas, cela peut être utile si vous configurez AdGuard Home en tant que <0>serveur DHCP</0>. Sinon, vous devez rechercher le manuel sur la façon de personnaliser les serveurs DNS pour votre modèle de routeur particulier.",
"install_devices_windows_list_1": "Ouvrez votre Panneau de configuration depuis le menu Démarrer ou la recherche Windows.",
"install_devices_windows_list_2": "Allez dans la catégorie Réseau et Internet et ensuite dans le Centre Réseau et Partage.",
"install_devices_windows_list_3": "Sur la partie gauche de l'écran, recherchez Modifier les paramètres de la carte et cliquez dessus.",
@ -346,6 +364,7 @@
"form_enter_id": "Entrer identifiant",
"form_add_id": "Ajouter identifiant",
"form_client_name": "Saisissez le nom du client",
"name": "Nom",
"client_global_settings": "Utiliser les paramètres généraux",
"client_deleted": "Le client \"{{key}}\" a été supprimé avec succès",
"client_added": "Le client \"{{key}}\" a été ajouté",
@ -361,6 +380,7 @@
"access_allowed_desc": "Une liste d'adresses IP ou CIDR. Si configuré, AdGuard Home acceptera uniquement les requêtes provenant de ces adresses IP.",
"access_disallowed_title": "Clients non autorisés",
"access_disallowed_desc": "Une liste d'adresses IP ou CIDR. Si configuré, AdGuard Home bloquera les requêtes provenant de ces adresses IP.",
"access_blocked_title": "Domaines interdits",
"access_blocked_desc": "Ne confondez pas ceci avec les filtres. AdGuard Home ignorera les requêtes DNS portant sur les domaines ci-dessous.",
"access_settings_saved": "Paramètres d'accès enregistrés avec succès",
"updates_checked": "Mises à jour vérifiées",
@ -444,6 +464,7 @@
"location": "Localisation",
"orgname": "Nom de l'organisation",
"netname": "Nom du réseau",
"network": "Réseau",
"descr": "Description",
"whois": "Whois",
"filtering_rules_learn_more": "<0>Apprenez-en plus</0> à propos de la création de vos propres listes de blocage dhôtes.",
@ -488,5 +509,19 @@
"list_updated": "{{count}} liste mise à jour",
"list_updated_plural": "{{count}} listes mises à jour",
"dnssec_enable": "Activer DNSSEC",
"dnssec_enable_desc": "Définir lindicateur DNSSEC dans les requêtes DNS sortantes et vérifier le résultat (résolveur compatible DNSSEC requis)"
}
"dnssec_enable_desc": "Définir lindicateur DNSSEC dans les requêtes DNS sortantes et vérifier le résultat (résolveur compatible DNSSEC requis)",
"validated_with_dnssec": "Validé avec DNSSEC",
"show_all_responses": "Toutes les réponses",
"show_blocked_responses": "Bloqué",
"show_whitelisted_responses": "Ajouté à la liste blanche",
"show_processed_responses": "Traité",
"blocked_safebrowsing": "Navigation sécurisée bloquée",
"blocked_adult_websites": "Sites à contenu adulte bloqués",
"blocked_threats": "Menaces bloquées",
"allowed": "Autorisé",
"filtered": "Filtré",
"rewritten": "Réécrit",
"safe_search": "Recherche sécurisée",
"blocklist": "Liste de blocage",
"milliseconds_abbreviation": "ms"
}

View File

@ -37,6 +37,7 @@
"dhcp_interface_select": "Odaberite DHCP sučelje",
"dhcp_hardware_address": "Adresa hardvera",
"dhcp_ip_addresses": "IP adrese",
"ip": "IP",
"dhcp_table_hostname": "Naziv računala",
"dhcp_table_expires": "Istječe",
"dhcp_warning": "Ako svejedno želite omogućiti DHCP poslužitelj, provjerite da nema drugog aktivnog DHCP poslužitelja na vašoj mreži. Inače može pokvariti Internet za ostale povezane uređaje!",
@ -49,17 +50,24 @@
"dhcp_static_leases_not_found": "Nisu pronađeni statični DHCP leases",
"dhcp_add_static_lease": "Dodaj static lease",
"dhcp_reset": "Jeste li sigurni da želite poništiti DHCP postavke?",
"country": "Država",
"delete_confirm": "Jeste li sigurni da želite ukloniti \"{{key}}\"?",
"form_enter_hostname": "Unesite naziv računala",
"error_details": "Detalji o pogrešci",
"request_details": "Detalji zahtjeva",
"client_details": "Detalji o klijentu",
"details": "Detalji",
"back": "Natrag",
"dashboard": "Upravljačka ploča",
"settings": "Postavke",
"filters": "Filtri",
"filter": "Filtar",
"query_log": "Zapisnik upita",
"empty_log": "Zapisik upita je prazan",
"faq": "ČPP",
"version": "Verzija",
"address": "adresa",
"address": "Adresa",
"protocol": "Protokol",
"on": "UKLJUČENO",
"off": "ISKLJUČENO",
"copyright": "Autorsko pravo",
@ -132,8 +140,10 @@
"rules_count_table_header": "Broj pravila",
"last_time_updated_table_header": "Zadnje ažurirano",
"actions_table_header": "Radnje",
"request_table_header": "Zahtjev",
"edit_table_action": "Uredi",
"delete_table_action": "Ukloni",
"elapsed": "Proteklo",
"filters_and_hosts_hint": "AdGuard Home razumije osnovna pravila blokiranja oglasa i sintaksu hosts datoteka.",
"no_blocklist_added": "Nema dodanih popisa blokiranih",
"no_whitelist_added": "Nema dodanih popisa omogućenih",
@ -170,10 +180,12 @@
"updated_upstream_dns_toast": "Ažurirani su upstream DNS poslužitelji",
"dns_test_ok_toast": "Odabrani DNS poslužitelji su trenutno aktivni",
"dns_test_not_ok_toast": "\"{{key}}\" poslužitelja: ne može se upotrijebiti, provjerite jeste li to ispravno napisali",
"unblock_btn": "Odblokiraj",
"block_btn": "Blokiraj",
"unblock": "Odblokiraj",
"block": "Blokiraj",
"time_table_header": "Vrijeme",
"date": "Datum",
"domain_name_table_header": "Naziv domene",
"domain_or_client": "Domena ili klijent",
"type_table_header": "Vrsta",
"response_table_header": "Odgovor",
"client_table_header": "Klijent",
@ -211,6 +223,8 @@
"custom_ip": "Prilagođen IP",
"blocking_ipv4": "Blokiranje IPv4",
"blocking_ipv6": "Blokiranje IPv6",
"dns_over_https": "DNS-over-HTTPS",
"dns_over_tls": "DNS-over-TLS",
"form_enter_rate_limit": "Unesite ograničenje",
"rate_limit": "Ograničenje",
"edns_enable": "Omogući EDNS Client Subnet",
@ -229,6 +243,7 @@
"rule_label": "Pravilo",
"list_label": "Popis",
"unknown_filter": "Nepoznati filtar {{filterId}}",
"known_tracker": "Poznati pratitelj",
"install_welcome_title": "Dobrodošli u AdGuard Home!",
"install_welcome_desc": "AdGuard Home je DNS poslužitelj za blokiranje oglasa i pratitelja na cijeloj mreži. Njegova je svrha omogućiti vam upravljanje cijelom mrežom i svim svojim uređajima, a da to ne zahtijeva korištenje programa na strani klijenta.",
"install_settings_title": "Administratorsko web sučelje",
@ -257,7 +272,7 @@
"install_devices_router_list_1": "Otvorite postavke za router. Obično mu možete pristupiti iz preglednika putem URL-a (kao što je http://192.168.0.1/ ili http://192.168.1.1/). Od vas će se možda tražiti da unesete lozinku. Ako je se ne sjećate, lozinku možete često poništiti pritiskom na dumge na samom routeru. Neki routeri trebaju određenu aplikaciju, koja bi u tom slučaju trebala biti već instalirana na vašem računalu/telefonu.",
"install_devices_router_list_2": "Pronađite DHCP/DNS postavke. Potražite DNS slova pored polja koje dopušta dva ili tri skupa brojeva, svaki razdvojen u četiri skupine od jedne do tri znamenke.",
"install_devices_router_list_3": "Unesite adresu AdGuard Home poslužitelja ovdje.",
"install_devices_router_list_4": "Ne možete postaviti prilagođeni DNS poslužitelj na nekim vrstama routera. U ovom slučaju, može vam pomoći ako postavite AdGuard Home kao DHCP poslužitelj. U suprotnom, trebali biste potražiti priručnik o tome kako prilagoditi DNS poslužitelje za vaš određeni model routera.",
"install_devices_router_list_4": "Ne možete postaviti prilagođeni DNS poslužitelj na nekim vrstama routera. U ovom slučaju, može vam pomoći ako postavite AdGuard Home kao <0>DHCP poslužitelj</0>. U suprotnom, trebali biste potražiti priručnik o tome kako prilagoditi DNS poslužitelje za vaš određeni model routera.",
"install_devices_windows_list_1": "Otvorite Upravljačku ploču putem Start izbornika ili Windows pretrage.",
"install_devices_windows_list_2": "Idite na kategoriju Mreža i Internet i odaberite Centar za mreže i zajedničko korištenje.",
"install_devices_windows_list_3": "Na lijevoj strani zaslona pronađite Promjeni postavke adaptera i pritisnite na to.",
@ -346,6 +361,7 @@
"form_enter_id": "Unesi identifikator",
"form_add_id": "Dodaj identifikator",
"form_client_name": "Unesite naziv klijenta",
"name": "Naziv",
"client_global_settings": "Koristi globalne postavke",
"client_deleted": "Klijent \"{{key}}\" je uspješno uklonjen",
"client_added": "Klijent \"{{key}}\" je uspješno dodan",
@ -445,6 +461,7 @@
"location": "Lokacija",
"orgname": "Naziv organizacije",
"netname": "Naziv mreže",
"network": "Mreža",
"descr": "Opis",
"whois": "Whois",
"filtering_rules_learn_more": "<0>Saznajte više</0> o stvaranju vlastitog popisa poslužitelja.",
@ -456,7 +473,7 @@
"disable_ipv6": "Onemogući IPv6",
"disable_ipv6_desc": "Ukoliko je ova značajka omogućena, svi DNS upiti za IPv6 adrese (AAAA tip) će biti odbačeni.",
"fastest_addr": "Najbrža IP adresa",
"fastest_addr_desc": "Ispitajte sve DNS poslužitelje i vratite najbržu IP adresu među svim odgovorima",
"fastest_addr_desc": "Ispitajte sve DNS poslužitelje i vratite najbržu IP adresu među svim odgovorima. Ovo će usporiti DNS upite jer moramo čekati odgovore sa svih DNS poslužitelja, ali će poboljšati cjelokupnu povezanost.",
"autofix_warning_text": "Ako pritisnete \"Popravi\", AdGuard Home će postaviti vaš sustav da koristi AdGuardHome DNS poslužitelj.",
"autofix_warning_list": "Izvodi sljedeće radnje: <0>Deaktiviraj DNSStubListener sustav</0> <0>Postavi adresu DNS poslužitelja na 127.0.0.1</0> <0>Zamijeni simbolički cilj veze iz /etc/resolv.conf u /run/systemd/resolve/resolv.conf</0> <0>Zaustavi DNSStubListener (ponovno pokreni systemd-resolved uslugu)</0>",
"autofix_warning_result": "Kao rezultat toga, sve DNS zahtjeve iz vašeg sustava će AdGuard Home obraditi prema zadanim postavkama.",
@ -489,5 +506,19 @@
"list_updated": "{{count}} popis ažuriran",
"list_updated_plural": "{{count}} popisa ažurirana",
"dnssec_enable": "Omogući DNSSEC",
"dnssec_enable_desc": "Omogućite DNSSEC u izlaznim DNS upitima i provjerite rezultat (potreban je resolver s omogućenim DNSSEC-om)"
"dnssec_enable_desc": "Omogućite DNSSEC u izlaznim DNS upitima i provjerite rezultat (potreban je resolver s omogućenim DNSSEC-om)",
"validated_with_dnssec": "Potvrđeno s DNSSEC-om",
"show_all_responses": "Svi odgovori",
"show_blocked_responses": "Blokirano",
"show_whitelisted_responses": "Na popisu dopuštenih",
"show_processed_responses": "Obrađeno",
"blocked_safebrowsing": "Blokirano s Sigurnom pretragom",
"blocked_adult_websites": "Blokirane web stranice za odrasle",
"blocked_threats": "Blokirane prijetnje",
"allowed": "Dopušteno",
"filtered": "Filtrirano",
"rewritten": "Prepisano",
"safe_search": "Sigurno pretraživanje",
"blocklist": "Popis neželjenih",
"milliseconds_abbreviation": "ms"
}

View File

@ -52,6 +52,7 @@
"delete_confirm": "Apakah anda yakin ingin menghapus \"{{key}}\"?",
"form_enter_hostname": "Masukkan hostname",
"error_details": "Detail kesalahan",
"request_details": "Detai permintaan",
"back": "Kembali",
"dashboard": "Beranda",
"settings": "Pengaturan",
@ -59,7 +60,8 @@
"query_log": "Catatan Kueri",
"faq": "Tanya Jawab",
"version": "versi",
"address": "alamat",
"address": "Alamat",
"protocol": "Protokol",
"on": "HIDUP",
"off": "MATI",
"copyright": "Hak cipta",
@ -107,6 +109,7 @@
"general_settings": "Pengaturan umum",
"dns_settings": "Pengaturan DNS",
"dns_blocklists": "Daftar blokir DNS",
"custom_filtering_rules": "Aturan penyaringan khusus",
"encryption_settings": "Pengaturan enkripsi",
"dhcp_settings": "Pengaturan DHCP",
"upstream_dns": "Server DNS hulu",
@ -152,9 +155,10 @@
"updated_upstream_dns_toast": "Server DNS hulu terbarui",
"dns_test_ok_toast": "Server DNS yang ditentukan bekerja dengan benar",
"dns_test_not_ok_toast": "Server \"{{key}}\": tidak dapat digunakan, mohon cek bahwa Anda telah menulisnya dengan benar",
"unblock_btn": "Buka Blokir",
"block_btn": "Blokir",
"unblock": "Buka Blokir",
"block": "Blok",
"time_table_header": "Waktu",
"date": "Tanggal",
"domain_name_table_header": "Nama domain",
"type_table_header": "Tipe",
"response_table_header": "Respon",
@ -184,6 +188,7 @@
"query_log_strict_search": "Gunakan tanda kutip ganda untuk pencarian ketat",
"query_log_retention_confirm": "Apakah Anda yakin ingin mengubah retensi kueri log? Jika Anda menurunkan nilai interval, beberapa data akan hilang",
"blocking_mode": "Mode blokir",
"default": "Standar",
"blocking_ipv4": "Blokiran IPv4",
"blocking_ipv6": "Blokiran IPv6",
"edns_cs_desc": "Apabila dinyalakan, AdGuard Home akan mengirim subnet klien ke server-server DNS.",
@ -222,7 +227,7 @@
"install_devices_router_list_1": "Buka preferensi untuk router Anda. Biasanya, Anda dapat mengaksesnya dari browser Anda melalui URL (seperti http://192.168.0.1/ atau http://192.168.1.1/). Anda mungkin diminta memasukkan kata sandi. Jika Anda tidak mengingatnya, Anda dapat mengatur ulang kata sandi dengan menekan tombol atur ulang (reset) pada router. Beberapa router ada yang memerlukan aplikasi tertentu, dalam hal ini harus sudah diinstal pada komputer / telepon Anda.",
"install_devices_router_list_2": "Temukan pengaturan DHCP / DNS. Cari huruf DNS di sebelah bidang yang memungkinkan dua atau tiga set angka, masing-masing dipecah menjadi empat grup dengan satu hingga tiga digit.",
"install_devices_router_list_3": "Masukkan alamat server AdGuard Home disana",
"install_devices_router_list_4": "Anda tidak dapat menyetel server DNS kustom pada beberapa tipe router. Dalam hal ini mungkin membantu jika Anda mengatur AdGuard Home sebagai server DHCP. Jika tidak, Anda harus mencari petunjuk tentang cara mengkustomisasi server DNS untuk model router khusus Anda.",
"install_devices_router_list_4": "Anda tidak dapat menyetel server DNS kustom pada beberapa tipe router. Dalam hal ini mungkin membantu jika Anda mengatur AdGuard Home sebagai <0>server DHCP</0>. Jika tidak, Anda harus mencari petunjuk tentang cara mengkustomisasi server DNS untuk model router khusus Anda.",
"install_devices_windows_list_1": "Buka Panel Kontrol melalui menu Start atau pencarian Windows.",
"install_devices_windows_list_2": "Masuk ke kategori Jaringan dan Internet (Network and Internet) dan kemudian ke Pusat Jaringan dan Berbagi (Network and Sharing Center).",
"install_devices_windows_list_3": "Di sisi kiri layar temukan Ubah pengaturan adaptor dan klik.",
@ -428,4 +433,4 @@
"client_blocked": "Klien \"{{ip}}\" sukses di blokir",
"client_unblocked": "Klien \"{{ip}}\" sukses di unblock",
"static_ip": "Alamat IP statis"
}
}

View File

@ -3,6 +3,8 @@
"example_upstream_reserved": "Puoi specificare un server DNS<0>per uno specifico dominio(i)</0>",
"upstream_parallel": "Usa le query parallele per accelerare la risoluzione interrogando simultaneamente tutti i server",
"parallel_requests": "Richieste parallele",
"load_balancing": "Bilanciamento del carico",
"load_balancing_desc": "Interroga un server per volta. AdGuardHome userà l'algoritmo soppesato casualmente per scegliere il server così che quello più veloce sarà usato più spesso.",
"bootstrap_dns": "Server DNS di avvio",
"bootstrap_dns_desc": "Server DNS usati per risolvere gli indirizzi IP dei risolutori DoH/DoT specificati come upstreams.",
"check_dhcp_servers": "Controlla la presenza di server DHCP",
@ -37,6 +39,7 @@
"dhcp_interface_select": "Seleziona l'interfaccia DHCP",
"dhcp_hardware_address": "Indirizzo hardware",
"dhcp_ip_addresses": "Indirizzi IP",
"ip": "IP",
"dhcp_table_hostname": "Nome host",
"dhcp_table_expires": "Scaduto",
"dhcp_warning": "Se si desidera abilitare il server DHCP integrato, assicurarsi che non vi siano altri server DHCP attivi. Altrimenti, possono sussistere problemi di rete per i dispositivi collegati!",
@ -49,17 +52,24 @@
"dhcp_static_leases_not_found": "Non è stato trovato nessun leases statico DHCP",
"dhcp_add_static_lease": "Aggiungi lease statico",
"dhcp_reset": "Sei sicuro di voler ripristinare la configurazione DHCP?",
"country": "Regione",
"delete_confirm": "Sei sicuro di voler cancellare \"{{key}}\"?",
"form_enter_hostname": "Inserisci hostname",
"error_details": "Dettagli errore",
"request_details": "Dettagli della richiesta",
"client_details": "Dettagli client",
"details": "Dettagli",
"back": "Indietro",
"dashboard": "Cruscotto",
"settings": "Impostazioni",
"filters": "Filtri",
"filter": "Filtro",
"query_log": "Query Log",
"empty_log": "Il log query è vuoto",
"faq": "FAQ",
"version": "versione",
"address": "indirizzo IP",
"address": "Indirizzo",
"protocol": "Protocollo",
"on": "ATTIVO",
"off": "DISATTIVATO",
"copyright": "Copyright",
@ -132,8 +142,10 @@
"rules_count_table_header": "Numero regole",
"last_time_updated_table_header": "Ultimo aggiornamento",
"actions_table_header": "Azioni",
"request_table_header": "Richiesta",
"edit_table_action": "Modifica",
"delete_table_action": "Elimina",
"elapsed": "Trascorso",
"filters_and_hosts_hint": "AdGuard Home è in grado di comprendere la sintassi delle regole di adblock o quelle dei file hosts",
"no_blocklist_added": "Non è stata aggiunta alcuna lista di blocco",
"no_whitelist_added": "Non è stata aggiunta alcuna lista dei consentiti",
@ -170,10 +182,12 @@
"updated_upstream_dns_toast": "Server DNS upstream aggiornati",
"dns_test_ok_toast": "I server DNS specificati funzionano correttamente",
"dns_test_not_ok_toast": "Server \"{{key}}\": non può essere usato, assicurati di averlo digitato correttamente",
"unblock_btn": "Sblocca",
"block_btn": "Blocca",
"unblock": "Sblocca",
"block": "Blocca",
"time_table_header": "Ora",
"date": "Data",
"domain_name_table_header": "Nome dominio",
"domain_or_client": "Dominio o client",
"type_table_header": "Tipo",
"response_table_header": "Risposta",
"client_table_header": "Client",
@ -211,6 +225,8 @@
"custom_ip": "IP personalizzato",
"blocking_ipv4": "Blocca IPv4",
"blocking_ipv6": "Blocca IPv6",
"dns_over_https": "DNS-over-HTTPS",
"dns_over_tls": "DNS-over-TLS",
"form_enter_rate_limit": "Imposta limite delle richieste",
"rate_limit": "Limite delle richieste",
"edns_enable": "Abilita client di sottorete EDNS",
@ -229,6 +245,7 @@
"rule_label": "Regola",
"list_label": "Lista",
"unknown_filter": "Filtro sconosciuto {{filterId}}",
"known_tracker": "Tracker conosciuto",
"install_welcome_title": "Benvenuto nella Home di AdGuard!",
"install_welcome_desc": "AdGuard Home è un server DNS che blocca annunci e tracker in tutta la rete. Il suo scopo è quello di consentire di controllare l'intera rete e tutti i dispositivi, e non richiede l'utilizzo di un programma sul lato client.",
"install_settings_title": "Interfaccia Web dell'Admin",
@ -257,7 +274,7 @@
"install_devices_router_list_1": "Apri le preferenze per il tuo router. Di solito, puoi accedervi dal tuo browser tramite un URL (come http://192.168.0.1/ o http://192.168.1.1/). Potrebbe essere richiesto di inserire la password. Se non lo ricordi, puoi spesso reimpostare la password premendo un pulsante sul router stesso. Alcuni router richiedono un'applicazione specifica, che in quel caso dovrebbe essere già installata sul tuo computer / telefono.",
"install_devices_router_list_2": "Trova le impostazioni DHCP / DNS. Cerca le lettere DNS accanto a un campo che consente due o tre serie di numeri, ciascuno suddiviso in quattro gruppi di 1-3 cifre.",
"install_devices_router_list_3": "Inserisci qui gli indirizzi del tuo server AdGuard Home.",
"install_devices_router_list_4": "Non puoi impostare un server DNS personalizzato o alcun tipo di router. In questi casi potrebbe essere di aiuto impostare la pagina principale di AdGuard come server DHCP. In alternativa, dovresti cercare sul manuale il modo per personalizzare i server DNS per il tuo particolare modello di router.",
"install_devices_router_list_4": "Non puoi impostare un server DNS personalizzato o alcun tipo di router. In questi casi potrebbe essere di aiuto impostare la pagina principale di AdGuard come <0>server DHCP</0>. In alternativa, dovresti cercare sul manuale il modo per personalizzare i server DNS per il tuo particolare modello di router.",
"install_devices_windows_list_1": "Aprire il Pannello di controllo tramite il menu Start o la ricerca di Windows.",
"install_devices_windows_list_2": "Vai a Rete e categoria Internet e poi a Centro connessioni di rete e condivisione.",
"install_devices_windows_list_3": "Sul lato sinistro dello schermo, trova le impostazioni della scheda Cambia e fai clic su di esso.",
@ -346,6 +363,7 @@
"form_enter_id": "Inserisci identificatore",
"form_add_id": "Aggiungi identificatore",
"form_client_name": "Inserisci nome client",
"name": "Nome",
"client_global_settings": "Usa le impostazioni globali",
"client_deleted": "Client \"{{key}}\" eliminato correttamente",
"client_added": "Client \"{{key}}\" aggiunto correttamente",
@ -445,6 +463,7 @@
"location": "Locazione",
"orgname": "Nome dell'organizzazione",
"netname": "Nome Network",
"network": "Rete",
"descr": "Descrizione",
"whois": "Chi è",
"filtering_rules_learn_more": "<0>Leggi altro</0> su come creare i tuoi host blacklist.",
@ -489,5 +508,19 @@
"list_updated": "{{count}} lista aggiornata",
"list_updated_plural": "{{count}} liste aggiornate",
"dnssec_enable": "Abilita DNSSEC",
"dnssec_enable_desc": "Imposta la spunta DNSSEC nelle interrogazioni DNS in uscita e verifica il risultato (è richiesta l'attivazione del risolutore DNSSEC)"
}
"dnssec_enable_desc": "Imposta la spunta DNSSEC nelle interrogazioni DNS in uscita e verifica il risultato (è richiesta l'attivazione del risolutore DNSSEC)",
"validated_with_dnssec": "Verificato con DNSSEC",
"show_all_responses": "Tutti i responsi",
"show_blocked_responses": "Bloccato",
"show_whitelisted_responses": "Nella whitelist",
"show_processed_responses": "Processato",
"blocked_safebrowsing": "Blocco Navigazione sicura",
"blocked_adult_websites": "Siti per adulti bloccati",
"blocked_threats": "Minacce bloccate",
"allowed": "Consentito",
"filtered": "Filtrato",
"rewritten": "Riscritto",
"safe_search": "Ricerca sicura",
"blocklist": "Lista di blocco",
"milliseconds_abbreviation": "ms"
}

View File

@ -3,6 +3,8 @@
"example_upstream_reserved": "<0>特定のドメイン</0>に対してDNSアップストリームを指定できます",
"upstream_parallel": "並列リクエストを使用する(すべてのアップストリームサーバーを同時に照会することで解決スピードが向上します)",
"parallel_requests": "並列リクエスト",
"load_balancing": "ロードバランシング",
"load_balancing_desc": "一度に1つのサーバを照会します。 AdGuard Homeは、重み付きランダムアルゴリズムを使用してサーバを選択するため、最速のサーバがより頻繁に使用されます。",
"bootstrap_dns": "ブートストラップDNSサーバ",
"bootstrap_dns_desc": "ブートストラップDNSサーバは、上流として指定したDoHDoTリゾルバのIPアドレスを解決するために使用されます。",
"check_dhcp_servers": "DHCPサーバをチェックする",
@ -37,6 +39,7 @@
"dhcp_interface_select": "DHCPインタフェースの選択",
"dhcp_hardware_address": "MACアドレス",
"dhcp_ip_addresses": "IPアドレス",
"ip": "IP",
"dhcp_table_hostname": "ホスト名",
"dhcp_table_expires": "有効期限",
"dhcp_warning": "内蔵しているDHCPサーバを有効にしたい場合は、稼働中のDHCPサーバがないことを確認してください。そうでなければ、接続されたデバイスのためにインターネットを壊すかもしれません",
@ -49,17 +52,26 @@
"dhcp_static_leases_not_found": "DHCP静的割り当てはありません",
"dhcp_add_static_lease": "静的割り当てを追加する",
"dhcp_reset": "DHCP設定をリセットして良いですか",
"country": "国",
"city": "街",
"delete_confirm": "\"{{key}}\" を削除してもよろしいですか?",
"form_enter_hostname": "ホスト名を入力してください",
"error_details": "エラー詳細",
"response_details": "応答の詳細",
"request_details": "要求の詳細",
"client_details": "クライアントの詳細",
"details": "詳細",
"back": "戻る",
"dashboard": "ダッシュボード",
"settings": "設定",
"filters": "フィルタ",
"filter": "フィルタ",
"query_log": "クエリ・ログ",
"empty_log": "クエリ・ログは空です",
"faq": "よくある質問",
"version": "バージョン",
"address": "アドレス",
"protocol": "プロトコル",
"on": "オン",
"off": "オフ",
"copyright": "著作権",
@ -132,8 +144,10 @@
"rules_count_table_header": "ルール数",
"last_time_updated_table_header": "最終更新時刻",
"actions_table_header": "操作",
"request_table_header": "リクエスト",
"edit_table_action": "編集する",
"delete_table_action": "削除する",
"elapsed": "経過",
"filters_and_hosts_hint": "AdGuard Homeは、基本的な広告ブロックルールとhostsファイルの構文を理解します。",
"no_blocklist_added": "ブロックリストには何も追加されていません",
"no_whitelist_added": "許可リストには何も追加されていません",
@ -170,10 +184,12 @@
"updated_upstream_dns_toast": "上流DNSサーバを更新しました",
"dns_test_ok_toast": "指定されたDNSサーバは正しく動作しています",
"dns_test_not_ok_toast": "サーバ \"{{key}}\": 使用できませんでした。正しく入力されているかどうかを確認してください",
"unblock_btn": "ブロック解除",
"block_btn": "ブロックする",
"unblock": "ブロック解除",
"block": "ブロック",
"time_table_header": "時刻",
"date": "購入日時",
"domain_name_table_header": "ドメイン名",
"domain_or_client": "ドメインまたはクライアント",
"type_table_header": "種類",
"response_table_header": "応答",
"client_table_header": "クライアント",
@ -211,6 +227,9 @@
"custom_ip": "カスタムIP",
"blocking_ipv4": "ブロック中のIPv4",
"blocking_ipv6": "ブロック中のIPv6",
"dns_over_https": "DNS-over-HTTPS",
"dns_over_tls": "DNS-over-TLS",
"plain_dns": "通常のDNS",
"form_enter_rate_limit": "頻度制限を入力してください",
"rate_limit": "頻度制限",
"edns_enable": "EDNSクライアント・サブネットを有効にする",
@ -229,6 +248,7 @@
"rule_label": "ルール",
"list_label": "リスト",
"unknown_filter": "不明なフィルタ {{filterId}}",
"known_tracker": "既知のトラッカー",
"install_welcome_title": "ようこそ、AdGuard Home へ!",
"install_welcome_desc": "AdGuard Homeは、ネットワーク全体で広告と追跡をブロックするDNSサーバです。その目的は、ネットワークとデバイスのすべてをあなたが制御できるようにすることであり、クライアント側のプログラムを使用する必要はありません。",
"install_settings_title": "管理用ウェブインターフェイス",
@ -257,7 +277,7 @@
"install_devices_router_list_1": "ルータの設定を開きます。通常は、URLhttp://192.168.0.1/ または http://192.168.1.1/ など)を介してブラウザからアクセスできます。パスワードの入力を求められることがあります。パスワードを覚えていない場合は、ルータにあるボタンを押してパスワードをリセットできます。一部のルータは特定のアプリケーションを必要とします。その場合、アプリケーションはあなたのコンピュータ/電話に既にインストールされているはずです。",
"install_devices_router_list_2": "DHCPDNSの設定を見つけます。DNSの文字のある入力欄を探します。それは、1〜3桁の数字で4つのグループに分けられた入力欄で、セットを許可されている欄です。",
"install_devices_router_list_3": "そこにAdGuard Homeサーバのアドレスを入力します。",
"install_devices_router_list_4": "一部のタイプのルータではカスタムDNSサーバを設定できません。この場合、AdGuard HomeをDHCPサーバとして設定することがおすすめです。それ以外の場合は、特定のルータモデルに合わせてDNSサーバをカスタマイズする方法に関するマニュアルを検索する必要があります。",
"install_devices_router_list_4": "一部のタイプのルータではカスタムDNSサーバを設定できません。この場合、AdGuard Homeを<0>DHCPサーバ</0>として設定するとお役に立ちます。それ以外の場合は、特定のルータモデルに合わせてDNSサーバをカスタマイズする方法に関するマニュアルを検索する必要があります。",
"install_devices_windows_list_1": "「スタート」メニューまたはWindowsの検索から「設定」を開きます。",
"install_devices_windows_list_2": "「ネットワークとインターネット」カテゴリに移動し、さらに「ネットワークと共有センター」へ移動します。",
"install_devices_windows_list_3": "画面の左側にある「アダプターの設定の変更」を見つけてクリックします。",
@ -346,6 +366,7 @@
"form_enter_id": "識別子を入力してください",
"form_add_id": "識別子を追加する",
"form_client_name": "クライアント名を入力してください",
"name": "名前",
"client_global_settings": "グローバル設定を使用する",
"client_deleted": "クライアント \"{{key}}\" の削除に成功しました",
"client_added": "クライアント \"{{key}}\" の追加に成功しました",
@ -361,6 +382,8 @@
"access_allowed_desc": "CIDRまたはIPアドレスのリスト。設定されると、AdGuard HomeはこれらのIPアドレスからのリクエストのみを許可します。",
"access_disallowed_title": "拒否するクライアント",
"access_disallowed_desc": "CIDRまたはIPアドレスのリスト。設定されると、AdGuard HomeはこれらのIPアドレスからのリクエストを破棄します。",
"access_blocked_title": "拒否するドメイン",
"access_blocked_desc": "これをフィルタと混同しないでください。AdGuard Homeは、これらのドメインを含むDNSクエリを破棄します。",
"access_settings_saved": "アクセス設定の保存に成功しました",
"updates_checked": "アップデートの確認に成功しました",
"updates_version_equal": "AdGuard Homeは既に最新です",
@ -443,6 +466,7 @@
"location": "ロケーション",
"orgname": "組織名",
"netname": "ネットワーク名",
"network": "ネットワーク",
"descr": "説明",
"whois": "Whois",
"filtering_rules_learn_more": "独自ホストリストの作成についての<0>詳細はこちら</0>。",
@ -486,5 +510,20 @@
"confirm_static_ip": "AdGuard Homeは、{{ip}}を静的IPアドレスとして設定します。よろしいですか",
"list_updated": "{{count}}個のリストが更新されました",
"list_updated_plural": "{{count}}個のリストが更新されました",
"dnssec_enable": "DNSSECを有効にする"
}
"dnssec_enable": "DNSSECを有効にする",
"dnssec_enable_desc": "DNSクエリの応答にDNSSECフラグを設定し、結果を確認しますDNSSEC対応のリゾルバが必要です",
"validated_with_dnssec": "DNSSECにて検証済",
"show_all_responses": "すべての応答",
"show_blocked_responses": "ブロック済",
"show_whitelisted_responses": "ホワイトリストにあり",
"show_processed_responses": "処理済",
"blocked_safebrowsing": "ブロックされたセーフブラウジング",
"blocked_adult_websites": "ブロックされたアダルトウェブサイト",
"blocked_threats": "ブロックされた脅威",
"allowed": "許可",
"filtered": "フィルタで処理",
"rewritten": "書換",
"safe_search": "セーフサーチ",
"blocklist": "ブロックリスト",
"milliseconds_abbreviation": "ms"
}

View File

@ -37,6 +37,7 @@
"dhcp_interface_select": "DHCP 인터페이스 선택",
"dhcp_hardware_address": "하드웨어 주소",
"dhcp_ip_addresses": "IP 주소",
"ip": "IP",
"dhcp_table_hostname": "호스트 이름",
"dhcp_table_expires": "만료",
"dhcp_warning": "DHCP 서버를 사용하려면 네트워크에 다른 활성 DHCP 서버가 없는지 확인해주세요. 다른 활성 DHCP 서버가 있다면, 연결된 장치의 인터넷을 끊을 수 있습니다.",
@ -49,17 +50,24 @@
"dhcp_static_leases_not_found": "DHCP 고정 임대를 찾을 수 없음",
"dhcp_add_static_lease": "고정 임대 추가",
"dhcp_reset": "정말로 DHCP 설정을 초기화할까요?",
"country": "지역",
"delete_confirm": "\"{{key}}\"을 삭제하시겠습니까?",
"form_enter_hostname": "호스트 이름을 입력해주세요",
"error_details": "오류 상세 정보",
"request_details": "요청 세부 사항",
"client_details": "클라이언트 정보",
"details": "정보",
"back": "뒤로",
"dashboard": "대시보드",
"settings": "설정",
"filters": "필터",
"filter": "필터",
"query_log": "쿼리 로그",
"empty_log": "질의 로그가 비어있음",
"faq": "자주 묻는 질문",
"version": "버전",
"address": "주소",
"protocol": "프로토콜",
"on": "ON",
"off": "OFF",
"copyright": "Copyright",
@ -132,8 +140,10 @@
"rules_count_table_header": "규칙 개수",
"last_time_updated_table_header": "마지막 업데이트",
"actions_table_header": "가능한 동작",
"request_table_header": "요청",
"edit_table_action": "편집",
"delete_table_action": "삭제",
"elapsed": "소요",
"filters_and_hosts_hint": "AdGuard Home은 기본적인 광고 차단 규칙과 호스트 파일 문법을 읽을 수 있습니다",
"no_blocklist_added": "차단 목록이 추가되지 않음",
"no_whitelist_added": "허용 목록이 추가되지 않음",
@ -170,10 +180,12 @@
"updated_upstream_dns_toast": "업스트림 DNS 서버를 업데이트하였습니다",
"dns_test_ok_toast": "특정 DNS 서버들은 정상적으로 동작 중입니다",
"dns_test_not_ok_toast": "서버 \"{{key}}\": 사용할 수 없습니다, 제대로 작성했는지 확인하세요.",
"unblock_btn": "차단 해제",
"block_btn": "차단",
"unblock": "차단 해제",
"block": "차단",
"time_table_header": "시간",
"date": "날짜",
"domain_name_table_header": "도메인명",
"domain_or_client": "도메인 또는 클라이언트",
"type_table_header": "유형",
"response_table_header": "응답",
"client_table_header": "클라이언트",
@ -211,6 +223,8 @@
"custom_ip": "사용자 지정 IP",
"blocking_ipv4": "IPv4 차단",
"blocking_ipv6": "IPv6 차단",
"dns_over_https": "DNS-over-HTTPS",
"dns_over_tls": "DNS-over-TLS",
"form_enter_rate_limit": "한도 제한 입력하기",
"rate_limit": "한도 제한",
"edns_enable": "EDNS 클라이언트 서브넷 활성화",
@ -229,6 +243,7 @@
"rule_label": "규칙",
"list_label": "목록",
"unknown_filter": "알려지지 않은 필터 {{filterId}}",
"known_tracker": "알려진 추적기",
"install_welcome_title": "AdGuard Home에 오신 것을 환영합니다!",
"install_welcome_desc": "AdGuard Home은 광범위한 네트워크 광고와 추적 DNS 서버를 차단 합니다. 그것의 목적은 당신이 당신의 전체 네트워크와 당신의 모든 기기를 제어하는 것이며, 그것은 클라이언트의 프로그램을 사용할 필요가 없습니다.",
"install_settings_title": "관리자 웹 인터페이스",
@ -257,7 +272,7 @@
"install_devices_router_list_1": "라우터의 환경 설정을 여세요. 환경 설정은 다음의 주소(http://192.168.0.1/ 혹은 http://192.168.1.1/)를 통해 브라우저로 접근 가능합니다. 비밀번호를 입력해야할 수 있습니다. 비밀번호를 잊었다면 대개 라우터 기기에 있는 버튼을 눌러 비밀번호를 초기화할 수 있습니다. 어떤 라우터들은 당신의 컴퓨터/핸드폰에 설치할 수 있는 특정 어플리케이션을 필요로합니다.",
"install_devices_router_list_2": "각각 1~3자리 숫자의 네 그룹으로 분할된 두 세트의 숫자를 허용하는 필드 옆에 있는 DNS 문자를 찾으세요.",
"install_devices_router_list_3": "AdGuard Home 서버 주소를 입력하세요",
"install_devices_router_list_4": "일부 라우터는 DNS서버의 커스텀 설정이 불가합니다. 간혹 AdGuard Home을 DHCP서버로 이용하여 문제를 해결하는 경우가 있지만 문제가 지속될 경우 사용하시는 라우터 모델의 매뉴얼을 참고하시어 DNS서버 커스텀 설정 방법을 직접 살펴보셔야 합니다.",
"install_devices_router_list_4": "일부 라우터는 DNS서버의 커스텀 설정이 불가합니다. 간혹 AdGuard Home을 DHCP서버로 이용하여 문제를 해결하는 경우가 있지만 문제가 지속될 경우 사용하시는 라우터 모델의 매뉴얼을 참고하시어 <0>DNS</0>서버 커스텀 설정 방법을 직접 살펴보셔야 합니다.",
"install_devices_windows_list_1": "시작 메뉴 또는 윈도우 검색을 통해 제어판을 여세요",
"install_devices_windows_list_2": "네트워크 및 인터넷 카테고리로 이동한 다음 네트워크 및 공유 센터로 이동하세요.",
"install_devices_windows_list_3": "화면 왼쪽에서 어댑터 설정 변경을 찾아 클릭하세요.",
@ -346,6 +361,7 @@
"form_enter_id": "식별자 입력",
"form_add_id": "식별자 추가",
"form_client_name": "클라이언트 이름 입력",
"name": "이름",
"client_global_settings": "글로벌 설정 사용",
"client_deleted": "클라이언트 \"{{key}}\"가 정상적으로 삭제되었습니다",
"client_added": "클라이언트 \"{{key}}\"가 정상적으로 추가되었습니다",
@ -445,6 +461,7 @@
"location": "위치",
"orgname": "단체 이름",
"netname": "네트워크 이름",
"network": "네트워크",
"descr": "설명",
"whois": "후이즈",
"filtering_rules_learn_more": "차단 리스트를 직접 호스트하는 법을 <0>알아보세요</0>.",
@ -489,5 +506,19 @@
"list_updated": "{{count}} 리스트 업데이트됨",
"list_updated_plural": "{{count}} 리스트 업데이트됨",
"dnssec_enable": "DNSSEC 활성화",
"dnssec_enable_desc": "발신 DNS 쿼리에서 DNSSEC 플래그를 설정하고 결과를 확인합니다 (DNSSEC-enabled resolver 필수)"
"dnssec_enable_desc": "발신 DNS 쿼리에서 DNSSEC 플래그를 설정하고 결과를 확인합니다 (DNSSEC-enabled resolver 필수)",
"validated_with_dnssec": "DNSSEC로 검증됨",
"show_all_responses": "모든 응답",
"show_blocked_responses": "차단됨",
"show_whitelisted_responses": "예외 적용됨",
"show_processed_responses": "처리됨",
"blocked_safebrowsing": "차단된 세이프 브라우징",
"blocked_adult_websites": "차단된 성인 웹사이트",
"blocked_threats": "차단된 위협",
"allowed": "허용됨",
"filtered": "필터링됨",
"rewritten": "재작성됨",
"safe_search": "세이프 서치",
"blocklist": "차단 목록",
"milliseconds_abbreviation": "ms"
}

View File

@ -3,6 +3,8 @@
"example_upstream_reserved": "Je kan DNS upstream <0>specifiëren voor specifieke domein(en)</0>",
"upstream_parallel": "Gebruik parallelle verzoeken om te versnellen door gelijktijdig verzoeken te sturen naar alle upstream servers",
"parallel_requests": "Parallelle verzoeken",
"load_balancing": "Volume balanceren",
"load_balancing_desc": "Eén server per keer bevragen. AdGuard Home gebruikt hiervoor een gewogen willekeurig algoritme om de server te kiezen zodat de snelste server meer zal gebruikt worden.",
"bootstrap_dns": "Bootstrap DNS servers",
"bootstrap_dns_desc": "Bootstrap DNS-servers worden gebruikt om IP-adressen op te lossen van de DoH / DoT-resolvers die u opgeeft als upstreams.",
"check_dhcp_servers": "Zoek achter DHCP servers",
@ -36,6 +38,7 @@
"dhcp_interface_select": "Selecteer DHCP interface",
"dhcp_hardware_address": "Hardware adres",
"dhcp_ip_addresses": "IP adressen",
"ip": "IP",
"dhcp_table_hostname": "Host naam",
"dhcp_table_expires": "Verloopt op",
"dhcp_warning": "Indien je de ingebouwde DHCP server wilt inschakelen, let dan op dat er geen andere actieve DHCP server aanwezig is. Dit kan de internet verbinding instabiel maken!.",
@ -48,17 +51,26 @@
"dhcp_static_leases_not_found": "Geen DHCP static lease gevonden",
"dhcp_add_static_lease": "Voeg statische lease toe",
"dhcp_reset": "Weet je zeker dat je de DHCP configuratie wil resetten?",
"country": "Land",
"city": "Stad",
"delete_confirm": "Ben je zeker dat je \"{{key}}\" wilt verwijderen?",
"form_enter_hostname": "Vul hostnaam in",
"error_details": "Fout details",
"response_details": "Antwoorddetails",
"request_details": "Verzoekdetails",
"client_details": "Client details",
"details": "Details",
"back": "Terug",
"dashboard": "Dashboard",
"settings": "Instellingen",
"filters": "Filters",
"filter": "Filter",
"query_log": "Query log",
"empty_log": "Logboek leeg",
"faq": "Veel gestelde vragen",
"version": "Versie",
"address": "IP-adres",
"address": "Adres",
"protocol": "Protocol",
"on": "Aan",
"off": "Uit",
"copyright": "Copyright",
@ -131,8 +143,10 @@
"rules_count_table_header": "Aantal regels",
"last_time_updated_table_header": "Laatste update",
"actions_table_header": "Actie",
"request_table_header": "Verzoek",
"edit_table_action": "Bewerk",
"delete_table_action": "Verwijderen",
"elapsed": "Verstreken",
"filters_and_hosts_hint": "AdGuard Home kan overweg met basic adblock regels en hosts bestanden syntaxis.",
"no_blocklist_added": "Geen blokkeerlijsten toegevoegd",
"no_whitelist_added": "Geen toestemmingslijsten toegevoegd",
@ -169,10 +183,12 @@
"updated_upstream_dns_toast": "De upstream DNS-servers zijn bijgewerkt",
"dns_test_ok_toast": "Opgegeven DNS-servers werken correct",
"dns_test_not_ok_toast": "Server \"{{key}}\": kon niet worden gebruikt, controleer of u het correct hebt geschreven",
"unblock_btn": "Deblokkeren",
"block_btn": "Blokkeren",
"unblock": "Deblokkeren",
"block": "Blokkeren",
"time_table_header": "Tijd",
"date": "Datum",
"domain_name_table_header": "Domein naam",
"domain_or_client": "Domein of cliënt",
"type_table_header": "Type",
"response_table_header": "Antwoord",
"client_table_header": "Gebruiker",
@ -202,13 +218,17 @@
"query_log_retention_confirm": "Weet u zeker dat u de bewaartermijn van het query logboek wilt wijzigen? Als u de intervalwaarde verlaagt, gaan sommige gegevens verloren",
"anonymize_client_ip": "Cliënt IP anonimiseren",
"anonymize_client_ip_desc": "Het volledige IP-adres van de cliënt niet opnemen in log- en statistiekbestanden",
"default": "Standaard",
"custom_ip": "Aangepast IP",
"dns_over_https": "DNS-via-HTTPS",
"dns_over_tls": "DNS-via-TLS",
"source_label": "Bron",
"found_in_known_domain_db": "Gevonden in de bekende domeingegevensbank.",
"category_label": "Categorie",
"rule_label": "Regel",
"list_label": "Lijst",
"unknown_filter": "Onbekend filter {{filterId}}",
"known_tracker": "Bekende volger",
"install_welcome_title": "Welkom bij AdGuard Home!",
"install_welcome_desc": "AdGuard Home is een netwerk DNS server die advertenties en trackers blokkeert. Het doel is om jou controle te geven over je gehele netwerk en al je apparaten, en er hoeft geen client-side programma te worden gebruikt.",
"install_settings_title": "Admin webinterface",
@ -237,7 +257,7 @@
"install_devices_router_list_1": "Open de instellingen pagina voor uw router. Meestal kunt u deze vanuit uw browser openen via een URL (zoals http://192.168.0.1/ of http://192.168.1.1/). Mogelijk wordt u gevraagd om het wachtwoord in te voeren. Als u het niet meer weet, kunt u het wachtwoord vaak opnieuw instellen door op een knop op de router zelf te drukken. Voor sommige routers is een specifieke toepassing vereist, die in dat geval al op uw computer / telefoon moet zijn geïnstalleerd.",
"install_devices_router_list_2": "Zoek de DHCP/DNS-instellingen. Zoek naar de DNS-letters naast een veld dat twee of drie reeksen nummers toestaat, elk verdeeld in vier groepen van één tot drie cijfers.",
"install_devices_router_list_3": "Voer je AdGuard Home server adressen daar in.",
"install_devices_router_list_4": "Je kan de DNS server niet aanpassen op sommige routers. In dat geval kan het een oplossing zijn om AdGuard Home te definiëren als een <a href='#dhcp'>DHCP server</a>. Je kan ook in de handleiding van je router kijken hoe je een DNS server aanpast.",
"install_devices_router_list_4": "Je kan de DNS server niet aanpassen op sommige routers. In dat geval kan het een oplossing zijn om AdGuard Home te definiëren als een <0>DHCP server</0>. Je kan ook in de handleiding van je router kijken hoe je een DNS server aanpast.",
"install_devices_windows_list_1": "Open het Configuratiescherm via het menu Start of Windows zoeken.",
"install_devices_windows_list_2": "Ga naar de categorie Netwerk en Internet en vervolgens naar Netwerkcentrum.",
"install_devices_windows_list_3": "Zoek aan de linkerkant van het scherm Adapter-instellingen wijzigen en klik erop.",
@ -326,6 +346,7 @@
"form_enter_id": "ID invoeren",
"form_add_id": "ID toevoegen",
"form_client_name": "Vul gebruikersnaam in",
"name": "Naam",
"client_global_settings": "Gebruik globale instelling",
"client_deleted": "Gebruiker \"{{key}}\" met succes verwijderd",
"client_added": "Gebruiker \"{{key}}\" met succes toegevoegd",
@ -425,6 +446,7 @@
"location": "Locatie",
"orgname": "Naam organisatie",
"netname": "Netwerk naam",
"network": "Netwerk",
"descr": "Beschrijving",
"whois": "Whois",
"filtering_rules_learn_more": "<0>Meer informatie</0> over het maken van je eigen host lijsten.",
@ -446,5 +468,18 @@
"check_service": "Servicenaam: {{service}}",
"list_updated": "{{count}} lijst geüpdatet",
"list_updated_plural": "{{count}} lijsten geüpdatet",
"dnssec_enable": "DNSSEC inschakelen"
}
"dnssec_enable": "DNSSEC inschakelen",
"validated_with_dnssec": "Gevalideerd met DNSSEC",
"show_all_responses": "Alle reacties",
"show_blocked_responses": "Geblokkeerd",
"show_whitelisted_responses": "Op toestemmingslijst",
"show_processed_responses": "Verwerkt",
"blocked_adult_websites": "Geblokkeerde 18+ websites",
"blocked_threats": "Geblokkeerde bedreigingen",
"allowed": "Toegestaan",
"filtered": "Gefilterd",
"rewritten": "Herschreven",
"safe_search": "Veilig zoeken",
"blocklist": "Blokkeerlijst",
"milliseconds_abbreviation": "ms"
}

View File

@ -51,14 +51,17 @@
"delete_confirm": "Er du sikker på at du vil slette «{{key}}»?",
"form_enter_hostname": "Skriv inn vertsnavnet",
"error_details": "Feildetaljer",
"request_details": "Detaljer over forespørsel",
"details": "Detaljer",
"back": "Tilbake",
"dashboard": "Kontrollsenter",
"settings": "Innstillinger",
"filters": "Filtre",
"filter": "Filter",
"query_log": "Forespørselslogg",
"faq": "OSS",
"version": "Versjon",
"address": "adresse",
"address": "Adresse",
"on": "PÅ",
"off": "AV",
"copyright": "Opphavsrett",
@ -167,9 +170,10 @@
"updated_upstream_dns_toast": "Oppdaterte oppstrøms-DNS-tjenerne",
"dns_test_ok_toast": "De spesifiserte DNS-tjenerne fungerer riktig",
"dns_test_not_ok_toast": "Tjeneren «{{key}}» kunne ikke brukes, vennligst dobbeltsjekk at du har skrevet den riktig",
"unblock_btn": "Tillat",
"block_btn": "Blokker",
"unblock": "Tillat",
"block": "Blokker",
"time_table_header": "Tidspunkt",
"date": "Dato",
"domain_name_table_header": "Domenenavn",
"type_table_header": "Type",
"response_table_header": "Respons",
@ -206,6 +210,7 @@
"custom_ip": "Tilpasset IP",
"blocking_ipv4": "IPv4-blokkering",
"blocking_ipv6": "IPv6-blokkering",
"dns_over_tls": "DNS-over-TLS",
"form_enter_rate_limit": "Skriv inn forespørselsfrekvensgrense",
"rate_limit": "Forespørselsfrekvensgrense",
"edns_enable": "Aktiver EDNS-klientundernett",
@ -340,6 +345,7 @@
"form_enter_id": "Skriv inn identifikator",
"form_add_id": "Legg til identifikator",
"form_client_name": "Skriv inn klientnavnet",
"name": "Navn",
"client_global_settings": "Bruk de overbestyrte innstillingene",
"client_deleted": "Klienten «{{key}}» ble vellykket slettet",
"client_added": "Klienten «{{key}}» ble vellykket lagt til",
@ -438,6 +444,7 @@
"location": "Posisjon",
"orgname": "Firmanavn",
"netname": "Nettverksnavn",
"network": "Network",
"descr": "Beskrivelse",
"whois": "Whois",
"filtering_rules_learn_more": "<0>Lær mer</0> om å lage dine egne filterlister for AdGuard Home.",
@ -478,5 +485,11 @@
"install_static_configure": "Vi har oppdaget at det brukes en dynamisk IP-adresse — <0>{{ip}}</0>. Vil du bruke det som din statiske adresse?",
"confirm_static_ip": "AdGuard Home vil sette opp {{ip}} til å bli din statiske IP-adresse. Vil du fortsette?",
"list_updated": "{{count}} liste oppdatert",
"list_updated_plural": "{{count}} lister oppdatert"
"list_updated_plural": "{{count}} lister oppdatert",
"show_blocked_responses": "Blokkért",
"show_processed_responses": "Bearbeidet",
"blocked_adult_websites": "Blokkerte voksennettsteder",
"blocked_threats": "Blokkerte trusler",
"allowed": "Unntak",
"blocklist": "Blokkeringsliste"
}

View File

@ -37,6 +37,7 @@
"dhcp_interface_select": "Wybierz interfejs DHCP",
"dhcp_hardware_address": "Adres sprzętowy",
"dhcp_ip_addresses": "Adresy IP",
"ip": "Adres IP",
"dhcp_table_hostname": "Nazwa hosta",
"dhcp_table_expires": "Wygasa",
"dhcp_warning": "Aby włączyć wbudowany serwer DHCP, upewnij się, że nie ma innego aktywnego serwera DHCP. W przeciwnym razie może przerwać połączenie internetowe dla podłączonych urządzeń!",
@ -49,17 +50,23 @@
"dhcp_static_leases_not_found": "Nie znaleziono statycznych dzierżaw DHCP",
"dhcp_add_static_lease": "Dodaj dzierżawę statyczną",
"dhcp_reset": "Czy na pewno chcesz zresetować konfigurację DHCP?",
"country": "Kraj",
"city": "Miasto",
"delete_confirm": "Czy na pewno chcesz usunąć \"{{key}}\"?",
"form_enter_hostname": "Wpisz nazwę hosta",
"error_details": "Szczegóły błędu",
"client_details": "Szczegóły klienta",
"details": "Szczegóły",
"back": "Wróć",
"dashboard": "Panel kontrolny",
"settings": "Ustawienia",
"filters": "Filtry",
"filter": "Filtr",
"query_log": "Dziennik zapytań",
"empty_log": "Dziennik zapytań jest pusty",
"faq": "FAQ",
"version": "wersja",
"address": "adres",
"address": "Adres",
"on": "WŁĄCZONY",
"off": "WYŁĄCZONY",
"copyright": "Prawo autorskie",
@ -132,8 +139,10 @@
"rules_count_table_header": "Liczba reguł",
"last_time_updated_table_header": "Ostatnia aktualizacja",
"actions_table_header": "Akcje",
"request_table_header": "Żądanie",
"edit_table_action": "Edytuj",
"delete_table_action": "Usuń",
"elapsed": "Upłynęło",
"filters_and_hosts_hint": "AdGuard Home rozumie podstawowe reguły adblocka i składnię plików hostów.",
"no_blocklist_added": "Nie dodano listy zablokowanych",
"no_whitelist_added": "Nie dodano listy dozwolonych",
@ -170,10 +179,12 @@
"updated_upstream_dns_toast": "Główne serwery DNS zostały zaktualizowane",
"dns_test_ok_toast": "Określone serwery DNS działają poprawnie",
"dns_test_not_ok_toast": "Serwer \"{{key}}\": nie można go użyć, sprawdź, czy napisałeś go poprawnie",
"unblock_btn": "Odblokuj",
"block_btn": "Zablokuj",
"unblock": "Odblokuj",
"block": "Zablokuj",
"time_table_header": "Czas",
"date": "Data",
"domain_name_table_header": "Nazwa domeny",
"domain_or_client": "Domena lub klient",
"type_table_header": "Typ",
"response_table_header": "Odpowiedź ",
"client_table_header": "Klient",
@ -211,6 +222,8 @@
"custom_ip": "Niestandardowy adres IP",
"blocking_ipv4": "Blokowanie IPv4",
"blocking_ipv6": "Blokowanie IPv6",
"dns_over_https": "DNS-over-HTTPS",
"dns_over_tls": "DNS-over-TLS",
"form_enter_rate_limit": "Wpisz limit ilościowy",
"rate_limit": "Limit ilościowy",
"edns_enable": "Włącz podsieć klienta EDNS",
@ -229,6 +242,7 @@
"rule_label": "Reguła",
"list_label": "Lista",
"unknown_filter": "Nieznany filtr {{filterId}}",
"known_tracker": "Znany element śledzący",
"install_welcome_title": "Witaj w AdGuard Home!",
"install_welcome_desc": "AdGuard Home to w pełni funkcjonalny serwer DNS do blokowania reklam i śledzenia. Jego celem jest kontrolowanie całej sieci i wszystkich urządzeń, bez konieczności korzystania z jakiegokolwiek programu po stronie klienta.",
"install_settings_title": "Interfejs internetowy administratora",
@ -257,7 +271,7 @@
"install_devices_router_list_1": "Otwórz ustawienia routera. Zazwyczaj możesz uzyskać do niego dostęp przez przeglądarkę za pośrednictwem adresu URL (na przykład http://192.168.0.1/ lub http://192.168.1.1/). Możesz zostać poproszony o wpisanie hasła. Jeśli nie pamiętasz hasła, możesz je odzyskać, naciskając przycisk na samym routerze. Niektóre routery wymagają określonej aplikacji, która powinna być już zainstalowana na komputerze lub telefonie.",
"install_devices_router_list_2": "Znajdź ustawienia DHCP/DNS. Poszukaj skrótu DNS obok pola, które pozwala wstawić dwa lub trzy zestawy liczb, z których każdy jest podzielony na cztery grupy z jedną do trzech cyfr.",
"install_devices_router_list_3": "Wpisz adresy swojego serwera AdGuard Home.",
"install_devices_router_list_4": "Nie możesz ustawić niestandardowego serwera DNS na niektórych routerach. W takim przypadku może pomóc Ci skonfigurowanie AdGuard Home jako <a href='#dhcp'>serwera DHCP</a>. W przeciwnym razie musisz poszukać instrukcji ustawienia serwerów DNS dla konkretnego modelu routera.",
"install_devices_router_list_4": "Nie możesz ustawić niestandardowego serwera DNS na niektórych routerach. W takim przypadku może pomóc Ci skonfigurowanie AdGuard Home jako <0>serwera DHCP</0>. W przeciwnym razie musisz poszukać instrukcji ustawienia serwerów DNS dla konkretnego modelu routera.",
"install_devices_windows_list_1": "Otwórz panel Ustawienia w menu Start lub w Windows.",
"install_devices_windows_list_2": "Przejdź do kategorii Sieć i Internet, a następnie do Centrum sieci i udostępniania.",
"install_devices_windows_list_3": "Po lewej stronie ekranu znajdź Zmień ustawienia adaptera i kliknij na niego.",
@ -346,6 +360,7 @@
"form_enter_id": "Wpisz identyfikator",
"form_add_id": "Dodaj identyfikator",
"form_client_name": "Wpisz nazwę klienta",
"name": "Nazwa",
"client_global_settings": "Użyj ustawień globalnych",
"client_deleted": "Klient \"{{key}}\" został pomyślnie usunięty",
"client_added": "Klient \"{{key}}\" został pomyślnie dodany",
@ -445,6 +460,7 @@
"location": "Lokalizacja",
"orgname": "Nazwa firmy",
"netname": "Nazwa sieci",
"network": "Sieć",
"descr": "Opis",
"whois": "Whois",
"filtering_rules_learn_more": "<0>Dowiedz się więcej</0> o tworzeniu własnych list blokowania hostów.",
@ -489,5 +505,19 @@
"list_updated": "{{count}} lista zaktualizowana",
"list_updated_plural": "{{count}} list zaktualizowanych",
"dnssec_enable": "Włącz DNSSEC",
"dnssec_enable_desc": "Ustaw flagę DNSSEC w wychodzących zapytaniach DNS i sprawdź wynik (wymagany jest resolver z obsługą zabezpieczania DNSSEC)"
}
"dnssec_enable_desc": "Ustaw flagę DNSSEC w wychodzących zapytaniach DNS i sprawdź wynik (wymagany jest usługodawca z obsługą zabezpieczania DNSSEC)",
"validated_with_dnssec": "Zweryfikowany przez DNSSEC",
"show_all_responses": "Wszystkie odpowiedzi",
"show_blocked_responses": "Zablokowane",
"show_whitelisted_responses": "Biała lista",
"show_processed_responses": "Przetworzono",
"blocked_safebrowsing": "Zablokowane przez bezpieczne przeglądanie",
"blocked_adult_websites": "Zablokowane witryny dla dorosłych",
"blocked_threats": "Zablokowane zagrożenia",
"allowed": "Dozwolone",
"filtered": "Filtrowane",
"rewritten": "Przepisane",
"safe_search": "Bezpieczne wyszukiwanie",
"blocklist": "Lista zablokowanych",
"milliseconds_abbreviation": "ms"
}

View File

@ -37,6 +37,7 @@
"dhcp_interface_select": "Selecione a interface DHCP",
"dhcp_hardware_address": "Endereço de hardware",
"dhcp_ip_addresses": "Endereço de IP",
"ip": "IP",
"dhcp_table_hostname": "Nome do servidor",
"dhcp_table_expires": "Expira",
"dhcp_warning": "Se você quiser ativar o servidor DHCP, verifique se não há outro servidor DHCP ativo na sua rede. Caso contrário, a internet pode parar de funcionar para outros dispositivos conectados!",
@ -49,17 +50,22 @@
"dhcp_static_leases_not_found": "Nenhuma concessão DHCP estática foi encontrada",
"dhcp_add_static_lease": "Adicionar nova concessão estática",
"dhcp_reset": "Você tem certeza de que deseja redefinir a configuração DHCP?",
"country": "País",
"delete_confirm": "Você tem certeza de que deseja excluir \"{{key}}\"?",
"form_enter_hostname": "Digite o hostname",
"error_details": "Detalhes do erro",
"client_details": "Detalhes do cliente",
"details": "Detalhes",
"back": "Voltar",
"dashboard": "Painel",
"settings": "Configurações",
"filters": "Filtros",
"filter": "Filtro",
"query_log": "Registro de consultas",
"empty_log": "O registro de consulta está vazio",
"faq": "FAQ",
"version": "Versão",
"address": "endereço",
"address": "Endereço",
"on": "Ligado",
"off": "Desligado",
"copyright": "Copyright",
@ -132,8 +138,10 @@
"rules_count_table_header": "Quantidade de regras",
"last_time_updated_table_header": "Última atualização",
"actions_table_header": "Ações",
"request_table_header": "Solicitação",
"edit_table_action": "Editar",
"delete_table_action": "Excluir",
"elapsed": "Tempo decorrido",
"filters_and_hosts_hint": "O AdGuard Home entende regras básicas de bloqueio de anúncios e a sintaxe de arquivos de hosts.",
"no_blocklist_added": "Nenhuma lista negra foi adicionada",
"no_whitelist_added": "Nenhuma lista branca foi adicionada",
@ -170,10 +178,12 @@
"updated_upstream_dns_toast": "Atualizado os servidores DNS upstream",
"dns_test_ok_toast": "Os servidores DNS especificados estão funcionando corretamente",
"dns_test_not_ok_toast": "O servidor \"{{key}}\": não pôde ser utilizado. Por favor, verifique se você escreveu corretamente",
"unblock_btn": "Desbloquear",
"block_btn": "Bloquear",
"unblock": "Desbloquear",
"block": "Bloquear",
"time_table_header": "Data",
"date": "Data",
"domain_name_table_header": "Nome de domínio",
"domain_or_client": "Domínio ou cliente",
"type_table_header": "Tipo",
"response_table_header": "Resposta",
"client_table_header": "Cliente",
@ -211,6 +221,8 @@
"custom_ip": "IP personalizado",
"blocking_ipv4": "Bloqueando IPv4",
"blocking_ipv6": "Bloqueando IPv6",
"dns_over_https": "DNS-sobre-HTTPS",
"dns_over_tls": "DNS-sobre-TLS",
"form_enter_rate_limit": "Insira a taxa limite",
"rate_limit": "Taxa limite",
"edns_enable": "Ativar a sub-rede do cliente EDNS",
@ -229,6 +241,7 @@
"rule_label": "Regra",
"list_label": "Lista",
"unknown_filter": "Filtro desconhecido {{filterId}}",
"known_tracker": "Rastreador conhecido",
"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_settings_title": "Interface web de administrador",
@ -257,7 +270,7 @@
"install_devices_router_list_1": "Abra as configurações do seu roteador\nNo navegador digite o IP do roteador, o padrão é (http://192.168.0.1/ ou http://192.168.1.1/), e o login e senha é admin/admin; Se você não se lembra da senha, você pode redefinir a senha rapidamente pressionando um botão no próprio roteador. Alguns roteadores têm um aplicativo específico que já deve estar instalado em seu computador/telefone.",
"install_devices_router_list_2": "Encontre as Configurações de DNS. Procure as letras DNS ao lado de um campo que permite dois ou três conjuntos de números, cada um dividido em quatro grupos de um a três números.",
"install_devices_router_list_3": "Digite aqui seu servidor do AdGuard Home.",
"install_devices_router_list_4": "Você não pode definir um servidor DNS personalizado em alguns tipos de roteadores. Nesse caso, pode ajudar se você configurar o AdGuard Home como um servidor DHCP. Caso contrário, você deve procurar o manual sobre como personalizar os servidores DNS para o seu modelo de roteador específico.",
"install_devices_router_list_4": "Você não pode definir um servidor DNS personalizado em alguns tipos de roteadores. Nesse caso, pode ajudar se você configurar o AdGuard Home como um <0>servidor DHCP</0>. Caso contrário, você deve procurar o manual sobre como personalizar os servidores DNS para o seu modelo de roteador específico.",
"install_devices_windows_list_1": "Abra o Painel de Controle pelo Menu Iniciar ou pela Pesquisa do Windows.",
"install_devices_windows_list_2": "Entre na categoria Rede e Internet e depois clique em Central de Rede e Compartilhamento.",
"install_devices_windows_list_3": "No lado esquerdo da janela clique em Alterar as configurações do adaptador.",
@ -346,6 +359,7 @@
"form_enter_id": "Inserir identificador",
"form_add_id": "Adicionar identificador",
"form_client_name": "Digite o nome do cliente",
"name": "Nome",
"client_global_settings": "Usar configurações global",
"client_deleted": "Cliente \"{{key}}\" excluído com sucesso",
"client_added": "Cliente \"{{key}}\" adicionado com sucesso",
@ -445,6 +459,7 @@
"location": "Localização",
"orgname": "Nome da organização",
"netname": "Nome da rede",
"network": "Rede",
"descr": "Descrição",
"whois": "Whois",
"filtering_rules_learn_more": "<0>Saiba mais</0> sobre como criar as suas próprias listas negras de servidores.",
@ -456,7 +471,7 @@
"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.",
"fastest_addr": "Endereço de IP mais rápido",
"fastest_addr_desc": "Consulte todos os servidores de DNS e retorne o endereço de IP mais rápido entre todas as respostas",
"fastest_addr_desc": "Consulta todos os servidores DNS e retorna o endereço IP mais rápido entre todas as respostas. Isso irá retardar as consultas ao DNS, pois temos que esperar por respostas de todos os servidores DNS, porém melhorando a conectividade em geral.",
"autofix_warning_text": "Se clicar em \"Corrigir\", o AdGuardHome irá configurar o seu sistema para utilizar o servidor DNS do AdGuardHome.",
"autofix_warning_list": "Ele irá realizar estas tarefas: <0>Desativar sistema DNSStubListener</0> <0>Definir endereço do servidor DNS para 127.0.0.1</0> <0>Substituir o alvo simbólico do link /etc/resolv.conf para /run/systemd/resolv.conf</0> <0>Parar DNSStubListener (recarregar serviço resolvido pelo sistema)</0>",
"autofix_warning_result": "Como resultado, todos as solicitações DNS do seu sistema serão processadas pelo AdGuardHome por padrão.",
@ -489,5 +504,19 @@
"list_updated": "{{count}} lista atualizada",
"list_updated_plural": "{{count}} listas atualizadas",
"dnssec_enable": "Ativar DNSSEC",
"dnssec_enable_desc": "Definir a flag DNSSEC nas consultas de DNS em andamento e verificar o resultado (é necessário um resolvedor DNSSEC ativado)"
"dnssec_enable_desc": "Definir a flag DNSSEC nas consultas de DNS em andamento e verificar o resultado (é necessário um resolvedor DNSSEC ativado)",
"validated_with_dnssec": "Validado com DNSSEC",
"show_all_responses": "Todas as respostas",
"show_blocked_responses": "Bloqueado",
"show_whitelisted_responses": "Na lista branca",
"show_processed_responses": "Processado",
"blocked_safebrowsing": "Bloqueado pela navegação segura",
"blocked_adult_websites": "Sites adultos bloqueados",
"blocked_threats": "Ameaças bloqueadas",
"allowed": "Permitido",
"filtered": "Filtrado",
"rewritten": "Reescrito",
"safe_search": "Pesquisa segura",
"blocklist": "Lista negra",
"milliseconds_abbreviation": "ms"
}

View File

@ -58,7 +58,7 @@
"query_log": "Registo de consultas",
"faq": "Perguntas frequentes",
"version": "Versão",
"address": "endereço",
"address": "Endereço",
"on": "LIGADO",
"off": "DESLIGADO",
"copyright": "Copyright",
@ -149,9 +149,10 @@
"updated_upstream_dns_toast": "A actualizar os servidores DNS upstream",
"dns_test_ok_toast": "Os servidores DNS especificados estão a funcionar correctamente",
"dns_test_not_ok_toast": "O servidor \"{{key}}\": não pôde ser utilizado. Por favor, verifique se o escreveu correctamente",
"unblock_btn": "Desbloquear",
"block_btn": "Bloquear",
"unblock": "Desbloquear",
"block": "Bloquear",
"time_table_header": "Data",
"date": "Data",
"domain_name_table_header": "Nome do domínio",
"type_table_header": "Tipo",
"response_table_header": "Resposta",
@ -316,6 +317,7 @@
"form_enter_id": "Inserir identificador",
"form_add_id": "Adicionar identificador",
"form_client_name": "Insira o nome do cliente",
"name": "Nome",
"client_global_settings": "Usar configurações globais",
"client_deleted": "Cliente \"{{key}}\" excluído com sucesso",
"client_added": "Cliente \"{{key}}\" adicionado com sucesso",
@ -412,6 +414,7 @@
"location": "Localização",
"orgname": "Nome da organização",
"netname": "Nome da rede",
"network": "Network",
"descr": "Descrição",
"whois": "Whois",
"filtering_rules_learn_more": "<0>Saiba mais</0>sobre como criar as suas próprias listas negras de servidores.",
@ -419,5 +422,9 @@
"try_again": "Tente novamente",
"domain_desc": "Insere o nome do domínio para ser reescrito.",
"example_rewrite_domain": "reescrever resposta apenas para este domínio.",
"example_rewrite_wildcard": "reescrever resposta para todos <0>example.org</0> sub-domínios."
"example_rewrite_wildcard": "reescrever resposta para todos <0>example.org</0> sub-domínios.",
"form_enter_host": "Insira o hostname",
"show_blocked_responses": "Bloqueado",
"show_whitelisted_responses": "Lista Branca",
"show_processed_responses": "Processado"
}

View File

@ -1,8 +1,10 @@
{
"client_settings": "Setări client",
"example_upstream_reserved": "Puteți preciza un DNS upstream <0>de domeni/u(ii) specific(e)</0>",
"example_upstream_reserved": "Puteți preciza un DNS upstream <0>de domeniu(ii) specific(e)</0>",
"upstream_parallel": "Folosiți interogări paralele pentru rezolvări rapide interogând simultan toate serverele în amonte",
"parallel_requests": "Solicitări paralele",
"load_balancing": "Echilibrare-sarcini",
"load_balancing_desc": "Fiecare server este interogat aparte. AdGuard Home alege serverul folosind algoritmul ponderat aleatoriu, astfel încât cel mai rapid server să fie utilizat mai des.",
"bootstrap_dns": "Serverele DNS Bootstrap",
"bootstrap_dns_desc": "Serverele DNS Bootstrap sunt folosite pentru a rezolva adresele IP ale resolverelor DoH/DoT indicate ca upstreams.",
"check_dhcp_servers": "Căutați servere DHCP",
@ -20,11 +22,11 @@
"dhcp_leases_not_found": "Nu s-au găsit DHCP închiriate",
"dhcp_config_saved": "Configurare DHCP salvată cu succes",
"form_error_required": "Câmp necesar",
"form_error_ip4_format": "Format IPv4 nevalid",
"form_error_ip6_format": "Format IPv6 nevalid",
"form_error_ip_format": "Format IP nevalid",
"form_error_mac_format": "Format MAC nevalid",
"form_error_client_id_format": "Format ID de client nevalid",
"form_error_ip4_format": "Format IPv4 invalid",
"form_error_ip6_format": "Format IPv6 invalid",
"form_error_ip_format": "Format IP invalid",
"form_error_mac_format": "Format MAC invalid",
"form_error_client_id_format": "Format ID de client invalid",
"form_error_positive": "Trebuie să fie mai mare de 0",
"form_error_negative": "Trebuie să fie egală cu 0 sau mai mare",
"dhcp_form_gateway_input": "IP Gateway",
@ -37,6 +39,7 @@
"dhcp_interface_select": "Selectați interfața DHCP",
"dhcp_hardware_address": "Adresa mașinii",
"dhcp_ip_addresses": "Adrese IP",
"ip": "IP",
"dhcp_table_hostname": "Hostname",
"dhcp_table_expires": "Expiră",
"dhcp_warning": "Dacă doriți oricum să activați serverul DHCP, verificați că nu există un alt server DHCP activ în rețeaua dvs. Altfel, poate întrerupe Internetul pe toate aparatele conectate!",
@ -49,17 +52,22 @@
"dhcp_static_leases_not_found": "Nu s-au găsit închirieri statice DHCP",
"dhcp_add_static_lease": "Adăugați închiriere statică",
"dhcp_reset": "Sunteți sigur că doriți să resetați configurația DHCP?",
"country": "Țara",
"delete_confirm": "Sunteți sigur că doriți să ștergeți \"{{key}}\"?",
"form_enter_hostname": "Intrați hostname",
"error_details": "Detalii eroare",
"client_details": "Detalii client",
"details": "Detalii",
"back": "Înapoi",
"dashboard": "Tablou de bord",
"settings": "Setări",
"filters": "Filtre",
"filter": "Filtru",
"query_log": "Jurnal interogări",
"empty_log": "Jurnal de interogări gol",
"faq": "FAQ",
"version": "Versiune",
"address": "adresă",
"address": "Adresă",
"on": "ON",
"off": "OFF",
"copyright": "Copyright",
@ -77,7 +85,7 @@
"stats_adult": "Site-uri cu conținut adult blocate",
"stats_query_domain": "Domeniile cele mai căutate",
"for_last_24_hours": "în ultimele 24 ore",
"for_last_days": "în ultimele {{count}} zile",
"for_last_days": "în ultima {{count}} zi",
"for_last_days_plural": "pentru ultimele {{count}} zile",
"no_domains_found": "Nu s-au găsit domenii",
"requests_count": "Cont interogări",
@ -99,8 +107,8 @@
"filters_block_toggle_hint": "Puteți configura regulile de blocare în setările <a href='#filters'> Filtre </a>.",
"use_adguard_browsing_sec": "Utilizați serviciul Navigarea în Securitate AdGuard",
"use_adguard_browsing_sec_hint": "AdGuard Home va verifica dacă domeniul este în lista negră a serviciul web de securitate de navigare. Pentru acesta va utiliza un lookup API discret: un prefix scurt al numelui de domeniu SHA256 hash este trimis serverului.",
"use_adguard_parental": "Utilizați controlul parental AdGuard",
"use_adguard_parental_hint": "AdGuard Home va verifica dacă este conținut adult pe domeniu. Utilizează aceeași API discret ca cel utilizat de serviciul de securitate de navigare.",
"use_adguard_parental": "Utilizați Controlul Parental AdGuard",
"use_adguard_parental_hint": "AdGuard Home va verifica pentru conținut adult pe domeniu. Utilizează același API discret ca cel utilizat de serviciul de securitate de navigare.",
"enforce_safe_search": "Căutare protejată întărită",
"enforce_save_search_hint": "AdGuard Home poate impune căutarea protejată în următoarele motoare de căutare: Google, Youtube, Bing, DuckDuckGo, Yandex, Pixabay.",
"no_servers_specified": "Nu sunt specificate servere",
@ -120,8 +128,8 @@
"apply_btn": "Aplică",
"disabled_filtering_toast": "Filtrare dezactivată",
"enabled_filtering_toast": "Filtrare activată",
"disabled_safe_browsing_toast": "Navigare protejată dezactivată",
"enabled_safe_browsing_toast": "Navigare protejată activată",
"disabled_safe_browsing_toast": "Navigare securitară dezactivată",
"enabled_safe_browsing_toast": "Navigare securitară activată",
"disabled_parental_toast": "Control parental dezactivat",
"enabled_parental_toast": "Control parental activat",
"disabled_safe_search_toast": "Căutare protejată dezactivată",
@ -132,8 +140,10 @@
"rules_count_table_header": "Număr de reguli",
"last_time_updated_table_header": "Ultima aducere la zi",
"actions_table_header": "Acțiuni",
"request_table_header": "Solicitare",
"edit_table_action": "Editare",
"delete_table_action": "Sterge",
"delete_table_action": "Șterge",
"elapsed": "Scurs",
"filters_and_hosts_hint": "AdGuard Home înțelege regulile de bază de blocare cât și sintaxa fișierelor hosts.",
"no_blocklist_added": "Listă blocări goală",
"no_whitelist_added": "Listă autorizări goală",
@ -156,24 +166,26 @@
"examples_title": "Exemple",
"example_meaning_filter_block": "blochează accesul la domeniul exemplu.org și la toate subdomeniile sale",
"example_meaning_filter_whitelist": "deblochează accesul la domeniul exemplu.org și la toate subdomeniile sale",
"example_meaning_host_block": "AdGuard Home va returna acum adresa 127.0.0.1 pentru domeniul example.org (dar nu și subdomeniile sale).",
"example_meaning_host_block": "AdGuard Home va returna acum adresa 127.0.0.1 pentru domeniul exemplu.org (dar nu și subdomeniile sale).",
"example_comment": "! Iată cum se adăugă o descriere",
"example_comment_meaning": "comentariu",
"example_comment_hash": "# Astfel putem lăsa comentarii",
"example_regex_meaning": "blocare acces la domenii care corespund expresiei obișnuite specificate",
"example_upstream_regular": "DNS clasic (peste UDP)",
"example_upstream_regular": "DNS clasic (over UDP)",
"example_upstream_dot": "<0>DNS-over-TLS</0> criptat",
"example_upstream_doh": "<0>DNS-over-HTTPS</0> criptat",
"example_upstream_sdns": "puteți utiliza <0>DNS Stamps</0> pentru rezolvere <1>DNSCrypt</1> sau <2>DNS-over-HTTPS</2>",
"example_upstream_tcp": "DNS clasic (peste TCP)",
"example_upstream_tcp": "DNS clasic (over TCP)",
"all_lists_up_to_date_toast": "Toate listele sunt deja la zi",
"updated_upstream_dns_toast": "Serverele DNS upstream aduse la zi",
"dns_test_ok_toast": "Serverele DNS specificate funcționează corect",
"dns_test_not_ok_toast": "Serverul \"{{key}}\": nu a putut fi utilizat, verificați dacă l-ați scris corect",
"unblock_btn": "Deblocați",
"block_btn": "Blocați",
"unblock": "Deblocați",
"block": "Blocați",
"time_table_header": "Ora",
"date": "Data",
"domain_name_table_header": "Nume domeniu",
"domain_or_client": "Domeniu sau client",
"type_table_header": "Tip",
"response_table_header": "Răspuns",
"client_table_header": "Client",
@ -189,7 +201,7 @@
"rows_table_footer_text": "linii",
"updated_custom_filtering_toast": "Reguli personalizate de filtrare aduse la zi",
"rule_removed_from_custom_filtering_toast": "Regulă scoasă din regullei personalizate de filtrare",
"rule_added_to_custom_filtering_toast": "Regula adăugată la regulile de filtrare personalizate",
"rule_added_to_custom_filtering_toast": "Regulă adăugată la regulile de filtrare personalizate",
"query_log_response_status": "Statut: {{value}}",
"query_log_filtered": "Filtrat de {{filter}}",
"query_log_confirm_clear": "Sunteți sigur că doriți să ștergeți întregul jurnal de interogări?",
@ -211,14 +223,16 @@
"custom_ip": "IP personalizat",
"blocking_ipv4": "Blocarea IPv4",
"blocking_ipv6": "Blocarea IPv6",
"dns_over_https": "DNS-over-HTTPS",
"dns_over_tls": "DNS-over-TLS",
"form_enter_rate_limit": "Intrați limita ratei",
"rate_limit": "Limita ratei",
"edns_enable": "Activați clientul subnet EDNS",
"edns_cs_desc": "Dacă este activat, AdGuard Home va trimite subnet-ele clienților către serverele DNS.",
"edns_cs_desc": "Dacă este activat, AdGuard Home va trimite subnet-ul clienților către serverele DNS.",
"rate_limit_desc": "Numărul de solicitări pe secundă pe care un singur client este permis să le facă (0: nelimitat)",
"blocking_ipv4_desc": "Adresa IP de returnat pentru o cerere A de blocare",
"blocking_ipv6_desc": "Adresa IP de returnat pentru o cerere AAAA de blocare",
"blocking_mode_default": "Implicit: Răspunde cu NXDOMAIN cînd sunt blocate de regula Adblock-style; răspunde cu adresa IP specificată în regulă când sunt blocate de regula /etc/hosts-style",
"blocking_mode_default": "Implicit: Răspunde cu NXDOMAIN când sunt blocate de regulă tip Adblock; răspunde cu adresa IP specificată în regulă când sunt blocate de regula tip /etc/hosts",
"blocking_mode_nxdomain": "NXDOMAIN: Răspunde cu codul NXDOMAIN",
"blocking_mode_null_ip": "IP nul: răspunde cu o adresă IP zero (0.0.0.0 pentru A; :: pentru AAAA)",
"blocking_mode_custom_ip": "IP personalizat: răspunde cu o adresă IP setată manual",
@ -229,8 +243,9 @@
"rule_label": "Regulă",
"list_label": "Listă",
"unknown_filter": "Filtru necunoscut {{filterId}}",
"known_tracker": "Tracker cunoscut",
"install_welcome_title": "Bun venit la AdGuard Home!",
"install_welcome_desc": "AdGuard Home este un server DNS care blochează anunțuri și trackere la nivel de rețea. Scopul său este de a vă da controlul pe întreaga rețea și toate aparatele dvs. și fără un program din partea clientului.",
"install_welcome_desc": "AdGuard Home este un server DNS care blochează reclame și trackere la nivel de rețea. Scopul său este de a vă da controlul pe întreaga rețea și toate aparatele dvs. și fără un program din partea clientului.",
"install_settings_title": "Interfață administrator web",
"install_settings_listen": "Interfață de ascultare",
"install_settings_port": "Port",
@ -254,29 +269,29 @@
"install_devices_router": "Router",
"install_devices_router_desc": "Această configurație va acoperi automat toate aparatele conectate la routerul de acasă și nu va trebui să le configurați manual pe fiecare.",
"install_devices_address": "Serverul DNS AdGuard Home ascultă pe următoarele adrese",
"install_devices_router_list_1": "Deschideți preferințele pentru routerul dvs. De obicei, îl puteți accesa din browserul dvs. printr-o adresă URL (cum ar fi http://192.168.0.1/ sau http://192.168.1.1/). Vi se poate cere să introduceți parola. Dacă nu v-o amintiți, puteți reseta adesea parola apăsând un buton de pe routerul propriu-zis. Unele routere necesită o aplicație specifică, care în acest caz ar trebui să fie deja instalată pe computerul/telefonul dvs.",
"install_devices_router_list_1": "Deschideți preferințele pentru routerul dvs. De obicei, îl puteți accesa din browserul dvs. printr-o adresă URL (cum ar fi http://192.168.0.1/ sau http://192.168.1.1/). Vi se poate cere să intrați parola. Dacă nu v-o amintiți, puteți reseta adesea parola apăsând un buton de pe routerul propriu-zis. Unele routere necesită o aplicație specifică, care în acest caz ar trebui să fie deja instalată pe computerul/telefonul dvs.",
"install_devices_router_list_2": "Găsiți setările DHCP/DNS. Căutați literele DNS lângă un câmp care să permită două sau trei seturi de numere, fiecare împărțit în patru grupuri de una până la trei cifre.",
"install_devices_router_list_3": "Intrați adresele serverului dvs. AdGuard Home aici.",
"install_devices_router_list_4": "Unele routere nu permit setarea unui server DNS personalizat. În acest caz, vă poate ajuta dacă configurați AdGuard Home ca server DHCP. Dacă nu, trebuie căutat manualul modelului dvs. de router ca să aflați cum se pot personaliza serverele DNS.",
"install_devices_router_list_4": "Unele routere nu permit setarea unui server DNS personalizat. În acest caz, vă poate ajuta dacă configurați AdGuard Home ca <0>server DHCP</0>. Dacă nu, trebuie căutat manualul modelului dvs. de router ca să aflați cum se pot personaliza serverele DNS.",
"install_devices_windows_list_1": "Deschideți panoul de control prin meniul Start sau căutare Windows.",
"install_devices_windows_list_2": "Accesați categoria \"Rețea și Internet\", apoi la \"Centrul de Rețea și Partajare\".",
"install_devices_windows_list_3": "În partea stângă a ecranului găsiți \"Schimbare setări adaptor\" și faceți clic pe el.",
"install_devices_windows_list_3": "În partea stângă a ecranului găsiți \"Schimbare setări adaptor\" și clicați pe el.",
"install_devices_windows_list_4": "Selectați conexiunea activă, faceți clic dreapta pe ea și alegeți \"Proprietăți\".",
"install_devices_windows_list_5": "Găsiți Internet Protocol Versiunea 4 (TCP/IP) din listă, selectați-l și apoi faceți din nou clic pe Proprietăți.",
"install_devices_windows_list_6": "Alegeți Utilizați următoarele adrese de server DNS și introduceți adresele de server AdGuard Home.",
"install_devices_macos_list_1": "Faceți clic pe pictograma Apple și accesați Preferințele Sistemului.",
"install_devices_macos_list_2": "Faceți clic pe Network.",
"install_devices_macos_list_3": "Selectați prima conexiune din listă și faceți clic pe Avansat.",
"install_devices_macos_list_4": "Selectați fila DNS și introduceți adresele serverului dvs. AdGuard Home.",
"install_devices_windows_list_5": "Găsiți Internet Protocol Versiunea 4 (TCP/IP) din listă, selectați-l și apoi clicați din nou pe Proprietăți.",
"install_devices_windows_list_6": "Alegeți Utilizați următoarele adrese de server DNS și intrați adresele de server AdGuard Home.",
"install_devices_macos_list_1": "Clicați pe icoana Apple și accesați Preferințele Sistemului.",
"install_devices_macos_list_2": "Clicați pe Network.",
"install_devices_macos_list_3": "Selectați prima conexiune din listă și clicați pe Avansat.",
"install_devices_macos_list_4": "Selectați fila DNS și intrați adresele serverului dvs. AdGuard Home.",
"install_devices_android_list_1": "Din ecranul principal al Meniului Android, tapați Setări.",
"install_devices_android_list_2": "Tapați Wi-Fi din meniu. Ecranul cu toate rețelele disponibile va fi afișat (este imposibil să setați DNS personalizat pentru conexiunea mobilă).",
"install_devices_android_list_3": "Apăsați lung pe rețeaua la care sunteți conectat și tapați Modificare Rețea.",
"install_devices_android_list_4": "Pe unele aparate, poate fi necesar să bifați caseta Advanced pentru a vedea setările ulterioare. Pentru a ajusta setările DNS Android, va trebui să comutați setările IP de la DHCP la Static.",
"install_devices_android_list_4": "Pe unele aparate, poate fi necesar să bifați caseta Advanced pentru a vedea setările adiționale. Pentru a ajusta setările DNS Android, va trebui să comutați setările IP de la DHCP la Static.",
"install_devices_android_list_5": "Schimbați valorile DNS 1 și DNS 2 la cele ale serverului dvs. AdGuard Home.",
"install_devices_ios_list_1": "Din ecranul de start, tapați Setări.",
"install_devices_ios_list_2": "Alegeți Wi-Fi în meniul din stânga (este imposibil să configurați DNS pentru rețelele mobile).",
"install_devices_ios_list_3": "Tapați numele rețelei active curente.",
"install_devices_ios_list_4": "În câmpul DNS, introduceți adresele serverului dvs. AdGuard Home.",
"install_devices_ios_list_4": "În câmpul DNS, intrați adresele serverului dvs. AdGuard Home.",
"get_started": "Să începem",
"next": "Următor",
"open_dashboard": "Deschideți Tabloul de bord",
@ -302,10 +317,10 @@
"encryption_key_input": "Copiați/lipiți cheia dvs. privată PEM-codată pentru certificatul dvs. aici.",
"encryption_enable": "Activați criptarea (HTTPS, DNS-over-HTTPS, și DNS-over-TLS)",
"encryption_enable_desc": "Dacă este activată criptarea, interfața administrator AdGuard Home va lucra peste HTTPS, și serverul DNS va asculta pentru cereri peste DNS-over-HTTPS și DNS-over-TLS.",
"encryption_chain_valid": "Lanțul de certificate valid",
"encryption_chain_invalid": "Lanțul de certificate nevalid",
"encryption_chain_valid": "Lanț de certificate valid",
"encryption_chain_invalid": "Lanț de certificate invalid",
"encryption_key_valid": "Aceasta este o cheie privată {{type}} validă",
"encryption_key_invalid": "Aceasta este o cheie privată {{type}} nevalidă",
"encryption_key_invalid": "Aceasta este o cheie privată {{type}} invalidă",
"encryption_subject": "Obiect",
"encryption_issuer": "Emitent",
"encryption_hostnames": "Nume de host",
@ -317,7 +332,7 @@
"form_error_equal": "Nu trebuie să fie egale",
"form_error_password": "Parolele nu corespund",
"reset_settings": "Resetare setări",
"update_announcement": "AdGuard Home {{version}} este disponibil! <0>Faceți clic aici</0> pentru mai multe informații.",
"update_announcement": "AdGuard Home {{version}} este disponibil! <0>Clicați aici</0> pentru mai multe informații.",
"setup_guide": "Ghid de instalare",
"dns_addresses": "Adrese DNS",
"dns_start": "Serverul DNS demarează",
@ -346,6 +361,7 @@
"form_enter_id": "Intrați identificator",
"form_add_id": "Adăugați identificator",
"form_client_name": "Intrați nume client",
"name": "Nume",
"client_global_settings": "Folosiți setări globale",
"client_deleted": "Clientul \"{{key}}\" a fost șters cu succes",
"client_added": "Clientul \"{{key}}\" a fost adăugat cu succes",
@ -354,7 +370,7 @@
"client_confirm_delete": "Sunteți sigur că doriți să ștergeți clientul \"{{key}}\"?",
"list_confirm_delete": "Sigur doriți să ștergeți această listă?",
"auto_clients_title": "Clienți (runtime)",
"auto_clients_desc": "Date despre clienții folosite de AdGuard Home, dar care nu sunt stocate în configurație",
"auto_clients_desc": "Date despre clienții care folosesc AdGuard Home, dar care nu sunt stocate în configurație",
"access_title": "Setări de acces",
"access_desc": "Aici puteți configura regulile de acces pentru serverul DNS AdGuard Home.",
"access_allowed_title": "Clienți autorizați",
@ -362,20 +378,20 @@
"access_disallowed_title": "Clienți neautorizați",
"access_disallowed_desc": "O listă de adrese CIDR sau IP. Dacă este configurat, AdGuard Home va elimina cererile de la aceste adrese IP.",
"access_blocked_title": "Domenii blocate",
"access_blocked_desc": "Nu confundați acest lucru cu filtrele. AdGuard Home va bloca interogări DNS cu aceste domenii în întrebare. Aici puteți specifica exact numele de domeniu, wildcard și reguli-urlfilter, de ex. 'examplu.org', '*.examplu.org' sau '||exemplu.org^'.",
"access_blocked_desc": "Nu confundați acest lucru cu filtrele. AdGuard Home va bloca interogări DNS cu aceste domenii în întrebare. Aici puteți specifica exact numele de domeniu, wildcard și reguli-urlfilter, de ex. 'exemplu.org', '*.exemplu.org' sau '||exemplu.org^'.",
"access_settings_saved": "Setările de acces au fost salvate cu succes",
"updates_checked": "Actualizările au fost verificate cu succes",
"updates_version_equal": "AdGuard Home este la zi",
"check_updates_now": "Verificați actualizările acum",
"dns_privacy": "Confidențialitate DNS",
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> Folosiți stringul <1>{{address}}</1>.",
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> Utilizați stringul <1>{{address}}</1>.",
"setup_dns_privacy_3": "<0>Rețineți că protocoalele DNS criptate sunt acceptate numai pe Android 9. Așadar, trebuie să instalați software suplimentar pentru alte sisteme de operare.</0><0>Iată o listă de software pe care o puteți utiliza.</0>",
"setup_dns_privacy_android_1": "Android 9 acceptă nativ DNS-over-TLS. Pentru a o configura, accesați Setări → Rețea și internet → Advanced → Private DNS și introduceți numele de domeniu acolo.",
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> Folosiți stringul <1>{{address}}</1>.",
"setup_dns_privacy_3": "<0>Rețineți că protocoalele DNS criptate sunt acceptate numai pe Android 9. Așadar, trebuie să instalați programe suplimentare pentru alte sisteme de operare.</0><0>Iată o listă de software pe care o puteți utiliza.</0>",
"setup_dns_privacy_android_1": "Android 9 acceptă nativ DNS-over-TLS. Pentru a-l configura, accesați Setări → Rețea și internet → Advanced → Private DNS și intrați numele de domeniu acolo.",
"setup_dns_privacy_android_2": "<0>AdGuard pentru Android</0> acceptă <1>DNS-over-HTTPS</1> și <1>DNS-over-TLS</1>.",
"setup_dns_privacy_android_3": "<0>Intra</0> adaugă <1>DNS-over-HTTPS</1> suport pentru Android.",
"setup_dns_privacy_ios_1": "<0>DNSCloak</0> acceptă <1>DNS-over-HTTPS</1>, dar pentru a-l configura pentru a utiliza propriul server, va trebui să generezi un <2>DNS Stamp</2> pentru aceasta.",
"setup_dns_privacy_ios_2": "<0>AdGuard pentru iOS</0> acceptă instalarea<1>DNS-over-HTTPS</1> și <1>DNS-over-TLS</1>.",
"setup_dns_privacy_ios_1": "<0>DNSCloak</0> acceptă <1>DNS-over-HTTPS</1>, dar pentru a-l configura pentru a utiliza propriul server, va trebui să generi un <2>DNS Stamp</2> pentru aceasta.",
"setup_dns_privacy_ios_2": "<0>AdGuard pentru iOS</0> acceptă instalarea <1>DNS-over-HTTPS</1> și <1>DNS-over-TLS</1>.",
"setup_dns_privacy_other_title": "Alte implementări",
"setup_dns_privacy_other_1": "AdGuard Home poate fi un client DNS sigur pe orice platformă.",
"setup_dns_privacy_other_2": "<0>dnsproxy</0> acceptă toate protocoalele DNS securizate cunoscute.",
@ -383,7 +399,7 @@
"setup_dns_privacy_other_4": "<0>Mozilla Firefox</0> acceptă <1>DNS-over-HTTPS</1>.",
"setup_dns_privacy_other_5": "Veți găsi mai multe implementări <0>aici</0> și <1>aici</1>.",
"setup_dns_notice": "Pentru a utiliza <1>DNS-over-HTTPS</1> sau <1>DNS-over-TLS</1>, trebuie să <0>configurați Criptarea</0> în setările AdGuard Home.",
"rewrite_added": "Rescriere DNS pentru \"{{key}}\" adăugat cu succes",
"rewrite_added": "Rescriere DNS pentru \"{{key}}\" adăugată cu succes",
"rewrite_deleted": "Rescriere DNS pentru \"{{key}}\" ștearsă cu succes",
"rewrite_add": "Adăugați rescriere DNS",
"rewrite_not_found": "Nu s-au găsit rescrieri DNS",
@ -394,11 +410,11 @@
"dns_rewrites": "Rescrieri DNS",
"form_domain": "Intrați un nume de domeniu sau wildcard",
"form_answer": "Intrați adresa IP sau numele de domeniu",
"form_error_domain_format": "Format de răspuns nevalid",
"form_error_answer_format": "Format de răspuns nevalid",
"form_error_domain_format": "Format de răspuns invalid",
"form_error_answer_format": "Format de răspuns invalid",
"configure": "Configurați",
"main_settings": "Setări principale",
"block_services": "Blocare anumite servicii",
"block_services": "Blochează anumite servicii",
"blocked_services": "Servicii blocate",
"blocked_services_desc": "Permite blocarea rapidă a site-urilor și serviciilor populare.",
"blocked_services_saved": "Serviciile blocate au fost salvate cu succes",
@ -422,11 +438,11 @@
"filter_added_successfully": "Filtrul a fost adăugat cu succes",
"filter_updated": "Filtrul a fost actualizat cu succes",
"statistics_configuration": "Configurația statisticilor",
"statistics_retention": "Statistică retenții",
"statistics_retention": "Păstrarea statisticilor",
"statistics_retention_desc": "Dacă reduceți valoarea intervalului, unele date vor fi pierdute",
"statistics_clear": " Șterge statisticile",
"statistics_clear_confirm": "Sunteți sigur că doriți să ștergeți statisticile?",
"statistics_retention_confirm": "Sunteți sigur că doriți să schimbați retenția statisticilor? Dacă reduceți valoarea intervalului, unele date vor fi pierdute",
"statistics_retention_confirm": "Sunteți sigur că doriți să schimbați păstrarea statisticilor? Dacă reduceți valoarea intervalului, unele date vor fi pierdute",
"statistics_cleared": "Statisticile au fost șterse cu succes",
"interval_hours": "{{count}} oră",
"interval_hours_plural": "{{count}} ore",
@ -445,6 +461,7 @@
"location": "Locația",
"orgname": "Numele organizației",
"netname": "Numele rețelei",
"network": "Rețea",
"descr": "Descriere",
"whois": "Whois",
"filtering_rules_learn_more": "<0>Aflați mai multe</0> despre crearea propriilor liste hosts.",
@ -456,10 +473,10 @@
"disable_ipv6": "Dezactivați IPv6",
"disable_ipv6_desc": "Dacă această opțiune este activată, toate interogările DNS pentru adrese IPv6 (tip AAAA) vor fi anulate.",
"fastest_addr": "Cea mai rapidă adresă IP",
"fastest_addr_desc": "Interogați toate serverele DNS și returnați cea mai rapidă adresă IP din răspunsuri",
"autofix_warning_text": "Dacă faceți clic pe \"Fix\", AdGuardHome va configura sistemul dvs. pentru a utiliza serverul DNS AdGuardHome.",
"autofix_warning_list": "Va efectua aceste sarcini: <0>Dezactivare sistem DNSStubListener</0> <0>Setare adresă server DNS la 127.0.0.1</0> <0>Înlocuire țintei legăturii simbolice a /etc/resolv.conf pentru /run/systemd/resolve/resolv.conf</0> <0>Oprire DNSStubListener (reîncărcare servici rezolvat prin sistem)</0>",
"autofix_warning_result": "Ca urmare, toate cererile DNS de la sistemul dvs. vor fi procesate în mod implicit de AdGuardHome.",
"fastest_addr_desc": "Interogările la toate serverele DNS întorc adresa IP cea mai rapidă din răspunsuri. Așteptarea răspunsului tuturor serverelor DNS face interogările DNS mai lente dar se ameliorează conectivitatea generală.",
"autofix_warning_text": "Dacă clicați pe \"Fix\", AdGuardHome va configura sistemul dvs. pentru a utiliza serverul DNS AdGuardHome.",
"autofix_warning_list": "Va efectua aceste sarcini: <0>Dezactivare sistem DNSStubListener</0> <0>Setare adresă server DNS la 127.0.0.1</0> <0>Înlocuire link simbolic țintă /etc/resolv.conf cu /run/systemd/resolve/resolv.conf</0> <0>Oprire DNSStubListener (reîncărcare servici rezolvat prin sistem)</0>",
"autofix_warning_result": "Ca urmare, toate cererile DNS ale sistemul dvs. vor fi procesate în mod implicit de AdGuardHome.",
"tags_title": "Etichete",
"tags_desc": "Puteți selecta etichetele care corespund clientului. Etichetele pot fi incluse în regulile de filtrare și vă permit să le aplicați mai exact. <0>Aflați mai multe</0>",
"form_select_tags": "Selectați etichete client",
@ -489,5 +506,19 @@
"list_updated": "{{count}} listă actualizată",
"list_updated_plural": "{{count}} liste actualizate",
"dnssec_enable": "Activați DNSSEC",
"dnssec_enable_desc": "Setați steagul DNSSEC pe interogările DNS de ieșire și verificați rezultatul (este necesar un resolver DNSSEC activat)"
"dnssec_enable_desc": "Setați steagul DNSSEC pe interogările DNS de ieșire și verificați rezultatul (este necesar un resolver DNSSEC activat)",
"validated_with_dnssec": "Validat cu DNSSEC",
"show_all_responses": "Toate răspunsurile",
"show_blocked_responses": "Blocat",
"show_whitelisted_responses": "Pe lista albă",
"show_processed_responses": "Tratat",
"blocked_safebrowsing": "Blocat de Navigarea securitară",
"blocked_adult_websites": "Site-uri pentru adulți blocate",
"blocked_threats": "Amenințări blocate",
"allowed": "Permise",
"filtered": "Filtrate",
"rewritten": "Rescrise",
"safe_search": "Căutare sigură",
"blocklist": "Lista neagră",
"milliseconds_abbreviation": "ms"
}

View File

@ -59,7 +59,7 @@
"query_log": "Журнал",
"faq": "FAQ",
"version": "версия",
"address": "адрес",
"address": "Адрес",
"on": "Вкл",
"off": "Выкл",
"copyright": "Все права защищены",
@ -170,9 +170,10 @@
"updated_upstream_dns_toast": "Upstream DNS-серверы обновлены",
"dns_test_ok_toast": "Указанные серверы DNS работают корректно",
"dns_test_not_ok_toast": "Сервер \"{{key}}\": невозможно использовать, проверьте правильность написания",
"unblock_btn": "Разблокировать",
"block_btn": "Заблокировать",
"unblock": "Разблокировать",
"block": "Заблокировать",
"time_table_header": "Время",
"date": "Дата",
"domain_name_table_header": "Домен",
"type_table_header": "Тип",
"response_table_header": "Ответ",
@ -257,7 +258,7 @@
"install_devices_router_list_1": "Откройте настройки вашего роутера. Обычно вы можете открыть их в вашем браузере (например, http://192.168.0.1/ или http://192.168.1.1/). Вас могут попросить ввести пароль. Если вы не помните его, пароль часто можно сбросить, нажав на кнопку на самом роутере. Некоторые роутеры требуют специального приложения, которое в этом случае должно быть уже установлено на ваш компьютер или телефон.",
"install_devices_router_list_2": "Найдите настройки DHCP или DNS. Найдите буквы \"DNS\" рядом с текстовым полем, в которое можно ввести два или три ряда цифр, разделенных на 4 группы от одной до трёх цифр.",
"install_devices_router_list_3": "Введите туда адрес вашего AdGuard Home.",
"install_devices_router_list_4": "Вы не можете установить собственный DNS-сервер на некоторых типах маршрутизаторов. В этом случае может помочь настройка AdGuard Home в качестве DHCP-сервера. В противном случае вам следует обратиться к руководству по настройке DNS-серверов для вашей конкретной модели маршрутизатора.",
"install_devices_router_list_4": "Вы не можете установить собственный DNS-сервер на некоторых типах маршрутизаторов. В этом случае может помочь настройка AdGuard Home в качестве <0>DHCP-сервера</0>. В противном случае вам следует обратиться к руководству по настройке DNS-серверов для вашей конкретной модели маршрутизатора.",
"install_devices_windows_list_1": "Откройте Панель управления через меню \"Пуск\" или через поиск Windows.",
"install_devices_windows_list_2": "Перейдите в \"Сеть и интернет\", а затем в \"Центр управления сетями и общим доступом\"",
"install_devices_windows_list_3": "В левой стороне экрана найдите \"Изменение параметров адаптера\" и кликните по нему.",
@ -489,5 +490,9 @@
"list_updated": "Обновлен {{count}} список",
"list_updated_plural": "Обновлено списков: {{count}}",
"dnssec_enable": "Включить DNSSEC",
"dnssec_enable_desc": "Установите флаг DNSSEC в исходящих DNS-запросах и проверьте результат (требуется резолвер с поддержкой DNSSEC)"
}
"dnssec_enable_desc": "Установите флаг DNSSEC в исходящих DNS-запросах и проверьте результат (требуется резолвер с поддержкой DNSSEC)",
"show_blocked_responses": "Blocked",
"blocked_adult_websites": "Заблокированные \"взрослые\" сайты",
"blocked_threats": "Заблокировано угроз",
"blocklist": "Черный список"
}

View File

@ -3,6 +3,8 @@
"example_upstream_reserved": "Môžete zadať DNS upstream <0>pre konkrétnu doménu (domény)</0>",
"upstream_parallel": "Používať paralelné dopyty na zrýchlenie súčasným dopytovaním všetkých serverov",
"parallel_requests": "Paralelné dopyty",
"load_balancing": "Vyrovnávanie záťaže",
"load_balancing_desc": "Dopytujte jeden server súčasne. AdGuard Home použije na výber servera vážený náhodný algoritmus, aby sa najrýchlejší server používal častejšie.",
"bootstrap_dns": "Bootstrap DNS servery",
"bootstrap_dns_desc": "Bootstrap DNS servery sa používajú na rozlíšenie IP adries DoH/DoT rezolverov, ktoré zadáte ako upstreams.",
"check_dhcp_servers": "Skontrolovať DHCP servery",
@ -37,6 +39,7 @@
"dhcp_interface_select": "Zvoľte DHCP rozhranie",
"dhcp_hardware_address": "Hardware adresa",
"dhcp_ip_addresses": "IP adresy",
"ip": "IP",
"dhcp_table_hostname": "Meno hostiteľa",
"dhcp_table_expires": "Vyprší",
"dhcp_warning": "Ak chcete server DHCP napriek tomu povoliť, uistite sa, že v sieti nie je žiadny iný aktívny DHCP server. V opačnom prípade sa môže prerušiť internet pre už pripojené zariadenia!",
@ -49,17 +52,22 @@
"dhcp_static_leases_not_found": "Nebol nájdený žiadny statický DHCP prenájom",
"dhcp_add_static_lease": "Pridať statický prenájom",
"dhcp_reset": "Naozaj chcete obnoviť konfiguráciu DHCP?",
"country": "Krajina",
"delete_confirm": "Naozaj chcete vymazať \"{{key}}\"?",
"form_enter_hostname": "Zadajte meno hostiteľa",
"error_details": "Podrobnosti chyby",
"client_details": "Podrobnosti klienta",
"details": "Podrobnosti",
"back": "Naspäť",
"dashboard": "Riadiaci panel",
"settings": "Nastavenia",
"filters": "Filtre",
"filter": "Filter",
"query_log": "Denník dopytov",
"empty_log": "Denník dopytov je prázdny",
"faq": "FAQ",
"version": "Verzia",
"address": "adresa",
"address": "Adresa",
"on": "ZAP.",
"off": "VYP.",
"copyright": "Copyright",
@ -132,8 +140,10 @@
"rules_count_table_header": "Počet pravidiel",
"last_time_updated_table_header": "Posledná aktualizácia",
"actions_table_header": "Akcie",
"request_table_header": "Dopyt",
"edit_table_action": "Upraviť",
"delete_table_action": "Vymazať",
"elapsed": "Uplynuté",
"filters_and_hosts_hint": "AdGuard Home pozná základné pravidlá adblock a syntax hosts súborov.",
"no_blocklist_added": "Nebol pridaný žiaden zoznam blokovaných DNS",
"no_whitelist_added": "Nebol pridaný žiaden zoznam povolených DNS",
@ -170,10 +180,12 @@
"updated_upstream_dns_toast": "Aktualizované upstream DNS servery",
"dns_test_ok_toast": "Špecifikované DNS servery pracujú korektne",
"dns_test_not_ok_toast": "Server \"{{key}}\": nemohol byť použitý, skontrolujte, či ste ho správne napísali",
"unblock_btn": "Odblokovať",
"block_btn": "Zablokovať",
"unblock": "Odblokovať",
"block": "Blokovať",
"time_table_header": "Čas",
"date": "Dátum",
"domain_name_table_header": "Meno domény",
"domain_or_client": "Doména alebo klient",
"type_table_header": "Typ",
"response_table_header": "Odozva",
"client_table_header": "Klient",
@ -211,6 +223,8 @@
"custom_ip": "Vlastná IP adresa",
"blocking_ipv4": "Blokovanie IPv4",
"blocking_ipv6": "Blokovanie IPv6",
"dns_over_https": "DNS-over-HTTPS",
"dns_over_tls": "DNS-over-TLS",
"form_enter_rate_limit": "Zadajte rýchlostný limit",
"rate_limit": "Rýchlostný limit",
"edns_enable": "Povoliť klientsku podsiete EDNS",
@ -229,6 +243,7 @@
"rule_label": "Pravidlo",
"list_label": "Zoznam",
"unknown_filter": "Neznámy filter {{filterId}}",
"known_tracker": "Známy sledovač",
"install_welcome_title": "Vitajte na stránkach AdGuard Home!",
"install_welcome_desc": "Doména AdGuard Home je celosieťový DNS server pre blokovanie reklám a sledovačov. Jeho cieľom je, aby ste ovládali celú Vašu sieť a všetky Vaše zariadenia, pričom sa nevyžaduje použitie akéhokoľvek programu na strane klienta.",
"install_settings_title": "Administrátorské webové rozhranie",
@ -257,7 +272,7 @@
"install_devices_router_list_1": "Otvorte predvoľby Vášho smerovača. Zvyčajne ho môžete získať z prehliadača prostredníctvom adresy URL (napríklad http://192.168.0.1/ alebo http://192.168.1.1/). Možno bude potrebné zadať heslo. Ak si to nepamätáte, heslo môžete často obnoviť stlačením tlačidla na samotnom smerovači. Niektoré smerovače vyžadujú konkrétnu aplikáciu, ktorá by v takom prípade mala byť už nainštalovaná na Vašom počítači alebo telefóne.",
"install_devices_router_list_2": "Nájdite nastavenia DHCP/DNS. Hľadajte skratku DNS vedľa poľa, ktoré umožňuje vložiť dve alebo tri sady čísel, každé rozdelené do štyroch skupín s jedným až tromi číslicami.",
"install_devices_router_list_3": "Zadajte tam adresy Vášho AdGuard Home servera.",
"install_devices_router_list_4": "Na niektorých typoch smerovačov nemôžete nastaviť vlastný DNS server. V takom prípade môže pomôcť, ak nastavíte AdGuard Home ako DHCP server. V opačnom prípade by ste mali vyhľadať príručku, ako prispôsobiť DNS servery konkrétnemu modelu smerovača.",
"install_devices_router_list_4": "Na niektorých typoch smerovačov nemôžete nastaviť vlastný DNS server. V takom prípade môže pomôcť, ak nastavíte domovskú stránku AdGuard ako <0>DHCP server</0>. V opačnom prípade by ste mali vyhľadať príručku, ako prispôsobiť servery DNS konkrétnemu modelu smerovača.",
"install_devices_windows_list_1": "Otvorte panel Nastavenia cez menu Štart alebo vyhľadávanie Windows.",
"install_devices_windows_list_2": "Prejdite do kategórie Sieť a internet a potom do Centra sietí a zdieľania.",
"install_devices_windows_list_3": "Vyhľadajte položku Zmeniť možnosti adaptéra a kliknite na ňu",
@ -346,6 +361,7 @@
"form_enter_id": "Zadajte identifikátor",
"form_add_id": "Pridajte identifikátor",
"form_client_name": "Zadajte meno klienta",
"name": "Meno",
"client_global_settings": "Použiť globálne nastavenia",
"client_deleted": "\"{{key}}\" klienta bol úspešne vymazaný",
"client_added": "\"{{key}}\" klienta bol úspešne pridaný",
@ -445,6 +461,7 @@
"location": "Poloha",
"orgname": "Meno organizácie",
"netname": "Meno siete",
"network": "Sieť",
"descr": "Popis",
"whois": "Whois",
"filtering_rules_learn_more": "<0>Dozvedieť sa viac</0> o tvorbe vlastných zoznamov hostiteľov.",
@ -456,7 +473,7 @@
"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é.",
"fastest_addr": "Najrýchlejšia IP adresa",
"fastest_addr_desc": "Dopytovať všetky DNS servery a vrátiť najrýchlejšiu IP adresu zo všetkých odpovedí",
"fastest_addr_desc": "Dopytovať všetky servery DNS a vrátiť najrýchlejšiu IP adresu zo všetkých odpovedí. Toto spomalí dotazy DNS, pretože musíme čakať na odpovede zo všetkých serverov DNS, ale zlepší sa celkové pripojenie.",
"autofix_warning_text": "Ak kliknete na „Opraviť“, AdGuardHome nakonfiguruje Váš systém tak, aby používal DNS server AdGuardHome.",
"autofix_warning_list": "Bude vykonávať tieto úlohy: <0>Deaktivovať systém DNSStubListener</0> <0>Nastaviť adresu servera DNS na 127.0.0.1</0> <0>Nahradiť cieľový symbolický odkaz /etc/resolv.conf na /run/systemd/resolve/resolv.conf</0> <0>Zastaviť službu DNSStubListener (znova načítať službu systemd-resolved)</0>",
"autofix_warning_result": "Výsledkom bude, že všetky DNS dopyty z Vášho systému budú štandardne spracované službou AdGuard Home.",
@ -489,5 +506,19 @@
"list_updated": "{{count}} zoznam aktualizovaný",
"list_updated_plural": "{{count}} zoznamov aktualizovaných",
"dnssec_enable": "Zapnúť DNSSEC",
"dnssec_enable_desc": "Nastavte príznak DNSSEC v nasledujúcich DNS dopytoch a skontrolujte výsledok (je potrebný prekladač so zapnutým DNSSEC)"
"dnssec_enable_desc": "Nastavte príznak DNSSEC v nasledujúcich DNS dopytoch a skontrolujte výsledok (je potrebný prekladač so zapnutým DNSSEC)",
"validated_with_dnssec": "Overené pomocou DNSSEC",
"show_all_responses": "Všetky odpovede",
"show_blocked_responses": "Zablokované",
"show_whitelisted_responses": "Obsiahnuté v bielej listine",
"show_processed_responses": "Spracované",
"blocked_safebrowsing": "Zablokované modulom Bezpečné prehliadanie",
"blocked_adult_websites": "Zablokovaná stránka pre dospelých",
"blocked_threats": "Zablokované hrozby",
"allowed": "Povolené",
"filtered": "Filtrované",
"rewritten": "Prepísané",
"safe_search": "Bezpečné vyhľadávanie",
"blocklist": "Zoznam blokovaní",
"milliseconds_abbreviation": "ms"
}

View File

@ -3,6 +3,8 @@
"example_upstream_reserved": "lahko določite nazgornji DNS <0>za določene domene</0>",
"upstream_parallel": "Uporabite vzporedne zahteve za pospešitev reševanja s hkratnim poizvedovanjem vseh gorvodnih strežnikov",
"parallel_requests": "Vzporedne zahteve",
"load_balancing": "Uravnavanje obremenitve",
"load_balancing_desc": "Poizvedujte po en strežnik. AdGuard Home bo uporabil uteženi naključni algoritem za izbiro strežnika, tako da bo najhitrejši strežnik uporabljen pogosteje.",
"bootstrap_dns": "Zagonski DNS strežniki",
"bootstrap_dns_desc": "Zagonski DNS strežniki se uporabljajo za razreševanje IP naslovov DoH/DoT reševalcev, ki jih določite kot navzgornje.",
"check_dhcp_servers": "Preveri strežnike DHCP",
@ -37,6 +39,7 @@
"dhcp_interface_select": "Izberite DHCP vmesnik",
"dhcp_hardware_address": "Naslov strojne opreme",
"dhcp_ip_addresses": "IP naslovi",
"ip": "IP",
"dhcp_table_hostname": "Ime gostitelja",
"dhcp_table_expires": "Poteče",
"dhcp_warning": "Če želite omogočiti DHCP strežnik, prepričajte se, da v vašem omrežju ni drugega aktivnega strežnika DHCP. V nasprotnem primeru lahko ta prekine internet za povezane naprave!",
@ -49,17 +52,22 @@
"dhcp_static_leases_not_found": "Ni najdenih statičnih najemov DHCP",
"dhcp_add_static_lease": "Dodaj statičen najem",
"dhcp_reset": "Ali ste prepričani, da želite ponastaviti konfiguracijo DHCP?",
"country": "Dežela",
"delete_confirm": "Ali ste prepričani, da želite izbrisati \"{{key}}\"?",
"form_enter_hostname": "Vnesite ime gostitelja",
"error_details": "Podrobnosti o napaki",
"client_details": "Podatki o odjemalcu",
"details": "Podrobnosti",
"back": "Nazaj",
"dashboard": "Nadzorna plošča",
"settings": "Nastavitve",
"filters": "Filtri",
"filter": "Filtriraj",
"query_log": "Dnevnik poizvedb",
"empty_log": "Dnevnik poizvedb je prazen",
"faq": "Pogosta vprašanja in odgovori (FAQ)",
"version": "različica",
"address": "naslov",
"address": "Naslov",
"on": "VKL",
"off": "IZK",
"copyright": "Avtorske pravice",
@ -132,8 +140,10 @@
"rules_count_table_header": "Število pravil",
"last_time_updated_table_header": "Zadnjič posodobljeno",
"actions_table_header": "Akcij",
"request_table_header": "Zahteva",
"edit_table_action": "Uredi",
"delete_table_action": "Izbriši",
"elapsed": "Potekla",
"filters_and_hosts_hint": "AdGuard Home razume osnovna pravila zaviranja oglasov in sintakso datotek gostiteljev.",
"no_blocklist_added": "Ni dodanih nobenih seznamov nedovoljenih",
"no_whitelist_added": "Ni dodanih nobenih dovoljenih seznamov",
@ -170,10 +180,12 @@
"updated_upstream_dns_toast": "Posodobljeni Zagonske strežnike DNS",
"dns_test_ok_toast": "Navedeni strežniki DNS delujejo pravilno",
"dns_test_not_ok_toast": "Ni mogoče uporabiti: strežnika \"{{key}}\". Preverite, ali ste ga pravilno napisali",
"unblock_btn": "Omogoči",
"block_btn": "Onemogoči",
"unblock": "Omogoči",
"block": "Onemogoči",
"time_table_header": "Čas",
"date": "Datum",
"domain_name_table_header": "Ime domene",
"domain_or_client": "Domena ali odjemalec",
"type_table_header": "Vrsta",
"response_table_header": "Odgovor",
"client_table_header": "Odjemalec",
@ -211,6 +223,8 @@
"custom_ip": "IP po meri",
"blocking_ipv4": "Onemogočanje IPv4",
"blocking_ipv6": "Onemogočanje IPv6",
"dns_over_https": "DNS-prek-HTTPS",
"dns_over_tls": "DNS-prek-TLS",
"form_enter_rate_limit": "Vnesite omejitev hitrosti",
"rate_limit": "Omejitev hitrosti",
"edns_enable": "Omogoči podmrežje odjemalcev EDNS",
@ -229,6 +243,7 @@
"rule_label": "Pravilo",
"list_label": "Seznam",
"unknown_filter": "Neznan filter {{filterId}}",
"known_tracker": "Znan sledilec",
"install_welcome_title": "Dobrodošli v AdGuard Home!",
"install_welcome_desc": "AdGuard Home je omrežni strežnik DNS, ki zavira oglase in sledilce v celotnem omrežju. Njegov namen je omogočanje nadzora nad celotnim omrežjem in vsemi vašimi napravami in ne zahteva uporabo odjemalskega programa.",
"install_settings_title": "Skrbniški spletni vmesnik",
@ -257,7 +272,7 @@
"install_devices_router_list_1": "Odprite nastavitve usmerjevalnika. Ponavadi lahko do nje dostopate iz brskalnika prek URL-ja (npr. http://192.168.0.1/ ali http://192.168.1.1/). Morda boste morali vnesti geslo. Če se ne spomnite gesla, lahko pogosto ponastavite geslo s pritiskom na gumb na samem usmerjevalniku. Nekateri usmerjevalniki zahtevajo posebno aplikacijo, ki bi morala biti v tem primeru že nameščena na vašem računalniku/telefonu.",
"install_devices_router_list_2": "Poiščite nastavitve DHCP/DNS. Poiščite črke DNS poleg polja, ki dovoljuje dva ali tri naborov številk, pri čemer je vsaka razdeljena na štiri skupine z enim do tremi števili.",
"install_devices_router_list_3": "Tam vnesite svoje naslove strežnikov AdGuard Home.",
"install_devices_router_list_4": "Na nekaterih usmerjevalnikih ne morete nastaviti strežnika DNS po meri. V tem primeru bo morda pomagalo, če boste AdGuard Home postavili kot strežnik DHCP. V nasprotnem primeru poiščite priročnik, kako prilagoditi strežnike DNS za vaš določen model usmerjevalnika.",
"install_devices_router_list_4": "Na nekaterih vrstah usmerjevalnikov ne morete nastaviti strežnika DNS po meri. V tem primeru bo morda pomagalo, če boste AdGuard Home postavili kot <0>strežnik DHCP</0>. V nasprotnem primeru poiščite priročnik, kako prilagoditi strežnike DNS za vaš določen model usmerjevalnika.",
"install_devices_windows_list_1": "Odprite 'Nadzorno ploščo' prek menija 'Začetek' ali 'Iskanja v sistemu Windows'.",
"install_devices_windows_list_2": "Pojdite v 'Omrežje' in 'Kategorija interneta' in nato v 'Omrežje' in 'Središče za skupno rabo'.",
"install_devices_windows_list_3": "Na levi strani zaslona poiščite 'Spremeni nastavitve kartice' in kliknite nanjo.",
@ -346,6 +361,7 @@
"form_enter_id": "Vnesi identifikatorja",
"form_add_id": "Dodaj identifikatorja",
"form_client_name": "Vnesite ime odjemalca",
"name": "Ime",
"client_global_settings": "Uporabi splošne nastavitve",
"client_deleted": "Odjemalec \"{{key}}\" je bil uspešno izbrisan",
"client_added": "Odjemalec \"{{key}}\" je bil uspešno dodan",
@ -381,7 +397,7 @@
"setup_dns_privacy_other_2": "<0>dnsproxy</0> podpira vse znane varne protokole DNS.",
"setup_dns_privacy_other_3": "<0>dnscrypt-proxy</0> podpira <1>DNS-prek-HTTPS</1>.",
"setup_dns_privacy_other_4": "<0>Mozilla Firefox</0> podpira <1>DNS-prek-HTTPS</1>.",
"setup_dns_privacy_other_5": "Več izvedb boste najdli <0>tukaj</0> in <1>tukaj</1>.",
"setup_dns_privacy_other_5": "Našli boste več izvedb <0>tukaj</0> in <1>tukaj</1>.",
"setup_dns_notice": "Za uporabo <1>DNS-prek-HTTPS</1> ali <1>DNS-prek-TLS</1>, morate <0>konfigurirati šifriranje</0> v nastavitvah AdGuard Home.",
"rewrite_added": "Uspešno je dodano DNS prepisovanje za \"{{key}}\"",
"rewrite_deleted": "Uspešno je izbrisano DNS prepisovanje za \"{{key}}\"",
@ -445,6 +461,7 @@
"location": "Lokacija",
"orgname": "Ime organizacije",
"netname": "Ime omrežja",
"network": "Omrežje",
"descr": "Opis",
"whois": "Whois",
"filtering_rules_learn_more": "<0>Več o</0> ustvarjanju lastnih seznamov gostiteljev.",
@ -456,7 +473,7 @@
"disable_ipv6": "Onemogoči IPv6",
"disable_ipv6_desc": "Če je ta funkcija omogočena, bodo vse poizvedbe DNS za naslove IPv6 (vrste AAAA) izpadle.",
"fastest_addr": "Najhitrejši IP naslov",
"fastest_addr_desc": "Poišči vse strežnike DNS in vrni najhitrejši IP naslov med vsemi odgovori",
"fastest_addr_desc": "Poizve vse strežnike DNS in vrne najhitrejši IP naslov med vsemi odgovori. To bo upočasnilo poizvedbe DNS, saj moramo čakati na odgovore vseh DNS strežnikov, vendar bo izboljšalo splošno povezljivost.",
"autofix_warning_text": "Če kliknete 'Popravi', bo AdGuardHome konfiguriral vaš sistem za uporabo strežnika AdGuardHome DNS.",
"autofix_warning_list": "To bo izvedlo naslednja opravila: <0>Deaktiviraj sistemski DNSStubListener</0> <0>Nastavi naslov strežnika DNS na 127.0.0.1</0> <0>Zamenjaj cilj simbolične povezave /etc/resolv.conf with /run/systemd/resolve/resolv.conf</0> <0>Zaustavi DNSStubListener (znova naloži storitev systemd-resolved)",
"autofix_warning_result": "Kot rezultat, bo vse zahteve DNS iz vašega sistema privzeto obdelal AdGuard Home.",
@ -489,5 +506,19 @@
"list_updated": "{{count}} posodobljen seznam",
"list_updated_plural": "{{count}} posodobljenih seznamov",
"dnssec_enable": "Omogoči DNSSEC",
"dnssec_enable_desc": "V odhodnih poizvedbah DNS nastavite zastavico DNSSEC in preverite rezultat (zahtevan je omogočen reševalnik DNSSEC)"
"dnssec_enable_desc": "V odhodnih poizvedbah DNS nastavite zastavico DNSSEC in preverite rezultat (zahtevan je omogočen reševalnik DNSSEC)",
"validated_with_dnssec": "Potrjen z DNSSEC",
"show_all_responses": "Vsi odgovori",
"show_blocked_responses": "Onemogočen",
"show_whitelisted_responses": "Na seznamu dovoljenih",
"show_processed_responses": "Obdelan",
"blocked_safebrowsing": "Onemogočeno z 'Varnim brskanjem'",
"blocked_adult_websites": "Onemogočeno spletnih strani za odrasle",
"blocked_threats": "Onemogočeno groženj",
"allowed": "Dovoljeno",
"filtered": "Filtrirano",
"rewritten": "Znova napisano",
"safe_search": "Varno iskanje",
"blocklist": "Seznam nedovoljenih",
"milliseconds_abbreviation": "ms"
}

View File

@ -58,7 +58,7 @@
"query_log": "Dnevnik zahteva",
"faq": "ČPP",
"version": "Verzija",
"address": "adresa",
"address": "Adresa",
"on": "Uključeno",
"off": "Isključeno",
"copyright": "Autorska prava",
@ -167,9 +167,10 @@
"updated_upstream_dns_toast": "Ažurirani upstream DNS serveri",
"dns_test_ok_toast": "Dati DNS serveri rade ispravno",
"dns_test_not_ok_toast": "Server \"{{key}}\": se ne može koristiti. Proverite da li ste ga ispravno uneli",
"unblock_btn": "Odblokiraj",
"block_btn": "Blokiraj",
"unblock": "Odblokiraj",
"block": "Blokiraj",
"time_table_header": "Vreme",
"date": "Datum",
"domain_name_table_header": "Ime domena",
"type_table_header": "Vrsta",
"response_table_header": "Odgovor",
@ -478,5 +479,8 @@
"install_static_configure": "Otkrili smo da se koristi dinamička IP adresa — <0>{{ip}}</0>. Želite li da je koristite kao vašu statičku adresu?",
"confirm_static_ip": "AdGuard Home će konfigurisati {{ip}} da bude vaša statička IP adresa. Želite li da nastavite?",
"list_updated": "{{count}} lista ažurirana",
"list_updated_plural": "{{count}} lista ažurirano"
"list_updated_plural": "{{count}} lista ažurirano",
"show_blocked_responses": "Blokirano",
"blocked_adult_websites": "Blokiraj sajtove za odrasle",
"blocked_threats": "Blokiranih pretnji"
}

View File

@ -53,7 +53,7 @@
"query_log": "Förfrågningslogg",
"faq": "FAQ",
"version": "version",
"address": "adress",
"address": "Adress",
"on": "PÅ",
"off": "AV",
"copyright": "Copyright",
@ -143,9 +143,10 @@
"updated_upstream_dns_toast": "Uppdaterade uppströms-dns-servrar",
"dns_test_ok_toast": "Angivna DNS servrar fungerar korrekt",
"dns_test_not_ok_toast": "Server \"{{key}}\": kunde inte användas. Var snäll och kolla att du skrivit in rätt",
"unblock_btn": "Avblockera",
"block_btn": "Blockera",
"unblock": "Avblockera",
"block": "Blockera",
"time_table_header": "Tid",
"date": "Datum",
"domain_name_table_header": "Domännamn",
"type_table_header": "Typ",
"response_table_header": "Svar",
@ -356,5 +357,8 @@
"netname": "Nätverksnamn",
"descr": "Beskrivning",
"whois": "Whois",
"filtering_rules_learn_more": "<0>Mer info</0> om att skapa dina egna blockeringslistor för värdar."
}
"filtering_rules_learn_more": "<0>Mer info</0> om att skapa dina egna blockeringslistor för värdar.",
"show_blocked_responses": "Blockerade",
"blocked_adult_websites": "Blockerade vuxensajter",
"blocked_threats": "Blockerade hot"
}

View File

@ -149,8 +149,8 @@
"updated_upstream_dns_toast": "อัปเดตเซิร์ฟเวอร์ DNS ต้นทาง",
"dns_test_ok_toast": "เซิร์ฟเวอร์ DNS ที่ระบุทำงานอย่างถูกต้อง",
"dns_test_not_ok_toast": "เซิร์ฟเวอร์ \"{{key}}\": ไม่สามารถใช้งานได้ โปรดตรวจสอบว่าคุณเขียนถูกต้อง",
"unblock_btn": "เลิกปิดกั้น",
"block_btn": "ปิดกั้น",
"unblock": "เลิกปิดกั้น",
"block": "ปิดกั้น",
"time_table_header": "เวลา",
"domain_name_table_header": "ชื่อโดเมน",
"type_table_header": "ประเภท",
@ -394,6 +394,7 @@
"location": "ตำแหน่ง",
"orgname": "ชื่อองค์กร",
"netname": "ชื่อเครือข่าย",
"network": "เครือข่าย",
"descr": "คำอธิบาย",
"whois": "Whois",
"filtering_rules_learn_more": "<0>เรียนรู้เพิ่มเติม</0> เกี่ยวกับการสร้างรายการปิดกั้นโฮสต์ของคุณเอง",
@ -411,5 +412,6 @@
"tags_desc": "คุณสามารถเลือกแท็กที่สอดคล้องกับลูกค้า แท็กสามารถรวมอยู่ในกฎการกรองและอนุญาตให้คุณใช้งานได้อย่างถูกต้องมากขึ้น <0>เรียนรู้เพิ่มเติม</0>",
"form_select_tags": "เลือกแท็กเครื่อง",
"check_title": "ตรวจสอบการกรอง",
"check_desc": "ตรวจสอบว่าชื่อโฮสต์ถูกกรอง"
"check_desc": "ตรวจสอบว่าชื่อโฮสต์ถูกกรอง",
"form_enter_host": "ป้อนชื่อโฮสต์"
}

View File

@ -59,7 +59,7 @@
"query_log": "Sorgu Günlüğü",
"faq": "SSS",
"version": "Sürüm",
"address": "adres",
"address": "Adres",
"on": "AÇIK",
"off": "KAPALI",
"copyright": "Tüm hakları saklıdır",
@ -170,9 +170,10 @@
"updated_upstream_dns_toast": "Üst DNS sunucuları güncellendi",
"dns_test_ok_toast": "Belirtilmiş DNS sunucuları düzgün çalışıyor",
"dns_test_not_ok_toast": "Sunucu \"{{key}}\": kullanılamıyor, lütfen doğru yazdığınızdan emin olun",
"unblock_btn": "Engeli kaldır",
"block_btn": "Engelle",
"unblock": "Engeli kaldır",
"block": "Engelle",
"time_table_header": "Saat",
"date": "Tarih",
"domain_name_table_header": "Alan adı",
"type_table_header": "Tür",
"response_table_header": "Yanıt",
@ -257,7 +258,7 @@
"install_devices_router_list_1": "Yönlendiricinizin ayarlarına girin. Genelde internet tarayıcınızdan bir URL vasıtasıyla erişebilirsiniz (http://192.168.0.1/ veya http://192.168.1.1/ gibi). Sizden şifre girmenizi isteyebilir. Hatırlamıyorsanız yönlendiricinizin arkasındaki 'reset' tuşuna basılı tutup fabrika ayarlarına sıfırlayabilirsiniz. Bazı yönlendiriciler belirli uygulamalarla çalışır, bu durumda bilgisayarınıza/telefonunuza kurulması gerekir.",
"install_devices_router_list_2": "DHCP/DNS ayarlarını bulun. DNS satırlarını arayın, genelde iki veya üç tanedir, üç rakam girilebilen dört ayrı grup içeren satırdır.",
"install_devices_router_list_3": "AdGuard Home sunucusunun adresini o kısma yazın.",
"install_devices_router_list_4": "Bazı yönlendirici tiplerinde özel bir DNS sunucusu ayarlayamazsınız. Bu durumda AdGuard Home'u bir DHCP sunucu olarak ayarlamanız yardımcı olabilir. Aksi halde, yönlendirici modeliniz için DNS sunucularını elle nasıl özelleştirebileceğinizi aramalısınız.",
"install_devices_router_list_4": "Bazı yönlendirici tiplerinde özel bir DNS sunucusu ayarlayamazsınız. Bu durumda AdGuard Home'u bir DHCP sunucu olarak ayarlamanız yardımcı olabilir. Aksi halde, yönlendirici modeliniz için <0>DNS sunucularını</0> elle nasıl özelleştirebileceğinizi aramalısınız.",
"install_devices_windows_list_1": "Başlat menüsünden veya Windows aramasıyla Denetim Masası'na girin.",
"install_devices_windows_list_2": "Ağ ve Internet kategorisine girin, sonra Ağ ve Paylaşım Merkezi'ne girin.",
"install_devices_windows_list_3": "Sol taraftaki Bağdaştırıcı ayarlarını değiştir ayarını bulun ve ona tıklayın.",
@ -489,5 +490,9 @@
"list_updated": "{{count}} liste güncellendi",
"list_updated_plural": "{{count}} liste güncellendi",
"dnssec_enable": "DNSSEC'i etkinleştir",
"dnssec_enable_desc": "DNSSEC'i giden DNS sorguları için etkinleştir ve sonucu kontrol et (DNSSEC-etkin sorgulama gerekli)"
"dnssec_enable_desc": "DNSSEC'i giden DNS sorguları için etkinleştir ve sonucu kontrol et (DNSSEC-etkin sorgulama gerekli)",
"show_blocked_responses": "Engellendi",
"blocked_adult_websites": "Yetişkin içerikli site engellendi",
"blocked_threats": "Engellenen Tehditler",
"blocklist": "Engellenen listesi"
}

View File

@ -2,6 +2,7 @@
"client_settings": "Cài đặt máy khách",
"example_upstream_reserved": "bạn có thể chỉ định DNS ngược tuyến <0>cho một tên miền cụ thể(hoặc nhiều)</0>",
"upstream_parallel": "Sử dụng truy vấn song song để tăng tốc độ giải quyết bằng cách truy vấn đồng thời tất cả các máy chủ ngược tuyến",
"parallel_requests": "Yêu cầu song song",
"bootstrap_dns": "Máy chủ DNS Bootstrap",
"bootstrap_dns_desc": "Máy chủ DNS Bootstrap được sử dụng để phân giải địa chỉ IP của bộ phân giải DoH/DoT mà bạn chỉ định là ngược tuyến.",
"check_dhcp_servers": "Kiểm tra máy chủ DHCP",
@ -36,6 +37,7 @@
"dhcp_interface_select": "Chọn một card mạng",
"dhcp_hardware_address": "Địa chỉ phần cứng",
"dhcp_ip_addresses": "Các địa chỉ IP",
"ip": "IP",
"dhcp_table_hostname": "Tên máy chủ",
"dhcp_table_expires": "Hết hạn",
"dhcp_warning": "Nếu bạn vẫn muốn bật máy chủ DHCP, hãy đảm bảo rằng không có máy chủ DHCP hoạt động nào khác trong mạng của bạn. Nếu không, nó có thể phá vỡ Internet cho các thiết bị được kết nối!",
@ -48,9 +50,11 @@
"dhcp_static_leases_not_found": "Không tìm thấy DHCP cho thuê tĩnh",
"dhcp_add_static_lease": "Thêm thuê tĩnh",
"dhcp_reset": "Bạn có chắc chắn muốn đặt lại thiết lập DHCP?",
"country": "Quốc gia",
"delete_confirm": "Bạn có chắc chắn muốn xóa \"{{key}}\" không?",
"form_enter_hostname": "Nhập tên máy chủ",
"error_details": "Chi tiết lỗi",
"details": "Chi tiết",
"back": "Quay lại",
"dashboard": "Tổng quan",
"settings": "Cài đặt",
@ -121,6 +125,7 @@
"enabled_save_search_toast": "Đã bật tìm kiếm an toàn",
"enabled_table_header": "Kích hoạt",
"name_table_header": "Tên",
"list_url_table_header": "Danh sách liên kết",
"rules_count_table_header": "Số quy tắc",
"last_time_updated_table_header": "Cập nhật cuối",
"actions_table_header": "Thao tác",
@ -148,10 +153,11 @@
"updated_upstream_dns_toast": "Đã cập nhật máy chủ DNS tìm kiếm",
"dns_test_ok_toast": "Máy chủ DNS có thể sử dụng",
"dns_test_not_ok_toast": "Máy chủ \"\"': không thể sử dụng, vui lòng kiểm tra lại",
"unblock_btn": "Bỏ chặn",
"block_btn": "Chặn",
"unblock": "Bỏ chặn",
"block": "Chặn",
"time_table_header": "Thời gian",
"domain_name_table_header": "Tên miền",
"domain_or_client": "Tên miền hoặc khách hàng",
"type_table_header": "Loại",
"response_table_header": "Phản hồi",
"client_table_header": "Người dùng cuối",
@ -190,6 +196,9 @@
"blocking_ipv6": "Chặn IPv6",
"form_enter_rate_limit": "Nhập giới hạn yêu cầu",
"rate_limit": "Giới hạn yêu cầu",
"edns_cs_desc": "Nếu được bật, AdGuard Home sẽ gửi các mạng con của khách hàng đến các máy chủ DNS.",
"rate_limit_desc": "Số lượng yêu cầu mỗi giây mà một khách hàng được phép thực hiện (0: không giới hạn)",
"blocking_ipv4_desc": "Địa chỉ IP được trả lại cho một yêu cầu A bị chặn",
"source_label": "Nguồn",
"found_in_known_domain_db": "Tìm thấy trong cơ sở dữ liệu tên miền",
"category_label": "Thể loại",
@ -413,5 +422,12 @@
"blocked_by_response": "Chặn bởi CNAME hoặc địa IP ở phản hồi",
"try_again": "Hãy thử lại",
"dnssec_enable": "Bật DNSSEC",
"dnssec_enable_desc": "Cắm mốc DNSSEC trong các truy vấn DNS sắp tới và kiểm tra kết quả (buộc phải có trình sửa lỗi hỗ trợ DNSSEC)"
}
"dnssec_enable_desc": "Cắm mốc DNSSEC trong các truy vấn DNS sắp tới và kiểm tra kết quả (buộc phải có trình sửa lỗi hỗ trợ DNSSEC)",
"show_blocked_responses": "Bị chặn",
"show_whitelisted_responses": "Đã thêm vào danh sách cho phép",
"show_processed_responses": "Đã xử lý",
"blocked_adult_websites": "Website người lớn đã chặn",
"blocked_threats": "Mối nguy hiểm đã chặn",
"allowed": "Được phép",
"safe_search": "Tìm kiếm an toàn"
}

View File

@ -170,9 +170,10 @@
"updated_upstream_dns_toast": "上游 DNS 已更新",
"dns_test_ok_toast": "指定的 DNS 服务器现已正常运行",
"dns_test_not_ok_toast": "服务器 \"{{key}}\":无法使用,请检查你输入的是否正确",
"unblock_btn": "放行",
"block_btn": "拦截",
"unblock": "放行",
"block": "拦截",
"time_table_header": "时间",
"date": "日起",
"domain_name_table_header": "域名",
"type_table_header": "类型",
"response_table_header": "响应",
@ -488,5 +489,10 @@
"list_updated": "{{count}} 列表已更新",
"list_updated_plural": "{{count}} 条列表已更新",
"dnssec_enable": "启用DNSSEC",
"dnssec_enable_desc": "在发出DNS查询中设置DNSSEC标志并检查结果(需要启用DNSSEC的解析器)"
}
"dnssec_enable_desc": "在发出DNS查询中设置DNSSEC标志并检查结果(需要启用DNSSEC的解析器)",
"show_blocked_responses": "已拦截",
"blocked_safebrowsing": "安全浏览阻止项目",
"blocked_adult_websites": "拦截的成人网站",
"blocked_threats": "拦截的威胁",
"blocklist": "拦截列表"
}

View File

@ -1,8 +1,10 @@
{
"client_settings": "用戶端設定",
"example_upstream_reserved": "您可明確指定<0>用於特定的網域</0>之 DNS 上游",
"upstream_parallel": "透過同時地查詢所有上游的伺服器,使用並行的請求以加速解析",
"upstream_parallel": "透過同時地查詢所有上游的伺服器,使用並行的查詢以加速解析網域",
"parallel_requests": "並行的請求",
"load_balancing": "負載平衡",
"load_balancing_desc": "每次查詢一個伺服器。AdGuard Home 將使用加權隨機的演算法來選擇伺服器,以便最快的伺服器將被更常使用。",
"bootstrap_dns": "自我啟動BootstrapDNS 伺服器",
"bootstrap_dns_desc": "自我啟動BootstrapDNS 伺服器被用於解析您明確指定作為上游的 DoH/DoT 解析器之 IP 位址。",
"check_dhcp_servers": "檢查動態主機設定協定DHCP伺服器",
@ -37,6 +39,7 @@
"dhcp_interface_select": "選擇動態主機設定協定DHCP介面",
"dhcp_hardware_address": "硬體位址",
"dhcp_ip_addresses": "IP 位址",
"ip": "IP",
"dhcp_table_hostname": "主機名稱",
"dhcp_table_expires": "到期",
"dhcp_warning": "如果您無論如何想要啟用動態主機設定協定DHCP伺服器確保在您的網路中無其它現行的 DHCP 伺服器。否則,它可能會破壞供已連線的裝置之網際網路!",
@ -49,14 +52,19 @@
"dhcp_static_leases_not_found": "無已發現之動態主機設定協定DHCP靜態租約",
"dhcp_add_static_lease": "增加靜態租約",
"dhcp_reset": "您確定您想要重置動態主機設定協定DHCP配置嗎",
"country": "國家",
"delete_confirm": "您確定您想要刪除 \"{{key}}\" 嗎?",
"form_enter_hostname": "輸入主機名稱",
"error_details": "錯誤細節",
"client_details": "用戶端細節",
"details": "細節",
"back": "返回",
"dashboard": "儀表板",
"settings": "設定",
"filters": "過濾器",
"filter": "過濾器",
"query_log": "查詢記錄",
"empty_log": "查詢記錄為空",
"faq": "常見問答集",
"version": "版本",
"address": "位址",
@ -88,7 +96,7 @@
"number_of_dns_query_days": "在最近的 {{count}} 日內已處理的 DNS 查詢之數量",
"number_of_dns_query_days_plural": "在最近的 {{count}} 日內已處理的 DNS 查詢之數量",
"number_of_dns_query_24_hours": "在最近的 24 小時內已處理的 DNS 查詢之數量",
"number_of_dns_query_blocked_24_hours": "被廣告封鎖過濾器和主機封鎖清單封鎖的 DNS 請求之數量",
"number_of_dns_query_blocked_24_hours": "被廣告封鎖過濾器和主機封鎖清單阻擋的 DNS 請求之數量",
"number_of_dns_query_blocked_24_hours_by_sec": "被 AdGuard 瀏覽安全模組封鎖的 DNS 請求之數量",
"number_of_dns_query_blocked_24_hours_adult": "已封鎖的成人網站之數量",
"enforced_save_search": "已強制執行的安全搜尋",
@ -108,7 +116,7 @@
"dns_settings": "DNS 設定",
"dns_blocklists": "DNS 封鎖清單",
"dns_allowlists": "DNS 允許清單",
"dns_blocklists_desc": "AdGuard Home 將封鎖與封鎖清單相符的網域。",
"dns_blocklists_desc": "AdGuard Home 將阻擋與封鎖清單相符的網域。",
"dns_allowlists_desc": "即使來自 DNS 允許清單的網域在任何的封鎖清單中,它們將被允許。",
"custom_filtering_rules": "自訂的過濾規則",
"encryption_settings": "加密設定",
@ -132,8 +140,10 @@
"rules_count_table_header": "規則總數",
"last_time_updated_table_header": "最近的更新時間",
"actions_table_header": "動作",
"request_table_header": "請求",
"edit_table_action": "編輯",
"delete_table_action": "刪除",
"elapsed": "已經過",
"filters_and_hosts_hint": "AdGuard Home 懂得基本的廣告封鎖規則和主機檔案語法。",
"no_blocklist_added": "無已加入的封鎖清單",
"no_whitelist_added": "無已加入的允許清單",
@ -170,10 +180,12 @@
"updated_upstream_dns_toast": "已更新上游的 DNS 伺服器",
"dns_test_ok_toast": "已明確指定的 DNS 伺服器正在正確地運作",
"dns_test_not_ok_toast": "伺服器 \"{{key}}\":無法被使用,請檢查您已正確地填寫它",
"unblock_btn": "解除封鎖",
"block_btn": "封鎖",
"unblock": "解除封鎖",
"block": "封鎖",
"time_table_header": "時間",
"date": "日期",
"domain_name_table_header": "域名",
"domain_or_client": "網域或用戶端",
"type_table_header": "類型",
"response_table_header": "回應",
"client_table_header": "用戶端",
@ -211,6 +223,8 @@
"custom_ip": "自訂的 IP",
"blocking_ipv4": "封鎖 IPv4",
"blocking_ipv6": "封鎖 IPv6",
"dns_over_https": "DNS-over-HTTPS",
"dns_over_tls": "DNS-over-TLS",
"form_enter_rate_limit": "輸入速率限制",
"rate_limit": "速率限制",
"edns_enable": "啟用對於 DNS 的擴充機制EDNS用戶端子網路",
@ -229,6 +243,7 @@
"rule_label": "規則",
"list_label": "清單",
"unknown_filter": "未知的過濾器 {{filterId}}",
"known_tracker": "已知的追蹤器",
"install_welcome_title": "歡迎至 AdGuard Home",
"install_welcome_desc": "AdGuard Home 是全網路範圍廣告和追蹤器封鎖的 DNS 伺服器。它的目的為讓您控制您的整個網路和所有您的裝置,且不需要使用用戶端程式。",
"install_settings_title": "管理員網路介面",
@ -257,7 +272,7 @@
"install_devices_router_list_1": "開啟關於您的路由器之偏好設定。通常地,您可透過網址(如 http://192.168.0.1/ 或 http://192.168.1.1/)從您的瀏覽器中存取它。您可能被要求輸入該密碼。如果您不記得它,您經常可透過按壓於該路由器本身上的按鈕來重置密碼。某些路由器需要特定的應用程式,既然如此其應已被安裝於您的電腦/手機上。",
"install_devices_router_list_2": "找到 DHCP/DNS 設定。尋找緊鄰著允許兩組或三組數字集的欄位之 DNS 字母,每組被拆成四個含有一至三個數字的群集。",
"install_devices_router_list_3": "在那裡輸入您的 AdGuard Home 伺服器位址。",
"install_devices_router_list_4": "您無法於某些類型的路由器上設定自訂的 DNS 伺服器。在這種情況下,如果您設置 AdGuard Home 作為 DHCP 伺服器,其可能有所幫助。否則,您應搜尋有關如何為您的特定路由器型號自訂 DNS 伺服器之用法說明。",
"install_devices_router_list_4": "您無法於某些類型的路由器上設定自訂的 DNS 伺服器。在這種情況下,如果您設置 AdGuard Home 作為 <0>DHCP 伺服器</0>,其可能有所幫助。否則,您應搜尋有關如何為您的特定路由器型號自訂 DNS 伺服器之用法說明。",
"install_devices_windows_list_1": "通過開始功能表或 Windows 搜尋,開啟控制台。",
"install_devices_windows_list_2": "去網路和網際網路類別,然後去網路和共用中心。",
"install_devices_windows_list_3": "於畫面之左側上找到變更介面卡設定並於它上點擊。",
@ -346,6 +361,7 @@
"form_enter_id": "輸入識別碼",
"form_add_id": "增加識別碼",
"form_client_name": "輸入用戶端名稱",
"name": "名稱",
"client_global_settings": "使用全域的設定",
"client_deleted": "用戶端 \"{{key}}\" 被成功地刪除",
"client_added": "用戶端 \"{{key}}\" 被成功地加入",
@ -445,6 +461,7 @@
"location": "位置",
"orgname": "組織名稱",
"netname": "網路名稱",
"network": "網路",
"descr": "說明",
"whois": "Whois",
"filtering_rules_learn_more": "<0>了解更多</0>有關創建您自己的主機hosts清單。",
@ -456,7 +473,7 @@
"disable_ipv6": "禁用 IPv6",
"disable_ipv6_desc": "如果此功能被啟用,所有對於 IPv6 位址(類型 AAAA的 DNS 查詢將被丟棄。",
"fastest_addr": "最快的 IP 位址",
"fastest_addr_desc": "查詢所有的 DNS 伺服器並返回在所有的回應之中最快的 IP 位址",
"fastest_addr_desc": "查詢所有的 DNS 伺服器並返回在所有的回應之中最快的 IP 位址。因為我們必須等待來自所有的 DNS 伺服器之回應,這將使 DNS 查詢變慢,但改善總體的連線。",
"autofix_warning_text": "如果您點擊\"修復\"AdGuard Home 將配置您的系統使用 AdGuard Home DNS 伺服器。",
"autofix_warning_list": "它將執行這些任務:<0>撤銷系統 DNSStubListener</0> <0>設定 DNS 伺服器位址為 127.0.0.1</0> <0>用 /run/systemd/resolve/resolv.conf 取代 /etc/resolv.conf 的符號連結目標</0> <0>停止 DNSStubListener重新載入 systemd 已解析的服務)</0>",
"autofix_warning_result": "因此,預設下,來自您的系統之所有的 DNS 請求將被 AdGuard Home 處理。",
@ -474,7 +491,7 @@
"check_reason": "原因:{{reason}}",
"check_rule": "規則:{{rule}}",
"check_service": "服務名稱:{{service}}",
"check_not_found": "未在您的過濾器清單中被找到",
"check_not_found": "未在您的過濾器中被找到",
"client_confirm_block": "您確定您想要封鎖該用戶端 \"{{ip}}\" 嗎?",
"client_confirm_unblock": "您確定您想要解除封鎖該用戶端 \"{{ip}}\" 嗎?",
"client_blocked": "用戶端 \"{{ip}}\" 被成功地封鎖",
@ -489,5 +506,19 @@
"list_updated": "{{count}} 清單被更新",
"list_updated_plural": "{{count}} 清單被更新",
"dnssec_enable": "啟用網域名稱系統安全性擴充功能DNSSEC",
"dnssec_enable_desc": "在發出的 DNS 查詢中設定 DNSSEC 標記並檢查該結果(已啟用 DNSSEC 的解析器是必須的)"
"dnssec_enable_desc": "在發出的 DNS 查詢中設定 DNSSEC 標記並檢查該結果(已啟用 DNSSEC 的解析器是必須的)",
"validated_with_dnssec": "已用網域名稱系統安全性擴充功能DNSSEC驗證",
"show_all_responses": "所有的回應",
"show_blocked_responses": "已封鎖的",
"show_whitelisted_responses": "已列入白名單的",
"show_processed_responses": "已處理的",
"blocked_safebrowsing": "被安全瀏覽封鎖",
"blocked_adult_websites": "已封鎖的成人網站",
"blocked_threats": "已封鎖的威脅",
"allowed": "已允許的",
"filtered": "已過濾的",
"rewritten": "已改寫的",
"safe_search": "安全搜尋",
"blocklist": "封鎖清單",
"milliseconds_abbreviation": "ms"
}

View File

@ -3,8 +3,8 @@ import i18next from 'i18next';
import apiClient from '../api/Api';
import { normalizeTextarea } from '../helpers/helpers';
import { ACTION } from '../helpers/constants';
import { addErrorToast, addSuccessToast } from './toasts';
import { BLOCK_ACTIONS } from '../helpers/constants';
export const getAccessListRequest = createAction('GET_ACCESS_LIST_REQUEST');
export const getAccessListFailure = createAction('GET_ACCESS_LIST_FAILURE');
@ -57,9 +57,9 @@ export const toggleClientBlock = (type, ip) => async (dispatch) => {
} = await apiClient.getAccessList();
let updatedDisallowedClients = disallowed_clients || [];
if (type === ACTION.unblock && updatedDisallowedClients.includes(ip)) {
if (type === BLOCK_ACTIONS.UNBLOCK && updatedDisallowedClients.includes(ip)) {
updatedDisallowedClients = updatedDisallowedClients.filter((client) => client !== ip);
} else if (type === ACTION.block && !updatedDisallowedClients.includes(ip)) {
} else if (type === BLOCK_ACTIONS.BLOCK && !updatedDisallowedClients.includes(ip)) {
updatedDisallowedClients.push(ip);
}
@ -72,9 +72,9 @@ export const toggleClientBlock = (type, ip) => async (dispatch) => {
await apiClient.setAccessList(values);
dispatch(toggleClientBlockSuccess(values));
if (type === ACTION.unblock) {
if (type === BLOCK_ACTIONS.UNBLOCK) {
dispatch(addSuccessToast(i18next.t('client_unblocked', { ip })));
} else if (type === ACTION.block) {
} else if (type === BLOCK_ACTIONS.BLOCK) {
dispatch(addSuccessToast(i18next.t('client_blocked', { ip })));
}
} catch (error) {

View File

@ -2,20 +2,23 @@ import { createAction } from 'redux-actions';
import apiClient from '../api/Api';
import { normalizeLogs, getParamsForClientsSearch, addClientInfo } from '../helpers/helpers';
import { TABLE_DEFAULT_PAGE_SIZE } from '../helpers/constants';
import { TABLE_DEFAULT_PAGE_SIZE, TABLE_FIRST_PAGE } from '../helpers/constants';
import { addErrorToast, addSuccessToast } from './toasts';
const getLogsWithParams = async (config) => {
const { older_than, filter, ...values } = config;
const rawLogs = await apiClient.getQueryLog({ ...filter, older_than });
const { data, oldest } = rawLogs;
const logs = normalizeLogs(data);
let logs = normalizeLogs(data);
const clientsParams = getParamsForClientsSearch(logs, 'client');
const clients = await apiClient.findClients(clientsParams);
const logsWithClientInfo = addClientInfo(logs, clients, 'client');
if (Object.keys(clientsParams).length > 0) {
const clients = await apiClient.findClients(clientsParams);
logs = addClientInfo(logs, clients, 'client');
}
return {
logs: logsWithClientInfo, oldest, older_than, filter, ...values,
logs, oldest, older_than, filter, ...values,
};
};
@ -56,6 +59,7 @@ const checkFilteredLogs = async (data, filter, dispatch, total) => {
export const setLogsPagination = createAction('LOGS_PAGINATION');
export const setLogsPage = createAction('SET_LOG_PAGE');
export const toggleDetailedLogs = createAction('TOGGLE_DETAILED_LOGS');
export const getLogsRequest = createAction('GET_LOGS_REQUEST');
export const getLogsFailure = createAction('GET_LOGS_FAILURE');
@ -93,7 +97,7 @@ export const setLogsFilter = (filter) => async (dispatch) => {
const updatedData = additionalData.logs ? { ...data, ...additionalData } : data;
dispatch(setLogsFilterSuccess({ ...updatedData, filter }));
dispatch(setLogsPage(0));
dispatch(setLogsPage(TABLE_FIRST_PAGE));
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(setLogsFilterFailure(error));

View File

@ -1,4 +1,9 @@
:root {
--yellow-pale: rgba(247, 181, 0, 0.1);
--green79: #67B279;
--gray-a5: #a5a5a5;
--gray-d8: #d8d8d8;
--gray-f3: #F3F3F3;
--font-family-monospace: Monaco, Menlo, "Ubuntu Mono", Consolas, source-code-pro, monospace;
}
@ -22,6 +27,16 @@ body {
}
}
@media screen and (max-width: 992px) {
.container {
padding: 0 !important;
}
.container--wrap {
min-height: calc(100vh);
}
}
.loading-bar {
position: fixed;
top: 0;
@ -31,10 +46,17 @@ body {
background: linear-gradient(45deg, rgba(99, 125, 120, 1) 0%, rgba(88, 177, 101, 1) 100%);
}
.hidden {
display: none;
@media (max-width: 575px) {
.container {
padding-right: 0;
padding-left: 0;
}
}
.font-monospace {
font-family: var(--font-family-monospace);
}
.mw-75 {
max-width: 75% !important;
}

View File

@ -94,7 +94,7 @@ class App extends Component {
)}
<LoadingBar className="loading-bar" updateTime={1000} />
<Route component={Header} />
<div className="container container--wrap">
<div className="container container--wrap pb-5">
{dashboard.processing && <Loading />}
{!dashboard.isCoreRunning && (
<div className="row row-cards">

View File

@ -32,17 +32,17 @@ const renderBlockingButton = (ipMatchListStatus, ip, handleClick, processing) =>
const buttonProps = ipMatchListStatus === IP_MATCH_LIST_STATUS.NOT_FOUND
? {
className: 'btn-outline-danger',
text: 'block_btn',
text: 'block',
type: 'block',
}
: {
className: 'btn-outline-secondary',
text: 'unblock_btn',
text: 'unblock',
type: 'unblock',
};
return (
<div className="table__action">
<div className="table__action button__action">
<button
type="button"
className={`btn btn-sm ${buttonProps.className}`}

View File

@ -10,7 +10,7 @@ import BlockedDomains from './BlockedDomains';
import PageTitle from '../ui/PageTitle';
import Loading from '../ui/Loading';
import { ACTION } from '../../helpers/constants';
import { BLOCK_ACTIONS } from '../../helpers/constants';
import './Dashboard.css';
class Dashboard extends Component {
@ -42,7 +42,7 @@ class Dashboard extends Component {
};
toggleClientStatus = (type, ip) => {
const confirmMessage = type === ACTION.block ? 'client_confirm_block' : 'client_confirm_unblock';
const confirmMessage = type === BLOCK_ACTIONS.BLOCK ? 'client_confirm_block' : 'client_confirm_unblock';
if (window.confirm(this.props.t(confirmMessage, { ip }))) {
this.props.toggleClientBlock(type, ip);

View File

@ -5,7 +5,7 @@ import { withTranslation } from 'react-i18next';
class Table extends Component {
cellWrap = ({ value }) => (
<div className="logs__row logs__row--overflow">
<div className="logs__row o-hidden">
<span className="logs__text" title={value}>
{value}
</span>
@ -31,7 +31,7 @@ class Table extends Component {
<div className="logs__row logs__row--center">
<button
type="button"
className="btn btn-icon btn-outline-secondary btn-sm"
className="btn btn-icon btn-icon--green btn-outline-secondary btn-sm"
onClick={() => this.props.handleDelete({
answer: value.row.answer,
domain: value.row.domain,
@ -59,16 +59,26 @@ class Table extends Component {
columns={this.columns}
loading={processing || processingAdd || processingDelete}
className="-striped -highlight card-table-overflow"
showPagination={true}
showPagination
defaultPageSize={10}
minRows={5}
previousText={t('previous_btn')}
nextText={t('next_btn')}
previousText={
<svg className="icons icon--small icon--gray">
<use xlinkHref="#arrow-left" />
</svg>}
nextText={
<svg className="icons icon--small icon--gray">
<use xlinkHref="#arrow-right" />
</svg>}
loadingText={t('loading_table_status')}
pageText={t('page_table_footer_text')}
ofText="/"
pageText=''
ofText=''
rowsText={t('rows_table_footer_text')}
noDataText={t('rewrite_not_found')}
showPageSizeOptions={false}
showPageJump={false}
renderTotalPagesCount={() => false}
getPaginationProps={() => ({ className: 'custom-pagination' })}
/>
);
}

View File

@ -48,7 +48,7 @@ class Table extends Component {
accessor: 'url',
minWidth: 200,
Cell: ({ value }) => (
<div className="logs__row logs__row--overflow">
<div className="logs__row o-hidden">
{isValidAbsolutePath(value) ? value
: <a
href={value}
@ -126,17 +126,26 @@ class Table extends Component {
<ReactTable
data={filters}
columns={this.columns}
showPagination={true}
showPagination
defaultPageSize={10}
showPageSizeOptions={false}
showPageJump={false}
renderTotalPagesCount={() => false}
loading={loading}
minRows={6}
previousText={t('previous_btn')}
nextText={t('next_btn')}
pageText=''
ofText=''
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')}
getPaginationProps={() => ({ className: 'custom-pagination' })}
previousText={
<svg className="icons icon--small icon--gray w-100 h-100">
<use xlinkHref="#arrow-left" />
</svg>}
nextText={
<svg className="icons icon--small icon--gray w-100 h-100">
<use xlinkHref="#arrow-right" />
</svg>}
/>
);
}

View File

@ -0,0 +1,106 @@
import React from 'react';
import { nanoid } from 'nanoid';
import classNames from 'classnames';
import PropTypes from 'prop-types';
import { formatClientCell } from '../../../helpers/formatClientCell';
import getHintElement from './getHintElement';
import { checkFiltered } from '../../../helpers/helpers';
import { BLOCK_ACTIONS } from '../../../helpers/constants';
const getClientCell = ({
row, t, isDetailed, toggleBlocking, autoClients, processingRules,
}) => {
const {
reason, client, domain, info: { name },
} = row.original;
const autoClient = autoClients.find((autoClient) => autoClient.name === client);
const country = autoClient && autoClient.whois_info && autoClient.whois_info.country;
const city = autoClient && autoClient.whois_info && autoClient.whois_info.city;
const network = autoClient && autoClient.whois_info && autoClient.whois_info.orgname;
const source = autoClient && autoClient.source;
const id = nanoid();
const data = {
address: client,
name,
country,
city,
network,
source_label: source,
};
const processedData = Object.entries(data);
const isFiltered = checkFiltered(reason);
const nameClass = classNames('w-90 o-hidden d-flex flex-column', {
'mt-2': isDetailed && !name,
'white-space--nowrap': isDetailed,
});
const hintClass = classNames('icons mr-4 icon--small cursor--pointer icon--light-gray', {
'my-3': isDetailed,
});
const renderBlockingButton = (isFiltered, domain) => {
const buttonType = isFiltered ? BLOCK_ACTIONS.UNBLOCK : BLOCK_ACTIONS.BLOCK;
const buttonClass = classNames('logs__action button__action', {
'btn-outline-secondary': isFiltered,
'btn-outline-danger': !isFiltered,
'logs__action--detailed': isDetailed,
});
const onClick = () => toggleBlocking(buttonType, domain);
return (
<div className={buttonClass}>
<button
type="button"
className={`btn btn-sm ${buttonClass}`}
onClick={onClick}
disabled={processingRules}
>
{t(buttonType)}
</button>
</div>
);
};
return (
<div className="logs__row o-hidden h-100">
{processedData && getHintElement({
className: hintClass,
columnClass: 'grid grid--limited',
tooltipClass: 'px-5 pb-5 pt-4 mw-75',
dataTip: true,
xlinkHref: 'question',
contentItemClass: 'text-truncate key-colon',
title: 'client_details',
content: processedData,
place: 'bottom',
})}
<div
className={nameClass}>
<div data-tip={true} data-for={id}>{formatClientCell(row, t, isDetailed)}</div>
{isDetailed && name
&& <div className="detailed-info d-none d-sm-block logs__text"
title={name}>{name}</div>}
</div>
{renderBlockingButton(isFiltered, domain)}
</div>
);
};
getClientCell.propTypes = {
row: PropTypes.object.isRequired,
t: PropTypes.func.isRequired,
isDetailed: PropTypes.bool.isRequired,
toggleBlocking: PropTypes.func.isRequired,
autoClients: PropTypes.array.isRequired,
processingRules: PropTypes.bool.isRequired,
};
export default getClientCell;

View File

@ -0,0 +1,28 @@
import React from 'react';
import { formatTime, formatDateTime } from '../../../helpers/helpers';
import {
DEFAULT_SHORT_DATE_FORMAT_OPTIONS,
DEFAULT_TIME_FORMAT,
} from '../../../helpers/constants';
const getDateCell = (row, isDetailed) => {
const { time } = row.original;
if (!time) {
return '';
}
const formattedTime = formatTime(time, DEFAULT_TIME_FORMAT);
const formattedDate = formatDateTime(time, DEFAULT_SHORT_DATE_FORMAT_OPTIONS);
return (
<div className="logs__cell">
<div className="logs__time" title={formattedTime}>{formattedTime}</div>
{isDetailed && <div className="detailed-info d-none d-sm-block text-truncate"
title={formattedDate}>{formattedDate}</div>}
</div>
);
};
export default getDateCell;

View File

@ -0,0 +1,121 @@
import React from 'react';
import classNames from 'classnames';
import PropTypes from 'prop-types';
import getHintElement from './getHintElement';
import {
DEFAULT_SHORT_DATE_FORMAT_OPTIONS,
LONG_TIME_FORMAT,
SCHEME_TO_PROTOCOL_MAP,
} from '../../../helpers/constants';
import { formatDateTime, formatTime } from '../../../helpers/helpers';
const getDomainCell = (props) => {
const {
row, t, isDetailed, dnssec_enabled,
} = props;
const {
tracker, type, answer_dnssec, client_proto, domain, time,
} = row.original;
const hasTracker = !!tracker;
const source = tracker && tracker.sourceData && tracker.sourceData.name;
const lockIconClass = classNames('icons', 'icon--small', 'd-none', 'd-sm-block', 'cursor--pointer', {
'icon--active': answer_dnssec,
'icon--disabled': !answer_dnssec,
'my-3': isDetailed,
});
const privacyIconClass = classNames('icons', 'mx-2', 'icon--small', 'd-none', 'd-sm-block', 'cursor--pointer', {
'icon--active': hasTracker,
'icon--disabled': !hasTracker,
'my-3': isDetailed,
});
const dnssecHint = getHintElement({
className: lockIconClass,
tooltipClass: 'py-4 px-5 pb-45',
dataTip: answer_dnssec,
xlinkHref: 'lock',
columnClass: 'w-100',
content: 'validated_with_dnssec',
place: 'bottom',
});
const protocol = t(SCHEME_TO_PROTOCOL_MAP[client_proto]) || '';
const ip = type ? `${t('type_table_header')}: ${type}` : '';
const requestDetailsObj = {
time_table_header: formatTime(time, LONG_TIME_FORMAT),
date: formatDateTime(time, DEFAULT_SHORT_DATE_FORMAT_OPTIONS),
domain,
type_table_header: type,
protocol,
};
const knownTrackerDataObj = {
name_table_header: tracker && tracker.name,
category_label: tracker && tracker.category,
source_label: source && <a href={`//${source}`} className="link--green">{source}</a>,
};
const renderGrid = (content, idx) => {
const preparedContent = typeof content === 'string' ? t(content) : content;
const className = classNames('text-truncate key-colon o-hidden', {
'word-break--break-all white-space--normal': preparedContent.length > 100,
});
return <div key={idx} className={className}>{preparedContent}</div>;
};
const getGrid = (contentObj, title, className) => [
<div key={title} className={classNames('pb-2 grid--title', className)}>{t(title)}</div>,
<div key={`${title}-1`} className="grid grid--limited">{React.Children.map(Object.entries(contentObj), renderGrid)}</div>,
];
const requestDetails = getGrid(requestDetailsObj, 'request_details');
const renderContent = hasTracker ? requestDetails.concat(getGrid(knownTrackerDataObj, 'known_tracker', 'pt-4')) : requestDetails;
const trackerHint = getHintElement({
className: privacyIconClass,
tooltipClass: 'pt-4 pb-5 px-5 mw-75',
dataTip: true,
xlinkHref: 'privacy',
contentItemClass: 'key-colon',
renderContent,
place: 'bottom',
});
const valueClass = classNames('w-100', {
'px-2 d-flex justify-content-center flex-column': isDetailed,
});
const details = [ip, protocol].filter(Boolean)
.join(', ');
return (
<div className="logs__row o-hidden">
{dnssec_enabled && dnssecHint}
{trackerHint}
<div className={valueClass}>
<div className="text-truncate" title={domain}>{domain}</div>
{details && isDetailed
&& <div className="detailed-info d-none d-sm-block text-truncate"
title={details}>{details}</div>}
</div>
</div>
);
};
getDomainCell.propTypes = {
row: PropTypes.object.isRequired,
t: PropTypes.func.isRequired,
isDetailed: PropTypes.bool.isRequired,
toggleBlocking: PropTypes.func.isRequired,
autoClients: PropTypes.array.isRequired,
dnssec_enabled: PropTypes.bool.isRequired,
};
export default getDomainCell;

View File

@ -0,0 +1,76 @@
import React, { useState } from 'react';
import PropTypes from 'prop-types';
import CustomTooltip from '../Tooltip/CustomTooltip';
const getHintElement = ({
className,
contentItemClass,
columnClass,
dataTip,
xlinkHref,
content,
title,
place,
tooltipClass,
trigger,
overridePosition,
scrollHide,
renderContent,
}) => {
const id = 'id';
const [isHovered, hover] = useState(false);
const openTooltip = () => hover(true);
const closeTooltip = () => hover(false);
return <div onMouseEnter={openTooltip}
onMouseLeave={closeTooltip}>
<div data-tip={dataTip}
data-for={dataTip ? id : undefined}
data-event={trigger}
>
{xlinkHref && <svg className={className}>
<use xlinkHref={`#${xlinkHref}`} />
</svg>}
</div>
{isHovered && dataTip
&& <CustomTooltip
className={tooltipClass}
id={id}
columnClass={columnClass}
contentItemClass={contentItemClass}
title={title}
place={place}
content={content}
trigger={trigger}
overridePosition={overridePosition}
scrollHide={scrollHide}
renderContent={renderContent}
/>}
</div>;
};
getHintElement.propTypes = {
className: PropTypes.string,
contentItemClass: PropTypes.string,
columnClass: PropTypes.string,
tooltipClass: PropTypes.string,
title: PropTypes.string,
place: PropTypes.string,
dataTip: PropTypes.string,
xlinkHref: PropTypes.string,
overridePosition: PropTypes.func,
scrollHide: PropTypes.bool,
trigger: PropTypes.oneOfType([
PropTypes.string,
PropTypes.arrayOf(PropTypes.string),
]),
content: PropTypes.oneOfType([
PropTypes.string,
PropTypes.array,
]),
renderContent: PropTypes.arrayOf(PropTypes.element),
};
export default getHintElement;

View File

@ -0,0 +1,120 @@
import React from 'react';
import classNames from 'classnames';
import { formatElapsedMs } from '../../../helpers/helpers';
import {
CUSTOM_FILTERING_RULES_ID,
FILTERED_STATUS,
FILTERED_STATUS_TO_META_MAP,
} from '../../../helpers/constants';
import getHintElement from './getHintElement';
const getFilterName = (filters, whitelistFilters, filterId, t) => {
if (filterId === CUSTOM_FILTERING_RULES_ID) {
return t('custom_filter_rules');
}
const filter = filters.find((filter) => filter.id === filterId)
|| whitelistFilters.find((filter) => filter.id === filterId);
let filterName = '';
if (filter) {
filterName = filter.name;
}
if (!filterName) {
filterName = t('unknown_filter', { filterId });
}
return filterName;
};
const getResponseCell = (row, filtering, t, isDetailed) => {
const {
reason, filterId, rule, status, upstream, elapsedMs, domain, response,
} = row.original;
const { filters, whitelistFilters } = filtering;
const formattedElapsedMs = formatElapsedMs(elapsedMs, t);
const statusLabel = t((FILTERED_STATUS_TO_META_MAP[reason]
&& FILTERED_STATUS_TO_META_MAP[reason].label) || reason);
const boldStatusLabel = <span className="font-weight-bold">{statusLabel}</span>;
const filter = getFilterName(filters, whitelistFilters, filterId, t);
const renderResponses = (responseArr) => {
if (responseArr.length === 0) {
return '';
}
return <div>{responseArr.map((response) => {
const className = classNames('white-space--nowrap', {
'white-space--normal': response.length > 100,
});
return <div key={response} className={className}>{`${response}\n`}</div>;
})}</div>;
};
const FILTERED_STATUS_TO_FIELDS_MAP = {
[FILTERED_STATUS.NOT_FILTERED_NOT_FOUND]: {
domain,
encryption_status: boldStatusLabel,
install_settings_dns: upstream,
elapsed: formattedElapsedMs,
response_code: status,
response_table_header: renderResponses(response),
},
[FILTERED_STATUS.FILTERED_BLOCKED_SERVICE]: {
domain,
encryption_status: boldStatusLabel,
filter,
rule_label: rule,
response_code: status,
},
[FILTERED_STATUS.FILTERED_SAFE_SEARCH]: {
domain,
encryption_status: boldStatusLabel,
install_settings_dns: upstream,
elapsed: formattedElapsedMs,
response_code: status,
},
[FILTERED_STATUS.FILTERED_BLACK_LIST]: {
domain,
encryption_status: boldStatusLabel,
install_settings_dns: upstream,
elapsed: formattedElapsedMs,
response_code: status,
},
};
const fields = FILTERED_STATUS_TO_FIELDS_MAP[reason]
? Object.entries(FILTERED_STATUS_TO_FIELDS_MAP[reason])
: Object.entries(FILTERED_STATUS_TO_FIELDS_MAP.NotFilteredNotFound);
const detailedInfo = reason === FILTERED_STATUS.FILTERED_BLOCKED_SERVICE
|| reason === FILTERED_STATUS.FILTERED_BLACK_LIST
? filter : formattedElapsedMs;
return (
<div className="logs__row">
{fields && getHintElement({
className: classNames('icons mr-4 icon--small cursor--pointer icon--light-gray', { 'my-3': isDetailed }),
columnClass: 'grid grid--limited',
tooltipClass: 'px-5 pb-5 pt-4 mw-75 custom-tooltip__response-details',
contentItemClass: 'text-truncate key-colon o-hidden',
dataTip: true,
xlinkHref: 'question',
title: 'response_details',
content: fields,
place: 'bottom',
})}
<div className="text-truncate">
<div className="text-truncate" title={statusLabel}>{statusLabel}</div>
{isDetailed && <div
className="detailed-info d-none d-sm-block pt-1 text-truncate" title={detailedInfo}>{detailedInfo}</div>}
</div>
</div>
);
};
export default getResponseCell;

View File

@ -0,0 +1,30 @@
import React, { Fragment } from 'react';
import { Trans } from 'react-i18next';
import { HashLink as Link } from 'react-router-hash-link';
import Card from '../ui/Card';
const Disabled = () => (
<Fragment>
<div className="page-header">
<h1 className="page-title page-title--large">
<Trans>query_log</Trans>
</h1>
</div>
<Card>
<div className="lead text-center py-6">
<Trans
components={[
<Link to="/settings#logs-config" key="0">
link
</Link>,
]}
>
query_log_disabled
</Trans>
</div>
</Card>
</Fragment>
);
export default Disabled;

View File

@ -1,11 +1,9 @@
import React, { Fragment } from 'react';
import React from 'react';
import PropTypes from 'prop-types';
import { Field, reduxForm } from 'redux-form';
import { withTranslation } from 'react-i18next';
import flow from 'lodash/flow';
import { renderInputField } from '../../../helpers/form';
import { FORM_NAME, RESPONSE_FILTER } from '../../../helpers/constants';
import { useTranslation } from 'react-i18next';
import debounce from 'lodash/debounce';
import { DEBOUNCE_FILTER_TIMEOUT, FORM_NAME, RESPONSE_FILTER } from '../../../helpers/constants';
import Tooltip from '../../ui/Tooltip';
const renderFilterField = ({
@ -18,25 +16,28 @@ const renderFilterField = ({
autoComplete,
tooltip,
meta: { touched, error },
}) => <Fragment>
<div className="logs__input-wrap">
<input
{...input}
id={id}
placeholder={placeholder}
type={type}
className={className}
disabled={disabled}
autoComplete={autoComplete}
/>
<span className="logs__notice">
}) => <>
<div className="input-group-search">
<svg className="icons icon--small icon--gray">
<use xlinkHref="#magnifier" />
</svg>
</div>
<input
{...input}
id={id}
placeholder={placeholder}
type={type}
className={className}
disabled={disabled}
autoComplete={autoComplete}
aria-label={placeholder} />
<span className="logs__notice">
<Tooltip text={tooltip} type='tooltip-custom--logs' />
</span>
{!disabled
&& touched
&& (error && <span className="form__message form__message--error">{error}</span>)}
</div>
</Fragment>;
{!disabled
&& touched
&& (error && <span className="form__message form__message--error">{error}</span>)}
</>;
renderFilterField.propTypes = {
input: PropTypes.object.isRequired,
@ -55,62 +56,47 @@ renderFilterField.propTypes = {
const Form = (props) => {
const {
t,
handleChange,
className = '',
responseStatusClass,
submit,
} = props;
const [t] = useTranslation();
const debouncedSubmit = debounce(submit, DEBOUNCE_FILTER_TIMEOUT);
const zeroDelaySubmit = () => setTimeout(submit, 0);
return (
<form onSubmit={handleChange}>
<div className="row">
<div className="col-6 col-sm-3 my-2">
<Field
id="filter_domain"
name="filter_domain"
component={renderFilterField}
type="text"
className="form-control"
placeholder={t('domain_name_table_header')}
tooltip={t('query_log_strict_search')}
onChange={handleChange}
/>
</div>
<div className="col-6 col-sm-3 my-2">
<Field
id="filter_question_type"
name="filter_question_type"
component={renderInputField}
type="text"
className="form-control"
placeholder={t('type_table_header')}
onChange={handleChange}
/>
</div>
<div className="col-6 col-sm-3 my-2">
<Field
name="filter_response_status"
component="select"
className="form-control custom-select"
>
<option value={RESPONSE_FILTER.ALL}>
{t('show_all_filter_type')}
</option>
<option value={RESPONSE_FILTER.FILTERED}>
{t('show_filtered_type')}
</option>
</Field>
</div>
<div className="col-6 col-sm-3 my-2">
<Field
id="filter_client"
name="filter_client"
component={renderFilterField}
type="text"
className="form-control"
placeholder={t('client_table_header')}
tooltip={t('query_log_strict_search')}
onChange={handleChange}
/>
</div>
<form className="d-flex flex-wrap form-control--container"
onSubmit={(e) => {
e.preventDefault();
zeroDelaySubmit();
debouncedSubmit.cancel();
}}
>
<Field
id="search"
name="search"
component={renderFilterField}
type="text"
className={`form-control--search form-control--transparent ${className}`}
placeholder={t('domain_or_client')}
tooltip={t('query_log_strict_search')}
onChange={debouncedSubmit}
/>
<div className="field__select">
<Field
name="response_status"
component="select"
className={`form-control custom-select custom-select--logs custom-select__arrow--left ml-small form-control--transparent ${responseStatusClass}`}
onChange={zeroDelaySubmit}
>
{Object.values(RESPONSE_FILTER)
.map(({
query, label, disabled,
}) => <option key={label} value={query}
disabled={disabled}>{t(label)}</option>)}
</Field>
</div>
</form>
);
@ -118,12 +104,11 @@ const Form = (props) => {
Form.propTypes = {
handleChange: PropTypes.func,
t: PropTypes.func.isRequired,
className: PropTypes.string,
responseStatusClass: PropTypes.string,
submit: PropTypes.func.isRequired,
};
export default flow([
withTranslation(),
reduxForm({
form: FORM_NAME.LOGS_FILTER,
}),
])(Form);
export default reduxForm({
form: FORM_NAME.LOGS_FILTER,
})(Form);

View File

@ -1,52 +1,48 @@
import React, { Component } from 'react';
import React from 'react';
import PropTypes from 'prop-types';
import debounce from 'lodash/debounce';
import classnames from 'classnames';
import { DEBOUNCE_FILTER_TIMEOUT, RESPONSE_FILTER } from '../../../helpers/constants';
import { isValidQuestionType } from '../../../helpers/helpers';
import { Trans } from 'react-i18next';
import { useDispatch } from 'react-redux';
import Form from './Form';
import Card from '../../ui/Card';
import { setLogsFilter } from '../../../actions/queryLogs';
class Filters extends Component {
getFilters = ({
filter_domain, filter_question_type, filter_response_status, filter_client,
}) => ({
filter_domain: filter_domain || '',
filter_question_type: isValidQuestionType(filter_question_type) ? filter_question_type.toUpperCase() : '',
filter_response_status: filter_response_status === RESPONSE_FILTER.FILTERED ? filter_response_status : '',
filter_client: filter_client || '',
});
const Filters = ({ filter, refreshLogs, setIsLoading }) => {
const dispatch = useDispatch();
handleFormChange = debounce((values) => {
const filter = this.getFilters(values);
this.props.setLogsFilter(filter);
}, DEBOUNCE_FILTER_TIMEOUT);
const onSubmit = async (values) => {
setIsLoading(true);
await dispatch(setLogsFilter(values));
setIsLoading(false);
};
render() {
const { filter, processingAdditionalLogs } = this.props;
return (
<div className="page-header page-header--logs">
<h1 className="page-title page-title--large">
<Trans>query_log</Trans>
<button
type="button"
className="btn btn-icon--green ml-3 bg-transparent"
onClick={refreshLogs}
>
<svg className="icons icon--small">
<use xlinkHref="#update" />
</svg>
</button>
const cardBodyClass = classnames({
'card-body': true,
'card-body--loading': processingAdditionalLogs,
});
return (
<Card bodyType={cardBodyClass}>
<Form
initialValues={filter}
onChange={this.handleFormChange}
/>
</Card>
);
}
}
</h1>
<Form
responseStatusClass="d-sm-block"
initialValues={filter}
onSubmit={onSubmit}
/>
</div>
);
};
Filters.propTypes = {
filter: PropTypes.object.isRequired,
setLogsFilter: PropTypes.func.isRequired,
refreshLogs: PropTypes.func.isRequired,
processingGetLogs: PropTypes.bool.isRequired,
processingAdditionalLogs: PropTypes.bool.isRequired,
setIsLoading: PropTypes.func.isRequired,
};
export default Filters;

View File

@ -1,8 +1,15 @@
:root {
--gray-4d: #4D4D4D;
--gray-8: #888;
--danger: #DF3812;
}
.logs__row {
position: relative;
display: flex;
align-items: center;
min-height: 26px;
overflow: hidden;
text-overflow: ellipsis;
}
.logs__row--center {
@ -15,10 +22,6 @@
justify-content: center;
}
.logs__row--overflow {
overflow: hidden;
}
.logs__row--icons {
max-width: 180px;
flex-flow: row wrap;
@ -35,6 +38,15 @@
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
font-size: 1rem;
font-family: var(--font-family-sans-serif);
color: var(--gray-4d);
letter-spacing: 0;
line-height: 1.5rem;
}
.logs__text--bold {
font-weight: bold;
}
.logs__text--full {
@ -51,6 +63,11 @@
white-space: normal;
}
.logs__text--nowrap {
line-height: 1.4;
white-space: nowrap;
}
.logs__text--whois {
line-height: 1.2;
}
@ -61,11 +78,18 @@
margin-right: 5px;
}
.logs__action,
.table__action {
position: absolute;
top: 11px;
right: 15px;
.tooltip__option {
height: 2.5rem !important;
width: 10.5rem;
padding: 0.3125rem 1.5rem 0.6875rem;
}
.tooltip__option:hover {
background-color: var(--gray-f3);
cursor: pointer;
}
.button__action {
background-color: #fff;
border-radius: 4px;
transition: opacity 0.2s ease, visibility 0.2s ease;
@ -73,11 +97,31 @@
opacity: 0;
}
.table__action {
position: absolute;
top: 11px;
right: 15px;
}
.logs__action {
position: absolute;
top: 0;
right: 1rem;
}
.logs__action--detailed {
top: 5px;
}
.logs__table .rt-td,
.clients__table .rt-td {
position: relative;
}
.logs__table .rt-thead, .logs__table .rt-tbody {
min-width: 100% !important;
}
.logs__table .rt-tr:hover .logs__action,
.clients__table .rt-tr:hover .table__action {
visibility: visible;
@ -152,14 +196,14 @@
}
.logs__notice {
position: absolute;
position: relative;
z-index: 1;
top: 8px;
right: 10px;
margin-top: 3px;
font-size: 12px;
top: 0.5rem;
right: 2rem;
margin-top: 0.1875rem;
font-size: 0.75rem;
text-align: left;
color: #a5a5a5;
color: var(--gray-a5);
}
.logs__whois {
@ -185,3 +229,348 @@
margin-right: 1px;
opacity: 0.5;
}
/* New logs */
.logs__table {
background-color: #fff;
border: 0;
border-radius: 8px;
min-height: 42rem;
max-width: 71rem;
}
.logs__table--detailed {
min-height: 50rem;
}
.logs__table .rt-thead.-header {
box-shadow: none;
font-weight: bold;
}
.logs__table .rt-thead .rt-th {
padding: 0.9375rem 0.9375rem 0.875rem 0;
text-align: left;
border-right: 0;
}
.logs__table .rt-tbody .rt-td {
padding: 1rem 1rem 0.5rem 0;
border-right: 0;
}
.logs__table .rt-thead .rt-th:last-child,
.logs__table .rt-tbody .rt-td:last-child {
padding-right: 0;
}
.logs__table .rt-tbody .rt-tr-group {
border-bottom: 0;
}
.logs__table .rt-tr {
position: relative;
padding: 0 24px;
}
.logs__table .rt-tr {
position: relative;
padding: 0 1.5rem;
}
.logs__table .rt-tr-group:not(:first-child) .rt-tr:before {
content: "";
position: absolute;
left: 1.5rem;
right: 1.5rem;
top: 0;
width: calc(100% - 3rem);
height: 2px;
background-color: rgba(216, 216, 216, 0.23);
}
.logs__table .rt-tr-group:last-child .rt-tr:after,
.logs__table .rt-thead .rt-tr:after {
display: none;
}
.logs__time {
font-size: 1rem;
line-height: 1.5;
}
.detailed-info {
font-size: 0.8rem;
line-height: 1.4;
color: #888888;
}
.icon--selected {
background-color: var(--gray-f3);
border: solid 1px var(--gray-d8);
border-radius: 4px;
}
/* Hide 3 and 4 column on mobile */
.logs__table .rt-thead .rt-th:nth-child(3),
.logs__table .rt-thead .rt-th:nth-child(4),
.logs__table .rt-tbody .rt-td:nth-child(3),
.logs__table .rt-tbody .rt-td:nth-child(4) {
display: none;
}
@media screen and (min-width: 768px) {
.logs__table .rt-thead .rt-th:nth-child(3),
.logs__table .rt-thead .rt-th:nth-child(4),
.logs__table .rt-tbody .rt-td:nth-child(3),
.logs__table .rt-tbody .rt-td:nth-child(4) {
display: block;
}
}
.text-pre {
white-space: pre-wrap !important;
overflow-wrap: break-word;
overflow: visible;
}
.custom-pagination {
width: 11.875rem !important;
background-color: transparent;
box-shadow: none !important;
border: none !important;
align-items: center !important;
}
.custom-pagination--padding {
padding: 2.5rem 0 2.5rem !important;
}
.custom-pagination .-btn {
--side-size: 2rem;
background-color: transparent !important;
border: 1px solid var(--gray-d8) !important;
border-radius: 4px !important;
width: var(--side-size) !important;
height: var(--side-size) !important;
}
.custom-pagination .-btn:enabled:hover {
background-color: var(--gray-f3) !important;
}
.custom-pagination .-previous {
flex: 0 1 !important;
}
.custom-pagination .-next {
flex: 0 1 !important;
}
.custom-pagination .-btn {
display: flex !important;
}
.-pageInfo {
--side-size: 2rem;
font-variant-numeric: tabular-nums !important;
background-color: transparent !important;
border: 1px solid var(--gray-d8) !important;
border-radius: 4px !important;
width: var(--side-size) !important;
height: var(--side-size) !important;
margin: 0 !important;
display: flex !important;
justify-content: center;
align-items: center;
}
.pagination-bottom {
justify-content: center !important;
display: flex !important;
}
.-center:before {
content: '...';
transform: translateY(-0.25rem);
margin: auto;
}
.-center:after {
content: '...';
transform: translateY(-0.25rem);
margin: auto;
}
.icon--detailed-info {
position: absolute;
right: 0;
top: 0.5rem;
}
.icon--light-gray {
color: var(--gray-8);
}
.link--green {
color: var(--green79);
}
.row--detailed {
height: 4.9rem
}
.w-90 {
max-width: 90% !important;
}
.h-85 {
height: 85% !important;
}
.pt-45 {
padding-top: 1.25rem !important;
}
.pb-45 {
padding-bottom: 1.25rem !important;
}
.py-45 {
padding-top: 1.25rem !important;
padding-bottom: 1.25rem !important;
}
.mh-100 {
max-height: 100% !important;
}
.cursor--pointer {
cursor: pointer;
}
.custom-select__arrow--left {
background: #fff url('./chevron-down.svg') no-repeat left 0.2rem center;
background-size: 1.5rem;
}
.custom-select--logs {
padding: 0.5rem 0.75rem 0.5rem 1.75rem !important;
}
.bg--danger {
color: var(--danger);
}
.ml-small {
margin-left: 3.3125rem;
}
.form-control--search {
width: 39.125rem;
box-shadow: 0 1px 0 #ddd;
padding: 0 2.5rem;
height: 2.25rem;
}
.form-control--transparent {
border: 0 solid transparent !important;
background-color: transparent !important;
}
.input-group-search {
background-color: transparent;
position: relative;
left: 2rem;
top: 0.4rem;
width: 1.5rem;
height: 1.5rem;
}
.form-control--container {
max-width: 100%;
}
@media (max-width: 1279.98px) {
.form-control--search {
max-width: 30.125rem;
}
.form-control--container {
max-width: 70%;
}
.form-control--search {
max-width: 50%;
}
}
@media (max-width: 991.98px) {
.form-control--search {
max-width: 40%;
}
.form-control--container {
max-width: 100%;
}
}
@media (max-width: 767.98px) {
.rt-tr .logs__row .logs__text {
max-width: calc(100% - 1.5rem);
}
.ml-small {
margin-left: 1.5rem;
}
}
@media (max-width: 575px) {
.logs__table .rt-tr {
height: 3.125rem;
}
.logs__table .rt-tbody .rt-td {
padding: 0.625rem 1rem 0.875rem 0;
}
.logs__table {
min-height: 42rem;
}
}
@media (max-width: 500px) {
.form-control--search {
max-width: 85%;
}
.field__select {
margin-top: 1.5rem;
}
}
.loading__container > .-loading-inner {
top: 10rem !important;
bottom: initial !important;
}
.loading__text {
transform: translateY(3rem);
}
/*reset position to make absolute position of tooltip on tablets, may cause problems https://github.com/wwayne/react-tooltip/issues/204*/
@media (hover: none) {
.logs__action {
top: 1rem !important;
right: 1rem;
}
.logs__table .rt-td,
.clients__table .rt-td {
position: initial;
}
.logs__row {
position: initial;
}
}

View File

@ -0,0 +1,399 @@
import React from 'react';
import PropTypes from 'prop-types';
import { useTranslation, Trans } from 'react-i18next';
import ReactTable from 'react-table';
import classNames from 'classnames';
import endsWith from 'lodash/endsWith';
import escapeRegExp from 'lodash/escapeRegExp';
import {
BLOCK_ACTIONS,
DEFAULT_SHORT_DATE_FORMAT_OPTIONS,
LONG_TIME_FORMAT,
FILTERED_STATUS_TO_META_MAP,
TABLE_DEFAULT_PAGE_SIZE,
SCHEME_TO_PROTOCOL_MAP,
} from '../../helpers/constants';
import getDateCell from './Cells/getDateCell';
import getDomainCell from './Cells/getDomainCell';
import getClientCell from './Cells/getClientCell';
import getResponseCell from './Cells/getResponseCell';
import {
checkFiltered,
formatDateTime,
formatElapsedMs,
formatTime,
} from '../../helpers/helpers';
import Loading from '../ui/Loading';
const Table = (props) => {
const {
setDetailedDataCurrent,
setButtonType,
setModalOpened,
isSmallScreen,
setIsLoading,
filtering,
isDetailed,
toggleDetailedLogs,
setLogsPage,
setLogsPagination,
processingGetLogs,
logs,
pages,
page,
isLoading,
} = props;
const [t] = useTranslation();
const toggleBlocking = (type, domain) => {
const {
setRules, getFilteringStatus, addSuccessToast,
} = props;
const { userRules } = filtering;
const lineEnding = !endsWith(userRules, '\n') ? '\n' : '';
const baseRule = `||${domain}^$important`;
const baseUnblocking = `@@${baseRule}`;
const blockingRule = type === BLOCK_ACTIONS.BLOCK ? baseUnblocking : baseRule;
const unblockingRule = type === BLOCK_ACTIONS.BLOCK ? baseRule : baseUnblocking;
const preparedBlockingRule = new RegExp(`(^|\n)${escapeRegExp(blockingRule)}($|\n)`);
const preparedUnblockingRule = new RegExp(`(^|\n)${escapeRegExp(unblockingRule)}($|\n)`);
const matchPreparedBlockingRule = userRules.match(preparedBlockingRule);
const matchPreparedUnblockingRule = userRules.match(preparedUnblockingRule);
if (matchPreparedBlockingRule) {
setRules(userRules.replace(`${blockingRule}`, ''));
addSuccessToast(`${t('rule_removed_from_custom_filtering_toast')}: ${blockingRule}`);
} else if (!matchPreparedUnblockingRule) {
setRules(`${userRules}${lineEnding}${unblockingRule}\n`);
addSuccessToast(`${t('rule_added_to_custom_filtering_toast')}: ${unblockingRule}`);
} else if (matchPreparedUnblockingRule) {
addSuccessToast(`${t('rule_added_to_custom_filtering_toast')}: ${unblockingRule}`);
return;
} else if (!matchPreparedBlockingRule) {
addSuccessToast(`${t('rule_removed_from_custom_filtering_toast')}: ${blockingRule}`);
return;
}
getFilteringStatus();
};
const columns = [
{
Header: t('time_table_header'),
accessor: 'time',
Cell: (row) => getDateCell(row, isDetailed),
minWidth: 70,
maxHeight: 60,
headerClassName: 'logs__text',
},
{
Header: t('request_table_header'),
accessor: 'domain',
Cell: (row) => {
const {
isDetailed,
autoClients,
dnssec_enabled,
} = props;
return getDomainCell({
row,
t,
isDetailed,
toggleBlocking,
autoClients,
dnssec_enabled,
});
},
minWidth: 180,
maxHeight: 60,
headerClassName: 'logs__text',
},
{
Header: t('response_table_header'),
accessor: 'response',
Cell: (row) => getResponseCell(
row,
filtering,
t,
isDetailed,
),
minWidth: 150,
maxHeight: 60,
headerClassName: 'logs__text',
},
{
Header: () => {
const plainSelected = classNames('cursor--pointer', {
'icon--selected': !isDetailed,
});
const detailedSelected = classNames('cursor--pointer', {
'icon--selected': isDetailed,
});
return <div className="d-flex justify-content-between">
{t('client_table_header')}
{<span>
<svg
className={`icons icon--small icon--active mr-2 cursor--pointer ${plainSelected}`}
onClick={() => toggleDetailedLogs(false)}
>
<title><Trans>compact</Trans></title>
<use xlinkHref='#list' />
</svg>
<svg
className={`icons icon--small icon--active cursor--pointer ${detailedSelected}`}
onClick={() => toggleDetailedLogs(true)}
>
<title><Trans>default</Trans></title>
<use xlinkHref='#detailed_list' />
</svg>
</span>}
</div>;
},
accessor: 'client',
Cell: (row) => {
const {
isDetailed,
autoClients,
filtering: { processingRules },
} = props;
return getClientCell({
row,
t,
isDetailed,
toggleBlocking,
autoClients,
processingRules,
});
},
minWidth: 123,
maxHeight: 60,
headerClassName: 'logs__text',
},
];
const changePage = async (page) => {
setIsLoading(true);
const { oldest, getLogs, pages } = props;
const isLastPage = pages && (page + 1 === pages);
await Promise.all([
setLogsPage(page),
setLogsPagination({
page,
pageSize: TABLE_DEFAULT_PAGE_SIZE,
}),
].concat(isLastPage ? getLogs(oldest, page) : []));
setIsLoading(false);
};
const tableClass = classNames('logs__table', {
'logs__table--detailed': isDetailed,
});
return (
<ReactTable
manual
minRows={0}
page={page}
pages={pages}
columns={columns}
filterable={false}
sortable={false}
resizable={false}
data={logs || []}
loading={isLoading}
showPageJump={false}
showPageSizeOptions={false}
onPageChange={changePage}
className={tableClass}
defaultPageSize={TABLE_DEFAULT_PAGE_SIZE}
loadingText={
<>
<Loading />
<h6 className="loading__text">{t('loading_table_status')}</h6>
</>
}
getLoadingProps={() => ({ className: 'loading__container' })}
rowsText={t('rows_table_footer_text')}
noDataText={!processingGetLogs
&& <label className="logs__text logs__text--bold">{t('nothing_found')}</label>}
pageText=''
ofText=''
showPagination={logs.length > 0}
getPaginationProps={() => ({ className: 'custom-pagination custom-pagination--padding' })}
getTbodyProps={() => ({ className: 'd-block' })}
previousText={
<svg className="icons icon--small icon--gray w-100 h-100 cursor--pointer">
<title><Trans>previous_btn</Trans></title>
<use xlinkHref="#arrow-left" />
</svg>}
nextText={
<svg className="icons icon--small icon--gray w-100 h-100 cursor--pointer">
<title><Trans>next_btn</Trans></title>
<use xlinkHref="#arrow-right" />
</svg>}
renderTotalPagesCount={() => false}
getTrGroupProps={(_state, rowInfo) => {
if (!rowInfo) {
return {};
}
const { reason } = rowInfo.original;
const colorClass = FILTERED_STATUS_TO_META_MAP[reason] ? FILTERED_STATUS_TO_META_MAP[reason].color : 'white';
return { className: colorClass };
}}
getTrProps={(state, rowInfo) => ({
className: isDetailed ? 'row--detailed' : '',
onClick: () => {
if (isSmallScreen) {
const { dnssec_enabled, autoClients } = props;
const {
answer_dnssec,
client,
domain,
elapsedMs,
info,
reason,
response,
time,
tracker,
upstream,
type,
client_proto,
} = rowInfo.original;
const hasTracker = !!tracker;
const autoClient = autoClients.find(
(autoClient) => autoClient.name === client,
);
const country = autoClient && autoClient.whois_info
&& autoClient.whois_info.country;
const network = autoClient && autoClient.whois_info
&& autoClient.whois_info.orgname;
const city = autoClient && autoClient.whois_info
&& autoClient.whois_info.city;
const source = autoClient && autoClient.source;
const formattedElapsedMs = formatElapsedMs(elapsedMs, t);
const isFiltered = checkFiltered(reason);
const buttonType = isFiltered ? BLOCK_ACTIONS.UNBLOCK : BLOCK_ACTIONS.BLOCK;
const onToggleBlock = () => {
toggleBlocking(buttonType, domain);
};
const tracker_source = tracker && tracker.sourceData
&& tracker.sourceData.name;
const status = t((FILTERED_STATUS_TO_META_MAP[reason]
&& FILTERED_STATUS_TO_META_MAP[reason].label) || reason);
const statusBlocked = <div className="bg--danger">{status}</div>;
const protocol = t(SCHEME_TO_PROTOCOL_MAP[client_proto]) || '';
const detailedData = {
time_table_header: formatTime(time, LONG_TIME_FORMAT),
date: formatDateTime(time, DEFAULT_SHORT_DATE_FORMAT_OPTIONS),
encryption_status: status,
domain,
type_table_header: type,
protocol,
known_tracker: hasTracker && 'title',
table_name: hasTracker && tracker.name,
category_label: hasTracker && tracker.category,
tracker_source: hasTracker && tracker_source && <a href={`//${source}`}
className="link--green">{tracker_source}</a>,
response_details: 'title',
install_settings_dns: upstream,
elapsed: formattedElapsedMs,
response_table_header: response && response.join('\n'),
client_details: 'title',
ip_address: client,
name: info && info.name,
country,
city,
network,
source_label: source,
validated_with_dnssec: dnssec_enabled ? Boolean(answer_dnssec) : false,
[buttonType]: <div onClick={onToggleBlock}
className="title--border bg--danger">{t(buttonType)}</div>,
};
const detailedDataBlocked = {
time_table_header: formatTime(time, LONG_TIME_FORMAT),
date: formatDateTime(time, DEFAULT_SHORT_DATE_FORMAT_OPTIONS),
encryption_status: statusBlocked,
domain,
type_table_header: type,
protocol,
known_tracker: 'title',
table_name: hasTracker && tracker.name,
category_label: hasTracker && tracker.category,
source_label: hasTracker && source
&& <a href={`//${source}`} className="link--green">{source}</a>,
response_details: 'title',
install_settings_dns: upstream,
elapsed: formattedElapsedMs,
response_table_header: response && response.join('\n'),
[buttonType]: <div onClick={onToggleBlock}
className="title--border">{t(buttonType)}</div>,
};
const detailedDataCurrent = isFiltered ? detailedDataBlocked : detailedData;
setDetailedDataCurrent(detailedDataCurrent);
setButtonType(buttonType);
setModalOpened(true);
}
},
})}
/>
);
};
Table.propTypes = {
logs: PropTypes.array.isRequired,
pages: PropTypes.number.isRequired,
page: PropTypes.number.isRequired,
autoClients: PropTypes.array.isRequired,
defaultPageSize: PropTypes.number,
oldest: PropTypes.string.isRequired,
filtering: PropTypes.object.isRequired,
processingGetLogs: PropTypes.bool.isRequired,
processingGetConfig: PropTypes.bool.isRequired,
isDetailed: PropTypes.bool.isRequired,
setLogsPage: PropTypes.func.isRequired,
setLogsPagination: PropTypes.func.isRequired,
getLogs: PropTypes.func.isRequired,
toggleDetailedLogs: PropTypes.func.isRequired,
setRules: PropTypes.func.isRequired,
addSuccessToast: PropTypes.func.isRequired,
getFilteringStatus: PropTypes.func.isRequired,
isLoading: PropTypes.bool.isRequired,
setIsLoading: PropTypes.func.isRequired,
dnssec_enabled: PropTypes.bool.isRequired,
setDetailedDataCurrent: PropTypes.func.isRequired,
setButtonType: PropTypes.func.isRequired,
setModalOpened: PropTypes.func.isRequired,
isSmallScreen: PropTypes.bool.isRequired,
};
export default Table;

View File

@ -0,0 +1,44 @@
import React from 'react';
import PropTypes from 'prop-types';
import { Trans } from 'react-i18next';
import classNames from 'classnames';
import Tooltip from './index';
const CustomTooltip = ({
id, title, className, contentItemClass, place = 'right', columnClass = '', content, trigger, overridePosition, scrollHide,
renderContent = React.Children.map(
content,
(item, idx) => <div key={idx} className={contentItemClass}>
<Trans>{item || '—'}</Trans>
</div>,
),
}) => <Tooltip id={id} className={className} place={place} trigger={trigger}
overridePosition={overridePosition}
scrollHide={scrollHide}
>
{title
&& <div className="pb-4 h-25 grid-content font-weight-bold"><Trans>{title}</Trans></div>}
<div className={classNames(columnClass)}>{renderContent}</div>
</Tooltip>;
CustomTooltip.propTypes = {
id: PropTypes.string.isRequired,
title: PropTypes.string,
place: PropTypes.string,
className: PropTypes.string,
columnClass: PropTypes.string,
contentItemClass: PropTypes.string,
overridePosition: PropTypes.func,
scrollHide: PropTypes.bool,
content: PropTypes.oneOfType([
PropTypes.string,
PropTypes.array,
]),
trigger: PropTypes.oneOfType([
PropTypes.string,
PropTypes.arrayOf(PropTypes.string),
]),
renderContent: PropTypes.arrayOf(PropTypes.element),
};
export default CustomTooltip;

View File

@ -0,0 +1,129 @@
.custom-tooltip {
padding: 1rem 1.5rem 1.25rem 1.5rem;
font-size: 16px !important;
box-shadow: 2px 4px 8px rgba(0, 0, 0, 0.2);
border-radius: 4px !important;
pointer-events: auto !important;
}
/*crutch, may cause problems https://github.com/wwayne/react-tooltip/issues/204*/
@media (hover: none) {
.custom-tooltip {
position: absolute !important;
top: 4rem !important;
}
}
.white-space--nowrap {
white-space: nowrap !important;
}
.white-space--normal {
white-space: normal !important;
}
.word-break--break-all {
word-break: break-all !important;
}
.grid {
display: grid;
grid-template-columns: repeat(2, min-content);
grid-row-gap: 0.5rem;
grid-column-gap: 1rem;
}
.grid--limited {
grid-template-columns: repeat(2, minmax(0, min-content));
}
.grid--gap-bg {
grid-column-gap: 1.5rem;
}
.grid--title {
font-weight: bold;
}
.grid--title:not(:first-child) {
padding-top: 1rem;
}
@media (max-width: 767.98px) {
.grid {
grid-template-columns: 35% 55%;
}
.grid * {
grid-column: 1 / -1;
}
.grid > :nth-child(even) {
margin: -0.5rem 0 0;
}
.grid > .key__time_table_header, .grid > .key__data, .grid > .key__encryption_status, .grid > .key__elapsed {
grid-column: 1 / span 1;
}
.grid > .value__time_table_header, .grid > .value__data, .grid > .value__encryption_status, .grid > .value__elapsed {
grid-column: 2 / span 1;
margin: 0 !important;
}
.grid .key-colon, .grid .title--border {
font-weight: bold;
}
.custom-tooltip {
overflow-y: scroll;
}
}
.grid .key-colon:nth-child(odd)::after {
content: ':';
}
.grid__one-row {
grid-template-columns: 15rem;
}
.grid__flow-column {
grid-auto-flow: column;
}
.custom-tooltip.show {
opacity: 1 !important;
}
.custom-tooltip:hover {
opacity: 1 !important;
}
.grid-content > * {
justify-content: space-between !important;
width: 100% !important;
overflow: hidden;
-o-text-overflow: ellipsis;
text-overflow: ellipsis;
white-space: nowrap;
}
.title--border {
padding-top: 2rem;
}
.title--border:before {
content: '';
position: absolute;
left: 0;
border-top: 0.5px solid var(--gray-d8) !important;
width: 100%;
margin-top: -1rem;
}
.icon-cross {
position: absolute;
right: 0.5rem;
top: 0.5rem;
}

View File

@ -0,0 +1,48 @@
import React from 'react';
import PropTypes from 'prop-types';
import ReactTooltip from 'react-tooltip';
import classNames from 'classnames';
import './ReactTooltip.css';
import { touchMediaQuery } from '../../../helpers/constants';
const Tooltip = ({
id, children, className = '', place = 'right', trigger = 'hover', overridePosition, scrollHide = true,
}) => {
const tooltipClassName = classNames('custom-tooltip', className);
return (
<ReactTooltip
id={id}
aria-haspopup="true"
effect="solid"
place={place}
className={tooltipClassName}
backgroundColor="#fff"
arrowColor="transparent"
textColor="#4d4d4d"
delayHide={300}
scrollHide={window.matchMedia(touchMediaQuery).matches ? false : scrollHide}
trigger={trigger}
overridePosition={overridePosition}
globalEventOff="click touchend"
clickable
>
{children}
</ReactTooltip>
);
};
Tooltip.propTypes = {
id: PropTypes.string.isRequired,
children: PropTypes.node.isRequired,
className: PropTypes.string,
place: PropTypes.string,
overridePosition: PropTypes.func,
scrollHide: PropTypes.bool,
trigger: PropTypes.oneOfType([
PropTypes.string,
PropTypes.arrayOf(PropTypes.string),
]),
};
export default Tooltip;

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#9aa0ac" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-chevron-down"><polyline points="6 9 12 15 18 9"></polyline></svg>

After

Width:  |  Height:  |  Size: 264 B

View File

@ -1,457 +1,210 @@
import React, { Component, Fragment } from 'react';
import React, { Fragment, useEffect, useState } from 'react';
import PropTypes from 'prop-types';
import ReactTable from 'react-table';
import escapeRegExp from 'lodash/escapeRegExp';
import endsWith from 'lodash/endsWith';
import { Trans, withTranslation } from 'react-i18next';
import { HashLink as Link } from 'react-router-hash-link';
import { Trans } from 'react-i18next';
import Modal from 'react-modal';
import { useDispatch } from 'react-redux';
import {
formatTime,
formatDateTime,
isToday,
checkFiltered,
checkRewrite,
checkRewriteHosts,
checkWhiteList,
checkBlackList,
checkBlockedService,
} from '../../helpers/helpers';
import {
SERVICES, TABLE_DEFAULT_PAGE_SIZE, CUSTOM_FILTERING_RULES_ID, FILTERED,
BLOCK_ACTIONS, smallScreenSize,
TABLE_DEFAULT_PAGE_SIZE,
TABLE_FIRST_PAGE,
} from '../../helpers/constants';
import { getTrackerData } from '../../helpers/trackers/trackers';
import { formatClientCell } from '../../helpers/formatClientCell';
import Filters from './Filters';
import PageTitle from '../ui/PageTitle';
import Card from '../ui/Card';
import Loading from '../ui/Loading';
import PopoverFiltered from '../ui/PopoverFilter';
import Popover from '../ui/Popover';
import Filters from './Filters';
import Table from './Table';
import Disabled from './Disabled';
import './Logs.css';
import CellWrap from '../ui/CellWrap';
import { getFilteringStatus } from '../../actions/filtering';
import { getClients } from '../../actions';
import { getDnsConfig } from '../../actions/dnsConfig';
import { getLogsConfig } from '../../actions/queryLogs';
import { addSuccessToast } from '../../actions/toasts';
const TABLE_FIRST_PAGE = 0;
const INITIAL_REQUEST = true;
const INITIAL_REQUEST_DATA = ['', TABLE_FIRST_PAGE, INITIAL_REQUEST];
class Logs extends Component {
componentDidMount() {
this.props.setLogsPage(TABLE_FIRST_PAGE);
this.getLogs(...INITIAL_REQUEST_DATA);
this.props.getFilteringStatus();
this.props.getLogsConfig();
}
export const processContent = (data, buttonType) => Object.entries(data)
.map(([key, value]) => {
const isTitle = value === 'title';
const isButton = key === buttonType;
const isBoolean = typeof value === 'boolean';
const isHidden = isBoolean && value === false;
getLogs = (older_than, page, initial) => {
if (this.props.queryLogs.enabled) {
this.props.getLogs({
older_than, page, pageSize: TABLE_DEFAULT_PAGE_SIZE, initial,
let keyClass = 'key-colon';
if (isTitle) {
keyClass = 'title--border';
}
if (isButton || isBoolean) {
keyClass = '';
}
return isHidden ? null : <Fragment key={key}>
<div
className={`key__${key} ${keyClass} ${(isBoolean && value === true) ? 'font-weight-bold' : ''}`}>
<Trans>{isButton ? value : key}</Trans>
</div>
<div className={`value__${key} text-pre text-truncate`}>
<Trans>{(isTitle || isButton || isBoolean) ? '' : value || '—'}</Trans>
</div>
</Fragment>;
});
const Logs = (props) => {
const dispatch = useDispatch();
const [isSmallScreen, setIsSmallScreen] = useState(window.innerWidth < smallScreenSize);
const [detailedDataCurrent, setDetailedDataCurrent] = useState({});
const [buttonType, setButtonType] = useState(BLOCK_ACTIONS.BLOCK);
const [isModalOpened, setModalOpened] = useState(false);
const [isLoading, setIsLoading] = useState(false);
const {
filtering,
setLogsPage,
setLogsPagination,
setLogsFilter,
toggleDetailedLogs,
dashboard,
dnsConfig,
queryLogs: {
filter,
enabled,
processingGetConfig,
processingAdditionalLogs,
processingGetLogs,
oldest,
logs,
pages,
page,
isDetailed,
},
} = props;
const mediaQuery = window.matchMedia(`(max-width: ${smallScreenSize}px)`);
const mediaQueryHandler = (e) => {
setIsSmallScreen(e.matches);
if (e.matches) {
toggleDetailedLogs(false);
}
};
useEffect(() => {
mediaQuery.addListener(mediaQueryHandler);
return () => mediaQuery.removeListener(mediaQueryHandler);
}, []);
const closeModal = () => setModalOpened(false);
const getLogs = (older_than, page, initial) => {
if (props.queryLogs.enabled) {
props.getLogs({
older_than,
page,
pageSize: TABLE_DEFAULT_PAGE_SIZE,
initial,
});
}
};
refreshLogs = () => {
window.location.reload();
useEffect(() => {
(async () => {
setIsLoading(true);
dispatch(setLogsPage(TABLE_FIRST_PAGE));
dispatch(getFilteringStatus());
dispatch(getClients());
try {
await Promise.all([
getLogs(...INITIAL_REQUEST_DATA),
dispatch(getLogsConfig()),
dispatch(getDnsConfig()),
]);
} catch (err) {
console.error(err);
} finally {
setIsLoading(false);
}
})();
}, []);
const refreshLogs = async () => {
setIsLoading(true);
await Promise.all([
dispatch(setLogsPage(TABLE_FIRST_PAGE)),
getLogs(...INITIAL_REQUEST_DATA),
]);
dispatch(addSuccessToast('query_log_updated'));
setIsLoading(false);
};
renderTooltip = (isFiltered, rule, filter, service) => isFiltered
&& <PopoverFiltered rule={rule} filter={filter} service={service} />;
renderResponseList = (response, status) => {
if (response.length > 0) {
const listItems = response.map((response, index) => (
<li key={index} title={response} className="logs__list-item">
{response}
</li>
));
return <ul className="list-unstyled">{listItems}</ul>;
}
return (
<div>
<Trans values={{ value: status }}>query_log_response_status</Trans>
</div>
);
};
toggleBlocking = (type, domain) => {
const { userRules } = this.props.filtering;
const { t } = this.props;
const lineEnding = !endsWith(userRules, '\n') ? '\n' : '';
const baseRule = `||${domain}^$important`;
const baseUnblocking = `@@${baseRule}`;
const blockingRule = type === 'block' ? baseUnblocking : baseRule;
const unblockingRule = type === 'block' ? baseRule : baseUnblocking;
const preparedBlockingRule = new RegExp(`(^|\n)${escapeRegExp(blockingRule)}($|\n)`);
const preparedUnblockingRule = new RegExp(`(^|\n)${escapeRegExp(unblockingRule)}($|\n)`);
if (userRules.match(preparedBlockingRule)) {
this.props.setRules(userRules.replace(`${blockingRule}`, ''));
this.props.addSuccessToast(`${t('rule_removed_from_custom_filtering_toast')}: ${blockingRule}`);
} else if (!userRules.match(preparedUnblockingRule)) {
this.props.setRules(`${userRules}${lineEnding}${unblockingRule}\n`);
this.props.addSuccessToast(`${t('rule_added_to_custom_filtering_toast')}: ${unblockingRule}`);
}
this.props.getFilteringStatus();
};
renderBlockingButton(isFiltered, domain) {
const buttonClass = isFiltered ? 'btn-outline-secondary' : 'btn-outline-danger';
const buttonText = isFiltered ? 'unblock_btn' : 'block_btn';
const buttonType = isFiltered ? 'unblock' : 'block';
return (
<div className="logs__action">
<button
type="button"
className={`btn btn-sm ${buttonClass}`}
onClick={() => this.toggleBlocking(buttonType, domain)}
disabled={this.props.filtering.processingRules}
>
<Trans>{buttonText}</Trans>
</button>
</div>
);
}
getDateCell = (row) => CellWrap(
row,
(isToday(row.value) ? formatTime : formatDateTime),
formatDateTime,
return (
<>
{enabled && processingGetConfig && <Loading />}
{enabled && !processingGetConfig && (
<Fragment>
<Filters
filter={filter}
setIsLoading={setIsLoading}
processingGetLogs={processingGetLogs}
processingAdditionalLogs={processingAdditionalLogs}
setLogsFilter={setLogsFilter}
refreshLogs={refreshLogs}
/>
<Table
isLoading={isLoading}
setIsLoading={setIsLoading}
logs={logs}
pages={pages}
page={page}
autoClients={dashboard.autoClients}
oldest={oldest}
filtering={filtering}
processingGetLogs={processingGetLogs}
processingGetConfig={processingGetConfig}
isDetailed={isDetailed}
setLogsPagination={setLogsPagination}
setLogsPage={setLogsPage}
toggleDetailedLogs={toggleDetailedLogs}
getLogs={getLogs}
setRules={props.setRules}
addSuccessToast={props.addSuccessToast}
getFilteringStatus={props.getFilteringStatus}
dnssec_enabled={dnsConfig.dnssec_enabled}
setDetailedDataCurrent={setDetailedDataCurrent}
setButtonType={setButtonType}
setModalOpened={setModalOpened}
isSmallScreen={isSmallScreen}
/>
<Modal portalClassName='grid' isOpen={isSmallScreen && isModalOpened}
onRequestClose={closeModal}
style={{
content: {
width: '100%',
height: 'fit-content',
left: 0,
top: 47,
padding: '1rem 1.5rem 1rem',
},
overlay: {
backgroundColor: 'rgba(0,0,0,0.5)',
},
}}
>
<svg
className="icon icon--small icon-cross d-block d-md-none cursor--pointer"
onClick={closeModal}>
<use xlinkHref="#cross" />
</svg>
{processContent(detailedDataCurrent, buttonType)}
</Modal>
</Fragment>
)}
{!enabled && !processingGetConfig && (
<Disabled />
)}
</>
);
getDomainCell = (row) => {
const response = row.value;
const trackerData = getTrackerData(response);
return (
<div className="logs__row" title={response}>
<div className="logs__text">{response}</div>
{trackerData && <Popover data={trackerData} />}
</div>
);
};
normalizeResponse = (response) => (
response.map((response) => {
const { value, type, ttl } = response;
return `${type}: ${value} (ttl=${ttl})`;
})
);
getFilterName = (filters, whitelistFilters, filterId, t) => {
if (filterId === CUSTOM_FILTERING_RULES_ID) {
return t('custom_filter_rules');
}
const filter = filters.find((filter) => filter.id === filterId)
|| whitelistFilters.find((filter) => filter.id === filterId);
let filterName = '';
if (filter) {
filterName = filter.name;
}
if (!filterName) {
filterName = t('unknown_filter', { filterId });
}
return filterName;
}
getResponseCell = ({ value: responses, original }) => {
const {
reason, filterId, rule, status, originalAnswer,
} = original;
const { t, filtering } = this.props;
const { filters, whitelistFilters } = filtering;
const isFiltered = checkFiltered(reason);
const isBlackList = checkBlackList(reason);
const isRewrite = checkRewrite(reason);
const isRewriteAuto = checkRewriteHosts(reason);
const isWhiteList = checkWhiteList(reason);
const isBlockedService = checkBlockedService(reason);
const isBlockedCnameIp = originalAnswer;
const filterKey = reason.replace(FILTERED, '');
const parsedFilteredReason = t('query_log_filtered', { filter: filterKey });
const currentService = SERVICES.find((service) => service.id === original.serviceName);
const serviceName = currentService && currentService.name;
const filterName = this.getFilterName(filters, whitelistFilters, filterId, t);
if (isBlockedCnameIp) {
const normalizedAnswer = this.normalizeResponse(originalAnswer);
return (
<div className="logs__row logs__row--column">
<div className="logs__text-wrap">
<span className="logs__text">
<Trans>blocked_by_response</Trans>
</span>
{this.renderTooltip(isFiltered, rule, filterName)}
</div>
<div className="logs__list-wrap">
{this.renderResponseList(normalizedAnswer, status)}
</div>
</div>
);
}
return (
<div className="logs__row logs__row--column">
<div className="logs__text-wrap">
{(isFiltered || isBlockedService) && !isBlackList && (
<span className="logs__text" title={parsedFilteredReason}>
{parsedFilteredReason}
</span>
)}
{isBlackList && (
<span className="logs__text">
<Trans values={{ filter: filterName }}>
query_log_filtered
</Trans>
</span>
)}
{isBlockedService
? this.renderTooltip(isFiltered, '', '', serviceName)
: this.renderTooltip(isFiltered, rule, filterName)}
{isRewrite && (
<strong>
<Trans>rewrite_applied</Trans>
</strong>
)}
{isRewriteAuto && (
<span className="logs__text">
<strong>
<Trans>rewrite_hosts_applied</Trans>
</strong>
</span>
)}
</div>
<div className="logs__list-wrap">
{this.renderResponseList(responses, status)}
{isWhiteList && this.renderTooltip(isWhiteList, rule, filterName)}
</div>
</div>
);
};
getClientCell = (row) => {
const { original } = row;
const { t } = this.props;
const { reason, domain } = original;
const isFiltered = checkFiltered(reason);
const isRewrite = checkRewrite(reason);
const isAutoRewrite = checkRewriteHosts(reason);
if (isAutoRewrite) {
return (
<div className="logs__row logs__row--overflow logs__row--column">
{formatClientCell(row, t)}
</div>
);
}
return (
<Fragment>
<div className="logs__row logs__row--overflow logs__row--column">
{formatClientCell(row, t)}
</div>
{isRewrite ? (
<div className="logs__action">
<Link to="/dns_rewrites" className="btn btn-sm btn-outline-primary">
<Trans>configure</Trans>
</Link>
</div>
) : (
this.renderBlockingButton(isFiltered, domain)
)}
</Fragment>
);
};
fetchData = (state) => {
const { pages } = state;
const { oldest, page } = this.props.queryLogs;
const isLastPage = pages && (page + 1 === pages);
if (isLastPage) {
this.getLogs(oldest, page);
}
};
changePage = (page) => {
this.props.setLogsPage(page);
this.props.setLogsPagination({ page, pageSize: TABLE_DEFAULT_PAGE_SIZE });
};
renderLogs() {
const { queryLogs, t } = this.props;
const {
processingGetLogs, processingGetConfig, logs, pages, page,
} = queryLogs;
const isLoading = processingGetLogs || processingGetConfig;
const columns = [
{
Header: t('time_table_header'),
accessor: 'time',
minWidth: 105,
Cell: this.getDateCell,
},
{
Header: t('domain_name_table_header'),
accessor: 'domain',
minWidth: 180,
Cell: this.getDomainCell,
},
{
Header: t('type_table_header'),
accessor: 'type',
maxWidth: 60,
},
{
Header: t('response_table_header'),
accessor: 'response',
minWidth: 250,
Cell: this.getResponseCell,
},
{
Header: t('client_table_header'),
accessor: 'client',
maxWidth: 240,
minWidth: 240,
Cell: this.getClientCell,
},
];
return (
<ReactTable
manual
minRows={5}
page={page}
pages={pages}
columns={columns}
filterable={false}
sortable={false}
data={logs || []}
loading={isLoading}
showPagination={true}
showPaginationTop={true}
showPageJump={false}
showPageSizeOptions={false}
onFetchData={this.fetchData}
onPageChange={this.changePage}
className="logs__table"
defaultPageSize={TABLE_DEFAULT_PAGE_SIZE}
previousText={t('previous_btn')}
nextText={t('next_btn')}
loadingText={t('loading_table_status')}
rowsText={t('rows_table_footer_text')}
noDataText={t('no_logs_found')}
pageText={''}
ofText={''}
renderTotalPagesCount={() => false}
defaultFilterMethod={(filter, row) => {
const id = filter.pivotId || filter.id;
return row[id] !== undefined
? String(row[id]).indexOf(filter.value) !== -1
: true;
}}
defaultSorted={[
{
id: 'time',
desc: true,
},
]}
getTrProps={(_state, rowInfo) => {
if (!rowInfo) {
return {};
}
const { reason } = rowInfo.original;
if (checkFiltered(reason)) {
return {
className: 'red',
};
} if (checkWhiteList(reason)) {
return {
className: 'green',
};
} if (checkRewrite(reason) || checkRewriteHosts(reason)) {
return {
className: 'blue',
};
}
return {
className: '',
};
}}
/>
);
}
render() {
const { queryLogs, t } = this.props;
const {
enabled, processingGetConfig, processingAdditionalLogs, processingGetLogs,
} = queryLogs;
const refreshButton = enabled ? (
<button
type="button"
className="btn btn-icon btn-outline-primary btn-sm ml-3"
onClick={this.refreshLogs}
>
<svg className="icons">
<use xlinkHref="#refresh" />
</svg>
</button>
) : (
''
);
return (
<Fragment>
<PageTitle title={t('query_log')}>{refreshButton}</PageTitle>
{enabled && processingGetConfig && <Loading />}
{enabled && !processingGetConfig && (
<Fragment>
<Filters
filter={queryLogs.filter}
processingGetLogs={processingGetLogs}
processingAdditionalLogs={processingAdditionalLogs}
setLogsFilter={this.props.setLogsFilter}
/>
<Card>{this.renderLogs()}</Card>
</Fragment>
)}
{!enabled && !processingGetConfig && (
<Card>
<div className="lead text-center py-6">
<Trans
components={[
<Link to="/settings#logs-config" key="0">
link
</Link>,
]}
>
query_log_disabled
</Trans>
</div>
</Card>
)}
</Fragment>
);
}
}
};
Logs.propTypes = {
getLogs: PropTypes.func.isRequired,
@ -461,12 +214,11 @@ Logs.propTypes = {
filtering: PropTypes.object.isRequired,
setRules: PropTypes.func.isRequired,
addSuccessToast: PropTypes.func.isRequired,
getClients: PropTypes.func.isRequired,
getLogsConfig: PropTypes.func.isRequired,
setLogsPagination: PropTypes.func.isRequired,
setLogsFilter: PropTypes.func.isRequired,
setLogsPage: PropTypes.func.isRequired,
t: PropTypes.func.isRequired,
toggleDetailedLogs: PropTypes.func.isRequired,
dnsConfig: PropTypes.object.isRequired,
};
export default withTranslation()(Logs);
export default Logs;

View File

@ -79,16 +79,26 @@ class AutoClients extends Component {
},
]}
className="-striped -highlight card-table-overflow"
showPagination={true}
showPagination
defaultPageSize={10}
minRows={5}
previousText={t('previous_btn')}
nextText={t('next_btn')}
showPageSizeOptions={false}
showPageJump={false}
renderTotalPagesCount={() => false}
previousText={
<svg className="icons icon--small icon--gray w-100 h-100">
<use xlinkHref="#arrow-left" />
</svg>}
nextText={
<svg className="icons icon--small icon--gray w-100 h-100">
<use xlinkHref="#arrow-right" />
</svg>}
loadingText={t('loading_table_status')}
pageText={t('page_table_footer_text')}
ofText="/"
pageText=''
ofText=''
rowsText={t('rows_table_footer_text')}
noDataText={t('clients_not_found')}
getPaginationProps={() => ({ className: 'custom-pagination' })}
/>
</Card>
);

View File

@ -91,7 +91,7 @@ class ClientsTable extends Component {
const { value } = row;
return (
<div className="logs__row logs__row--overflow">
<div className="logs__row o-hidden">
<span className="logs__text">
{value.map((address) => (
<div key={address} title={address}>
@ -121,7 +121,7 @@ class ClientsTable extends Component {
);
return (
<div className="logs__row logs__row--overflow">
<div className="logs__row o-hidden">
<div className="logs__text">{title}</div>
</div>
);
@ -167,7 +167,7 @@ class ClientsTable extends Component {
);
return (
<div className="logs__row logs__row--overflow">
<div className="logs__row o-hidden">
<div className="logs__text">{title}</div>
</div>
);
@ -185,7 +185,7 @@ class ClientsTable extends Component {
}
return (
<div className="logs__row logs__row--overflow">
<div className="logs__row o-hidden">
<span className="logs__text">
{value.map((tag) => (
<div key={tag} title={tag} className="small">
@ -282,16 +282,26 @@ class ClientsTable extends Component {
},
]}
className="-striped -highlight card-table-overflow"
showPagination={true}
showPagination
defaultPageSize={10}
minRows={5}
previousText={t('previous_btn')}
nextText={t('next_btn')}
showPageSizeOptions={false}
showPageJump={false}
renderTotalPagesCount={() => false}
previousText={
<svg className="icons icon--small icon--gray w-100 h-100">
<use xlinkHref="#arrow-left" />
</svg>}
nextText={
<svg className="icons icon--small icon--gray w-100 h-100">
<use xlinkHref="#arrow-right" />
</svg>}
loadingText={t('loading_table_status')}
pageText={t('page_table_footer_text')}
ofText="/"
pageText=''
ofText=''
rowsText={t('rows_table_footer_text')}
noDataText={t('clients_not_found')}
getPaginationProps={() => ({ className: 'custom-pagination' })}
/>
<button
type="button"

View File

@ -89,7 +89,7 @@ const renderFieldsWrapper = (placeholder, buttonTitle) => function cell(row) {
onClick={() => fields.push()}
title={buttonTitle}
>
<svg className="icon icon--close">
<svg className="icon icon--small">
<use xlinkHref="#plus" />
</svg>
</button>

View File

@ -32,11 +32,9 @@ const getFormattedWhois = (value, t) => {
const whoisCell = (t) => function cell(row) {
const { value } = row;
return (
<div className="logs__row logs__row--overflow">
<span className="logs__text logs__text--wrap">{getFormattedWhois(value, t)}</span>
</div>
);
return <div className="logs__row o-hidden">
<div className="logs__text logs__text--wrap">{getFormattedWhois(value, t)}</div>
</div>;
};
export default whoisCell;

View File

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

View File

@ -2,13 +2,13 @@ import React, { Component, Fragment } from 'react';
import PropTypes from 'prop-types';
import ReactTable from 'react-table';
import { Trans, withTranslation } from 'react-i18next';
import { SMALL_TABLE_DEFAULT_PAGE_SIZE } from '../../../../helpers/constants';
import { LEASES_TABLE_DEFAULT_PAGE_SIZE } from '../../../../helpers/constants';
import Modal from './Modal';
class StaticLeases extends Component {
cellWrap = ({ value }) => (
<div className="logs__row logs__row--overflow">
<div className="logs__row o-hidden">
<span className="logs__text" title={value}>
{value}
</span>
@ -67,7 +67,7 @@ class StaticLeases extends Component {
<div className="logs__row logs__row--center">
<button
type="button"
className="btn btn-icon btn-outline-secondary btn-sm"
className="btn btn-icon btn-icon--green btn-outline-secondary btn-sm"
title={t('delete_table_action')}
disabled={processingDeleting}
onClick={() => this.handleDelete(ip, mac, hostname)
@ -82,9 +82,9 @@ class StaticLeases extends Component {
},
},
]}
pageSize={SMALL_TABLE_DEFAULT_PAGE_SIZE}
pageSize={LEASES_TABLE_DEFAULT_PAGE_SIZE}
showPageSizeOptions={false}
showPagination={staticLeases.length > SMALL_TABLE_DEFAULT_PAGE_SIZE}
showPagination={staticLeases.length > LEASES_TABLE_DEFAULT_PAGE_SIZE}
noDataText={t('dhcp_static_leases_not_found')}
className="-striped -highlight card-table-overflow"
minRows={6}

View File

@ -112,6 +112,11 @@
justify-content: center;
width: 30px;
height: 30px;
background-color: transparent;
}
.btn-icon--green {
color: var(--green);
}
.btn-icon-sm {

View File

@ -6,6 +6,13 @@
width: 345px;
}
@media (max-width: 425px) {
.toasts {
right: 0;
width: 100%;
}
}
.toast {
display: flex;
align-items: flex-start;

View File

@ -1,20 +1,33 @@
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { Trans, withTranslation } from 'react-i18next';
import { FAILURE_TOAST_TIMEOUT, SUCCESS_TOAST_TIMEOUT } from '../../helpers/constants';
class Toast extends Component {
componentDidMount() {
const timeout = this.props.type === 'success' ? 5000 : 30000;
state = {
timerId: null,
};
setTimeout(() => {
this.props.removeToast(this.props.id);
}, timeout);
componentDidMount() {
this.setRemoveToastTimeout();
}
shouldComponentUpdate() {
return false;
}
clearRemoveToastTimeout = () => clearTimeout(this.state.timerId);
setRemoveToastTimeout = () => {
const timeout = this.props.type === 'success' ? SUCCESS_TOAST_TIMEOUT : FAILURE_TOAST_TIMEOUT;
const timerId = setTimeout(() => {
this.props.removeToast(this.props.id);
}, timeout);
this.setState({ timerId });
};
showMessage(t, type, message) {
if (type === 'notice') {
return <span dangerouslySetInnerHTML={{ __html: t(message) }} />;
@ -29,12 +42,18 @@ class Toast extends Component {
} = this.props;
return (
<div className={`toast toast--${type}`}>
<div className={`toast toast--${type}`}
onMouseOver={this.clearRemoveToastTimeout}
onMouseOut={this.setRemoveToastTimeout}>
<p className="toast__content">
{this.showMessage(t, type, message)}
</p>
<button className="toast__dismiss" onClick={() => this.props.removeToast(id)}>
<svg stroke="#fff" fill="none" width="20" height="20" strokeWidth="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m18 6-12 12"/><path d="m6 6 12 12"/></svg>
<svg stroke="#fff" fill="none" width="20" height="20" strokeWidth="2"
viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="m18 6-12 12" />
<path d="m6 6 12 12" />
</svg>
</button>
</div>
);

View File

@ -9,7 +9,7 @@ const CellWrap = ({ value }, formatValue, formatTitle = formatValue) => {
const cellTitle = typeof formatTitle === 'function' ? formatTitle(value) : value;
return (
<div className="logs__row logs__row--overflow">
<div className="logs__row o-hidden">
<span className="logs__text logs__text--full" title={cellTitle}>
{cellValue}
</span>

View File

@ -4,7 +4,19 @@
height: 100%;
}
.icon--close {
width: 24px;
height: 24px;
.icon--small {
width: 1.5rem;
height: 1.5rem;
}
.icon--gray {
color: var(--gray-a5);
}
.icon--disabled {
color: var(--gray-d8);
}
.icon--active {
color: #66b574;
}

File diff suppressed because one or more lines are too long

View File

@ -3,7 +3,7 @@ import React from 'react';
import './Loading.css';
const Loading = () => (
<div className="loading"></div>
<div className="loading" />
);
export default Loading;

View File

@ -3,13 +3,32 @@
align-items: flex-start;
}
.page-header--logs {
flex-direction: row;
align-items: flex-end;
margin: 2rem 0 3rem;
}
@media (max-width: 991px) {
.page-header--logs {
flex-direction: column;
align-items: center;
margin-bottom: 1.5rem;
}
.page-header--logs .page-title {
padding-bottom: 2.5rem;;
}
}
.page-subtitle {
margin-left: 0;
font-size: 0.9rem;
}
.page-title {
line-height: 2.2rem;
.page-title--large {
font-size: 36px;
line-height: 46px;
}
.page-title__actions {

View File

@ -3,15 +3,15 @@ import PropTypes from 'prop-types';
import './PageTitle.css';
const PageTitle = (props) => (
const PageTitle = ({ title, subtitle, children }) => (
<div className="page-header">
<h1 className="page-title">
{props.title}
{props.children}
{title}
{children}
</h1>
{props.subtitle && (
{subtitle && (
<div className="page-subtitle">
{props.subtitle}
{subtitle}
</div>
)}
</div>

View File

@ -1,21 +1,26 @@
.ReactTable .rt-th,
.ReactTable .rt-td {
padding: 10px 15px;
overflow: visible;
overflow: hidden;
text-overflow: ellipsis;
}
.ReactTable .rt-tbody {
overflow: visible;
}
.rt-tr-group .red {
background-color: #fff4f2;
.rt-tr-group.red {
background-color: rgba(223, 56, 18, 0.05);
}
.rt-tr-group .green {
background-color: #f1faf3;
.rt-tr-group.green {
background-color: rgba(103, 178, 121, 0.1);
}
.rt-tr-group .blue {
background-color: #ecf7ff;
.rt-tr-group.blue {
background-color: #e5effd;
}
.rt-tr-group.yellow {
background-color: var(--yellow-pale);
}

View File

@ -6,7 +6,6 @@
width: 18px;
height: 18px;
flex-shrink: 0;
margin-left: 5px;
background-image: url("./svg/help-circle.svg");
background-size: 100%;
cursor: pointer;
@ -56,7 +55,6 @@
.tooltip-custom--logs {
border-radius: 50%;
background-image: url("./svg/help-circle-gray.svg");
background-color: #fff;
}
.tooltip-custom--logs:before {

View File

@ -3,9 +3,8 @@ import PropTypes from 'prop-types';
import './Tooltip.css';
const Tooltip = (props) => (
<div data-tooltip={props.text} className={`tooltip-custom ${props.type || ''}`}></div>
);
const Tooltip = ({ text, type = '' }) => <div data-tooltip={text}
className={`tooltip-custom ml-1 ${type}`} />;
Tooltip.propTypes = {
text: PropTypes.string.isRequired,

View File

@ -1,15 +1,22 @@
import { connect } from 'react-redux';
import { getClients } from '../actions';
import { getFilteringStatus, setRules } from '../actions/filtering';
import {
getLogs, getLogsConfig, setLogsPagination, setLogsFilter, setLogsPage,
getLogs, setLogsPagination, setLogsFilter, setLogsPage, toggleDetailedLogs,
} from '../actions/queryLogs';
import Logs from '../components/Logs';
import { addSuccessToast } from '../actions/toasts';
const mapStateToProps = (state) => {
const { queryLogs, dashboard, filtering } = state;
const props = { queryLogs, dashboard, filtering };
const {
queryLogs, dashboard, filtering, dnsConfig,
} = state;
const props = {
queryLogs,
dashboard,
filtering,
dnsConfig,
};
return props;
};
@ -18,11 +25,10 @@ const mapDispatchToProps = {
getFilteringStatus,
setRules,
addSuccessToast,
getClients,
getLogsConfig,
setLogsPagination,
setLogsFilter,
setLogsPage,
toggleDetailedLogs,
};
export default connect(

View File

@ -55,7 +55,8 @@ export const EMPTY_DATE = '0001-01-01T00:00:00Z';
export const DEBOUNCE_TIMEOUT = 300;
export const DEBOUNCE_FILTER_TIMEOUT = 500;
export const CHECK_TIMEOUT = 1000;
export const STOP_TIMEOUT = 10000;
export const SUCCESS_TOAST_TIMEOUT = 5000;
export const FAILURE_TOAST_TIMEOUT = 30000;
export const UNSAFE_PORTS = [
1,
@ -256,18 +257,6 @@ export const ENCRYPTION_SOURCE = {
CONTENT: 'content',
};
export const FILTERED_STATUS = {
FILTERED_BLACK_LIST: 'FilteredBlackList',
NOT_FILTERED_WHITE_LIST: 'NotFilteredWhiteList',
NOT_FILTERED_NOT_FOUND: 'NotFilteredNotFound',
FILTERED_BLOCKED_SERVICE: 'FilteredBlockedService',
REWRITE: 'Rewrite',
REWRITE_HOSTS: 'RewriteEtcHosts',
FILTERED_SAFE_SEARCH: 'FilteredSafeSearch',
FILTERED_SAFE_BROWSING: 'FilteredSafeBrowsing',
FILTERED_PARENTAL: 'FilteredParental',
};
export const FILTERED = 'Filtered';
export const NOT_FILTERED = 'NotFiltered';
@ -336,25 +325,124 @@ export const DNS_RECORD_TYPES = [
];
export const DEFAULT_LOGS_FILTER = {
filter_domain: '',
filter_client: '',
filter_question_type: '',
filter_response_status: '',
search: '',
response_status: '',
};
export const DEFAULT_LANGUAGE = 'en';
export const TABLE_DEFAULT_PAGE_SIZE = 100;
export const TABLE_DEFAULT_PAGE_SIZE = 50;
export const SMALL_TABLE_DEFAULT_PAGE_SIZE = 20;
export const TABLE_FIRST_PAGE = 0;
export const LEASES_TABLE_DEFAULT_PAGE_SIZE = 20;
export const FILTERED_STATUS = {
FILTERED_BLACK_LIST: 'FilteredBlackList',
NOT_FILTERED_WHITE_LIST: 'NotFilteredWhiteList',
NOT_FILTERED_NOT_FOUND: 'NotFilteredNotFound',
FILTERED_BLOCKED_SERVICE: 'FilteredBlockedService',
REWRITE: 'Rewrite',
REWRITE_HOSTS: 'RewriteEtcHosts',
FILTERED_SAFE_SEARCH: 'FilteredSafeSearch',
FILTERED_SAFE_BROWSING: 'FilteredSafeBrowsing',
FILTERED_PARENTAL: 'FilteredParental',
};
export const RESPONSE_FILTER = {
ALL: 'all',
FILTERED: 'filtered',
ALL: {
query: 'all',
label: 'show_all_responses',
},
FILTERED: {
query: 'filtered',
label: 'filtered',
},
PROCESSED: {
query: 'processed',
label: 'show_processed_responses',
},
SPACE: {
query: 'all',
label: '',
disabled: true,
},
BLOCKED: {
query: 'blocked',
label: 'show_blocked_responses',
},
BLOCKED_THREATS: {
query: 'blocked_safebrowsing',
label: 'blocked_threats',
},
BLOCKED_ADULT_WEBSITES: {
query: 'blocked_parental',
label: 'blocked_adult_websites',
},
ALLOWED: {
query: 'whitelisted',
label: 'allowed',
},
REWRITTEN: {
query: 'rewritten',
label: 'rewritten',
},
SAFE_SEARCH: {
query: 'safe_search',
label: 'safe_search',
},
};
export const FILTERED_STATUS_TO_META_MAP = {
[FILTERED_STATUS.NOT_FILTERED_WHITE_LIST]: {
label: RESPONSE_FILTER.ALLOWED.label,
color: 'green',
},
[FILTERED_STATUS.NOT_FILTERED_NOT_FOUND]: {
label: RESPONSE_FILTER.PROCESSED.label,
color: 'white',
},
[FILTERED_STATUS.FILTERED_BLOCKED_SERVICE]: {
label: RESPONSE_FILTER.BLOCKED.label,
color: 'red',
},
[FILTERED_STATUS.FILTERED_SAFE_SEARCH]: {
label: RESPONSE_FILTER.SAFE_SEARCH.label,
color: 'yellow',
},
[FILTERED_STATUS.FILTERED_BLACK_LIST]: {
label: RESPONSE_FILTER.BLOCKED.label,
color: 'red',
},
[FILTERED_STATUS.REWRITE]: {
label: RESPONSE_FILTER.REWRITTEN.label,
color: 'blue',
},
[FILTERED_STATUS.REWRITE_HOSTS]: {
label: RESPONSE_FILTER.REWRITTEN.label,
color: 'blue',
},
[FILTERED_STATUS.FILTERED_SAFE_BROWSING]: {
label: RESPONSE_FILTER.BLOCKED_THREATS.label,
color: 'yellow',
},
[FILTERED_STATUS.FILTERED_PARENTAL]: {
label: RESPONSE_FILTER.BLOCKED_ADULT_WEBSITES.label,
color: 'yellow',
},
};
export const DEFAULT_TIME_FORMAT = 'HH:mm:ss';
export const LONG_TIME_FORMAT = 'HH:mm:ss.SSS';
export const DEFAULT_SHORT_DATE_FORMAT_OPTIONS = {
year: 'numeric',
month: 'numeric',
day: 'numeric',
hour12: false,
};
export const DEFAULT_DATE_FORMAT_OPTIONS = {
year: 'numeric',
month: 'numeric',
@ -371,9 +459,15 @@ export const DETAILED_DATE_FORMAT_OPTIONS = {
export const CUSTOM_FILTERING_RULES_ID = 0;
export const ACTION = {
block: 'block',
unblock: 'unblock',
export const BLOCK_ACTIONS = {
BLOCK: 'block',
UNBLOCK: 'unblock',
};
export const SCHEME_TO_PROTOCOL_MAP = {
doh: 'dns_over_https',
dot: 'dns_over_tls',
'': 'plain_dns',
};
export const DNS_REQUEST_OPTIONS = {
@ -407,3 +501,7 @@ export const FORM_NAME = {
INSTALL: 'install',
LOGIN: 'login',
};
export const smallScreenSize = 767;
export const touchMediaQuery = '(hover: none)';

View File

@ -85,10 +85,10 @@ export const renderGroupField = ({
&& <span className="input-group-append">
<button
type="button"
className="btn btn-secondary btn-icon"
className="btn btn-secondary btn-icon btn-icon--green"
onClick={removeField}
>
<svg className="icon icon--close">
<svg className="icon icon--small">
<use xlinkHref="#cross" />
</svg>
</button>

View File

@ -5,37 +5,40 @@ import { WHOIS_ICONS } from './constants';
const getFormattedWhois = (whois, t) => {
const whoisInfo = normalizeWhois(whois);
return (
Object.keys(whoisInfo).map((key) => {
const icon = WHOIS_ICONS[key];
return (
<span className="logs__whois text-muted" key={key} title={t(key)}>
Object.keys(whoisInfo)
.map((key) => {
const icon = WHOIS_ICONS[key];
return (
<span className="logs__whois text-muted" key={key} title={t(key)}>
{icon && (
<Fragment>
<svg className="logs__whois-icon icons">
<use xlinkHref={`#${icon}`} />
</svg>&nbsp;
</svg>
&nbsp;
</Fragment>
)}{whoisInfo[key]}
</span>
);
})
);
})
);
};
export const formatClientCell = (row, t) => {
const { value, original: { info } } = row;
export const formatClientCell = (row, t, isDetailed = false) => {
const { info, client } = row.original;
let whoisContainer = '';
let nameContainer = value;
let nameContainer = client;
if (info) {
const { name, whois_info } = info;
if (name) {
nameContainer = (
<span className="logs__text logs__text--wrap" title={`${name} (${value})`}>
{name} <small>({value})</small>
</span>
);
nameContainer = isDetailed ? <small title={client}>{client}</small>
: <div className="logs__text logs__text--nowrap"
title={`${name} (${client})`}>
{name}
<small>{`(${client})`}</small>
</div>;
}
if (whois_info) {
@ -48,11 +51,11 @@ export const formatClientCell = (row, t) => {
}
return (
<span className="logs__text">
<Fragment>
<div className="logs__text" title={client}>
<>
{nameContainer}
{whoisContainer}
</Fragment>
</span>
</>
</div>
);
};

View File

@ -1,4 +1,3 @@
/* eslint-disable no-bitwise */
import 'url-polyfill';
import dateParse from 'date-fns/parse';
import dateFormat from 'date-fns/format';
@ -13,29 +12,30 @@ import i18n from 'i18next';
import uniqBy from 'lodash/uniqBy';
import ipaddr from 'ipaddr.js';
import versionCompare from './versionCompare';
import { getTrackerData } from './trackers/trackers';
import {
STANDARD_DNS_PORT,
STANDARD_WEB_PORT,
STANDARD_HTTPS_PORT,
CHECK_TIMEOUT,
DNS_RECORD_TYPES,
DEFAULT_TIME_FORMAT,
DEFAULT_DATE_FORMAT_OPTIONS,
DETAILED_DATE_FORMAT_OPTIONS,
DEFAULT_LANGUAGE,
FILTERED_STATUS,
DEFAULT_TIME_FORMAT,
DETAILED_DATE_FORMAT_OPTIONS,
DNS_RECORD_TYPES,
FILTERED,
FILTERED_STATUS,
IP_MATCH_LIST_STATUS,
STANDARD_DNS_PORT,
STANDARD_HTTPS_PORT,
STANDARD_WEB_PORT,
} from './constants';
/**
* @param time {string} The time to format
* @returns {string} Returns the time in the format HH:mm:ss
*/
export const formatTime = (time) => {
export const formatTime = (time, options = DEFAULT_TIME_FORMAT) => {
const parsedTime = dateParse(time);
return dateFormat(parsedTime, DEFAULT_TIME_FORMAT);
return dateFormat(parsedTime, options);
};
/**
@ -68,34 +68,48 @@ export const isToday = (date) => isSameDay(new Date(date), new Date());
export const normalizeLogs = (logs) => logs.map((log) => {
const {
time,
question,
answer: response,
reason,
answer,
answer_dnssec,
client,
client_proto,
elapsedMs,
question,
reason,
status,
time,
filterId,
rule,
service_name,
status,
original_answer,
upstream,
} = log;
const { host: domain, type } = question;
const responsesArray = response ? response.map((response) => {
const response = answer ? answer.map((response) => {
const { value, type, ttl } = response;
return `${type}: ${value} (ttl=${ttl})`;
}) : [];
const tracker = getTrackerData(domain);
return {
time,
domain,
type,
response: responsesArray,
response,
reason,
client,
client_proto,
filterId,
rule,
status,
serviceName: service_name,
originalAnswer: original_answer,
tracker,
answer_dnssec,
elapsedMs,
upstream,
};
});
@ -562,3 +576,15 @@ export const getIpMatchListStatus = (ip, list) => {
return IP_MATCH_LIST_STATUS.NOT_FOUND;
}
};
/**
* @param {string} elapsedMs
* @param {function} t translate
* @returns {string}
*/
export const formatElapsedMs = (elapsedMs, t) => {
const formattedElapsedMs = parseInt(elapsedMs, 10) || parseFloat(elapsedMs)
.toFixed(2);
return `${formattedElapsedMs} ${t('milliseconds_abbreviation')}`;
};

View File

@ -3,13 +3,13 @@ import adguardDb from './adguard.json';
import { REPOSITORY } from '../constants';
/**
@typedef TrackerData
@type {object}
@property {string} id - tracker ID.
@property {string} name - tracker name.
@property {string} url - tracker website url.
@property {number} category - tracker category.
@property {source} source - tracker data source.
@typedef TrackerData
@type {object}
@property {string} id - tracker ID.
@property {string} name - tracker name.
@property {string} url - tracker website url.
@property {number} category - tracker category.
@property {source} source - tracker data source.
*/
/**
@ -20,45 +20,6 @@ export const sources = {
ADGUARD: 2,
};
/**
* Gets tracker data in the specified database
*
* @param {String} domainName domain name to check
* @param {*} trackersDb trackers database
* @param {number} source source ID
* @returns {TrackerData} tracker data or null if no matching tracker found
*/
const getTrackerDataFromDb = (domainName, trackersDb, source) => {
if (!domainName) {
return null;
}
const parts = domainName.split(/\./g).reverse();
let hostToCheck = '';
// Check every subdomain
for (let i = 0; i < parts.length; i += 1) {
hostToCheck = parts[i] + (i > 0 ? '.' : '') + hostToCheck;
const trackerId = trackersDb.trackerDomains[hostToCheck];
if (trackerId) {
const trackerData = trackersDb.trackers[trackerId];
const categoryName = trackersDb.categories[trackerData.categoryId];
return {
id: trackerId,
name: trackerData.name,
url: trackerData.url,
category: categoryName,
source,
};
}
}
// No tracker found for the specified domain
return null;
};
/**
* Gets the source metadata for the specified tracker
* @param {TrackerData} trackerData tracker data
@ -74,7 +35,8 @@ export const getSourceData = (trackerData) => {
name: 'Whotracks.me',
url: `https://whotracks.me/trackers/${trackerData.id}.html`,
};
} if (trackerData.source === sources.ADGUARD) {
}
if (trackerData.source === sources.ADGUARD) {
return {
name: 'AdGuard',
url: REPOSITORY.TRACKERS_DB,
@ -84,6 +46,49 @@ export const getSourceData = (trackerData) => {
return null;
};
/**
* Gets tracker data in the specified database
*
* @param {String} domainName domain name to check
* @param {*} trackersDb trackers database
* @param {number} source source ID
* @returns {TrackerData} tracker data or null if no matching tracker found
*/
const getTrackerDataFromDb = (domainName, trackersDb, source) => {
if (!domainName) {
return null;
}
const parts = domainName.split(/\./g)
.reverse();
let hostToCheck = '';
// Check every subdomain
for (let i = 0; i < parts.length; i += 1) {
hostToCheck = parts[i] + (i > 0 ? '.' : '') + hostToCheck;
const trackerId = trackersDb.trackerDomains[hostToCheck];
if (trackerId) {
const trackerData = trackersDb.trackers[trackerId];
const categoryName = trackersDb.categories[trackerData.categoryId];
trackerData.source = source;
const sourceData = getSourceData(trackerData);
return {
id: trackerId,
name: trackerData.name,
url: trackerData.url,
category: categoryName,
source,
sourceData,
};
}
}
// No tracker found for the specified domain
return null;
};
/**
* Gets tracker data from the trackers database
*

View File

@ -1,7 +1,7 @@
import { handleActions } from 'redux-actions';
import * as actions from '../actions/queryLogs';
import { DEFAULT_LOGS_FILTER } from '../helpers/constants';
import { DEFAULT_LOGS_FILTER, TABLE_DEFAULT_PAGE_SIZE } from '../helpers/constants';
const queryLogs = handleActions(
{
@ -27,15 +27,20 @@ const queryLogs = handleActions(
[actions.setLogsFilterRequest]: (state) => ({ ...state, processingGetLogs: true }),
[actions.setLogsFilterFailure]: (state) => ({ ...state, processingGetLogs: false }),
[actions.toggleDetailedLogs]: (state, { payload }) => ({
...state,
isDetailed: payload,
}),
[actions.setLogsFilterSuccess]: (state, { payload }) => {
const { logs, oldest, filter } = payload;
const pageSize = 100;
const pageSize = TABLE_DEFAULT_PAGE_SIZE;
const page = 0;
const pages = Math.ceil(logs.length / pageSize);
const total = logs.length;
const rowsStart = pageSize * page;
const rowsEnd = (pageSize * page) + pageSize;
const rowsEnd = rowsStart + pageSize;
const logsSlice = logs.slice(rowsStart, rowsEnd);
const isFiltered = Object.keys(filter).some((key) => filter[key]);
@ -135,6 +140,7 @@ const queryLogs = handleActions(
filter: DEFAULT_LOGS_FILTER,
isFiltered: false,
anonymize_client_ip: false,
isDetailed: true,
},
);

View File

@ -2,10 +2,8 @@ package home
import (
"testing"
"time"
"github.com/AdguardTeam/AdGuardHome/dnsforward"
"github.com/AdguardTeam/dnsproxy/proxy"
"github.com/stretchr/testify/assert"
)
@ -13,17 +11,12 @@ func prepareTestDNSServer() error {
config.DNS.Port = 1234
Context.dnsServer = dnsforward.NewServer(nil, nil, nil)
conf := &dnsforward.ServerConfig{}
uc, err := proxy.ParseUpstreamsConfig([]string{"1.1.1.1"}, nil, time.Second*5)
if err != nil {
return err
}
conf.UpstreamConfig = &uc
conf.UpstreamDNS = []string{"8.8.8.8"}
return Context.dnsServer.Prepare(conf)
}
func TestWhois(t *testing.T) {
err := prepareTestDNSServer()
assert.Nil(t, err)
assert.Nil(t, prepareTestDNSServer())
w := Whois{timeoutMsec: 5000}
resp, err := w.queryAll("8.8.8.8")