Merge branch 'master' into 4162-fix-theme-color

This commit is contained in:
Ainar Garipov 2022-01-25 18:20:37 +03:00
commit 2263adbbe0
49 changed files with 931 additions and 440 deletions

View File

@ -22,35 +22,48 @@ and this project adheres to
### Deprecated ### Deprecated
<!-- <!--
TODO(a.garipov): Remove this deprecation, if v0.108.0 is released before the Go TODO(a.garipov): Remove this deprecation, if v0.108.0 is released before
1.18 release. the Go 1.18 release.
--> -->
- Go 1.17 support. v0.109.0 will require at least Go 1.18 to build. - Go 1.17 support. v0.109.0 will require at least Go 1.18 to build.
### Fixed
- Incorrectly invalidated service domains ([#4120]).
- Poor testing of domain-specific upstream servers ([#4074]).
- Omitted aliases of hosts specified by another line within the OS's hosts file
([#4079]).
### Removed ### Removed
- Go 1.16 support. - Go 1.16 support.
[#3057]: https://github.com/AdguardTeam/AdGuardHome/issues/3057 [#3057]: https://github.com/AdguardTeam/AdGuardHome/issues/3057
[#4074]: https://github.com/AdguardTeam/AdGuardHome/issues/4074
[#4079]: https://github.com/AdguardTeam/AdGuardHome/issues/4079
[#4120]: https://github.com/AdguardTeam/AdGuardHome/issues/4120
<!-- <!--
## [v0.107.3] - 2022-01-19 (APPROX.) ## [v0.107.4] - 2022-03-01 (APPROX.)
--> -->
## [v0.107.3] - 2022-01-25
### Added
- Support for a `$dnsrewrite` modifier with an empty `NOERROR` response
([#4133]).
### Fixed
- Wrong set of ports checked for duplicates during the initial setup ([#4095]).
- Incorrectly invalidated service domains ([#4120]).
- Poor testing of domain-specific upstream servers ([#4074]).
- Omitted aliases of hosts specified by another line within the OS's hosts file
([#4079]).
[#4074]: https://github.com/AdguardTeam/AdGuardHome/issues/4074
[#4079]: https://github.com/AdguardTeam/AdGuardHome/issues/4079
[#4095]: https://github.com/AdguardTeam/AdGuardHome/issues/4095
[#4120]: https://github.com/AdguardTeam/AdGuardHome/issues/4120
[#4133]: https://github.com/AdguardTeam/AdGuardHome/issues/4133
## [v0.107.2] - 2021-12-29 ## [v0.107.2] - 2021-12-29
### Fixed ### Fixed
@ -690,11 +703,12 @@ In this release, the schema version has changed from 10 to 12.
<!-- <!--
[Unreleased]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.3...HEAD [Unreleased]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.4...HEAD
[v0.107.3]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.2...v0.107.3 [v0.107.4]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.3...v0.107.4
--> -->
[Unreleased]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.2...HEAD [Unreleased]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.3...HEAD
[v0.107.3]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.2...v0.107.3
[v0.107.2]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.1...v0.107.2 [v0.107.2]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.1...v0.107.2
[v0.107.1]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.0...v0.107.1 [v0.107.1]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.0...v0.107.1
[v0.107.0]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.106.3...v0.107.0 [v0.107.0]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.106.3...v0.107.0

View File

@ -163,8 +163,8 @@
"apply_btn": "Ужыць", "apply_btn": "Ужыць",
"disabled_filtering_toast": "Фільтрацыя выкл.", "disabled_filtering_toast": "Фільтрацыя выкл.",
"enabled_filtering_toast": "Фільтрацыя ўкл.", "enabled_filtering_toast": "Фільтрацыя ўкл.",
"disabled_safe_browsing_toast": "Бяспечная навігацыя выкл.", "disabled_safe_browsing_toast": "Бяспечная навігацыя выключана",
"enabled_safe_browsing_toast": "Бяспечная навігацыя ўкл.", "enabled_safe_browsing_toast": "Бяспечная навігацыя ўключана",
"disabled_parental_toast": "Бацькоўскі кантроль выкл.", "disabled_parental_toast": "Бацькоўскі кантроль выкл.",
"enabled_parental_toast": "Бацькоўскі кантроль укл.", "enabled_parental_toast": "Бацькоўскі кантроль укл.",
"disabled_safe_search_toast": "Бяспечны пошук выкл.", "disabled_safe_search_toast": "Бяспечны пошук выкл.",
@ -200,6 +200,7 @@
"form_error_url_or_path_format": "Няслушны URL ці абсалютны шлях да спіса", "form_error_url_or_path_format": "Няслушны URL ці абсалютны шлях да спіса",
"custom_filter_rules": "Карыстацкае рэдагавала фільтрацыі", "custom_filter_rules": "Карыстацкае рэдагавала фільтрацыі",
"custom_filter_rules_hint": "Уводзьце па адным правіле на радок. Вы можаце выкарыстоўваць правілы блакавання ці сінтаксіс файлаў hosts.", "custom_filter_rules_hint": "Уводзьце па адным правіле на радок. Вы можаце выкарыстоўваць правілы блакавання ці сінтаксіс файлаў hosts.",
"system_host_files": "Сістэмныя hosts-файлы",
"examples_title": "Прыклады", "examples_title": "Прыклады",
"example_meaning_filter_block": "заблакаваць доступ да дамена example.org і ўсім яго паддаменам", "example_meaning_filter_block": "заблакаваць доступ да дамена example.org і ўсім яго паддаменам",
"example_meaning_filter_whitelist": "адблакаваць доступ да дамена example.org і ўсім яго паддаменам", "example_meaning_filter_whitelist": "адблакаваць доступ да дамена example.org і ўсім яго паддаменам",
@ -586,8 +587,8 @@
"show_blocked_responses": "Заблакавана", "show_blocked_responses": "Заблакавана",
"show_whitelisted_responses": "Белы спіс", "show_whitelisted_responses": "Белы спіс",
"show_processed_responses": "Апрацавана", "show_processed_responses": "Апрацавана",
"blocked_safebrowsing": "Заблакавана згодна базе дадзеных Safebrowsing", "blocked_safebrowsing": "Заблакавана згодна базе дадзеных Safe Browsing",
"blocked_adult_websites": "Заблакаваныя \"дарослыя\" сайты", "blocked_adult_websites": "Заблакавана Бацькоўскім кантролем",
"blocked_threats": "Заблакавана пагроз", "blocked_threats": "Заблакавана пагроз",
"allowed": "Дазволены", "allowed": "Дазволены",
"filtered": "Адфільтраваныя", "filtered": "Адфільтраваныя",
@ -624,5 +625,7 @@
"last_rule_in_allowlist": "Няможна заблакаваць гэтага кліента, бо вынятак правіла «{{disallowed_rule}}» АДКЛЮЧЫЦЬ рэжым белага спіса.", "last_rule_in_allowlist": "Няможна заблакаваць гэтага кліента, бо вынятак правіла «{{disallowed_rule}}» АДКЛЮЧЫЦЬ рэжым белага спіса.",
"experimental": "Эксперыментальны", "experimental": "Эксперыментальны",
"use_saved_key": "Скарыстаць захаваны раней ключ", "use_saved_key": "Скарыстаць захаваны раней ключ",
"parental_control": "Бацькоўскі кантроль" "parental_control": "Бацькоўскі кантроль",
"safe_browsing": "Бяспечны інтэрнэт",
"served_from_cache": "{{value}} <i>(атрымана з кэша)</i>"
} }

View File

@ -43,7 +43,7 @@
"form_error_ip6_format": "Neplatná adresa IPv6", "form_error_ip6_format": "Neplatná adresa IPv6",
"form_error_ip_format": "Neplatná adresa IP", "form_error_ip_format": "Neplatná adresa IP",
"form_error_mac_format": "Neplatná adresa MAC", "form_error_mac_format": "Neplatná adresa MAC",
"form_error_client_id_format": "Neplatné ID klienta", "form_error_client_id_format": "ID klienta musí obsahovat pouze čísla, malá písmena a spojovníky",
"form_error_server_name": "Neplatný název serveru", "form_error_server_name": "Neplatný název serveru",
"form_error_subnet": "Podsíť \"{{cidr}}\" neobsahuje IP adresu \"{{ip}}\"", "form_error_subnet": "Podsíť \"{{cidr}}\" neobsahuje IP adresu \"{{ip}}\"",
"form_error_positive": "Musí být větší než 0", "form_error_positive": "Musí být větší než 0",

View File

@ -43,7 +43,7 @@
"form_error_ip6_format": "Ugyldig IPv6-adresse", "form_error_ip6_format": "Ugyldig IPv6-adresse",
"form_error_ip_format": "Ugyldig IP-adresse", "form_error_ip_format": "Ugyldig IP-adresse",
"form_error_mac_format": "Ugyldig MAC-adresse", "form_error_mac_format": "Ugyldig MAC-adresse",
"form_error_client_id_format": "Ugyldigt klient-ID", "form_error_client_id_format": "Klient-ID må kun indeholde cifre, minuskler og bindestreger",
"form_error_server_name": "Ugyldigt servernavn", "form_error_server_name": "Ugyldigt servernavn",
"form_error_subnet": "Subnet \"{{cidr}}\" indeholder ikke IP-adressen \"{{ip}}\"", "form_error_subnet": "Subnet \"{{cidr}}\" indeholder ikke IP-adressen \"{{ip}}\"",
"form_error_positive": "Skal være større end 0", "form_error_positive": "Skal være større end 0",

View File

@ -43,7 +43,7 @@
"form_error_ip6_format": "Ungültige IPv6-Adresse", "form_error_ip6_format": "Ungültige IPv6-Adresse",
"form_error_ip_format": "Ungültige IP-Adresse", "form_error_ip_format": "Ungültige IP-Adresse",
"form_error_mac_format": "Ungültige MAC-Adresse", "form_error_mac_format": "Ungültige MAC-Adresse",
"form_error_client_id_format": "Ungültiges Client-ID", "form_error_client_id_format": "Client-ID muss nur Zahlen, Kleinbuchstaben und Bindestriche enthalten",
"form_error_server_name": "Ungültiger Servername", "form_error_server_name": "Ungültiger Servername",
"form_error_subnet": "Subnetz „{{cidr}}“ enthält nicht die IP-Adresse „{{ip}}“", "form_error_subnet": "Subnetz „{{cidr}}“ enthält nicht die IP-Adresse „{{ip}}“",
"form_error_positive": "Muss größer als 0 (Null) sein", "form_error_positive": "Muss größer als 0 (Null) sein",
@ -70,9 +70,9 @@
"dhcp_error": "AdGuard Home konnte nicht ermitteln, ob es einen anderen aktiven DHCP-Server im Netzwerk gibt.", "dhcp_error": "AdGuard Home konnte nicht ermitteln, ob es einen anderen aktiven DHCP-Server im Netzwerk gibt.",
"dhcp_static_ip_error": "Um den DHCP-Server nutzen zu können, muss eine statische IP-Adresse festgelegt werden. Es konnte nicht ermittelt werden, ob diese Netzwerkschnittstelle mit statischer IP-Adresse konfiguriert ist. Bitte legen Sie eine statische IP-Adresse manuell fest.", "dhcp_static_ip_error": "Um den DHCP-Server nutzen zu können, muss eine statische IP-Adresse festgelegt werden. Es konnte nicht ermittelt werden, ob diese Netzwerkschnittstelle mit statischer IP-Adresse konfiguriert ist. Bitte legen Sie eine statische IP-Adresse manuell fest.",
"dhcp_dynamic_ip_found": "Ihr System verwendet die dynamische Konfiguration der IP-Adresse für die Schnittstelle <0>{{interfaceName}}</0>. Um den DHCP-Server nutzen zu können, muss eine statische IP-Adresse festgelegt werden. Ihre aktuelle IP-Adresse ist <0>{{ipAddress}}</0>. Diese IP-Adresse wird automatisch als statisch festgelegt, sobald Sie auf die Schaltfläche „DHCP-Server aktivieren“ klicken.", "dhcp_dynamic_ip_found": "Ihr System verwendet die dynamische Konfiguration der IP-Adresse für die Schnittstelle <0>{{interfaceName}}</0>. Um den DHCP-Server nutzen zu können, muss eine statische IP-Adresse festgelegt werden. Ihre aktuelle IP-Adresse ist <0>{{ipAddress}}</0>. Diese IP-Adresse wird automatisch als statisch festgelegt, sobald Sie auf die Schaltfläche „DHCP-Server aktivieren“ klicken.",
"dhcp_lease_added": "Statischer Zuweisung „{{key}}“ erfolgreich hinzugefügt", "dhcp_lease_added": "Statische Zuweisung „{{key}}“ erfolgreich hinzugefügt",
"dhcp_lease_deleted": "Statische Zuweisung „{{key}}“ erfolgreich entfernt", "dhcp_lease_deleted": "Statische Zuweisung „{{key}}“ erfolgreich entfernt",
"dhcp_new_static_lease": "Neuer statischer Zuweisung", "dhcp_new_static_lease": "Neue statische Zuweisung",
"dhcp_static_leases_not_found": "Keine statischen DHCP-Zuweisungen gefunden", "dhcp_static_leases_not_found": "Keine statischen DHCP-Zuweisungen gefunden",
"dhcp_add_static_lease": "Statische Zuweisung hinzufügen", "dhcp_add_static_lease": "Statische Zuweisung hinzufügen",
"dhcp_reset_leases": "Alle Zuweisungen zurücksetzen", "dhcp_reset_leases": "Alle Zuweisungen zurücksetzen",
@ -133,8 +133,8 @@
"number_of_dns_query_blocked_24_hours": "Anzahl der durch Werbefilter und Host-Sperrlisten abgelehnte DNS-Anfragen", "number_of_dns_query_blocked_24_hours": "Anzahl der durch Werbefilter und Host-Sperrlisten abgelehnte DNS-Anfragen",
"number_of_dns_query_blocked_24_hours_by_sec": "Anzahl der durch das AdGuard-Modul „Internetsicherheit“ gesperrten DNS-Anfragen", "number_of_dns_query_blocked_24_hours_by_sec": "Anzahl der durch das AdGuard-Modul „Internetsicherheit“ gesperrten DNS-Anfragen",
"number_of_dns_query_blocked_24_hours_adult": "Anzahl der gesperrten Websites mit jugendgefährdenden Inhalten", "number_of_dns_query_blocked_24_hours_adult": "Anzahl der gesperrten Websites mit jugendgefährdenden Inhalten",
"enforced_save_search": "SafeSearch erzwungen", "enforced_save_search": "Sichere Suche erzwungen",
"number_of_dns_query_to_safe_search": "Anzahl der DNS-Anfragen bei denen SafeSearch für Suchanfragen erzwungen wurde", "number_of_dns_query_to_safe_search": "Anzahl der DNS-Anfragen bei denen Sichere Suche für Suchanfragen erzwungen wurde",
"average_processing_time": "Durchschnittliche Bearbeitungsdauer", "average_processing_time": "Durchschnittliche Bearbeitungsdauer",
"average_processing_time_hint": "Durchschnittliche Zeit in Millisekunden zur Bearbeitung von DNS-Anfragen", "average_processing_time_hint": "Durchschnittliche Zeit in Millisekunden zur Bearbeitung von DNS-Anfragen",
"block_domain_use_filters_and_hosts": "Domains durch Filter und Host-Dateien sperren", "block_domain_use_filters_and_hosts": "Domains durch Filter und Host-Dateien sperren",
@ -143,8 +143,8 @@
"use_adguard_browsing_sec_hint": "AdGuard Home prüft, ob die Domain durch den Webdienst für Internetsicherheit auf eine Sperrliste gesetzt wurde. Es verwendet eine datenschutzfreundliche Lookup-API, um die Prüfung durchzuführen: Nur ein kurzes Präfix des Domänennamens SHA256-Hash wird an den Server gesendet.", "use_adguard_browsing_sec_hint": "AdGuard Home prüft, ob die Domain durch den Webdienst für Internetsicherheit auf eine Sperrliste gesetzt wurde. Es verwendet eine datenschutzfreundliche Lookup-API, um die Prüfung durchzuführen: Nur ein kurzes Präfix des Domänennamens SHA256-Hash wird an den Server gesendet.",
"use_adguard_parental": "AdGuard Webservice für Kindersicherung verwenden", "use_adguard_parental": "AdGuard Webservice für Kindersicherung verwenden",
"use_adguard_parental_hint": "AdGuard Home wird prüfen, ob die Domain jugendgefährdende Inhalte enthält. Zum Schutz Ihrer Privatsphäre wird die selbe API wie für den Webservice für Internetsicherheit verwendet.", "use_adguard_parental_hint": "AdGuard Home wird prüfen, ob die Domain jugendgefährdende Inhalte enthält. Zum Schutz Ihrer Privatsphäre wird die selbe API wie für den Webservice für Internetsicherheit verwendet.",
"enforce_safe_search": "SafeSearch erzwingen", "enforce_safe_search": "Sichere Suche verwenden",
"enforce_save_search_hint": "AdGuard kann SafeSearch für folgende Suchmaschinen erzwingen: Google, YouTube, Bing, DuckDuckGo, Yandex und Pixabay.", "enforce_save_search_hint": "AdGuard kann Sichere Suche für folgende Suchmaschinen erzwingen: Google, YouTube, Bing, DuckDuckGo, Yandex und Pixabay.",
"no_servers_specified": "Keine Server festgelegt", "no_servers_specified": "Keine Server festgelegt",
"general_settings": "Allgemeine Einstellungen", "general_settings": "Allgemeine Einstellungen",
"dns_settings": "DNS-Einstellungen", "dns_settings": "DNS-Einstellungen",
@ -167,8 +167,8 @@
"enabled_safe_browsing_toast": "Internetsicherheit aktiviert", "enabled_safe_browsing_toast": "Internetsicherheit aktiviert",
"disabled_parental_toast": "Kindersicherung deaktiviert", "disabled_parental_toast": "Kindersicherung deaktiviert",
"enabled_parental_toast": "Kindersicherung aktiviert", "enabled_parental_toast": "Kindersicherung aktiviert",
"disabled_safe_search_toast": "SafeSearch deaktiviert", "disabled_safe_search_toast": "Sichere Suche deaktiviert",
"enabled_save_search_toast": "SafeSearch aktiviert", "enabled_save_search_toast": "Sichere Suche aktiviert",
"enabled_table_header": "Aktiviert", "enabled_table_header": "Aktiviert",
"name_table_header": "Name", "name_table_header": "Name",
"list_url_table_header": "Adressliste", "list_url_table_header": "Adressliste",
@ -626,6 +626,6 @@
"experimental": "Experimentell", "experimental": "Experimentell",
"use_saved_key": "Zuvor gespeicherten Schlüssel verwenden", "use_saved_key": "Zuvor gespeicherten Schlüssel verwenden",
"parental_control": "Kindersicherung", "parental_control": "Kindersicherung",
"safe_browsing": "Sicheres Surfen", "safe_browsing": "Internetsicherheit",
"served_from_cache": "{{value}} <i>(aus dem Zwischenspeicher abgerufen)</i>" "served_from_cache": "{{value}} <i>(aus dem Zwischenspeicher abgerufen)</i>"
} }

View File

@ -43,7 +43,7 @@
"form_error_ip6_format": "Invalid IPv6 address", "form_error_ip6_format": "Invalid IPv6 address",
"form_error_ip_format": "Invalid IP address", "form_error_ip_format": "Invalid IP address",
"form_error_mac_format": "Invalid MAC address", "form_error_mac_format": "Invalid MAC address",
"form_error_client_id_format": "Invalid client ID", "form_error_client_id_format": "Client ID must contain only numbers, lowercase letters, and hyphens",
"form_error_server_name": "Invalid server name", "form_error_server_name": "Invalid server name",
"form_error_subnet": "Subnet \"{{cidr}}\" does not contain the IP address \"{{ip}}\"", "form_error_subnet": "Subnet \"{{cidr}}\" does not contain the IP address \"{{ip}}\"",
"form_error_positive": "Must be greater than 0", "form_error_positive": "Must be greater than 0",

View File

@ -43,7 +43,7 @@
"form_error_ip6_format": "Dirección IPv6 no válida", "form_error_ip6_format": "Dirección IPv6 no válida",
"form_error_ip_format": "Dirección IP no válida", "form_error_ip_format": "Dirección IP no válida",
"form_error_mac_format": "Dirección MAC no válida", "form_error_mac_format": "Dirección MAC no válida",
"form_error_client_id_format": "ID de cliente no válido", "form_error_client_id_format": "El ID de cliente debe contener solo números, letras minúsculas y guiones",
"form_error_server_name": "Nombre de servidor no válido", "form_error_server_name": "Nombre de servidor no válido",
"form_error_subnet": "La subred \"{{cidr}}\" no contiene la dirección IP \"{{ip}}\"", "form_error_subnet": "La subred \"{{cidr}}\" no contiene la dirección IP \"{{ip}}\"",
"form_error_positive": "Debe ser mayor que 0", "form_error_positive": "Debe ser mayor que 0",

View File

@ -17,7 +17,7 @@
"form_error_required": "فیلد مورد نیاز", "form_error_required": "فیلد مورد نیاز",
"form_error_ip4_format": "فرمت نامعتبر IPv4", "form_error_ip4_format": "فرمت نامعتبر IPv4",
"form_error_ip6_format": "فرمت نامعتبر IPv6", "form_error_ip6_format": "فرمت نامعتبر IPv6",
"form_error_ip_format": "فرمت IPv4 نامعتبر است", "form_error_ip_format": "آدرس آی پی نامعتبر است",
"form_error_mac_format": "فرمت مَک نامعتبر است", "form_error_mac_format": "فرمت مَک نامعتبر است",
"form_error_client_id_format": "فرمت شناسه کلاینت نامعتبر است", "form_error_client_id_format": "فرمت شناسه کلاینت نامعتبر است",
"form_error_positive": "باید بزرگتر از 0 باشد", "form_error_positive": "باید بزرگتر از 0 باشد",

View File

@ -43,7 +43,7 @@
"form_error_ip6_format": "Virheellinen IPv6-osoite", "form_error_ip6_format": "Virheellinen IPv6-osoite",
"form_error_ip_format": "Virheellinen IP-osoite", "form_error_ip_format": "Virheellinen IP-osoite",
"form_error_mac_format": "Virheellinen MAC-osoite", "form_error_mac_format": "Virheellinen MAC-osoite",
"form_error_client_id_format": "Virheellinen päätelaitteen ID", "form_error_client_id_format": "Päätelaitteen tunniste voi sisältää ainoastaan numeroita, pieniä kirjaimia sekä yhdysviivoja",
"form_error_server_name": "Virheellinen palvelimen nimi", "form_error_server_name": "Virheellinen palvelimen nimi",
"form_error_subnet": "Aliverkko \"{{cidr}}\" ei sisällä IP-osoitetta \"{{ip}}\"", "form_error_subnet": "Aliverkko \"{{cidr}}\" ei sisällä IP-osoitetta \"{{ip}}\"",
"form_error_positive": "Oltava suurempi kuin 0", "form_error_positive": "Oltava suurempi kuin 0",
@ -603,9 +603,9 @@
"enter_cache_size": "Syötä välimuistin koko (tavuina)", "enter_cache_size": "Syötä välimuistin koko (tavuina)",
"enter_cache_ttl_min_override": "Syötä vähimmäis-TTL (sekunteina)", "enter_cache_ttl_min_override": "Syötä vähimmäis-TTL (sekunteina)",
"enter_cache_ttl_max_override": "Syötä enimmäis-TTL (sekunteina)", "enter_cache_ttl_max_override": "Syötä enimmäis-TTL (sekunteina)",
"cache_ttl_min_override_desc": "Pidennä ylävirran palvelimelta vastaanotettuja, lyhyitä time-to-live -arvoja (sekunteina) tallennettaessa DNS-vastauksia välimuistiin.", "cache_ttl_min_override_desc": "Pidennä ylävirran palvelimelta vastaanotettuja, lyhyitä elinaika-arvoja (sekunteina) tallennettaessa DNS-vastauksia välimuistiin.",
"cache_ttl_max_override_desc": "Määritä DNS-välimuistin kohteiden suurin time-to-live -arvo (sekunteina)", "cache_ttl_max_override_desc": "Määritä DNS-välimuistin kohteiden suurin elinaika-arvo (sekunteina)",
"ttl_cache_validation": "Välimuistin TTL-vähimmäisarvon tulee olla pienempi tai sama kuin enimmäisarvon", "ttl_cache_validation": "Välimuistin elinajan vähimmäisarvon tulee olla pienempi tai sama kuin enimmäisarvon",
"cache_optimistic": "Optimistinen välimuisti", "cache_optimistic": "Optimistinen välimuisti",
"cache_optimistic_desc": "Pakota AdGuard Home vastaamaan välimuistista vaikka sen tiedot olisivat vanhentuneet. Pyri samalla myös päivittämään tiedot.", "cache_optimistic_desc": "Pakota AdGuard Home vastaamaan välimuistista vaikka sen tiedot olisivat vanhentuneet. Pyri samalla myös päivittämään tiedot.",
"filter_category_general": "Yleiset", "filter_category_general": "Yleiset",

View File

@ -43,7 +43,7 @@
"form_error_ip6_format": "Adresse IPv6 invalide", "form_error_ip6_format": "Adresse IPv6 invalide",
"form_error_ip_format": "Adresse IP invalide", "form_error_ip_format": "Adresse IP invalide",
"form_error_mac_format": "Adresse MAC invalide", "form_error_mac_format": "Adresse MAC invalide",
"form_error_client_id_format": "Identifiant de client invalide", "form_error_client_id_format": "L'ID du client ne doit contenir que des chiffres, des lettres minuscules et des traits d'union.",
"form_error_server_name": "Nom de serveur invalide", "form_error_server_name": "Nom de serveur invalide",
"form_error_subnet": "Le sous-réseau « {{cidr}} » ne contient pas l'adresse IP « {{ip}} »", "form_error_subnet": "Le sous-réseau « {{cidr}} » ne contient pas l'adresse IP « {{ip}} »",
"form_error_positive": "Doit être supérieur à 0", "form_error_positive": "Doit être supérieur à 0",
@ -163,8 +163,8 @@
"apply_btn": "Appliquer", "apply_btn": "Appliquer",
"disabled_filtering_toast": "Filtrage désactivé", "disabled_filtering_toast": "Filtrage désactivé",
"enabled_filtering_toast": "Filtrage activé", "enabled_filtering_toast": "Filtrage activé",
"disabled_safe_browsing_toast": "Surfing sécurisé désactivé", "disabled_safe_browsing_toast": "Navigation sécurisée désactivée",
"enabled_safe_browsing_toast": "Surfing sécurisé activé", "enabled_safe_browsing_toast": "Navigation sécurisée activée",
"disabled_parental_toast": "Contrôle parental désactivé", "disabled_parental_toast": "Contrôle parental désactivé",
"enabled_parental_toast": "Contrôle parental activé", "enabled_parental_toast": "Contrôle parental activé",
"disabled_safe_search_toast": "Recherche sécurisée désactivée", "disabled_safe_search_toast": "Recherche sécurisée désactivée",

View File

@ -43,7 +43,7 @@
"form_error_ip6_format": "Nevažeći IPv6 format", "form_error_ip6_format": "Nevažeći IPv6 format",
"form_error_ip_format": "Nevažeći format IP adrese", "form_error_ip_format": "Nevažeći format IP adrese",
"form_error_mac_format": "Nevažeći MAC format", "form_error_mac_format": "Nevažeći MAC format",
"form_error_client_id_format": "Nevažeći format ID-a klijenta", "form_error_client_id_format": "ID klijenta može sadržavati samo brojeve, mala slova i crtice",
"form_error_server_name": "Nevažeće ime poslužitelja", "form_error_server_name": "Nevažeće ime poslužitelja",
"form_error_subnet": "Podmrežu \"{{cidr}}\" ne sadrži IP adresu \"{{ip}}\"", "form_error_subnet": "Podmrežu \"{{cidr}}\" ne sadrži IP adresu \"{{ip}}\"",
"form_error_positive": "Mora biti veće od 0", "form_error_positive": "Mora biti veće od 0",
@ -163,8 +163,8 @@
"apply_btn": "Primijeni", "apply_btn": "Primijeni",
"disabled_filtering_toast": "Onemogućeno filtriranje", "disabled_filtering_toast": "Onemogućeno filtriranje",
"enabled_filtering_toast": "Omogućeno filtriranje", "enabled_filtering_toast": "Omogućeno filtriranje",
"disabled_safe_browsing_toast": "Onemogućena sigurna pretraga", "disabled_safe_browsing_toast": "Onemogućena Sigurna pretraga",
"enabled_safe_browsing_toast": "Omogućena sigurna pretraga", "enabled_safe_browsing_toast": "Omogućena Sigurna pretraga",
"disabled_parental_toast": "Onemogućen roditeljski nadzor", "disabled_parental_toast": "Onemogućen roditeljski nadzor",
"enabled_parental_toast": "Omogućen roditeljski nadzor", "enabled_parental_toast": "Omogućen roditeljski nadzor",
"disabled_safe_search_toast": "Onemogućeno sigurno pretraživanje", "disabled_safe_search_toast": "Onemogućeno sigurno pretraživanje",
@ -588,7 +588,7 @@
"show_whitelisted_responses": "Na popisu dopuštenih", "show_whitelisted_responses": "Na popisu dopuštenih",
"show_processed_responses": "Obrađeno", "show_processed_responses": "Obrađeno",
"blocked_safebrowsing": "Blokirano s Sigurnom pretragom", "blocked_safebrowsing": "Blokirano s Sigurnom pretragom",
"blocked_adult_websites": "Blokirala roditeljska zaštita", "blocked_adult_websites": "Blokirano Roditeljskom kontrolom",
"blocked_threats": "Blokirane prijetnje", "blocked_threats": "Blokirane prijetnje",
"allowed": "Dopušteno", "allowed": "Dopušteno",
"filtered": "Filtrirano", "filtered": "Filtrirano",

View File

@ -36,14 +36,23 @@
"dhcp_ipv4_settings": "DHCP IPv4 Beállítások", "dhcp_ipv4_settings": "DHCP IPv4 Beállítások",
"dhcp_ipv6_settings": "DHCP IPv6 Beállítások", "dhcp_ipv6_settings": "DHCP IPv6 Beállítások",
"form_error_required": "Kötelező mező", "form_error_required": "Kötelező mező",
"form_error_ip4_format": "Érvénytelen IPv4 formátum", "form_error_ip4_format": "Érvénytelen IPv4 cím",
"form_error_ip6_format": "Érvénytelen IPv6 formátum", "form_error_ip4_range_start_format": "Érvénytelen IPv4-cím a tartomány kezdetéhez",
"form_error_ip4_range_end_format": "Érvénytelen IPv4-cím a tartomány végén",
"form_error_ip4_gateway_format": "Érvénytelen IPv4-cím az átjáró",
"form_error_ip6_format": "Érvénytelen IPv6 cím",
"form_error_ip_format": "Érvénytelen IP-cím", "form_error_ip_format": "Érvénytelen IP-cím",
"form_error_mac_format": "Érvénytelen MAC formátum", "form_error_mac_format": "Érvénytelen MAC m",
"form_error_client_id_format": "Érvénytelen kliens ID formátum", "form_error_client_id_format": "Az ügyfél-azonosító csak számokat, kisbetűket és kötőjeleket tartalmazhat",
"form_error_server_name": "Érvénytelen szervernév", "form_error_server_name": "Érvénytelen szervernév",
"form_error_subnet": "A(z) \"{{cidr}}\" alhálózat nem tartalmazza a(z) \"{{ip}}\" IP címet", "form_error_subnet": "A(z) \"{{cidr}}\" alhálózat nem tartalmazza a(z) \"{{ip}}\" IP címet",
"form_error_positive": "0-nál nagyobbnak kell lennie", "form_error_positive": "0-nál nagyobbnak kell lennie",
"out_of_range_error": "A tartományon kívül legyen \"{{start}}\"-\"{{end}}\"",
"lower_range_start_error": "Kisebb legyen, mint a tartomány kezdete",
"greater_range_start_error": "Nagyobbbb legyen, mint a tartomány kezdete",
"greater_range_end_error": "Nagyobb legyen, mint a tartomány vége",
"subnet_error": "A címeknek egy alhálózatban kell lenniük",
"gateway_or_subnet_invalid": "Az alhálózati maszk érvénytelen",
"dhcp_form_gateway_input": "Átjáró IP", "dhcp_form_gateway_input": "Átjáró IP",
"dhcp_form_subnet_input": "Alhálózati maszk", "dhcp_form_subnet_input": "Alhálózati maszk",
"dhcp_form_range_title": "IP-címek tartománya", "dhcp_form_range_title": "IP-címek tartománya",
@ -191,6 +200,7 @@
"form_error_url_or_path_format": "Helytelen URL vagy elérési út a listához", "form_error_url_or_path_format": "Helytelen URL vagy elérési út a listához",
"custom_filter_rules": "Egyéni szűrési szabályok", "custom_filter_rules": "Egyéni szűrési szabályok",
"custom_filter_rules_hint": "Adjon meg egy szabályt egy sorban. Használhat egyszerű hirdetésblokkolási szabályokat vagy hosztfájl szintaxist.", "custom_filter_rules_hint": "Adjon meg egy szabályt egy sorban. Használhat egyszerű hirdetésblokkolási szabályokat vagy hosztfájl szintaxist.",
"system_host_files": "Rendszer hosztfájlok",
"examples_title": "Példák", "examples_title": "Példák",
"example_meaning_filter_block": "letiltja a hozzáférést az example.org domainhez, valamint annak az összes aldomainjéhez is", "example_meaning_filter_block": "letiltja a hozzáférést az example.org domainhez, valamint annak az összes aldomainjéhez is",
"example_meaning_filter_whitelist": "feloldja a hozzáférést az example.org domainhez, valamint annak az összes aldomainjéhez is", "example_meaning_filter_whitelist": "feloldja a hozzáférést az example.org domainhez, valamint annak az összes aldomainjéhez is",
@ -577,7 +587,7 @@
"show_blocked_responses": "Blokkolva", "show_blocked_responses": "Blokkolva",
"show_whitelisted_responses": "Kivételezett", "show_whitelisted_responses": "Kivételezett",
"show_processed_responses": "Feldolgozva", "show_processed_responses": "Feldolgozva",
"blocked_safebrowsing": "Blokkolva a biztonságos böngészés által", "blocked_safebrowsing": "Blokkolva a Biztonságos böngészés által",
"blocked_adult_websites": "Szülői felügyelet által blokkolva", "blocked_adult_websites": "Szülői felügyelet által blokkolva",
"blocked_threats": "Blokkolt fenyegetések", "blocked_threats": "Blokkolt fenyegetések",
"allowed": "Engedve", "allowed": "Engedve",
@ -611,7 +621,11 @@
"click_to_view_queries": "Kattintson a lekérésekért", "click_to_view_queries": "Kattintson a lekérésekért",
"port_53_faq_link": "Az 53-as portot gyakran a \"DNSStubListener\" vagy a \"systemd-resolved\" (rendszer által feloldott) szolgáltatások használják. Kérjük, olvassa el <0>ezt az útmutatót</0> a probléma megoldásához.", "port_53_faq_link": "Az 53-as portot gyakran a \"DNSStubListener\" vagy a \"systemd-resolved\" (rendszer által feloldott) szolgáltatások használják. Kérjük, olvassa el <0>ezt az útmutatót</0> a probléma megoldásához.",
"adg_will_drop_dns_queries": "Az AdGuard Home eldobja az összes DNS kérést erről a kliensről.", "adg_will_drop_dns_queries": "Az AdGuard Home eldobja az összes DNS kérést erről a kliensről.",
"filter_allowlist": "FIGYELMEZTETÉS: Ez a művelet a \"{{disallowed_rule}}\" szabályt is kizárja az engedélyezett ügyfelek listájából.",
"last_rule_in_allowlist": "Nem lehet letiltani ezt az ügyfelet, mert a \"{{disallowed_rule}}\" szabály kizárása letiltja az \"Allowed clients\" listát.",
"experimental": "Kísérleti", "experimental": "Kísérleti",
"use_saved_key": "Előzőleg mentett kulcs használata", "use_saved_key": "Előzőleg mentett kulcs használata",
"parental_control": "Szülői felügyelet" "parental_control": "Szülői felügyelet",
"safe_browsing": "Biztonságos böngészés",
"served_from_cache": "{{value}} <i>(gyorsítótárból kiszolgálva)</i>"
} }

View File

@ -36,10 +36,23 @@
"dhcp_ipv4_settings": "Pengaturan DHCP IPv4", "dhcp_ipv4_settings": "Pengaturan DHCP IPv4",
"dhcp_ipv6_settings": "Pengaturan DHCP IPv6", "dhcp_ipv6_settings": "Pengaturan DHCP IPv6",
"form_error_required": "Kolom yang harus diisi", "form_error_required": "Kolom yang harus diisi",
"form_error_ip_format": "Alamat IP salah", "form_error_ip4_format": "Alamat IPv4 tidak valid",
"form_error_ip4_range_start_format": "Alamat IPv4 tidak valid dari rentang awal",
"form_error_ip4_range_end_format": "Alamat IPv4 tidak valid dari rentang akhir",
"form_error_ip4_gateway_format": "Alamat IPv4 gateway tidak valid",
"form_error_ip6_format": "Alamat IPv6 tidak valid",
"form_error_ip_format": "Alamat IP tidak valid",
"form_error_mac_format": "Alamat MAC tidak valid",
"form_error_client_id_format": "ID Klien hanya boleh berisi angka, huruf kecil, dan tanda hubung",
"form_error_server_name": "Nama server tidak valid", "form_error_server_name": "Nama server tidak valid",
"form_error_subnet": "Subnet \"{{cidr}}\" tidak berisi alamat IP \"{{ip}}\"", "form_error_subnet": "Subnet \"{{cidr}}\" tidak berisi alamat IP \"{{ip}}\"",
"form_error_positive": "Harus lebih dari 0", "form_error_positive": "Harus lebih dari 0",
"out_of_range_error": "Harus di luar rentang \"{{start}}\"-\"{{end}}\"",
"lower_range_start_error": "Harus lebih rendah dari rentang awal",
"greater_range_start_error": "Harus lebih besar dari rentang awal",
"greater_range_end_error": "Harus lebih besar dari rentang akhir",
"subnet_error": "Alamat harus dalam satu subnet",
"gateway_or_subnet_invalid": "Subnet mask tidak valid",
"dhcp_form_gateway_input": "IP gateway", "dhcp_form_gateway_input": "IP gateway",
"dhcp_form_subnet_input": "Subnet mask", "dhcp_form_subnet_input": "Subnet mask",
"dhcp_form_range_title": "Rentang alamat IP", "dhcp_form_range_title": "Rentang alamat IP",
@ -150,8 +163,8 @@
"apply_btn": "Terapkan", "apply_btn": "Terapkan",
"disabled_filtering_toast": "Penyaringan nonaktif", "disabled_filtering_toast": "Penyaringan nonaktif",
"enabled_filtering_toast": "Penyaringan aktif", "enabled_filtering_toast": "Penyaringan aktif",
"disabled_safe_browsing_toast": "Penelusuran aman dinonaktifkan", "disabled_safe_browsing_toast": "Penjelajahan Aman dinonaktifkan",
"enabled_safe_browsing_toast": "Penelusuran aman diaktifkan", "enabled_safe_browsing_toast": "Penjelajahan Aman Diaktifkan",
"disabled_parental_toast": "Kontrol orang tua dinonaktifkan", "disabled_parental_toast": "Kontrol orang tua dinonaktifkan",
"enabled_parental_toast": "Kontrol orang tua diaktifkan", "enabled_parental_toast": "Kontrol orang tua diaktifkan",
"disabled_safe_search_toast": "Pencarian aman dinonaktifkan", "disabled_safe_search_toast": "Pencarian aman dinonaktifkan",
@ -187,6 +200,7 @@
"form_error_url_or_path_format": "URL atau jalur absolut dari daftar tidak valid", "form_error_url_or_path_format": "URL atau jalur absolut dari daftar tidak valid",
"custom_filter_rules": "Aturan penyaringan khusus", "custom_filter_rules": "Aturan penyaringan khusus",
"custom_filter_rules_hint": "Masukkan satu aturan dalam sebuah baris. Anda dapat menggunakan baik aturan adblock maupun sintaks file hosts.", "custom_filter_rules_hint": "Masukkan satu aturan dalam sebuah baris. Anda dapat menggunakan baik aturan adblock maupun sintaks file hosts.",
"system_host_files": "File host sistem",
"examples_title": "Contoh", "examples_title": "Contoh",
"example_meaning_filter_block": "Blokir akses ke example.org dan seluruh subdomainnya", "example_meaning_filter_block": "Blokir akses ke example.org dan seluruh subdomainnya",
"example_meaning_filter_whitelist": "Buka blokir akses ke domain example.orf dan seluruh subdomainnya", "example_meaning_filter_whitelist": "Buka blokir akses ke domain example.orf dan seluruh subdomainnya",
@ -202,6 +216,7 @@
"example_upstream_sdns": "anda bisa menggunakan <0>Stempel DNS</0> untuk <1>DNSCrypt</1> atau pengarah <2>DNS-over-HTTPS</2>", "example_upstream_sdns": "anda bisa menggunakan <0>Stempel DNS</0> untuk <1>DNSCrypt</1> atau pengarah <2>DNS-over-HTTPS</2>",
"example_upstream_tcp": "DNS reguler (melalui TCP)", "example_upstream_tcp": "DNS reguler (melalui TCP)",
"all_lists_up_to_date_toast": "Semua daftar sudah diperbarui", "all_lists_up_to_date_toast": "Semua daftar sudah diperbarui",
"updated_upstream_dns_toast": "Server upstream berhasil disimpan",
"dns_test_ok_toast": "Server DNS yang ditentukan bekerja dengan benar", "dns_test_ok_toast": "Server DNS yang ditentukan bekerja dengan benar",
"dns_test_not_ok_toast": "Server \"{{key}}\": tidak dapat digunakan, mohon cek bahwa Anda telah menulisnya dengan benar", "dns_test_not_ok_toast": "Server \"{{key}}\": tidak dapat digunakan, mohon cek bahwa Anda telah menulisnya dengan benar",
"unblock": "Buka Blokir", "unblock": "Buka Blokir",
@ -299,6 +314,7 @@
"install_settings_dns_desc": "Anda perlu mengkonfigurasi perangkat atau router anda untuk menggunakan server DNS berikut ini", "install_settings_dns_desc": "Anda perlu mengkonfigurasi perangkat atau router anda untuk menggunakan server DNS berikut ini",
"install_settings_all_interfaces": "Semua antarmuka", "install_settings_all_interfaces": "Semua antarmuka",
"install_auth_title": "Otentikasi", "install_auth_title": "Otentikasi",
"install_auth_desc": "Otentikasi kata sandi ke antarmuka web admin AdGuard Home Anda harus dikonfigurasi. Meskipun AdGuard Home hanya dapat diakses di jaringan lokal Anda, tetap penting untuk melindunginya dari akses tak terbatas.",
"install_auth_username": "Nama Pengguna", "install_auth_username": "Nama Pengguna",
"install_auth_password": "Kata Sandi", "install_auth_password": "Kata Sandi",
"install_auth_confirm": "Konfirmasi kata sandi", "install_auth_confirm": "Konfirmasi kata sandi",
@ -495,6 +511,7 @@
"statistics_clear_confirm": "Apakah Anda yakin ingin menghapus statistik?", "statistics_clear_confirm": "Apakah Anda yakin ingin menghapus statistik?",
"statistics_retention_confirm": "Apakah Anda yakin ingin mengubah retensi statistik? Jika Anda menurunkan nilai interval, beberapa data akan hilang", "statistics_retention_confirm": "Apakah Anda yakin ingin mengubah retensi statistik? Jika Anda menurunkan nilai interval, beberapa data akan hilang",
"statistics_cleared": "Statistik berhasil dihapus", "statistics_cleared": "Statistik berhasil dihapus",
"statistics_enable": "Aktifkan statistik",
"interval_hours": "{{count}} jam", "interval_hours": "{{count}} jam",
"interval_hours_plural": "{{count}} jam", "interval_hours_plural": "{{count}} jam",
"filters_configuration": "Konfigurasi filter", "filters_configuration": "Konfigurasi filter",
@ -570,7 +587,7 @@
"show_blocked_responses": "Diblokir", "show_blocked_responses": "Diblokir",
"show_whitelisted_responses": "Dalam Daftar Putih", "show_whitelisted_responses": "Dalam Daftar Putih",
"show_processed_responses": "Terproses", "show_processed_responses": "Terproses",
"blocked_safebrowsing": "Terblokir oleh Safebrowsing", "blocked_safebrowsing": "Diblokir oleh Penjelajahan Aman",
"blocked_adult_websites": "Diblok oleh Kontrol Orang tua", "blocked_adult_websites": "Diblok oleh Kontrol Orang tua",
"blocked_threats": "Blokir Ancaman", "blocked_threats": "Blokir Ancaman",
"allowed": "Dibolehkan", "allowed": "Dibolehkan",
@ -604,7 +621,11 @@
"click_to_view_queries": "Klik untuk lihat permintaan", "click_to_view_queries": "Klik untuk lihat permintaan",
"port_53_faq_link": "Port 53 sering ditempati oleh layanan \"DNSStubListener\" atau \"systemd-resolved\". Silakan baca <0>instruksi ini</0> tentang cara menyelesaikan ini.", "port_53_faq_link": "Port 53 sering ditempati oleh layanan \"DNSStubListener\" atau \"systemd-resolved\". Silakan baca <0>instruksi ini</0> tentang cara menyelesaikan ini.",
"adg_will_drop_dns_queries": "AdGuard Home akan menghapus semua permintaan DNS dari klien ini.", "adg_will_drop_dns_queries": "AdGuard Home akan menghapus semua permintaan DNS dari klien ini.",
"filter_allowlist": "PERINGATAN: Tindakan ini juga akan mengecualikan aturan \"{{disallowed_rule}}\" dari daftar klien yang diizinkan.",
"last_rule_in_allowlist": "Tidak dapat melarang klien ini karena mengecualikan aturan \"{{disallowed_rule}}\" akan MENONAKTIFKAN daftar \"Klien yang diizinkan\".",
"experimental": "Eksperimental", "experimental": "Eksperimental",
"use_saved_key": "Gunakan kunci yang disimpan sebelumnya", "use_saved_key": "Gunakan kunci yang disimpan sebelumnya",
"parental_control": "Kontrol Orang Tua" "parental_control": "Kontrol Orang Tua",
"safe_browsing": "Penjelajahan Aman",
"served_from_cache": "{{value}} <i>(disajikan dari cache)</i>"
} }

View File

@ -43,7 +43,7 @@
"form_error_ip6_format": "Indirizzo IPv6 non valido", "form_error_ip6_format": "Indirizzo IPv6 non valido",
"form_error_ip_format": "Indirizzo IP non valido", "form_error_ip_format": "Indirizzo IP non valido",
"form_error_mac_format": "Indirizzo MAC non valido", "form_error_mac_format": "Indirizzo MAC non valido",
"form_error_client_id_format": "ID cliente non valido", "form_error_client_id_format": "Il client ID deve contenere solo numeri, lettere minuscole e trattini",
"form_error_server_name": "Nome server non valido", "form_error_server_name": "Nome server non valido",
"form_error_subnet": "La subnet \"{{cidr}}\" non contiene l'indirizzo IP \"{{ip}}\"", "form_error_subnet": "La subnet \"{{cidr}}\" non contiene l'indirizzo IP \"{{ip}}\"",
"form_error_positive": "Deve essere maggiore di 0", "form_error_positive": "Deve essere maggiore di 0",
@ -295,16 +295,16 @@
"blocking_mode_null_ip": "IP nullo: Rispondi con indirizzo IP zero (0.0.0.0 per A; :: per AAAA)", "blocking_mode_null_ip": "IP nullo: Rispondi con indirizzo IP zero (0.0.0.0 per A; :: per AAAA)",
"blocking_mode_custom_ip": "IP personalizzato: Rispondi con un indirizzo IP impostato manualmente", "blocking_mode_custom_ip": "IP personalizzato: Rispondi con un indirizzo IP impostato manualmente",
"upstream_dns_client_desc": "Se lasci questo spazio vuoto, AdGuard Home utilizzerà i server configurati nelle <0>impostazioni DNS</0>.", "upstream_dns_client_desc": "Se lasci questo spazio vuoto, AdGuard Home utilizzerà i server configurati nelle <0>impostazioni DNS</0>.",
"tracker_source": "Origine tracciante", "tracker_source": "Origine del tracciatore",
"source_label": "Fonte", "source_label": "Fonte",
"found_in_known_domain_db": "Trovato nel database dei domini conosciuti.", "found_in_known_domain_db": "Trovato nel database dei domini noti.",
"category_label": "Categoria", "category_label": "Categoria",
"rule_label": "Regola(e)", "rule_label": "Regola(e)",
"list_label": "Elenco", "list_label": "Elenco",
"unknown_filter": "Filtro sconosciuto {{filterId}}", "unknown_filter": "Filtro sconosciuto {{filterId}}",
"known_tracker": "Tracciante noto", "known_tracker": "Tracciatore noto",
"install_welcome_title": "Benvenuto nella Home di AdGuard!", "install_welcome_title": "Benvenuto nella Home di AdGuard!",
"install_welcome_desc": "AdGuard Home è un server DNS che blocca annunci e traccianti in tutta la rete. Il suo scopo è quello di consentire di controllare l'intera rete e tutti i dispositivi, e non richiede l'utilizzo di un programma sul lato client.", "install_welcome_desc": "AdGuard Home è un server DNS che blocca annunci e tracciatori a livello di rete. Il suo scopo è quello di permetterti il controllo dell'intera rete e di tutti i dispositivi, e non richiede l'utilizzo di un programma lato client.",
"install_settings_title": "Interfaccia Web dell'Admin", "install_settings_title": "Interfaccia Web dell'Admin",
"install_settings_listen": "Interfaccia d'ascolto", "install_settings_listen": "Interfaccia d'ascolto",
"install_settings_port": "Porta", "install_settings_port": "Porta",
@ -400,7 +400,7 @@
"dns_status_error": "Errore nel recupero dello stato del server DNS", "dns_status_error": "Errore nel recupero dello stato del server DNS",
"down": "Spenta", "down": "Spenta",
"fix": "Risolvi", "fix": "Risolvi",
"dns_providers": "Qui c'è un <0>elenco di fornitori DNS conosciuti</0> da cui scegliere.", "dns_providers": "Qui c'è un <0>elenco di fornitori DNS noti</0> da cui scegliere.",
"update_now": "Aggiorna ora", "update_now": "Aggiorna ora",
"update_failed": "Aggiornamento automatico non riuscito. Ti suggeriamo di <a>seguire questi passaggi</a> per aggiornare manualmente.", "update_failed": "Aggiornamento automatico non riuscito. Ti suggeriamo di <a>seguire questi passaggi</a> per aggiornare manualmente.",
"processing_update": "Perfavore aspetta, AdGuard Home si sta aggiornando", "processing_update": "Perfavore aspetta, AdGuard Home si sta aggiornando",
@ -612,9 +612,9 @@
"filter_category_security": "Sicurezza", "filter_category_security": "Sicurezza",
"filter_category_regional": "Regionale", "filter_category_regional": "Regionale",
"filter_category_other": "Altro", "filter_category_other": "Altro",
"filter_category_general_desc": "Elenchi per il blocco dei traccianti e degli annunci sulla maggioranza dei dispositivi", "filter_category_general_desc": "Elenchi per il blocco dei tracciatori e degli annunci sulla maggioranza dei dispositivi",
"filter_category_security_desc": "Elenchi progettati specificamente per bloccare domini malevoli, di phishing o truffa", "filter_category_security_desc": "Elenchi progettati specificamente per bloccare domini malevoli, di phishing o truffa",
"filter_category_regional_desc": "Elenchi focalizzati su annunci regionali e server traccianti", "filter_category_regional_desc": "Elenchi focalizzati su annunci regionali e server tracciatori",
"filter_category_other_desc": "Altre liste nere", "filter_category_other_desc": "Altre liste nere",
"setup_config_to_enable_dhcp_server": "Configurazione dell'installazione per l'attivazione del server DHCP", "setup_config_to_enable_dhcp_server": "Configurazione dell'installazione per l'attivazione del server DHCP",
"original_response": "Responso originale", "original_response": "Responso originale",

View File

@ -43,7 +43,7 @@
"form_error_ip6_format": "IPv6アドレスが無効です", "form_error_ip6_format": "IPv6アドレスが無効です",
"form_error_ip_format": "IPアドレスが無効です", "form_error_ip_format": "IPアドレスが無効です",
"form_error_mac_format": "MACアドレスが無効です", "form_error_mac_format": "MACアドレスが無効です",
"form_error_client_id_format": "クライアントIDが無効です", "form_error_client_id_format": "クライアントIDには、数字、小文字、ハイフンのみが使われている必要があります",
"form_error_server_name": "サーバ名が無効です", "form_error_server_name": "サーバ名が無効です",
"form_error_subnet": "IPアドレス「{{ip}}」はサブネット「{{cidr}}」に含まれていません", "form_error_subnet": "IPアドレス「{{ip}}」はサブネット「{{cidr}}」に含まれていません",
"form_error_positive": "0より大きい必要があります", "form_error_positive": "0より大きい必要があります",
@ -587,8 +587,8 @@
"show_blocked_responses": "ブロック済", "show_blocked_responses": "ブロック済",
"show_whitelisted_responses": "ホワイトリストにあり", "show_whitelisted_responses": "ホワイトリストにあり",
"show_processed_responses": "処理済", "show_processed_responses": "処理済",
"blocked_safebrowsing": "ブロックされたセーフブラウジング", "blocked_safebrowsing": "セーフブラウジングによってブロック済み",
"blocked_adult_websites": "ペアレンタルコントロールによってブロックされました", "blocked_adult_websites": "ペアレンタルコントロールによってブロック済み",
"blocked_threats": "ブロックされた脅威", "blocked_threats": "ブロックされた脅威",
"allowed": "許可", "allowed": "許可",
"filtered": "フィルタで処理", "filtered": "フィルタで処理",

View File

@ -43,7 +43,7 @@
"form_error_ip6_format": "잘못된 IPv6 형식", "form_error_ip6_format": "잘못된 IPv6 형식",
"form_error_ip_format": "잘못된 IP 형식", "form_error_ip_format": "잘못된 IP 형식",
"form_error_mac_format": "잘못된 MAC 형식", "form_error_mac_format": "잘못된 MAC 형식",
"form_error_client_id_format": "잘못된 클라이언트 ID 형식", "form_error_client_id_format": "클라이언트 ID는 숫자, 소문자 및 하이픈만 포함해야 합니다",
"form_error_server_name": "유효하지 않은 서버 이름입니다", "form_error_server_name": "유효하지 않은 서버 이름입니다",
"form_error_subnet": "서브넷 \"{{cidr}}\"에 \"{{ip}}\" IP 주소가 없습니다", "form_error_subnet": "서브넷 \"{{cidr}}\"에 \"{{ip}}\" IP 주소가 없습니다",
"form_error_positive": "0보다 커야 합니다", "form_error_positive": "0보다 커야 합니다",
@ -587,8 +587,8 @@
"show_blocked_responses": "차단됨", "show_blocked_responses": "차단됨",
"show_whitelisted_responses": "예외 적용됨", "show_whitelisted_responses": "예외 적용됨",
"show_processed_responses": "처리됨", "show_processed_responses": "처리됨",
"blocked_safebrowsing": "차단된 세이프 브라우징", "blocked_safebrowsing": "세이프 브라우징에 의해 차단됨",
"blocked_adult_websites": "자녀 보호 차단됨", "blocked_adult_websites": "자녀 보호에 의해 차단됨",
"blocked_threats": "차단된 위협", "blocked_threats": "차단된 위협",
"allowed": "허용됨", "allowed": "허용됨",
"filtered": "필터링됨", "filtered": "필터링됨",
@ -626,6 +626,6 @@
"experimental": "실험", "experimental": "실험",
"use_saved_key": "이전에 저장했던 키 사용하기", "use_saved_key": "이전에 저장했던 키 사용하기",
"parental_control": "자녀 보호", "parental_control": "자녀 보호",
"safe_browsing": "안전한 브라우징", "safe_browsing": "세이프 브라우징",
"served_from_cache": "{{value}} <i>(캐시에서 제공)</i>" "served_from_cache": "{{value}} <i>(캐시에서 제공)</i>"
} }

View File

@ -43,7 +43,7 @@
"form_error_ip6_format": "Ongeldig IPv6-adres", "form_error_ip6_format": "Ongeldig IPv6-adres",
"form_error_ip_format": "Ongeldig IP-adres", "form_error_ip_format": "Ongeldig IP-adres",
"form_error_mac_format": "Ongeldig MAC-adres", "form_error_mac_format": "Ongeldig MAC-adres",
"form_error_client_id_format": "Ongeldige cliënt-ID", "form_error_client_id_format": "Client-ID mag alleen cijfers, kleine letters en koppeltekens bevatten",
"form_error_server_name": "Ongeldige servernaam", "form_error_server_name": "Ongeldige servernaam",
"form_error_subnet": "Subnet “{{cidr}}” bevat niet het IP-adres “{{ip}}”", "form_error_subnet": "Subnet “{{cidr}}” bevat niet het IP-adres “{{ip}}”",
"form_error_positive": "Moet groter zijn dan 0", "form_error_positive": "Moet groter zijn dan 0",

View File

@ -43,7 +43,7 @@
"form_error_ip6_format": "Nieprawidłowy adres IPv6", "form_error_ip6_format": "Nieprawidłowy adres IPv6",
"form_error_ip_format": "Nieprawidłowy adres IP", "form_error_ip_format": "Nieprawidłowy adres IP",
"form_error_mac_format": "Nieprawidłowy adres MAC", "form_error_mac_format": "Nieprawidłowy adres MAC",
"form_error_client_id_format": "Nieprawidłowy ID klienta", "form_error_client_id_format": "ID klienta musi zawierać tylko cyfry, małe litery i myślniki",
"form_error_server_name": "Nieprawidłowa nazwa serwera", "form_error_server_name": "Nieprawidłowa nazwa serwera",
"form_error_subnet": "Podsieć \"{{cidr}}\" nie zawiera adresu IP \"{{ip}}\"", "form_error_subnet": "Podsieć \"{{cidr}}\" nie zawiera adresu IP \"{{ip}}\"",
"form_error_positive": "Musi być większa niż 0", "form_error_positive": "Musi być większa niż 0",

View File

@ -43,7 +43,7 @@
"form_error_ip6_format": "Endereço de IPv6 inválido", "form_error_ip6_format": "Endereço de IPv6 inválido",
"form_error_ip_format": "Endereço de IP inválido", "form_error_ip_format": "Endereço de IP inválido",
"form_error_mac_format": "Endereço de MAC inválido", "form_error_mac_format": "Endereço de MAC inválido",
"form_error_client_id_format": "ID de cliente inválido", "form_error_client_id_format": "O ID do cliente deve conter apenas números, letras minúsculas e hifens",
"form_error_server_name": "Nome de servidor inválido", "form_error_server_name": "Nome de servidor inválido",
"form_error_subnet": "A sub-rede \"{{cidr}}\" não contém o endereço IP \"{{ip}}\"", "form_error_subnet": "A sub-rede \"{{cidr}}\" não contém o endereço IP \"{{ip}}\"",
"form_error_positive": "Deve ser maior que 0", "form_error_positive": "Deve ser maior que 0",

View File

@ -43,7 +43,7 @@
"form_error_ip6_format": "Endereço de IPv6 inválido", "form_error_ip6_format": "Endereço de IPv6 inválido",
"form_error_ip_format": "Endereço de IP inválido", "form_error_ip_format": "Endereço de IP inválido",
"form_error_mac_format": "Endereço de MAC inválido", "form_error_mac_format": "Endereço de MAC inválido",
"form_error_client_id_format": "ID de cliente inválido", "form_error_client_id_format": "O ID do cliente deve conter apenas números, letras minúsculas e hifens",
"form_error_server_name": "Nome de servidor inválido", "form_error_server_name": "Nome de servidor inválido",
"form_error_subnet": "A sub-rede \"{{cidr}}\" não contém o endereço IP \"{{ip}}\"", "form_error_subnet": "A sub-rede \"{{cidr}}\" não contém o endereço IP \"{{ip}}\"",
"form_error_positive": "Deve ser maior que 0", "form_error_positive": "Deve ser maior que 0",

View File

@ -43,7 +43,7 @@
"form_error_ip6_format": "Adresa IPv6 nevalidă", "form_error_ip6_format": "Adresa IPv6 nevalidă",
"form_error_ip_format": "Adresă IP nevalidă", "form_error_ip_format": "Adresă IP nevalidă",
"form_error_mac_format": "Adresă MAC nevalidă", "form_error_mac_format": "Adresă MAC nevalidă",
"form_error_client_id_format": "ID client nevalid", "form_error_client_id_format": "ID-ul clientului trebuie să conțină numai numere, litere minuscule și liniuțe.",
"form_error_server_name": "Nume de server nevalid", "form_error_server_name": "Nume de server nevalid",
"form_error_subnet": "Subrețeaua „{{cidr}}” nu conține adresa IP „{{ip}}”", "form_error_subnet": "Subrețeaua „{{cidr}}” nu conține adresa IP „{{ip}}”",
"form_error_positive": "Trebuie să fie mai mare de 0", "form_error_positive": "Trebuie să fie mai mare de 0",

View File

@ -43,7 +43,7 @@
"form_error_ip6_format": "Некорректный IPv6-адрес", "form_error_ip6_format": "Некорректный IPv6-адрес",
"form_error_ip_format": "Некорректный IP-адрес", "form_error_ip_format": "Некорректный IP-адрес",
"form_error_mac_format": "Некорректный MAC-адрес", "form_error_mac_format": "Некорректный MAC-адрес",
"form_error_client_id_format": "Некорректный ID клиента", "form_error_client_id_format": "ID клиента может содержать только цифры, строчные латинские буквы и дефисы",
"form_error_server_name": "Некорректное имя сервера", "form_error_server_name": "Некорректное имя сервера",
"form_error_subnet": "Подсеть «{{cidr}}» не содержит IP-адрес «{{ip}}»", "form_error_subnet": "Подсеть «{{cidr}}» не содержит IP-адрес «{{ip}}»",
"form_error_positive": "Должно быть больше 0", "form_error_positive": "Должно быть больше 0",
@ -587,7 +587,7 @@
"show_blocked_responses": "Заблокировано", "show_blocked_responses": "Заблокировано",
"show_whitelisted_responses": "В белом списке", "show_whitelisted_responses": "В белом списке",
"show_processed_responses": "Обработан", "show_processed_responses": "Обработан",
"blocked_safebrowsing": "Заблокировано согласно базе данных Safebrowsing", "blocked_safebrowsing": "Заблокировано согласно базе данных Safe Browsing",
"blocked_adult_websites": "Заблокировано Родительским контролем", "blocked_adult_websites": "Заблокировано Родительским контролем",
"blocked_threats": "Заблокировано угроз", "blocked_threats": "Заблокировано угроз",
"allowed": "Разрешённые", "allowed": "Разрешённые",

View File

@ -43,7 +43,7 @@
"form_error_ip6_format": "Neplatná IPv6 adresa", "form_error_ip6_format": "Neplatná IPv6 adresa",
"form_error_ip_format": "Neplatná IP adresa", "form_error_ip_format": "Neplatná IP adresa",
"form_error_mac_format": "Neplatná MAC adresa", "form_error_mac_format": "Neplatná MAC adresa",
"form_error_client_id_format": "Neplatné ID klienta", "form_error_client_id_format": "ID klienta musí obsahovať iba čísla, malé písmená a spojovníky",
"form_error_server_name": "Neplatné meno servera", "form_error_server_name": "Neplatné meno servera",
"form_error_subnet": "Podsieť \"{{cidr}}\" neobsahuje IP adresu \"{{ip}}\"", "form_error_subnet": "Podsieť \"{{cidr}}\" neobsahuje IP adresu \"{{ip}}\"",
"form_error_positive": "Musí byť väčšie ako 0", "form_error_positive": "Musí byť väčšie ako 0",
@ -163,8 +163,8 @@
"apply_btn": "Použiť", "apply_btn": "Použiť",
"disabled_filtering_toast": "Vypnutá filtrácia", "disabled_filtering_toast": "Vypnutá filtrácia",
"enabled_filtering_toast": "Zapnutá filtrácia", "enabled_filtering_toast": "Zapnutá filtrácia",
"disabled_safe_browsing_toast": "Vypnuté Bezpečné prehliadanie", "disabled_safe_browsing_toast": "Bezpečné prehliadanie vypnuté",
"enabled_safe_browsing_toast": "Zapnuté Bezpečné prehliadanie", "enabled_safe_browsing_toast": "Bezpečné prehliadanie zapnuté",
"disabled_parental_toast": "Vypnutá Rodičovská kontrola", "disabled_parental_toast": "Vypnutá Rodičovská kontrola",
"enabled_parental_toast": "Zapnutá Rodičovská kontrola", "enabled_parental_toast": "Zapnutá Rodičovská kontrola",
"disabled_safe_search_toast": "Vypnuté bezpečné vyhľadávanie", "disabled_safe_search_toast": "Vypnuté bezpečné vyhľadávanie",
@ -588,7 +588,7 @@
"show_whitelisted_responses": "Obsiahnuté v bielej listine", "show_whitelisted_responses": "Obsiahnuté v bielej listine",
"show_processed_responses": "Spracované", "show_processed_responses": "Spracované",
"blocked_safebrowsing": "Zablokované modulom Bezpečné prehliadanie", "blocked_safebrowsing": "Zablokované modulom Bezpečné prehliadanie",
"blocked_adult_websites": "Blokované Rodičovskou kontrolou", "blocked_adult_websites": "Zablokovaná stránka pre dospelých",
"blocked_threats": "Zablokované hrozby", "blocked_threats": "Zablokované hrozby",
"allowed": "Povolené", "allowed": "Povolené",
"filtered": "Filtrované", "filtered": "Filtrované",

View File

@ -43,7 +43,7 @@
"form_error_ip6_format": "Neveljaven naslov IPv6", "form_error_ip6_format": "Neveljaven naslov IPv6",
"form_error_ip_format": "Neveljaven naslov IP", "form_error_ip_format": "Neveljaven naslov IP",
"form_error_mac_format": "Neveljaven naslov MAC", "form_error_mac_format": "Neveljaven naslov MAC",
"form_error_client_id_format": "Neveljaven ID odjemalca", "form_error_client_id_format": "ID odjemalca mora vsebovati samo številke, male črke in vezaje",
"form_error_server_name": "Neveljavno ime strežnika", "form_error_server_name": "Neveljavno ime strežnika",
"form_error_subnet": "Podomrežje \"{{cidr}}\" ne vsebuje naslova IP \"{{ip}}\"", "form_error_subnet": "Podomrežje \"{{cidr}}\" ne vsebuje naslova IP \"{{ip}}\"",
"form_error_positive": "Mora biti večja od 0", "form_error_positive": "Mora biti večja od 0",

View File

@ -1,24 +1,58 @@
{ {
"client_settings": "Klientinställningar", "client_settings": "Klientinställningar",
"example_upstream_reserved": "Du kan specificera DNS-uppström <0>för en specifik domän</0>",
"example_upstream_comment": "Du kan ange en kommentar",
"upstream_parallel": "Använd parallella förfrågningar för att snabba upp dessa genom att fråga alla uppströmsservrar samtidigt.",
"parallel_requests": "Parallella förfrågningar",
"load_balancing": "Lastbalansering",
"load_balancing_desc": "Fråga en uppströmsserver åt gången. AdGuard Home använder sin viktade slumpmässiga algoritm för att välja server så att den snabbaste servern används oftare.",
"bootstrap_dns": "Bootstrap-DNS-servrar", "bootstrap_dns": "Bootstrap-DNS-servrar",
"bootstrap_dns_desc": "Bootstrap-DNS-servrar används för att slå upp DoH/DoT-resolvrarnas IP-adresser som du specificerat som uppström.", "bootstrap_dns_desc": "Bootstrap-DNS-servrar används för att slå upp DoH/DoT-resolvrarnas IP-adresser som du specificerat som uppström.",
"local_ptr_title": "Privata omvända DNS-servrar",
"local_ptr_desc": "DNS servrarna som AdGuard Home använder för lokala PTR frågor. Dessa servrar används för att lösa värdnamnen på klienter med privata IP-adresser, till exempel \"192.168.12.34\", genom omvänd DNS. Om inga servrar angetts använder AdGuard Home adresserna till standard DNS servrar för ditt operativsystem förutom adresserna till AdGuard Home själv.",
"local_ptr_default_resolver": "Som standard använder AdGuard Home följande omvända DNS upplösare: {{ip}}.",
"local_ptr_no_default_resolver": "AdGuard Home kunde inte fastställa lämpliga privata omvända DNS upplösare för detta system.",
"local_ptr_placeholder": "Ange en serveradress per rad", "local_ptr_placeholder": "Ange en serveradress per rad",
"resolve_clients_title": "Aktivera omvänd upplösning av klienters IP-adresser",
"resolve_clients_desc": "Lös upp klienternas värdnamn med omvänt uppslag av klienternas IP-adresser genom att skicka PTR-frågor till motsvarande upplösare (privata DNS-servrar för lokala klienter, uppströmsservrar för klienter med offentliga IP-adresser).",
"use_private_ptr_resolvers_title": "Använd privata omvända DNS upplösare",
"use_private_ptr_resolvers_desc": "Utför omvända DNS-sökningar för lokalt betjänade adresser med dessa uppströmsservrar. Om det är inaktiverat svarar AdGuard Home med NXDOMAIN på alla sådana PTR-förfrågningar förutom klienter kända från DHCP, /etc/hosts, och så vidare.",
"check_dhcp_servers": "Letar efter DHCP-servrar", "check_dhcp_servers": "Letar efter DHCP-servrar",
"save_config": "Spara konfiguration", "save_config": "Spara konfiguration",
"enabled_dhcp": "DHCP-server aktiverad", "enabled_dhcp": "DHCP-server aktiverad",
"disabled_dhcp": "Dhcp-server avaktiverad", "disabled_dhcp": "Dhcp-server avaktiverad",
"unavailable_dhcp": "DHCP är inte tillgängligt",
"unavailable_dhcp_desc": "AdGuard Home kan inte köra en DHCP-server på ditt operativsystem",
"dhcp_title": "DHCP-server (experimentell)", "dhcp_title": "DHCP-server (experimentell)",
"dhcp_description": "Om din router inte har inställningar för DHCP kan du använda AdGuards inbyggda server.", "dhcp_description": "Om din router inte har inställningar för DHCP kan du använda AdGuards inbyggda server.",
"dhcp_enable": "Aktivera DHCP.-server", "dhcp_enable": "Aktivera DHCP.-server",
"dhcp_disable": "Avaktivera DHCP-server", "dhcp_disable": "Avaktivera DHCP-server",
"dhcp_not_found": "Det är säkert att aktivera den inbyggda DHCP-servern eftersom AdGuard Home inte hittade några aktiva DHCP-servrar i nätverket. Du bör dock kontrollera det igen manuellt eftersom den automatiska sökningenn efter DHCP-servrar inte ger 100 % garanti.",
"dhcp_found": "Några aktiva DHCP-servar upptäcktes. Det är inte säkert att aktivera inbyggda DHCP-servrar.", "dhcp_found": "Några aktiva DHCP-servar upptäcktes. Det är inte säkert att aktivera inbyggda DHCP-servrar.",
"dhcp_leases": "DHCP-lease", "dhcp_leases": "DHCP-lease",
"dhcp_static_leases": "Statiska DHCP-leases", "dhcp_static_leases": "Statiska DHCP-leases",
"dhcp_leases_not_found": "Ingen DHCP-lease hittad", "dhcp_leases_not_found": "Ingen DHCP-lease hittad",
"dhcp_config_saved": "DHCP-konfigurationen har sparats",
"dhcp_ipv4_settings": "DHCP IPv4 inställningar",
"dhcp_ipv6_settings": "DHCP IPv6 inställningar",
"form_error_required": "Obligatoriskt fält", "form_error_required": "Obligatoriskt fält",
"form_error_ip4_format": "Ogiltig IPv4-adress",
"form_error_ip4_range_start_format": "Ogiltig IPv4-adress för starten av intervallet",
"form_error_ip4_range_end_format": "Ogiltig IPv4-adress för slutet av intervallet",
"form_error_ip4_gateway_format": "Ogiltig IPv4 adress för gatewayen",
"form_error_ip6_format": "Ogiltig IPv6-adress",
"form_error_ip_format": "Ogiltig IP-adress", "form_error_ip_format": "Ogiltig IP-adress",
"form_error_mac_format": "Ogiltig MAC-adress", "form_error_mac_format": "Ogiltig MAC-adress",
"form_error_client_id_format": "Ogiltigt klient-ID",
"form_error_server_name": "Ogiltigt servernamn",
"form_error_subnet": "Subnätet \"{{cidr}}\" innehåller inte IP-adressen \"{{ip}}\"",
"form_error_positive": "Måste vara större än noll", "form_error_positive": "Måste vara större än noll",
"out_of_range_error": "Måste vara utanför intervallet \"{{start}}\"-\"{{end}}\"",
"lower_range_start_error": "Måste vara lägre än starten på intervallet",
"greater_range_start_error": "Måste vara högre än starten på intervallet",
"greater_range_end_error": "Måste vara större än intervallets slut",
"subnet_error": "Adresser måste finnas i ett subnät",
"gateway_or_subnet_invalid": "Subnätmask ogiltig",
"dhcp_form_gateway_input": "Gateway-IP", "dhcp_form_gateway_input": "Gateway-IP",
"dhcp_form_subnet_input": "Subnetmask", "dhcp_form_subnet_input": "Subnetmask",
"dhcp_form_range_title": "IP-adressgränser", "dhcp_form_range_title": "IP-adressgränser",
@ -29,17 +63,30 @@
"dhcp_interface_select": "Välj DHCP-gränssnitt", "dhcp_interface_select": "Välj DHCP-gränssnitt",
"dhcp_hardware_address": "Hårdvaruadress", "dhcp_hardware_address": "Hårdvaruadress",
"dhcp_ip_addresses": "IP-adresser", "dhcp_ip_addresses": "IP-adresser",
"ip": "IP",
"dhcp_table_hostname": "Värdnamn", "dhcp_table_hostname": "Värdnamn",
"dhcp_table_expires": "Utgår", "dhcp_table_expires": "Utgår",
"dhcp_warning": "Om du vill använda den inbyggda DHCP servern ändå, se till att det inte finns några andra aktiva DHCP servrar. Annars kan den störa internetanslutningen för anslutna enheter!",
"dhcp_error": "Vi kunde inte avgöra om det finns en till DHCP-server på nätverket.",
"dhcp_static_ip_error": "För att kunna använda en DHCP-server måste det finnas en statisk IP-adress. AdGuard Home kunde inte avgöra om nätverksgränssnittet är konfigurerat med en statisk IP-adress. Ställ in en statisk IP-adress manuellt.",
"dhcp_dynamic_ip_found": "Din enhet använder en dynamisk IP-adress för gränssnittet <0>{{interfaceName}}</0>. För att kunna använda DHCP-servern behövs en statisk IP-adress. Din nuvarande IP-adress är <0>{{ipAddress}}</0>. AdGuard Home kommer automatiskt att göra denna IP-adress statisk om du trycker på knappen \"Aktivera DHCP\".",
"dhcp_lease_added": "Statisk lease \"{{key}}\" har lagts till", "dhcp_lease_added": "Statisk lease \"{{key}}\" har lagts till",
"dhcp_lease_deleted": "Statisk lease \"{{key}}\" har raderats", "dhcp_lease_deleted": "Statisk lease \"{{key}}\" har raderats",
"dhcp_new_static_lease": "Ny statisk lease", "dhcp_new_static_lease": "Ny statisk lease",
"dhcp_static_leases_not_found": "Inga statiska DHCP-leases hittade", "dhcp_static_leases_not_found": "Inga statiska DHCP-leases hittade",
"dhcp_add_static_lease": "Lägg till statisk lease", "dhcp_add_static_lease": "Lägg till statisk lease",
"dhcp_reset_leases": "Återställ alla leasingavtal",
"dhcp_reset_leases_confirm": "Är du säker på att du vill ta bort alla leasingavtal?",
"dhcp_reset_leases_success": "DHCP-leasing har återställts",
"dhcp_reset": "Är du säker på att du vill ta bort DHCP inställningarna?",
"country": "Land",
"city": "Stad",
"delete_confirm": "Är du säker på att du vill ta bort \"{{key}}\"?", "delete_confirm": "Är du säker på att du vill ta bort \"{{key}}\"?",
"form_enter_hostname": "Skriv in värdnamn", "form_enter_hostname": "Skriv in värdnamn",
"error_details": "Felinformation", "error_details": "Felinformation",
"response_details": "Svarsdetaljer",
"request_details": "Förfrågningsdetaljer", "request_details": "Förfrågningsdetaljer",
"client_details": "Klient information",
"details": "Detaljer", "details": "Detaljer",
"back": "Tiilbaka", "back": "Tiilbaka",
"dashboard": "Kontrollpanel", "dashboard": "Kontrollpanel",
@ -47,6 +94,8 @@
"filters": "Filter", "filters": "Filter",
"filter": "Filter", "filter": "Filter",
"query_log": "Förfrågningslogg", "query_log": "Förfrågningslogg",
"compact": "Komprimera",
"nothing_found": "Inget hittades",
"faq": "FAQ", "faq": "FAQ",
"version": "version", "version": "version",
"address": "Adress", "address": "Adress",
@ -70,52 +119,88 @@
"for_last_24_hours": "under de senaste 24 timmarna", "for_last_24_hours": "under de senaste 24 timmarna",
"for_last_days": "för den senaste {{count}} dagen", "for_last_days": "för den senaste {{count}} dagen",
"for_last_days_plural": "för de senaste {{count}} dagarna", "for_last_days_plural": "för de senaste {{count}} dagarna",
"stats_disabled": "Statistiken har inaktiverats. Du kan aktivera det från <0>inställningssidan</0>.",
"stats_disabled_short": "Statistiken har inaktiverats",
"no_domains_found": "Inga domäner hittade", "no_domains_found": "Inga domäner hittade",
"requests_count": "Förfrågningsantal", "requests_count": "Förfrågningsantal",
"top_blocked_domains": "Flest blockerade domäner", "top_blocked_domains": "Flest blockerade domäner",
"top_clients": "Toppklienter", "top_clients": "Toppklienter",
"no_clients_found": "Inga klienter hittade", "no_clients_found": "Inga klienter hittade",
"general_statistics": "Allmän statistik", "general_statistics": "Allmän statistik",
"number_of_dns_query_days": "Antalet DNS-förfrågningar som utfördes under senaste {{count}} dagen",
"number_of_dns_query_days_plural": "Ett antal DNS förfrågningar utfördes under de senaste {{count}} dagarna",
"number_of_dns_query_24_hours": "Antalet DNS-förfrågningar som utfördes under de senaste 24 timmarna",
"number_of_dns_query_blocked_24_hours": "Antalet DNS-förfrågningar som blockerades av annonsfilter och värdens blockeringsklistor",
"number_of_dns_query_blocked_24_hours_by_sec": "Antalet DNS-förfrågningar som blockerades av AdGuards modul för surfsäkerhet",
"number_of_dns_query_blocked_24_hours_adult": "Antalet vuxensajter som blockerats",
"enforced_save_search": "Aktivering av Säker surf", "enforced_save_search": "Aktivering av Säker surf",
"number_of_dns_query_to_safe_search": "Antalet DNS-förfrågningar mot sökmotorer där Säker surf tvingats",
"average_processing_time": "Genomsnittlig processtid", "average_processing_time": "Genomsnittlig processtid",
"average_processing_time_hint": "Genomsnittlig processtid i millisekunder för DNS-förfrågning", "average_processing_time_hint": "Genomsnittlig processtid i millisekunder för DNS-förfrågning",
"block_domain_use_filters_and_hosts": "Blockera domäner med filter- och värdfiler", "block_domain_use_filters_and_hosts": "Blockera domäner med filter- och värdfiler",
"filters_block_toggle_hint": "Du kan ställa in egna blockerings regler i <a>Filterinställningar</a>.", "filters_block_toggle_hint": "Du kan ställa in egna blockerings regler i <a>Filterinställningar</a>.",
"use_adguard_browsing_sec": "Använd AdGuards webbservice för surfsäkerhet", "use_adguard_browsing_sec": "Använd AdGuards webbservice för surfsäkerhet",
"use_adguard_browsing_sec_hint": "AdGuard Home kommer att kontrollera om en domän är svartlistad i webbservicens surfsäkerhet. Med en integritetsvänlig metod görs en API-lookup för att kontrollera : endast en kort prefix i domännamnet SHA256 hash skickas till servern.", "use_adguard_browsing_sec_hint": "AdGuard Home kommer att kontrollera om en domän är blockerad av webbservicen surfsäkerhet. Med en integritetsvänlig metod görs en API-lookup för att kontrollera: endast ett kort prefix i domännamnet SHA256 hash skickas till servern.",
"use_adguard_parental": "Använda AdGuards webbservice för föräldrakontroll", "use_adguard_parental": "Använda AdGuards webbservice för föräldrakontroll",
"use_adguard_parental_hint": "AdGuard Home kommer att kontrollera domäner för innehåll av vuxenmaterial . Samma integritetsvänliga metod för API-lookup som tillämpas i webbservicens surfsäkerhet används.", "use_adguard_parental_hint": "AdGuard Home kommer att kontrollera domäner för innehåll av vuxenmaterial . Samma integritetsvänliga metod för API-lookup som tillämpas i webbservicens surfsäkerhet används.",
"enforce_safe_search": "Tillämpa Säker surf", "enforce_safe_search": "Använd säker webbsökning",
"enforce_save_search_hint": "AdGuard Home kommer tvinga säker surf på följande sökmotorer: Google, Youtube, Bing, DuckDuckGo, Yandex, Pixabay.",
"no_servers_specified": "Inga servrar angivna", "no_servers_specified": "Inga servrar angivna",
"general_settings": "Allmänna inställningar", "general_settings": "Allmänna inställningar",
"dns_settings": "DNS-inställningar", "dns_settings": "DNS-inställningar",
"dns_blocklists": "DNS blockeringslistor",
"dns_allowlists": "DNS frilistor",
"dns_blocklists_desc": "AdGuard Home kommer att blockera domäner som matchar blockeringslistorna.",
"dns_allowlists_desc": "Domäner från DNS frilistor kommer att tillåtas även om de finns i någon av blockeringslistorna.",
"custom_filtering_rules": "Egna filterregler", "custom_filtering_rules": "Egna filterregler",
"encryption_settings": "Krypteringsinställningar", "encryption_settings": "Krypteringsinställningar",
"dhcp_settings": "DHCP-inställningar", "dhcp_settings": "DHCP-inställningar",
"upstream_dns": "Upstream DNS-servrar", "upstream_dns": "Upstream DNS-servrar",
"upstream_dns_help": "Ange en serveradress per rad. <a>Läs mer</a> om att konfigurera uppströms DNS-servrar.",
"upstream_dns_configured_in_file": "Konfigurerad i {{path}}",
"test_upstream_btn": "Testa uppströmmar", "test_upstream_btn": "Testa uppströmmar",
"upstreams": "Uppströms",
"apply_btn": "Tillämpa", "apply_btn": "Tillämpa",
"disabled_filtering_toast": "Filtrering bortkopplad", "disabled_filtering_toast": "Filtrering bortkopplad",
"enabled_filtering_toast": "Filtrering inkopplad", "enabled_filtering_toast": "Filtrering inkopplad",
"disabled_safe_browsing_toast": "Säker surfning bortkopplat", "disabled_safe_browsing_toast": "Säker surfning inaktiverad",
"enabled_safe_browsing_toast": "Säker surfning inkopplat", "enabled_safe_browsing_toast": "Säker surfning aktiverat",
"disabled_parental_toast": "Föräldrakontroll bortkopplat", "disabled_parental_toast": "Föräldrakontroll bortkopplat",
"enabled_parental_toast": "Föräldrakontroll inkopplat", "enabled_parental_toast": "Föräldrakontroll inkopplat",
"disabled_safe_search_toast": "Säker webbsökning bortkopplat", "disabled_safe_search_toast": "Säker webbsökning bortkopplat",
"enabled_save_search_toast": "Säker webbsökning inkopplat", "enabled_save_search_toast": "Säker webbsökning inkopplat",
"enabled_table_header": "Inkopplat", "enabled_table_header": "Inkopplat",
"name_table_header": "Namn", "name_table_header": "Namn",
"list_url_table_header": "Lista URL",
"rules_count_table_header": "Regelantal", "rules_count_table_header": "Regelantal",
"last_time_updated_table_header": "Uppdaterades senast", "last_time_updated_table_header": "Uppdaterades senast",
"actions_table_header": "Åtgärder", "actions_table_header": "Åtgärder",
"request_table_header": "Förfrågning",
"edit_table_action": "Redigera", "edit_table_action": "Redigera",
"delete_table_action": "Radera", "delete_table_action": "Radera",
"elapsed": "Förfluten tid",
"filters_and_hosts_hint": "AdGuard tillämpar grundläggande annonsblockeringsregler och värdfiltersyntaxer", "filters_and_hosts_hint": "AdGuard tillämpar grundläggande annonsblockeringsregler och värdfiltersyntaxer",
"no_blocklist_added": "Inga blocklistor har lagts till",
"no_whitelist_added": "Inga frilistor har lagts till",
"add_blocklist": "Lägg till blockeringslista",
"add_allowlist": "Lägg till frilista",
"cancel_btn": "Avbryt", "cancel_btn": "Avbryt",
"enter_name_hint": "Skriv in namn", "enter_name_hint": "Skriv in namn",
"enter_url_or_path_hint": "Ange en URL eller en absolut sökväg till listan",
"check_updates_btn": "Sök efter uppdateringar", "check_updates_btn": "Sök efter uppdateringar",
"new_blocklist": "Ny blockeringslista",
"new_allowlist": "Ny frilista",
"edit_blocklist": "Redigera blockeringslista",
"edit_allowlist": "Redigera frilista",
"choose_blocklist": "Välj blockeringslistor",
"choose_allowlist": "Välj frilistor",
"enter_valid_blocklist": "Ange en giltig URL till blockeringslistan.",
"enter_valid_allowlist": "Ange en giltig URL till frilistan.",
"form_error_url_format": "Ogiltigt URL format",
"form_error_url_or_path_format": "Ogiltig URL eller absolut sökväg till listan",
"custom_filter_rules": "Egna filterregler", "custom_filter_rules": "Egna filterregler",
"custom_filter_rules_hint": "Skriv en regel per rad. Du kan använda antingen annonsblockeringsregler eller värdfilssyntax.", "custom_filter_rules_hint": "Skriv en regel per rad. Du kan använda antingen annonsblockeringsregler eller värdfilssyntax.",
"system_host_files": "Systemfiler",
"examples_title": "Exempel", "examples_title": "Exempel",
"example_meaning_filter_block": "blockera åtkomst till domän example.org domain och alla dess subdomäner", "example_meaning_filter_block": "blockera åtkomst till domän example.org domain och alla dess subdomäner",
"example_meaning_filter_whitelist": "avblockera åtkomst till domän example.org domain och alla dess subdomäner", "example_meaning_filter_whitelist": "avblockera åtkomst till domän example.org domain och alla dess subdomäner",
@ -127,17 +212,26 @@
"example_upstream_regular": "vanlig DNS (över UDP)", "example_upstream_regular": "vanlig DNS (över UDP)",
"example_upstream_dot": "krypterat <0>DNS-over-TLS</0>", "example_upstream_dot": "krypterat <0>DNS-over-TLS</0>",
"example_upstream_doh": "krypterat <0>DNS-over-HTTPS</0>", "example_upstream_doh": "krypterat <0>DNS-over-HTTPS</0>",
"example_upstream_doq": "krypterat <0>DNS-over-QUIC</0>",
"example_upstream_sdns": "Du kan använda <0>DNS-stamps</0> för <1>DNSCrypt</1> eller <2>DNS-over-HTTPS</2>-resolvers", "example_upstream_sdns": "Du kan använda <0>DNS-stamps</0> för <1>DNSCrypt</1> eller <2>DNS-over-HTTPS</2>-resolvers",
"example_upstream_tcp": "vanlig DNS (över UDP)", "example_upstream_tcp": "vanlig DNS (över UDP)",
"all_lists_up_to_date_toast": "Alla listor är redan uppdaterade",
"updated_upstream_dns_toast": "Sparade uppströms dns-servrar",
"dns_test_ok_toast": "Angivna DNS servrar fungerar korrekt", "dns_test_ok_toast": "Angivna DNS servrar fungerar korrekt",
"dns_test_not_ok_toast": "Server \"{{key}}\": kunde inte användas. Var snäll och kolla att du skrivit in rätt", "dns_test_not_ok_toast": "Server \"{{key}}\": kunde inte användas. Var snäll och kolla att du skrivit in rätt",
"unblock": "Avblockera", "unblock": "Avblockera",
"block": "Blockera", "block": "Blockera",
"disallow_this_client": "Tillåt inte den här klienten",
"allow_this_client": "Tillåt den här klienten",
"block_for_this_client_only": "Blockera endast för denna klient",
"unblock_for_this_client_only": "Avblockera endast för denna klient",
"time_table_header": "Tid", "time_table_header": "Tid",
"date": "Datum", "date": "Datum",
"domain_name_table_header": "Domännamn", "domain_name_table_header": "Domännamn",
"domain_or_client": "Domän eller klient",
"type_table_header": "Typ", "type_table_header": "Typ",
"response_table_header": "Svar", "response_table_header": "Svar",
"response_code": "Svarskod",
"client_table_header": "Klient", "client_table_header": "Klient",
"empty_response_status": "Tomt", "empty_response_status": "Tomt",
"show_all_filter_type": "Visa alla", "show_all_filter_type": "Visa alla",
@ -149,13 +243,14 @@
"loading_table_status": "Läser in...", "loading_table_status": "Läser in...",
"page_table_footer_text": "Sida", "page_table_footer_text": "Sida",
"rows_table_footer_text": "rader", "rows_table_footer_text": "rader",
"updated_custom_filtering_toast": "Uppdaterade de egna filterreglerna", "updated_custom_filtering_toast": "Anpassade filterregler sparade",
"rule_removed_from_custom_filtering_toast": "Regel borttagen från de egna filterreglerna: {{rule}}", "rule_removed_from_custom_filtering_toast": "Regel borttagen från de egna filterreglerna: {{rule}}",
"rule_added_to_custom_filtering_toast": "Regel tillagd till de egna filterreglerna: {{rule}}", "rule_added_to_custom_filtering_toast": "Regel tillagd till de egna filterreglerna: {{rule}}",
"query_log_response_status": "Status: {{value}}", "query_log_response_status": "Status: {{value}}",
"query_log_filtered": "Filtrerat av {{filter}}", "query_log_filtered": "Filtrerat av {{filter}}",
"query_log_confirm_clear": "Är du säker på att du vill rensa hela förfrågningsloggen?", "query_log_confirm_clear": "Är du säker på att du vill rensa hela förfrågningsloggen?",
"query_log_cleared": "Förfrågningsloggen har rensats", "query_log_cleared": "Förfrågningsloggen har rensats",
"query_log_updated": "Förfrågningsloggen har uppdaterats",
"query_log_clear": "Rensa förfrågningsloggar", "query_log_clear": "Rensa förfrågningsloggar",
"query_log_retention": "Förfrågningsloggars retentionstid", "query_log_retention": "Förfrågningsloggars retentionstid",
"query_log_enable": "Aktivera logg", "query_log_enable": "Aktivera logg",
@ -163,27 +258,63 @@
"query_log_disabled": "Förfrågningsloggen är avaktiverad och kan konfigureras i <0>inställningar</0>", "query_log_disabled": "Förfrågningsloggen är avaktiverad och kan konfigureras i <0>inställningar</0>",
"query_log_strict_search": "Använd dubbla citattecken för strikt sökning", "query_log_strict_search": "Använd dubbla citattecken för strikt sökning",
"query_log_retention_confirm": "Är du säker på att du vill ändra förfrågningsloggars retentionstid? Om du minskar intervallet kommer viss data att gå förlorad", "query_log_retention_confirm": "Är du säker på att du vill ändra förfrågningsloggars retentionstid? Om du minskar intervallet kommer viss data att gå förlorad",
"anonymize_client_ip": "Anonymisera klientens IP",
"anonymize_client_ip_desc": "Spara inte klientens fullständiga IP-adress i loggar och statistik",
"dns_config": "DNS server konfiguration",
"dns_cache_config": "DNS cache konfiguration",
"dns_cache_config_desc": "Här kan du konfigurera DNS cache",
"blocking_mode": "Blockeringsläge",
"default": "Standard", "default": "Standard",
"nxdomain": "NXDOMÄN",
"refused": "REFUSED",
"null_ip": "Null IP",
"custom_ip": "Eget IP", "custom_ip": "Eget IP",
"blocking_ipv4": "Blockera IPv4",
"blocking_ipv6": "Blockera IPv6",
"dnscrypt": "DNSCrypt", "dnscrypt": "DNSCrypt",
"dns_over_https": "DNS-over-HTTPS", "dns_over_https": "DNS-over-HTTPS",
"dns_over_tls": "DNS-over-TLS", "dns_over_tls": "DNS-over-TLS",
"dns_over_quic": "DNS-over-QUIC", "dns_over_quic": "DNS-over-QUIC",
"client_id": "Klient ID",
"client_id_placeholder": "Ange klient ID",
"client_id_desc": "Olika klienter kan identifieras med ett speciellt klient ID. <a>Här</a> kan du lära dig mer om hur du identifierar klienter.",
"download_mobileconfig_doh": "Ladda ner .mobileconfig för DNS-over-HTTPS",
"download_mobileconfig_dot": "Ladda ner .mobileconfig för DNS-over-TLS",
"download_mobileconfig": "Ladda ner konfigurationsfil",
"plain_dns": "Vanlig DNS",
"form_enter_rate_limit": "Ange förfrågnings gräns",
"rate_limit": "Förfrågnings gräns",
"edns_enable": "Aktivera EDNS-klient subnät",
"edns_cs_desc": "Skicka klienternas subnät till DNS servrarna.",
"rate_limit_desc": "Antalet förfrågningar per sekund som tillåts per klient. Att sätta den till 0 innebär ingen gräns.",
"blocking_ipv4_desc": "IP adress som ska returneras för en blockerad A förfrågan",
"blocking_ipv6_desc": "IP adress som ska returneras för en blockerad AAAA förfrågan",
"blocking_mode_default": "Standard: Svara med noll IP-adress (0.0.0.0 för A; :: för AAAA) när det blockeras av regel i Adblock-stil; svara med IP-adressen som anges i regeln när den blockeras av regel i /etc/hosts-stil",
"blocking_mode_refused": "REFUSED: Svara med REFUSED kod",
"blocking_mode_nxdomain": "NXDOMAIN: Svara med NXDOMAIN kod",
"blocking_mode_null_ip": "Null IP: Svara med noll IP adress (0.0.0.0 för A; :: för AAAA)",
"blocking_mode_custom_ip": "Anpassad IP: Svara med en manuellt inställd IP adress",
"upstream_dns_client_desc": "Om detta fält är tomt kommer AdGuard Home att använda de servrar som konfigurerats i <0>DNS inställningarna</0>.",
"tracker_source": "Spårningskälla",
"source_label": "Källa", "source_label": "Källa",
"found_in_known_domain_db": "Hittad i domändatabas.", "found_in_known_domain_db": "Hittad i domändatabas.",
"category_label": "Kategori", "category_label": "Kategori",
"rule_label": "Regel(er)",
"list_label": "Lista",
"unknown_filter": "Okänt filter {{filterId}}", "unknown_filter": "Okänt filter {{filterId}}",
"known_tracker": "Känd spårare",
"install_welcome_title": "Välkommen till AdGuard Home!", "install_welcome_title": "Välkommen till AdGuard Home!",
"install_welcome_desc": "AdGuard Home är en DNS-server för nätverkstäckande annons- och spårningsblockering. Dess syfte är att de dig kontroll över hela nätverket och alla dina enheter, utan behov av att använda klientbaserade program.", "install_welcome_desc": "AdGuard Home är en DNS-server för nätverkstäckande annons- och spårningsblockering. Dess syfte är att de dig kontroll över hela nätverket och alla dina enheter, utan behov av att använda klientbaserade program.",
"install_settings_title": "Administratörens webbgränssnitt", "install_settings_title": "Administratörens webbgränssnitt",
"install_settings_listen": "Övervakningsgränssnitt", "install_settings_listen": "Övervakningsgränssnitt",
"install_settings_port": "Port", "install_settings_port": "Port",
"install_settings_interface_link": "Din administratörssida för AdGuard Home finns på följande adresser:", "install_settings_interface_link": "Din administratörssida för AdGuard Home finns på följande adresser:",
"form_error_port": "Skriv in ett giltigt portnummer",
"install_settings_dns": "DNS-server", "install_settings_dns": "DNS-server",
"install_settings_dns_desc": "Du behöver ställa in dina enheter eller din router för att använda DNS-server på följande adresser.", "install_settings_dns_desc": "Du behöver ställa in dina enheter eller din router för att använda DNS-server på följande adresser.",
"install_settings_all_interfaces": "Alla gränssnitt", "install_settings_all_interfaces": "Alla gränssnitt",
"install_auth_title": "Autentisering", "install_auth_title": "Autentisering",
"install_auth_desc": "Det rekommenderas starkt att ställa in lösenordsskydd till webbgränssnittets administrativa del i ditt AdGuard Home. Även om den endast är åtkomlig på ditt lokala nätverk rekommenderas det ändå att skydda det mot oönskad åtkomst.", "install_auth_desc": "Lösenordsautentisering till ditt AdGuard Home administratörsgränssnitt måste konfigureras. Även om AdGuard Home bara är tillgängligt i ditt lokala nätverk är det fortfarande viktigt att skydda det från obegränsad åtkomst.",
"install_auth_username": "Användarnamn", "install_auth_username": "Användarnamn",
"install_auth_password": "Lösenord", "install_auth_password": "Lösenord",
"install_auth_confirm": "Bekräfta lösenord", "install_auth_confirm": "Bekräfta lösenord",
@ -193,18 +324,20 @@
"install_devices_title": "Ställ in dina enheter", "install_devices_title": "Ställ in dina enheter",
"install_devices_desc": "För att kunna använda AdGuard Home måste du ställa in dina enheter för att utnyttja den.", "install_devices_desc": "För att kunna använda AdGuard Home måste du ställa in dina enheter för att utnyttja den.",
"install_submit_title": "Grattis!", "install_submit_title": "Grattis!",
"install_submit_desc": "Inställningsproceduren är klar och du kan börja använda AdGuard Home.", "install_submit_desc": "Installationen är klar och du kan börja använda AdGuard Home.",
"install_devices_router": "Router", "install_devices_router": "Router",
"install_devices_router_desc": "Den här anpassningen kommer att automatiskt täcka in alla de enheter som är anslutna till din hemmarouter och du behöver därför inte konfigurera var och en individuellt.", "install_devices_router_desc": "Den här anpassningen kommer att automatiskt täcka in alla de enheter som är anslutna till din hemmarouter och du behöver därför inte konfigurera var och en individuellt.",
"install_devices_address": "AdGuard Home DNS-server täcker följande adresser", "install_devices_address": "AdGuard Home DNS-server täcker följande adresser",
"install_devices_router_list_1": "Öppna inställningarna för din router. Vanligtvis kan du komma åt den från din webbläsare via en URL, som http://192.168.0.1/ eller http://192.168.1.1/. Du kan bli ombedd att ange ett lösenord. Om du inte kommer ihåg det kan du ofta återställa lösenordet genom att trycka på en knapp på själva routern, men var medveten om att om denna procedur väljs kommer du förmodligen att förlora hela routerkonfigurationen. Om din router kräver en app för att konfigurera den, installera appen på din telefon eller dator och använd den för att komma åt routerns inställningar.",
"install_devices_router_list_2": "Leta upp DHCP/DNS-inställningarna. Titta efter DNS-tecken intill ett fält med två eller tre uppsättningar siffror, var och en uppdelade i grupper om fyra med en eller tre siffror.", "install_devices_router_list_2": "Leta upp DHCP/DNS-inställningarna. Titta efter DNS-tecken intill ett fält med två eller tre uppsättningar siffror, var och en uppdelade i grupper om fyra med en eller tre siffror.",
"install_devices_router_list_3": "Ange serveradressen till ditt AdGuard Home.", "install_devices_router_list_3": "Ange serveradressen till ditt AdGuard Home.",
"install_devices_router_list_4": "På vissa routertyper kan en anpassad DNS server inte konfigureras. I så fall kan det hjälpa att konfigurera AdGuard Home som en <0>DHCP server</0>. Annars bör du kontrollera routermanualen om hur du anpassar DNS servrar på din specifika routermodell.",
"install_devices_windows_list_1": "Öppna Kontrollpanelen via Start eller Windows Sök.", "install_devices_windows_list_1": "Öppna Kontrollpanelen via Start eller Windows Sök.",
"install_devices_windows_list_2": "Välj Nätverks och delningscenter, Nätverk och Internet.", "install_devices_windows_list_2": "Välj Nätverks och delningscenter, Nätverk och Internet.",
"install_devices_windows_list_3": "Leta upp Ändra nätverkskortsalternativ", "install_devices_windows_list_3": "På vänster sida av skärmen hittar du \"Ändra adapterinställningar\" och klicka på den.",
"install_devices_windows_list_4": "Markera din aktiva anslutning. Högerklicka på den och välj Egenskaper.", "install_devices_windows_list_4": "Markera din aktiva anslutning. Högerklicka på den och välj Egenskaper.",
"install_devices_windows_list_5": "Markera Internet Protocol Version 4 (TCP/IP) och klicka på knappen Egenskaper.", "install_devices_windows_list_5": "Hitta \"Internet Protocol Version 4 (TCP/IPv4)\" (eller, för IPv6, \"Internet Protocol Version 6 (TCP/IPv6)\") i listan, välj den och klicka sedan på Egenskaper igen.",
"install_devices_windows_list_6": "Markera Använd följande DNS-serveradresser och skriv in adresserna till ditt AdGuard Home.", "install_devices_windows_list_6": "Välj \"Använd följande DNS-serveradresser\" och ange dina AdGuard Home-serveradresser.",
"install_devices_macos_list_1": "Klicka på Apple-ikonen och välj Systemalternativ.", "install_devices_macos_list_1": "Klicka på Apple-ikonen och välj Systemalternativ.",
"install_devices_macos_list_2": "Klicka på Nätverk.", "install_devices_macos_list_2": "Klicka på Nätverk.",
"install_devices_macos_list_3": "Välj den första anslutningen i listan och klicka på Avancerat.", "install_devices_macos_list_3": "Välj den första anslutningen i listan och klicka på Avancerat.",
@ -213,7 +346,7 @@
"install_devices_android_list_2": "Tryck på Nätverk och Internet, Wi-Fi. Alla tillgängliga nätverk visas i en lista (det går inte all välja egen DNS på mobilnätverk.", "install_devices_android_list_2": "Tryck på Nätverk och Internet, Wi-Fi. Alla tillgängliga nätverk visas i en lista (det går inte all välja egen DNS på mobilnätverk.",
"install_devices_android_list_3": "Håll ner på nätverksnamnet som du är ansluten till och välj Ändra nätverk.", "install_devices_android_list_3": "Håll ner på nätverksnamnet som du är ansluten till och välj Ändra nätverk.",
"install_devices_android_list_4": "På en del enheter kan du behöva välja Avancerat för att komma åt ytterligare inställningar. För att ändra på DNS-inställningar måste du byta IP-inställning från DHCP till Statisk. På Android Pie väljs Privat DNS på Nätverk och internet.", "install_devices_android_list_4": "På en del enheter kan du behöva välja Avancerat för att komma åt ytterligare inställningar. För att ändra på DNS-inställningar måste du byta IP-inställning från DHCP till Statisk. På Android Pie väljs Privat DNS på Nätverk och internet.",
"install_devices_android_list_5": "Ändra DNS 1 och DNS 2 till serveradresserna för AdGuard Home.", "install_devices_android_list_5": "Ändra DNS 1 och DNS 2 värdena till serveradresserna för din AdGuard Home.",
"install_devices_ios_list_1": "Tryck Inställningar från hemskärmen.", "install_devices_ios_list_1": "Tryck Inställningar från hemskärmen.",
"install_devices_ios_list_2": "Välj Wi_Fi på den vänstra menyn (det går inte att ställa in egen DNS för mobila nätverk).", "install_devices_ios_list_2": "Välj Wi_Fi på den vänstra menyn (det går inte att ställa in egen DNS för mobila nätverk).",
"install_devices_ios_list_3": "Tryck på namnet på den aktiva anslutningen.", "install_devices_ios_list_3": "Tryck på namnet på den aktiva anslutningen.",
@ -224,14 +357,18 @@
"install_saved": "Sparat utan fel", "install_saved": "Sparat utan fel",
"encryption_title": "Kryptering", "encryption_title": "Kryptering",
"encryption_desc": "Krypteringsstöd (HTTPS/TLS) för både DNS och adminwebbgränssnitt.", "encryption_desc": "Krypteringsstöd (HTTPS/TLS) för både DNS och adminwebbgränssnitt.",
"encryption_config_saved": "Krypteringsinställningar sparade",
"encryption_server": "Servernamn", "encryption_server": "Servernamn",
"encryption_server_enter": "Skriv in ditt domännamn", "encryption_server_enter": "Skriv in ditt domännamn",
"encryption_server_desc": "För att kunna använda HTTPS måste du ange servernamnet som matchar ditt SSL-certifikat eller jokerteckencertifikat. Om fältet inte är inställt kommer det att acceptera TLS-anslutningar för alla domäner.",
"encryption_redirect": "Omdirigera till HTTPS automatiskt", "encryption_redirect": "Omdirigera till HTTPS automatiskt",
"encryption_redirect_desc": "Om bockad kommer AdGuard Home automatiskt att omdirigera dig från HTTP till HTTPS-adresser.", "encryption_redirect_desc": "Om bockad kommer AdGuard Home automatiskt att omdirigera dig från HTTP till HTTPS-adresser.",
"encryption_https": "HTTPS-port", "encryption_https": "HTTPS-port",
"encryption_https_desc": "Om en HTTPS-port är inställd kommer gränssnittet till AdGuard Home administrering att kunna nås via HTTPS och kommer också att erbjuda DNS-over-HTTPS på '/dns-query' plats.", "encryption_https_desc": "Om en HTTPS-port är inställd kommer gränssnittet till AdGuard Home administrering att kunna nås via HTTPS och kommer också att erbjuda DNS-over-HTTPS på '/dns-query' plats.",
"encryption_dot": "DNS-över-TLS port", "encryption_dot": "DNS-över-TLS port",
"encryption_dot_desc": "Om den här porten ställs in kommer AdGuard Home att använda DNS-over-TLS-server på porten.", "encryption_dot_desc": "Om den här porten ställs in kommer AdGuard Home att använda DNS-over-TLS-server på porten.",
"encryption_doq": "DNS-over-QUIC port",
"encryption_doq_desc": "Om denna port är konfigurerad kommer AdGuard Home att köra en DNS-over-QUIC-server på denna port. Det är experimentellt och kanske inte är tillförlitligt. Dessutom finns det inte så många klienter som stödjer det för tillfället.",
"encryption_certificates": "Certifikat", "encryption_certificates": "Certifikat",
"encryption_certificates_desc": "För att använda kryptering måste du ange ett giltigt SSL-certifikat för din domän. Du kan skaffa ett certifikat gratis på <0>{{link}}</0> eller köpa ett från någon av de godkända certifikatutfärdare.", "encryption_certificates_desc": "För att använda kryptering måste du ange ett giltigt SSL-certifikat för din domän. Du kan skaffa ett certifikat gratis på <0>{{link}}</0> eller köpa ett från någon av de godkända certifikatutfärdare.",
"encryption_certificates_input": "Kopiera/klistra in dina PEM-kodade certifikat här.", "encryption_certificates_input": "Kopiera/klistra in dina PEM-kodade certifikat här.",
@ -251,11 +388,16 @@
"encryption_reset": "Är du säker på att du vill återställa krypteringsinställningarna?", "encryption_reset": "Är du säker på att du vill återställa krypteringsinställningarna?",
"topline_expiring_certificate": "Ditt SSL-certifikat håller på att gå ut. <0>Krypteringsinställningar</0>.", "topline_expiring_certificate": "Ditt SSL-certifikat håller på att gå ut. <0>Krypteringsinställningar</0>.",
"topline_expired_certificate": "Ditt SSL-certifikat har gått ut. Uppdatera <0>Krypteringsinställningar</0>-", "topline_expired_certificate": "Ditt SSL-certifikat har gått ut. Uppdatera <0>Krypteringsinställningar</0>-",
"form_error_port_range": "Ange ett portnummer inom värdena 80-65535",
"form_error_port_unsafe": "Det här är en osäker port", "form_error_port_unsafe": "Det här är en osäker port",
"form_error_equal": "Får inte vara samma",
"form_error_password": "Lösenorden överensstämmer inte", "form_error_password": "Lösenorden överensstämmer inte",
"reset_settings": "Återställ inställningar", "reset_settings": "Återställ inställningar",
"update_announcement": "AdGuard Home {{version}} är nu tillgänglig! <0>Klicka här</0> för mer information.", "update_announcement": "AdGuard Home {{version}} är nu tillgänglig! <0>Klicka här</0> för mer information.",
"setup_guide": "Installationsguide",
"dns_addresses": "DNS-adresser", "dns_addresses": "DNS-adresser",
"dns_start": "DNS servern startar",
"dns_status_error": "Fel vid kontroll av DNS serverns status",
"down": "Ner", "down": "Ner",
"fix": "Fixa", "fix": "Fixa",
"dns_providers": "Här är en <0>lista över kända DNS-leverantörer</0> att välja från.", "dns_providers": "Här är en <0>lista över kända DNS-leverantörer</0> att välja från.",
@ -274,8 +416,12 @@
"client_edit": "Redigera klient", "client_edit": "Redigera klient",
"client_identifier": "Identifikator", "client_identifier": "Identifikator",
"ip_address": "IP-adress", "ip_address": "IP-adress",
"client_identifier_desc": "Klienter kan identifieras med IP-adressen, CIDR, MAC-adressen eller ett speciellt klient-ID (kan användas för DoT/DoH/DoQ). <0>Här</0> kan du lära dig mer om hur du identifierar klienter.",
"form_enter_ip": "Skriv in IP", "form_enter_ip": "Skriv in IP",
"form_enter_subnet_ip": "Ange en IP adress i subnätet \"{{cidr}}\"",
"form_enter_mac": "Skriv in MAC", "form_enter_mac": "Skriv in MAC",
"form_enter_id": "Ange identifierare",
"form_add_id": "Lägg till identifierare",
"form_client_name": "Skriv in klientnamn", "form_client_name": "Skriv in klientnamn",
"name": "Namn", "name": "Namn",
"client_global_settings": "Använda globala inställningar", "client_global_settings": "Använda globala inställningar",
@ -284,15 +430,17 @@
"client_updated": "Klient \"{{key}}\" har uppdaterats", "client_updated": "Klient \"{{key}}\" har uppdaterats",
"clients_not_found": "Inga klienter hittade", "clients_not_found": "Inga klienter hittade",
"client_confirm_delete": "Är du säker på att du vill ta bort klient \"{{key}}\"?", "client_confirm_delete": "Är du säker på att du vill ta bort klient \"{{key}}\"?",
"list_confirm_delete": "Är du säker på att du vill ta bort den här listan?",
"auto_clients_title": "Klienter (körtid)", "auto_clients_title": "Klienter (körtid)",
"auto_clients_desc": "Data från klienter som använder AdGuard Home, men inte är sparade i konfigurationen", "auto_clients_desc": "Data från klienter som använder AdGuard Home, men inte är sparade i konfigurationen",
"access_title": "Åtkomstinställningar", "access_title": "Åtkomstinställningar",
"access_desc": "Här kan du konfigurera åtkomstregler för AdGuard Homes DNS-server.", "access_desc": "Här kan du konfigurera åtkomstregler för AdGuard Homes DNS-server.",
"access_allowed_title": "Tillåtna klienter", "access_allowed_title": "Tillåtna klienter",
"access_allowed_desc": "En lista över CIDR eller IP-adresser. Om konfigurerad kommer AdGuard Home endast acceptera förfrågningar från dessa IP-adresser.", "access_allowed_desc": "En lista över CIDR, IP-adresser eller klient-ID. Om det är konfigurerat accepterar AdGuard Home endast förfrågningar från dessa klienter.",
"access_disallowed_title": "Otillåtna klienter", "access_disallowed_title": "Otillåtna klienter",
"access_disallowed_desc": "En lista över CIDR eller IP-adresser. Om konfigurerad kommer AdGuard Home inte acceptera förfrågningar från dessa IP-adresser.", "access_disallowed_desc": "En lista över CIDR, IP-adresser eller klient-ID. Om det är konfigurerat kommer AdGuard Home att kasta förfrågningar från dessa klienter. Om tillåtna klienter är konfigurerade ignoreras detta fält.",
"access_blocked_title": "Blockerade domäner", "access_blocked_title": "Blockerade domäner",
"access_blocked_desc": "Ej att förväxla med filter. AdGuard Home kastar DNS-frågor som matchar dessa domäner, och dessa frågor visas inte ens i frågeloggen. Du kan ange exakta domännamn, jokertecken eller URL-filterregler, t.ex. \"example.org\", \"*.example.org\" eller \"||example.org^\" på motsvarande sätt.",
"access_settings_saved": "Åtkomstinställningar sparade", "access_settings_saved": "Åtkomstinställningar sparade",
"updates_checked": "Sökning efter uppdateringar genomförd", "updates_checked": "Sökning efter uppdateringar genomförd",
"updates_version_equal": "AdGuard Home är uppdaterat", "updates_version_equal": "AdGuard Home är uppdaterat",
@ -300,6 +448,8 @@
"dns_privacy": "DNS-Integritet", "dns_privacy": "DNS-Integritet",
"setup_dns_privacy_1": "<0>DNS-över-TLS:</0> Använd: <1>{{address}}</1>", "setup_dns_privacy_1": "<0>DNS-över-TLS:</0> Använd: <1>{{address}}</1>",
"setup_dns_privacy_2": "<0>DNS-över-HTTPS:</0> Använd: <1>{{address}}</1>", "setup_dns_privacy_2": "<0>DNS-över-HTTPS:</0> Använd: <1>{{address}}</1>",
"setup_dns_privacy_3": "<0>Här är en lista över program du kan använda.</0>",
"setup_dns_privacy_4": "På en iOS 14 eller macOS Big Sur enhet kan du ladda ner en speciell '.mobileconfig' fil som lägger till <highlight>DNS-over-HTTPS</highlight> eller <highlight>DNS-over-TLS</highlight>-servrar till DNS inställningarna.",
"setup_dns_privacy_android_1": "Android 9 har inbyggt stöd för DNS-över-TLS. Konfigurera och uppge domännamn under Inställningar → Nätverk & Internet → Avancerat → Privat DNS.", "setup_dns_privacy_android_1": "Android 9 har inbyggt stöd för DNS-över-TLS. Konfigurera och uppge domännamn under Inställningar → Nätverk & Internet → Avancerat → Privat DNS.",
"setup_dns_privacy_android_2": "<0>AdGuard för Android</0> stödjer <1>DNS-över-HTTPS</1> samt <1>DNS-över-TLS</1>.", "setup_dns_privacy_android_2": "<0>AdGuard för Android</0> stödjer <1>DNS-över-HTTPS</1> samt <1>DNS-över-TLS</1>.",
"setup_dns_privacy_android_3": "<0>Intra</0> lägger till stöd för <1>DNS-ÖVER-HTTPS</1> till Android.", "setup_dns_privacy_android_3": "<0>Intra</0> lägger till stöd för <1>DNS-ÖVER-HTTPS</1> till Android.",
@ -311,15 +461,51 @@
"setup_dns_privacy_other_3": "<0>dnscrypt-proxy</0> stödjer <1>DNS-over-HTTPS</1>.", "setup_dns_privacy_other_3": "<0>dnscrypt-proxy</0> stödjer <1>DNS-over-HTTPS</1>.",
"setup_dns_privacy_other_4": "<0>Mozilla Firefox</0> stödjer <1>DNS-over-HTTPS</1>.", "setup_dns_privacy_other_4": "<0>Mozilla Firefox</0> stödjer <1>DNS-over-HTTPS</1>.",
"setup_dns_privacy_other_5": "Du kan hitta fler implementeringar <0>här</0> och <1>här</1>.", "setup_dns_privacy_other_5": "Du kan hitta fler implementeringar <0>här</0> och <1>här</1>.",
"setup_dns_privacy_ioc_mac": "iOS och macOS konfiguration",
"setup_dns_notice": "För att kunna använda <1>DNS-över-HTTPS</1> eller <1>DNS-över-TLS</1>, behöver du <0>konfigurera Kryptering</0> i AdGuard Home-inställningar.", "setup_dns_notice": "För att kunna använda <1>DNS-över-HTTPS</1> eller <1>DNS-över-TLS</1>, behöver du <0>konfigurera Kryptering</0> i AdGuard Home-inställningar.",
"rewrite_added": "DNS-omskrivning för \"{{key}}\" lyckad", "rewrite_added": "DNS-omskrivning för \"{{key}}\" lyckad",
"rewrite_deleted": "DNS-omskrivning för \"{{key}}\" har tagits bort", "rewrite_deleted": "DNS-omskrivning för \"{{key}}\" har tagits bort",
"rewrite_add": "Lägg till DNS omskrivning",
"rewrite_not_found": "Inga DNS omskrivningar hittades",
"rewrite_confirm_delete": "Är du säker på att du vill ta bort DNS-omskrivningen för \"{{key}}\"?",
"rewrite_desc": "Gör det enkelt att konfigurera anpassat DNS svar för ett specifikt domännamn.",
"rewrite_applied": "Omskrivningsregeln tillämpas",
"rewrite_hosts_applied": "Omskriven av värd fil regel",
"dns_rewrites": "DNS omskrivningar",
"form_domain": "Ange domännamn eller jokertecken",
"form_answer": "Ange IP adress eller domännamn",
"form_error_domain_format": "Ogiltigt domänformat",
"form_error_answer_format": "Ogiltigt svarsformat",
"configure": "Konfigurera",
"main_settings": "Huvudinställningar",
"block_services": "Blockera specifika tjänster",
"blocked_services": "Blockerade tjänster",
"blocked_services_desc": "Gör det möjligt att snabbt blockera populära webbplatser och tjänster.",
"blocked_services_saved": "Blockerade tjänster har sparats",
"blocked_services_global": "Använd globalt blockerade tjänster",
"blocked_service": "Blockerad tjänst",
"block_all": "Blockera alla",
"unblock_all": "Avblockera alla",
"encryption_certificate_path": "Certifikatsökväg",
"encryption_private_key_path": "Privat nyckel sökväg",
"encryption_certificates_source_path": "Ange sökväg för certifikatfilen",
"encryption_certificates_source_content": "Klistra in certifikatets innehåll",
"encryption_key_source_path": "Ställ in en privat nyckelfil",
"encryption_key_source_content": "Klistra in den privata nyckelns innehåll",
"stats_params": "Statistikkonfiguration",
"config_successfully_saved": "Konfigurationen har sparats",
"interval_6_hour": "6 timmar", "interval_6_hour": "6 timmar",
"interval_24_hour": "24 timmar", "interval_24_hour": "24 timmar",
"interval_days": "{{count}} dag", "interval_days": "{{count}} dag",
"interval_days_plural": "{{count}} dagar", "interval_days_plural": "{{count}} dagar",
"domain": "Domän", "domain": "Domän",
"punycode": "Punycode",
"answer": "Svar", "answer": "Svar",
"filter_added_successfully": "Listan har lagts till",
"filter_removed_successfully": "Listan har tagits bort",
"filter_updated": "Listan har uppdaterats",
"statistics_configuration": "Statistikkonfiguration",
"statistics_retention": "Bevarande av statistik",
"statistics_retention_desc": "Om du minskar intervallet kommer viss data att gå förlorad", "statistics_retention_desc": "Om du minskar intervallet kommer viss data att gå förlorad",
"statistics_clear": "Rensa statistik", "statistics_clear": "Rensa statistik",
"statistics_clear_confirm": "Är du säker på att du vill radera statistiken?", "statistics_clear_confirm": "Är du säker på att du vill radera statistiken?",
@ -347,17 +533,99 @@
"descr": "Beskrivning", "descr": "Beskrivning",
"whois": "Whois", "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.",
"blocked_by_response": "Blockerad av CNAME eller IP i svaret",
"blocked_by_cname_or_ip": "Blockerad av CNAME eller IP",
"try_again": "Försök igen", "try_again": "Försök igen",
"domain_desc": "Ange domännamnet eller jokertecken som du vill ska skrivas om.",
"example_rewrite_domain": "skriv bara om svar för detta domännamn.",
"example_rewrite_wildcard": "skriv om svar för alla <0>example.org</0> subdomäner.",
"rewrite_ip_address": "IP adress: använd denna IP i ett A- eller AAAA-svar",
"rewrite_domain_name": "Domännamn: lägg till en CNAME post",
"rewrite_A": "<0>A</0>: specialvärde, behåll <0>A</0> poster från uppströms",
"rewrite_AAAA": "<0>AAAA</0>: specialvärde, behåll <0>AAAA</0> poster från uppströms",
"disable_ipv6": "Inaktivera upplösning av IPv6 adresser",
"disable_ipv6_desc": "Kasta alla DNS-frågor för IPv6-adresser (typ AAAA).",
"fastest_addr": "Snabbaste IP adressen",
"fastest_addr_desc": "Fråga alla DNS servrar och returnera den snabbaste IP adressen bland alla svar. Detta saktar ner DNS-frågor eftersom AdGuard Home måste vänta på svar från alla DNS servrar, men förbättrar den övergripande anslutningen.",
"autofix_warning_text": "Om du klickar på \"Fix\" kommer AdGuard Home att konfigurera ditt system för att använda AdGuard Home DNS server.",
"autofix_warning_list": "Den kommer att utföra följande uppgifter: <0>Avaktivera system DNSStubListener</0> <0>Sätt DNS serveradress till 127.0.0.1</0> <0>Ersätt symboliskt länkmål för /etc/resolv.conf med /run/systemd /resolve/resolv.conf</0> <0>Stoppa DNSStubListener (ladda om systemd-resolved tjänst)</0>",
"autofix_warning_result": "Som ett resultat kommer alla DNS-förfrågningar från ditt system att behandlas av AdGuard Home som standard.",
"tags_title": "Taggar",
"tags_desc": "Du kan välja de taggar som motsvarar klienten. Taggar kan inkluderas i filtreringsreglerna och låter dig tillämpa dem mer exakt. <0>Läs mer</0>",
"form_select_tags": "Välj klienttaggar",
"check_title": "Kontrollera filtreringen",
"check_desc": "Kontrollera om värdnamnet är filtrerat",
"check": "Kontrollera",
"form_enter_host": "Ange ett värdnamn",
"filtered_custom_rules": "Filtrerat efter anpassade filtreringsregler",
"choose_from_list": "Välj från listan",
"add_custom_list": "Lägg till en anpassad lista",
"host_whitelisted": "Värden är tillåten",
"check_ip": "IP adresser: {{ip}}",
"check_cname": "CNAME: {{cname}}",
"check_reason": "Anledning: {{reason}}",
"check_service": "Service namn: {{service}}",
"service_name": "Service namn",
"check_not_found": "Hittades inte i dina filterlistor",
"client_confirm_block": "Är du säker på att du vill blockera klienten \"{{ip}}\"?",
"client_confirm_unblock": "Är du säker på att du vill avblockera klienten \"{{ip}}\"?",
"client_blocked": "Klienten \"{{ip}}\" har blockerats",
"client_unblocked": "Klienten \"{{ip}}\" har avblockerats",
"static_ip": "Statisk IP adress",
"static_ip_desc": "AdGuard Home är en server så den behöver en statisk IP-adress för att fungera korrekt. Annars kan din router vid något tillfälle tilldela en annan IP-adress till den här enheten.",
"set_static_ip": "Ställ in en statisk IP adress",
"install_static_ok": "Goda nyheter! Den statiska IP adressen är redan konfigurerad",
"install_static_error": "AdGuard Home kan inte konfigurera det automatiskt för detta nätverksgränssnitt. Vänligen leta efter en instruktion om hur du gör detta manuellt.",
"install_static_configure": "AdGuard Home har upptäckt att den dynamiska IP adressen <0>{{ip}}</0> används. Vill du att den ska ställas in som din statiska adress?",
"confirm_static_ip": "AdGuard Home kommer att konfigurera {{ip}} för att vara din statiska IP adress. Vill du fortsätta?",
"list_updated": "{{count}} listan uppdaterad",
"list_updated_plural": "{{count}} listor uppdaterade",
"dnssec_enable": "Aktivera DNSSEC",
"dnssec_enable_desc": "Ställ in DNSSEC flagga i de utgående DNS frågorna och kontrollera resultatet (DNSSEC-aktiverad upplösare krävs).",
"validated_with_dnssec": "Validerad med DNSSEC",
"all_queries": "Alla förfrågningar",
"show_blocked_responses": "Blockerade", "show_blocked_responses": "Blockerade",
"show_whitelisted_responses": "Vitlistade", "show_whitelisted_responses": "Vitlistade",
"show_processed_responses": "Utförda", "show_processed_responses": "Utförda",
"blocked_adult_websites": "Blockerad av Föräldrakontrollen", "blocked_safebrowsing": "Blockerad av Säker webbsökning",
"blocked_adult_websites": "Blockerad av Föräldrakontroll",
"blocked_threats": "Blockerade hot", "blocked_threats": "Blockerade hot",
"allowed": "Vitlistade", "allowed": "Vitlistade",
"filtered": "Filtrerad",
"rewritten": "Omskriven",
"safe_search": "Säker surf", "safe_search": "Säker surf",
"blocklist": "Blocklista",
"milliseconds_abbreviation": "ms",
"cache_size": "Cachestorlek",
"cache_size_desc": "DNS cachestorlek (i byte)",
"cache_ttl_min_override": "Åsidosätt minsta TTL",
"cache_ttl_max_override": "Åsidosätt maximal TTL",
"enter_cache_size": "Ange cachestorlek (byte)",
"enter_cache_ttl_min_override": "Ange minsta TTL (sekunder)",
"enter_cache_ttl_max_override": "Ange maximal TTL (sekunder)",
"cache_ttl_min_override_desc": "Förläng värden för korta time-to-live värden (sekunder) som tas emot från uppströms server när DNS svar cachelagras",
"cache_ttl_max_override_desc": "Ställ in ett maximalt värde för time-to-live (sekunder) för poster i DNS cachen",
"ttl_cache_validation": "Minsta cache TTL-värde måste vara mindre än eller lika med maxvärdet",
"cache_optimistic": "Optimistisk cachning",
"cache_optimistic_desc": "Få AdGuard Home att svara från cachen även när posterna har gått ut och försök även uppdatera dem.",
"filter_category_general": "General", "filter_category_general": "General",
"filter_category_security": "säkerhet", "filter_category_security": "säkerhet",
"filter_category_regional": "Regional",
"filter_category_other": "Övrigt", "filter_category_other": "Övrigt",
"filter_category_general_desc": "Listor som blockerar spårning och reklam på de flesta enheterna",
"filter_category_security_desc": "Listor utformade specifikt för att blockera skadliga domäner, nätfiske och bluffdomäner",
"filter_category_regional_desc": "Listor som fokuserar på regionala annonser och spårningsservrar",
"filter_category_other_desc": "Andra blockeringslistor",
"setup_config_to_enable_dhcp_server": "Ställ in konfiguration för att aktivera DHCP-server",
"original_response": "Ursprungligt svar",
"click_to_view_queries": "Klicka för att se förfrågningar",
"port_53_faq_link": "Port 53 är ofta upptagen av \"DNSStubListener\" eller \"systemd-resolved\" tjänster. Läs <0>denna instruktion</0> om hur du löser detta.",
"adg_will_drop_dns_queries": "AdGuard Home kommer att kasta alla DNS-frågor från den här klienten.",
"filter_allowlist": "VARNING: Denna åtgärd kommer också att utesluta regeln \"{{disallowed_rule}}\" från listan över tillåtna klienter.",
"last_rule_in_allowlist": "Det går inte att avvisa den här klienten eftersom att utesluta regeln \"{{disallowed_rule}}\" kommer att INAKTIVERA listan \"Tillåtna klienter\".",
"experimental": "Experimentell",
"use_saved_key": "Använd den tidigare sparade nyckeln", "use_saved_key": "Använd den tidigare sparade nyckeln",
"parental_control": "Föräldrarkontroll" "parental_control": "Föräldrakontroll",
"safe_browsing": "Säker surfning",
"served_from_cache": "{{value}} <i>(levereras från cache)</i>"
} }

View File

@ -43,7 +43,7 @@
"form_error_ip6_format": "IPv6 adresi geçersiz", "form_error_ip6_format": "IPv6 adresi geçersiz",
"form_error_ip_format": "IP adresi geçersiz", "form_error_ip_format": "IP adresi geçersiz",
"form_error_mac_format": "MAC adresi geçersiz", "form_error_mac_format": "MAC adresi geçersiz",
"form_error_client_id_format": "İstemci kimliği geçersiz", "form_error_client_id_format": "İstemci kimliği yalnızca sayılar, küçük harfler ve kısa çizgiler içermelidir",
"form_error_server_name": "Sunucu adı geçersiz", "form_error_server_name": "Sunucu adı geçersiz",
"form_error_subnet": "\"{{cidr}}\" alt ağı, \"{{ip}}\" IP adresini içermiyor", "form_error_subnet": "\"{{cidr}}\" alt ağı, \"{{ip}}\" IP adresini içermiyor",
"form_error_positive": "0'dan büyük olmalıdır", "form_error_positive": "0'dan büyük olmalıdır",
@ -53,7 +53,7 @@
"greater_range_end_error": "Bitiş aralığından daha büyük olmalıdır", "greater_range_end_error": "Bitiş aralığından daha büyük olmalıdır",
"subnet_error": "Adresler bir alt ağda olmalıdır", "subnet_error": "Adresler bir alt ağda olmalıdır",
"gateway_or_subnet_invalid": "Alt ağ maskesi geçersiz", "gateway_or_subnet_invalid": "Alt ağ maskesi geçersiz",
"dhcp_form_gateway_input": "Ağ Geçidi IP'si", "dhcp_form_gateway_input": "Ağ geçidi IP",
"dhcp_form_subnet_input": "Alt ağ maskesi", "dhcp_form_subnet_input": "Alt ağ maskesi",
"dhcp_form_range_title": "IP adresi aralığı", "dhcp_form_range_title": "IP adresi aralığı",
"dhcp_form_range_start": "Başlangıç aralığı", "dhcp_form_range_start": "Başlangıç aralığı",
@ -138,7 +138,7 @@
"average_processing_time": "Ortalama işlem süresi", "average_processing_time": "Ortalama işlem süresi",
"average_processing_time_hint": "Bir DNS isteğinin milisaniye cinsinden ortalama işlem süresi", "average_processing_time_hint": "Bir DNS isteğinin milisaniye cinsinden ortalama işlem süresi",
"block_domain_use_filters_and_hosts": "Filtre ve ana bilgisayar listelerini kullanarak alan adlarını engelle", "block_domain_use_filters_and_hosts": "Filtre ve ana bilgisayar listelerini kullanarak alan adlarını engelle",
"filters_block_toggle_hint": "<a>Filtreler</a> sayfasından engelleme kurallarını ayarlayabilirsiniz.", "filters_block_toggle_hint": "<a>Filtreler</a> ayarlarında engelleme kuralları oluşturabilirsiniz.",
"use_adguard_browsing_sec": "AdGuard gezinti koruması web hizmetini kullan", "use_adguard_browsing_sec": "AdGuard gezinti koruması web hizmetini kullan",
"use_adguard_browsing_sec_hint": "AdGuard Home, alan adının gezinti koruması web hizmeti tarafından engellenip engellenmediğini kontrol eder. Kontrolü gerçekleştirmek için gizlilik dostu arama API'sini kullanır: sunucuya yalnızca SHA256 karma alan adının kısa bir ön eki gönderilir.", "use_adguard_browsing_sec_hint": "AdGuard Home, alan adının gezinti koruması web hizmeti tarafından engellenip engellenmediğini kontrol eder. Kontrolü gerçekleştirmek için gizlilik dostu arama API'sini kullanır: sunucuya yalnızca SHA256 karma alan adının kısa bir ön eki gönderilir.",
"use_adguard_parental": "AdGuard ebeveyn denetimi web hizmetini kullan", "use_adguard_parental": "AdGuard ebeveyn denetimi web hizmetini kullan",
@ -165,10 +165,10 @@
"enabled_filtering_toast": "Filtreleme etkin", "enabled_filtering_toast": "Filtreleme etkin",
"disabled_safe_browsing_toast": "Güvenli Gezinti devre dışı bırakıldı", "disabled_safe_browsing_toast": "Güvenli Gezinti devre dışı bırakıldı",
"enabled_safe_browsing_toast": "Güvenli Gezinti etkinleştirildi", "enabled_safe_browsing_toast": "Güvenli Gezinti etkinleştirildi",
"disabled_parental_toast": "Ebeveyn denetimi devre dışı", "disabled_parental_toast": "Ebeveyn denetimi devre dışı bırakıldı",
"enabled_parental_toast": "Ebeveyn denetimi etkin", "enabled_parental_toast": "Ebeveyn denetimi etkinleştirildi",
"disabled_safe_search_toast": "Güvenli arama devre dışı", "disabled_safe_search_toast": "Güvenli arama devre dışı bırakıldı",
"enabled_save_search_toast": "Güvenli arama etkin", "enabled_save_search_toast": "Güvenli arama etkinleştirildi",
"enabled_table_header": "Etkin", "enabled_table_header": "Etkin",
"name_table_header": "İsim", "name_table_header": "İsim",
"list_url_table_header": "Liste URL'si", "list_url_table_header": "Liste URL'si",
@ -178,7 +178,7 @@
"request_table_header": "İstek", "request_table_header": "İstek",
"edit_table_action": "Düzenle", "edit_table_action": "Düzenle",
"delete_table_action": "Sil", "delete_table_action": "Sil",
"elapsed": "Geçen zaman", "elapsed": "Geçen süre",
"filters_and_hosts_hint": "AdGuard Home, temel reklam engelleme kurallarını ve ana bilgisayar engelleme dosyalarının söz dizimini anlar.", "filters_and_hosts_hint": "AdGuard Home, temel reklam engelleme kurallarını ve ana bilgisayar engelleme dosyalarının söz dizimini anlar.",
"no_blocklist_added": "Engel listesi eklenmedi", "no_blocklist_added": "Engel listesi eklenmedi",
"no_whitelist_added": "İzin listesi eklenmedi", "no_whitelist_added": "İzin listesi eklenmedi",
@ -327,10 +327,10 @@
"install_submit_desc": "Yükleme işlemi tamamlandı ve artık AdGuard Home'u kullanmaya hazırsınız.", "install_submit_desc": "Yükleme işlemi tamamlandı ve artık AdGuard Home'u kullanmaya hazırsınız.",
"install_devices_router": "Yönlendirici", "install_devices_router": "Yönlendirici",
"install_devices_router_desc": "Bu kurulum, ev yönlendiricinize bağlı tüm cihazları otomatik olarak kapsar ve her birini elle yapılandırmanıza gerek yoktur.", "install_devices_router_desc": "Bu kurulum, ev yönlendiricinize bağlı tüm cihazları otomatik olarak kapsar ve her birini elle yapılandırmanıza gerek yoktur.",
"install_devices_address": "AdGuard Home DNS sunucusu şu adresi dinleyecektir", "install_devices_address": "AdGuard Home DNS sunucusu aşağıdaki adresleri dinliyor",
"install_devices_router_list_1": "Yönlendiricinizin ayarlarına gidin. Genellikle tarayıcınızdan http://192.168.0.1/ veya http://192.168.1.1/ gibi bir URL aracılığıyla erişebilirsiniz. Bir parola girmeniz istenebilir. Hatırlamıyorsanız, genellikle yönlendiricinin üzerindeki bir düğmeye basarak parolayı sıfırlayabilirsiniz, ancak bu işlemin seçilmesi durumunda yüksek ihtimalle tüm yönlendirici yapılandırmasını kaybedeceğinizi unutmayın. Yönlendiricinizin kurulumu için bir uygulama gerekiyorsa, lütfen uygulamayı telefonunuza veya PC'nize yükleyin ve yönlendiricinin ayarlarına erişmek için kullanın.", "install_devices_router_list_1": "Yönlendiricinizin ayarlarına gidin. Genellikle tarayıcınızdan http://192.168.0.1/ veya http://192.168.1.1/ gibi bir URL aracılığıyla erişebilirsiniz. Bir parola girmeniz istenebilir. Hatırlamıyorsanız, genellikle yönlendiricinin üzerindeki bir düğmeye basarak parolayı sıfırlayabilirsiniz, ancak bu işlemin seçilmesi durumunda yüksek ihtimalle tüm yönlendirici yapılandırmasını kaybedeceğinizi unutmayın. Yönlendiricinizin kurulumu için bir uygulama gerekiyorsa, lütfen uygulamayı telefonunuza veya PC'nize yükleyin ve yönlendiricinin ayarlarına erişmek için kullanın.",
"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_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_3": "AdGuard Home sunucu adreslerinizi oraya girin.",
"install_devices_router_list_4": "Bazı yönlendirici türlerinde özel bir DNS sunucusu ayarlanamaz. Bu durumda, AdGuard Home'u <0>DHCP sunucusu</0> olarak ayarlamak yardımcı olabilir. Aksi takdirde, yönlendirici modeliniz için DNS sunucularını nasıl ayarlayacağınız konusunda yönlendirici kılavuzuna bakmalısınız.", "install_devices_router_list_4": "Bazı yönlendirici türlerinde özel bir DNS sunucusu ayarlanamaz. Bu durumda, AdGuard Home'u <0>DHCP sunucusu</0> olarak ayarlamak yardımcı olabilir. Aksi takdirde, yönlendirici modeliniz için DNS sunucularını nasıl ayarlayacağınız konusunda yönlendirici kılavuzuna bakmalısınız.",
"install_devices_windows_list_1": "Başlat menüsünden veya Windows araması aracılığıyla Denetim Masası'nıın.", "install_devices_windows_list_1": "Başlat menüsünden veya Windows araması aracılığıyla Denetim Masası'nıın.",
"install_devices_windows_list_2": "Ağ ve İnternet kategorisine girin ve ardından Ağ ve Paylaşım Merkezi'ne girin.", "install_devices_windows_list_2": "Ağ ve İnternet kategorisine girin ve ardından Ağ ve Paylaşım Merkezi'ne girin.",
@ -339,15 +339,15 @@
"install_devices_windows_list_5": "Listede \"İnternet Protokolü Sürüm 4 (TCP/IPv4)\" (veya IPv6 için \"İnternet Protokolü Sürüm 6 (TCP/IPv6)\") öğesini bulun, seçin ve ardından tekrar Özellikler'e tıklayın.", "install_devices_windows_list_5": "Listede \"İnternet Protokolü Sürüm 4 (TCP/IPv4)\" (veya IPv6 için \"İnternet Protokolü Sürüm 6 (TCP/IPv6)\") öğesini bulun, seçin ve ardından tekrar Özellikler'e tıklayın.",
"install_devices_windows_list_6": "\"Aşağıdaki DNS sunucu adreslerini kullan\"ı seçin ve AdGuard Home sunucu adreslerinizi girin.", "install_devices_windows_list_6": "\"Aşağıdaki DNS sunucu adreslerini kullan\"ı seçin ve AdGuard Home sunucu adreslerinizi girin.",
"install_devices_macos_list_1": "Apple simgesinde bulunan Sistem Tercihleri'ne tıklayın.", "install_devices_macos_list_1": "Apple simgesinde bulunan Sistem Tercihleri'ne tıklayın.",
"install_devices_macos_list_2": "Ağ seçeneğine tıklayın.", "install_devices_macos_list_2": "Ağ'a tıklayın.",
"install_devices_macos_list_3": "Listedeki ilk bağlantıyı seçin ve Gelişmiş öğesine tıklayın.", "install_devices_macos_list_3": "Listedeki ilk bağlantıyı seçin ve Gelişmiş öğesine tıklayın.",
"install_devices_macos_list_4": "DNS sekmesini seçin ve AdGuard Home sunucunuzun adreslerini girin.", "install_devices_macos_list_4": "DNS sekmesini seçin ve AdGuard Home sunucunuzun adreslerini girin.",
"install_devices_android_list_1": "Android cihazınızda Ayarlar simgesine dokunun.", "install_devices_android_list_1": "Android Menüsü ana ekranından Ayarlar'a dokunun.",
"install_devices_android_list_2": "Menüde bulunan Wi-Fi seçeneğine dokunun. Mevcut tüm ağlar listelenecektir (mobil ağlar için özel DNS sunucusu ayarlanamaz).", "install_devices_android_list_2": "Menüde bulunan Wi-Fi seçeneğine dokunun. Mevcut tüm ağlar listelenecektir (mobil ağlar için özel DNS sunucusu ayarlanamaz).",
"install_devices_android_list_3": "Bağlı olduğunuz ağın üzerine basılı tutun ve Ağı Değiştir'e dokunun.", "install_devices_android_list_3": "Bağlı olduğunuz ağın üzerine basılı tutun ve Ağı Değiştir'e dokunun.",
"install_devices_android_list_4": "Bazı cihazlarda, diğer ayarları görmek için \"Gelişmiş\" seçeneğini seçmeniz gerekebilir. Android DNS ayarlarınızı yapmak için IP ayarlarını DHCP modundan Statik moda almanız gerekecektir.", "install_devices_android_list_4": "Bazı cihazlarda, diğer ayarları görmek için \"Gelişmiş\" seçeneğini seçmeniz gerekebilir. Android DNS ayarlarınızı yapmak için IP ayarlarını DHCP modundan Statik moda almanız gerekecektir.",
"install_devices_android_list_5": "DNS 1 ve DNS 2 değerlerini AdGuard Home sunucunuzun adresleriyle değiştirin.", "install_devices_android_list_5": "DNS 1 ve DNS 2 değerlerini AdGuard Home sunucunuzun adresleriyle değiştirin.",
"install_devices_ios_list_1": "Ana ekrandaki Ayarlar simgesine dokunun.", "install_devices_ios_list_1": "Ana ekrandan Ayarlar'a dokunun.",
"install_devices_ios_list_2": "Sol menüde bulunan Wi-Fi bölümüne girin (mobil ağlar için özel DNS sunucusu ayarlanamaz).", "install_devices_ios_list_2": "Sol menüde bulunan Wi-Fi bölümüne girin (mobil ağlar için özel DNS sunucusu ayarlanamaz).",
"install_devices_ios_list_3": "Bağlı olduğunuz ağın ismine dokunun.", "install_devices_ios_list_3": "Bağlı olduğunuz ağın ismine dokunun.",
"install_devices_ios_list_4": "DNS alanına AdGuard Home sunucunuzun adreslerini girin.", "install_devices_ios_list_4": "DNS alanına AdGuard Home sunucunuzun adreslerini girin.",
@ -386,8 +386,8 @@
"encryption_issuer": "Sağlayan", "encryption_issuer": "Sağlayan",
"encryption_hostnames": "Ana bilgisayar adları", "encryption_hostnames": "Ana bilgisayar adları",
"encryption_reset": "Şifreleme ayarlarını sıfırlamak istediğinizden emin misiniz?", "encryption_reset": "Şifreleme ayarlarını sıfırlamak istediğinizden emin misiniz?",
"topline_expiring_certificate": "SSL sertifikanızın süresi dolmak üzere. <0>Şifreleme ayarlarını</0> güncelleyin.", "topline_expiring_certificate": "SSL sertifikanızın süresi sona erdi. <0>Şifreleme ayarlarını</0> güncelleyin.",
"topline_expired_certificate": "SSL sertifikanızın süresi doldu. <0>Şifreleme ayarlarını</0> güncelleyin.", "topline_expired_certificate": "SSL sertifikanızın süresi sona erdi. <0>Şifreleme ayarlarını</0> güncelleyin.",
"form_error_port_range": "80-65535 aralığında geçerli bir bağlantı noktası değeri girin", "form_error_port_range": "80-65535 aralığında geçerli bir bağlantı noktası değeri girin",
"form_error_port_unsafe": "Bu bağlantı noktası güvenli değil", "form_error_port_unsafe": "Bu bağlantı noktası güvenli değil",
"form_error_equal": "Aynı olmamalı", "form_error_equal": "Aynı olmamalı",
@ -417,7 +417,7 @@
"client_identifier": "Tanımlayıcı", "client_identifier": "Tanımlayıcı",
"ip_address": "IP adresi", "ip_address": "IP adresi",
"client_identifier_desc": "İstemciler IP adresi, CIDR, MAC adresi veya özel bir istemci kimliği ile tanımlanabilir (DoT/DoH/DoQ için kullanılabilir). İstemcileri nasıl tanımlayacağınız hakkında daha fazla bilgiyi <0>burada</0> bulabilirsiniz.", "client_identifier_desc": "İstemciler IP adresi, CIDR, MAC adresi veya özel bir istemci kimliği ile tanımlanabilir (DoT/DoH/DoQ için kullanılabilir). İstemcileri nasıl tanımlayacağınız hakkında daha fazla bilgiyi <0>burada</0> bulabilirsiniz.",
"form_enter_ip": "IP adresi girin", "form_enter_ip": "IP girin",
"form_enter_subnet_ip": "\"{{cidr}}\" alt ağına bir IP adresi girin", "form_enter_subnet_ip": "\"{{cidr}}\" alt ağına bir IP adresi girin",
"form_enter_mac": "MAC adresi girin", "form_enter_mac": "MAC adresi girin",
"form_enter_id": "Tanımlayıcı girin", "form_enter_id": "Tanımlayıcı girin",
@ -439,7 +439,7 @@
"access_allowed_desc": "CIDR'lerin, IP adreslerinin veya istemci kimliklerinin listesi. Yapılandırılırsa, AdGuard Home yalnızca bu istemcilerden gelen istekleri kabul eder.", "access_allowed_desc": "CIDR'lerin, IP adreslerinin veya istemci kimliklerinin listesi. Yapılandırılırsa, AdGuard Home yalnızca bu istemcilerden gelen istekleri kabul eder.",
"access_disallowed_title": "İzin verilmeyen istemciler", "access_disallowed_title": "İzin verilmeyen istemciler",
"access_disallowed_desc": "CIDR'lerin, IP adreslerinin veya istemci kimliklerinin listesi. Yapılandırılırsa, AdGuard Home bu istemcilerden gelen istekleri keser. İzin verilen istemciler yapılandırılırsa, bu alan yok sayılır.", "access_disallowed_desc": "CIDR'lerin, IP adreslerinin veya istemci kimliklerinin listesi. Yapılandırılırsa, AdGuard Home bu istemcilerden gelen istekleri keser. İzin verilen istemciler yapılandırılırsa, bu alan yok sayılır.",
"access_blocked_title": "Engellenen alan adları", "access_blocked_title": "İzin verilmeyen alan adları",
"access_blocked_desc": "Bu işlem filtrelerle ilgili değildir. AdGuard Home, bu alan adlarından gelen DNS sorgularını yanıtsız bırakır ve bu sorgular sorgu günlüğünde görünmez. Tam alan adlarını, joker karakterleri veya URL filtre kurallarını belirtebilirsiniz, ör. \"example.org\", \"*.example.org\" veya \"||example.org^\".", "access_blocked_desc": "Bu işlem filtrelerle ilgili değildir. AdGuard Home, bu alan adlarından gelen DNS sorgularını yanıtsız bırakır ve bu sorgular sorgu günlüğünde görünmez. Tam alan adlarını, joker karakterleri veya URL filtre kurallarını belirtebilirsiniz, ör. \"example.org\", \"*.example.org\" veya \"||example.org^\".",
"access_settings_saved": "Erişim ayarları başarıyla kaydedildi!", "access_settings_saved": "Erişim ayarları başarıyla kaydedildi!",
"updates_checked": "Güncelleme kontrolü başarılı", "updates_checked": "Güncelleme kontrolü başarılı",
@ -601,8 +601,8 @@
"cache_ttl_min_override": "Minimum TTL'i değiştir", "cache_ttl_min_override": "Minimum TTL'i değiştir",
"cache_ttl_max_override": "Maksimum TTL'i değiştir", "cache_ttl_max_override": "Maksimum TTL'i değiştir",
"enter_cache_size": "Önbellek boyutunu girin (bayt)", "enter_cache_size": "Önbellek boyutunu girin (bayt)",
"enter_cache_ttl_min_override": "Minimum TTL değerini girin (saniye)", "enter_cache_ttl_min_override": "Minimum TTL değerini girin (saniye olarak)",
"enter_cache_ttl_max_override": "Maksimum TTL değerini girin (saniye)", "enter_cache_ttl_max_override": "Maksimum TTL değerini girin (saniye olarak)",
"cache_ttl_min_override_desc": "DNS yanıtlarını önbelleğe alırken üst sunucudan alınan kullanım süresi değerini uzatın (saniye olarak)", "cache_ttl_min_override_desc": "DNS yanıtlarını önbelleğe alırken üst sunucudan alınan kullanım süresi değerini uzatın (saniye olarak)",
"cache_ttl_max_override_desc": "DNS önbelleğindeki girişler için maksimum kullanım süresi değerini ayarlayın (saniye olarak)", "cache_ttl_max_override_desc": "DNS önbelleğindeki girişler için maksimum kullanım süresi değerini ayarlayın (saniye olarak)",
"ttl_cache_validation": "Minimum önbellek TTL değeri, maksimum değerden küçük veya bu değere eşit olmalıdır", "ttl_cache_validation": "Minimum önbellek TTL değeri, maksimum değerden küçük veya bu değere eşit olmalıdır",
@ -626,5 +626,6 @@
"experimental": "Deneysel", "experimental": "Deneysel",
"use_saved_key": "Önceden kaydedilmiş anahtarı kullan", "use_saved_key": "Önceden kaydedilmiş anahtarı kullan",
"parental_control": "Ebeveyn Denetimi", "parental_control": "Ebeveyn Denetimi",
"safe_browsing": "Güvenli Gezinti" "safe_browsing": "Güvenli Gezinti",
"served_from_cache": "{{value}} <i>(önbellekten kullanıldı)</i>"
} }

View File

@ -43,7 +43,7 @@
"form_error_ip6_format": "Неправильна IPv6-адреса", "form_error_ip6_format": "Неправильна IPv6-адреса",
"form_error_ip_format": "Неправильна IP-адреса", "form_error_ip_format": "Неправильна IP-адреса",
"form_error_mac_format": "Неправильна MAC-адреса", "form_error_mac_format": "Неправильна MAC-адреса",
"form_error_client_id_format": "Неправильний ID клієнта", "form_error_client_id_format": "ID клієнта має містити лише цифри, малі букви та дефіси",
"form_error_server_name": "Неправильна назва сервера", "form_error_server_name": "Неправильна назва сервера",
"form_error_subnet": "Підмережа «{{cidr}}» не містить IP-адресу «{{ip}}»", "form_error_subnet": "Підмережа «{{cidr}}» не містить IP-адресу «{{ip}}»",
"form_error_positive": "Повинно бути більше 0", "form_error_positive": "Повинно бути більше 0",

View File

@ -43,7 +43,7 @@
"form_error_ip6_format": "无效的 IPv6 地址", "form_error_ip6_format": "无效的 IPv6 地址",
"form_error_ip_format": "无效的 IP 地址", "form_error_ip_format": "无效的 IP 地址",
"form_error_mac_format": "无效的 MAC 地址", "form_error_mac_format": "无效的 MAC 地址",
"form_error_client_id_format": "无效的客户端 ID", "form_error_client_id_format": "无效的客户端 ID 格式客户 ID 必须只包含数字、小写字母和连字符",
"form_error_server_name": "无效的服务器名", "form_error_server_name": "无效的服务器名",
"form_error_subnet": "子网 \"{{cidr}}\" 不包含 IP 地址 \"{{ip}}\"", "form_error_subnet": "子网 \"{{cidr}}\" 不包含 IP 地址 \"{{ip}}\"",
"form_error_positive": "必须大于 0", "form_error_positive": "必须大于 0",
@ -588,7 +588,7 @@
"show_whitelisted_responses": "已列入白名单", "show_whitelisted_responses": "已列入白名单",
"show_processed_responses": "已处理", "show_processed_responses": "已处理",
"blocked_safebrowsing": "被安全浏览阻止", "blocked_safebrowsing": "被安全浏览阻止",
"blocked_adult_websites": "已由家长控制拦截", "blocked_adult_websites": "被家长控制阻止",
"blocked_threats": "拦截的威胁", "blocked_threats": "拦截的威胁",
"allowed": "允许项", "allowed": "允许项",
"filtered": "已过滤", "filtered": "已过滤",

View File

@ -43,7 +43,7 @@
"form_error_ip6_format": "無效的 IPv6 位址", "form_error_ip6_format": "無效的 IPv6 位址",
"form_error_ip_format": "無效的 IP 位址", "form_error_ip_format": "無效的 IP 位址",
"form_error_mac_format": "無效的媒體存取控制MAC位址", "form_error_mac_format": "無效的媒體存取控制MAC位址",
"form_error_client_id_format": "無效的用戶端 ID", "form_error_client_id_format": "用戶端 ID 必須只包含數字、小寫字母和連字號",
"form_error_server_name": "無效的伺服器名稱", "form_error_server_name": "無效的伺服器名稱",
"form_error_subnet": "子網路 \"{{cidr}}\" 不包含該 IP 位址 \"{{ip}}\"", "form_error_subnet": "子網路 \"{{cidr}}\" 不包含該 IP 位址 \"{{ip}}\"",
"form_error_positive": "必須大於 0", "form_error_positive": "必須大於 0",
@ -146,7 +146,7 @@
"enforce_safe_search": "使用安全搜尋", "enforce_safe_search": "使用安全搜尋",
"enforce_save_search_hint": "AdGuard Home 將在下列的搜尋引擎Google、YouTube、Bing、DuckDuckGo、Yandex 和 Pixabay 中強制執行安全搜尋。", "enforce_save_search_hint": "AdGuard Home 將在下列的搜尋引擎Google、YouTube、Bing、DuckDuckGo、Yandex 和 Pixabay 中強制執行安全搜尋。",
"no_servers_specified": "無已明確指定的伺服器", "no_servers_specified": "無已明確指定的伺服器",
"general_settings": "一般設定", "general_settings": "一般設定",
"dns_settings": "DNS 設定", "dns_settings": "DNS 設定",
"dns_blocklists": "DNS 封鎖清單", "dns_blocklists": "DNS 封鎖清單",
"dns_allowlists": "DNS 允許清單", "dns_allowlists": "DNS 允許清單",

View File

@ -4,7 +4,7 @@ import { Trans, withTranslation } from 'react-i18next';
import ReactTable from 'react-table'; import ReactTable from 'react-table';
import { MODAL_TYPE } from '../../../helpers/constants'; import { MODAL_TYPE } from '../../../helpers/constants';
import { splitByNewLine, countClientsStatistics } from '../../../helpers/helpers'; import { splitByNewLine, countClientsStatistics, sortIp } from '../../../helpers/helpers';
import Card from '../../ui/Card'; import Card from '../../ui/Card';
import Modal from './Modal'; import Modal from './Modal';
import CellWrap from '../../ui/CellWrap'; import CellWrap from '../../ui/CellWrap';
@ -106,6 +106,7 @@ class ClientsTable extends Component {
</div> </div>
); );
}, },
sortMethod: sortIp,
}, },
{ {
Header: this.props.t('table_name'), Header: this.props.t('table_name'),

View File

@ -754,8 +754,10 @@ const getAddressesComparisonBytes = (item) => {
*/ */
export const sortIp = (a, b) => { export const sortIp = (a, b) => {
try { try {
const comparisonBytesA = getAddressesComparisonBytes(a); const comparisonBytesA = Array.isArray(a)
const comparisonBytesB = getAddressesComparisonBytes(b); ? getAddressesComparisonBytes(a[0]) : getAddressesComparisonBytes(a);
const comparisonBytesB = Array.isArray(b)
? getAddressesComparisonBytes(b[0]) : getAddressesComparisonBytes(b);
for (let i = 0; i < comparisonBytesA.length; i += 1) { for (let i = 0; i < comparisonBytesA.length; i += 1) {
const byteA = comparisonBytesA[i]; const byteA = comparisonBytesA[i];

4
go.mod
View File

@ -3,9 +3,9 @@ module github.com/AdguardTeam/AdGuardHome
go 1.17 go 1.17
require ( require (
github.com/AdguardTeam/dnsproxy v0.40.4 github.com/AdguardTeam/dnsproxy v0.40.6
github.com/AdguardTeam/golibs v0.10.4 github.com/AdguardTeam/golibs v0.10.4
github.com/AdguardTeam/urlfilter v0.15.1 github.com/AdguardTeam/urlfilter v0.15.2
github.com/NYTimes/gziphandler v1.1.1 github.com/NYTimes/gziphandler v1.1.1
github.com/ameshkov/dnscrypt/v2 v2.2.3 github.com/ameshkov/dnscrypt/v2 v2.2.3
github.com/digineo/go-ipset/v2 v2.2.1 github.com/digineo/go-ipset/v2 v2.2.1

10
go.sum
View File

@ -7,17 +7,16 @@ dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBr
dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4=
dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU=
git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg=
github.com/AdguardTeam/dnsproxy v0.40.4 h1:dnI60dO/lm7ILSZ5GLV5bt3Vp8jFUPKqpaWewWpb3gY= github.com/AdguardTeam/dnsproxy v0.40.6 h1:cTyzjiDrTk4vOXixLsWZ4Xjpqy6pqjTY++Tndq3bEf4=
github.com/AdguardTeam/dnsproxy v0.40.4/go.mod h1:PZ9l22h3Er+5mxFQB7oHZMTvx+aa9R6LbzA/ikXQlS0= github.com/AdguardTeam/dnsproxy v0.40.6/go.mod h1:PZ9l22h3Er+5mxFQB7oHZMTvx+aa9R6LbzA/ikXQlS0=
github.com/AdguardTeam/golibs v0.4.0/go.mod h1:skKsDKIBB7kkFflLJBpfGX+G8QFTx0WKUzB6TIgtUj4= github.com/AdguardTeam/golibs v0.4.0/go.mod h1:skKsDKIBB7kkFflLJBpfGX+G8QFTx0WKUzB6TIgtUj4=
github.com/AdguardTeam/golibs v0.4.2/go.mod h1:skKsDKIBB7kkFflLJBpfGX+G8QFTx0WKUzB6TIgtUj4= github.com/AdguardTeam/golibs v0.4.2/go.mod h1:skKsDKIBB7kkFflLJBpfGX+G8QFTx0WKUzB6TIgtUj4=
github.com/AdguardTeam/golibs v0.9.2/go.mod h1:fCAMwPBJ8S7YMYbTWvYS+eeTLblP5E04IDtNAo7y7IY=
github.com/AdguardTeam/golibs v0.10.3/go.mod h1:rSfQRGHIdgfxriDDNgNJ7HmE5zRoURq8R+VdR81Zuzw= github.com/AdguardTeam/golibs v0.10.3/go.mod h1:rSfQRGHIdgfxriDDNgNJ7HmE5zRoURq8R+VdR81Zuzw=
github.com/AdguardTeam/golibs v0.10.4 h1:TMBkablZC0IZOpRgg9fzAKlxxNhSN2YJq7qbgtuZ7PQ= github.com/AdguardTeam/golibs v0.10.4 h1:TMBkablZC0IZOpRgg9fzAKlxxNhSN2YJq7qbgtuZ7PQ=
github.com/AdguardTeam/golibs v0.10.4/go.mod h1:rSfQRGHIdgfxriDDNgNJ7HmE5zRoURq8R+VdR81Zuzw= github.com/AdguardTeam/golibs v0.10.4/go.mod h1:rSfQRGHIdgfxriDDNgNJ7HmE5zRoURq8R+VdR81Zuzw=
github.com/AdguardTeam/gomitmproxy v0.2.0/go.mod h1:Qdv0Mktnzer5zpdpi5rAwixNJzW2FN91LjKJCkVbYGU= github.com/AdguardTeam/gomitmproxy v0.2.0/go.mod h1:Qdv0Mktnzer5zpdpi5rAwixNJzW2FN91LjKJCkVbYGU=
github.com/AdguardTeam/urlfilter v0.15.1 h1:dP6S7J6eFAk8MN4IDpUq2fZoBo8K8fmc6pXpxNIv84M= github.com/AdguardTeam/urlfilter v0.15.2 h1:LZGgrm4l4Ys9eAqB+UUmZfiC6vHlDlYFhx0WXqo6LtQ=
github.com/AdguardTeam/urlfilter v0.15.1/go.mod h1:EwXwrYhowP7bedqmOrmKKmQtpBYFyDNEBFQ+lxdUgQU= github.com/AdguardTeam/urlfilter v0.15.2/go.mod h1:46YZDOV1+qtdRDuhZKVPSSp7JWWes0KayqHrKAFBdEI=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/toml v0.4.1 h1:GaI7EiDXDRfa8VshkTj7Fym7ha+y8/XxIgD2okUIjLw= github.com/BurntSushi/toml v0.4.1 h1:GaI7EiDXDRfa8VshkTj7Fym7ha+y8/XxIgD2okUIjLw=
github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
@ -344,7 +343,6 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20210908191846-a5e095526f91/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20210928044308-7d9f5e0b762b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210928044308-7d9f5e0b762b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20210929193557-e81a3d93ecf6/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210929193557-e81a3d93ecf6/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=

View File

@ -1,7 +1,7 @@
// Package aghalgo contains common generic algorithms and data structures. // Package aghalg contains common generic algorithms and data structures.
// //
// TODO(a.garipov): Update to use type parameters in Go 1.18. // TODO(a.garipov): Update to use type parameters in Go 1.18.
package aghalgo package aghalg
import ( import (
"fmt" "fmt"
@ -14,20 +14,20 @@ import (
// TODO(a.garipov): Remove in Go 1.18. // TODO(a.garipov): Remove in Go 1.18.
type comparable = interface{} type comparable = interface{}
// UniquenessValidator allows validating uniqueness of comparable items. // UniqChecker allows validating uniqueness of comparable items.
type UniquenessValidator map[comparable]int64 type UniqChecker map[comparable]int64
// Add adds a value to the validator. v must not be nil. // Add adds a value to the validator. v must not be nil.
func (v UniquenessValidator) Add(elems ...comparable) { func (uc UniqChecker) Add(elems ...comparable) {
for _, e := range elems { for _, e := range elems {
v[e]++ uc[e]++
} }
} }
// Merge returns a validator containing data from both v and other. // Merge returns a checker containing data from both uc and other.
func (v UniquenessValidator) Merge(other UniquenessValidator) (merged UniquenessValidator) { func (uc UniqChecker) Merge(other UniqChecker) (merged UniqChecker) {
merged = make(UniquenessValidator, len(v)+len(other)) merged = make(UniqChecker, len(uc)+len(other))
for elem, num := range v { for elem, num := range uc {
merged[elem] += num merged[elem] += num
} }
@ -41,9 +41,9 @@ func (v UniquenessValidator) Merge(other UniquenessValidator) (merged Uniqueness
// Validate returns an error enumerating all elements that aren't unique. // Validate returns an error enumerating all elements that aren't unique.
// isBefore is an optional sorting function to make the error message // isBefore is an optional sorting function to make the error message
// deterministic. // deterministic.
func (v UniquenessValidator) Validate(isBefore func(a, b comparable) (less bool)) (err error) { func (uc UniqChecker) Validate(isBefore func(a, b comparable) (less bool)) (err error) {
var dup []comparable var dup []comparable
for elem, num := range v { for elem, num := range uc {
if num > 1 { if num > 1 {
dup = append(dup, elem) dup = append(dup, elem)
} }
@ -62,13 +62,13 @@ func (v UniquenessValidator) Validate(isBefore func(a, b comparable) (less bool)
return fmt.Errorf("duplicated values: %v", dup) return fmt.Errorf("duplicated values: %v", dup)
} }
// IntIsBefore is a helper sort function for UniquenessValidator.Validate. // IntIsBefore is a helper sort function for UniqChecker.Validate.
// a and b must be of type int. // a and b must be of type int.
func IntIsBefore(a, b comparable) (less bool) { func IntIsBefore(a, b comparable) (less bool) {
return a.(int) < b.(int) return a.(int) < b.(int)
} }
// StringIsBefore is a helper sort function for UniquenessValidator.Validate. // StringIsBefore is a helper sort function for UniqChecker.Validate.
// a and b must be of type string. // a and b must be of type string.
func StringIsBefore(a, b comparable) (less bool) { func StringIsBefore(a, b comparable) (less bool) {
return a.(string) < b.(string) return a.(string) < b.(string)

View File

@ -19,7 +19,8 @@ import (
"github.com/insomniacslk/dhcp/iana" "github.com/insomniacslk/dhcp/iana"
) )
// defaultDiscoverTime is the // defaultDiscoverTime is the default timeout of checking another DHCP server
// response.
const defaultDiscoverTime = 3 * time.Second const defaultDiscoverTime = 3 * time.Second
func checkOtherDHCP(ifaceName string) (ok4, ok6 bool, err4, err6 error) { func checkOtherDHCP(ifaceName string) (ok4, ok6 bool, err4, err6 error) {

View File

@ -343,113 +343,93 @@ func TestHostsContainer(t *testing.T) {
testdata := os.DirFS("./testdata") testdata := os.DirFS("./testdata")
nRewrites := func(t *testing.T, res *urlfilter.DNSResult, n int) (rws []*rules.DNSRewrite) {
rewrites := res.DNSRewrites()
require.Len(t, rewrites, n)
for _, rewrite := range rewrites {
require.Equal(t, listID, rewrite.FilterListID)
rw := rewrite.DNSRewrite
require.NotNil(t, rw)
rws = append(rws, rw)
}
return rws
}
testCases := []struct { testCases := []struct {
testTail func(t *testing.T, res *urlfilter.DNSResult) want []*rules.DNSRewrite
name string name string
req urlfilter.DNSRequest req urlfilter.DNSRequest
}{{ }{{
want: []*rules.DNSRewrite{{
RCode: dns.RcodeSuccess,
Value: net.IPv4(1, 0, 0, 1),
RRType: dns.TypeA,
}, {
RCode: dns.RcodeSuccess,
Value: net.IP(append((&[15]byte{})[:], byte(1))),
RRType: dns.TypeAAAA,
}},
name: "simple", name: "simple",
req: urlfilter.DNSRequest{ req: urlfilter.DNSRequest{
Hostname: "simplehost", Hostname: "simplehost",
DNSType: dns.TypeA, DNSType: dns.TypeA,
}, },
testTail: func(t *testing.T, res *urlfilter.DNSResult) {
rws := nRewrites(t, res, 2)
v, ok := rws[0].Value.(net.IP)
require.True(t, ok)
assert.True(t, net.IP{1, 0, 0, 1}.Equal(v))
v, ok = rws[1].Value.(net.IP)
require.True(t, ok)
// It's ::1.
assert.True(t, net.IP(append((&[15]byte{})[:], byte(1))).Equal(v))
},
}, { }, {
want: []*rules.DNSRewrite{{
RCode: dns.RcodeSuccess,
NewCNAME: "hello",
}},
name: "hello_alias", name: "hello_alias",
req: urlfilter.DNSRequest{ req: urlfilter.DNSRequest{
Hostname: "hello.world", Hostname: "hello.world",
DNSType: dns.TypeA, DNSType: dns.TypeA,
}, },
testTail: func(t *testing.T, res *urlfilter.DNSResult) {
assert.Equal(t, "hello", nRewrites(t, res, 1)[0].NewCNAME)
},
}, { }, {
want: []*rules.DNSRewrite{{
RCode: dns.RcodeSuccess,
NewCNAME: "hello",
}},
name: "other_line_alias", name: "other_line_alias",
req: urlfilter.DNSRequest{ req: urlfilter.DNSRequest{
Hostname: "hello.world.again", Hostname: "hello.world.again",
DNSType: dns.TypeA, DNSType: dns.TypeA,
}, },
testTail: func(t *testing.T, res *urlfilter.DNSResult) {
assert.Equal(t, "hello", nRewrites(t, res, 1)[0].NewCNAME)
},
}, { }, {
want: []*rules.DNSRewrite{},
name: "hello_subdomain", name: "hello_subdomain",
req: urlfilter.DNSRequest{ req: urlfilter.DNSRequest{
Hostname: "say.hello", Hostname: "say.hello",
DNSType: dns.TypeA, DNSType: dns.TypeA,
}, },
testTail: func(t *testing.T, res *urlfilter.DNSResult) {
assert.Empty(t, res.DNSRewrites())
},
}, { }, {
want: []*rules.DNSRewrite{},
name: "hello_alias_subdomain", name: "hello_alias_subdomain",
req: urlfilter.DNSRequest{ req: urlfilter.DNSRequest{
Hostname: "say.hello.world", Hostname: "say.hello.world",
DNSType: dns.TypeA, DNSType: dns.TypeA,
}, },
testTail: func(t *testing.T, res *urlfilter.DNSResult) {
assert.Empty(t, res.DNSRewrites())
},
}, { }, {
want: []*rules.DNSRewrite{{
RCode: dns.RcodeSuccess,
NewCNAME: "a.whole",
}},
name: "lots_of_aliases", name: "lots_of_aliases",
req: urlfilter.DNSRequest{ req: urlfilter.DNSRequest{
Hostname: "for.testing", Hostname: "for.testing",
DNSType: dns.TypeA, DNSType: dns.TypeA,
}, },
testTail: func(t *testing.T, res *urlfilter.DNSResult) {
assert.Equal(t, "a.whole", nRewrites(t, res, 1)[0].NewCNAME)
},
}, { }, {
want: []*rules.DNSRewrite{{
RCode: dns.RcodeSuccess,
RRType: dns.TypePTR,
Value: "simplehost.",
}},
name: "reverse", name: "reverse",
req: urlfilter.DNSRequest{ req: urlfilter.DNSRequest{
Hostname: "1.0.0.1.in-addr.arpa", Hostname: "1.0.0.1.in-addr.arpa",
DNSType: dns.TypePTR, DNSType: dns.TypePTR,
}, },
testTail: func(t *testing.T, res *urlfilter.DNSResult) {
rws := nRewrites(t, res, 1)
assert.Equal(t, dns.TypePTR, rws[0].RRType)
assert.Equal(t, "simplehost.", rws[0].Value)
},
}, { }, {
want: []*rules.DNSRewrite{},
name: "non-existing", name: "non-existing",
req: urlfilter.DNSRequest{ req: urlfilter.DNSRequest{
Hostname: "nonexisting", Hostname: "nonexisting",
DNSType: dns.TypeA, DNSType: dns.TypeA,
}, },
testTail: func(t *testing.T, res *urlfilter.DNSResult) { }, {
require.NotNil(t, res) want: nil,
name: "bad_type",
assert.Nil(t, res.DNSRewrites()) req: urlfilter.DNSRequest{
Hostname: "1.0.0.1.in-addr.arpa",
DNSType: dns.TypeSRV,
}, },
}} }}
@ -466,9 +446,26 @@ func TestHostsContainer(t *testing.T) {
t.Run(tc.name, func(t *testing.T) { t.Run(tc.name, func(t *testing.T) {
res, ok := hc.MatchRequest(tc.req) res, ok := hc.MatchRequest(tc.req)
require.False(t, ok) require.False(t, ok)
if tc.want == nil {
assert.Nil(t, res)
return
}
require.NotNil(t, res) require.NotNil(t, res)
tc.testTail(t, res) rewrites := res.DNSRewrites()
require.Len(t, rewrites, len(tc.want))
for i, rewrite := range rewrites {
require.Equal(t, listID, rewrite.FilterListID)
rw := rewrite.DNSRewrite
require.NotNil(t, rw)
assert.Equal(t, tc.want[i], rw)
}
}) })
} }
} }

View File

@ -25,6 +25,13 @@ type NetIface interface {
// IfaceIPAddrs returns the interface's IP addresses. // IfaceIPAddrs returns the interface's IP addresses.
func IfaceIPAddrs(iface NetIface, ipv IPVersion) (ips []net.IP, err error) { func IfaceIPAddrs(iface NetIface, ipv IPVersion) (ips []net.IP, err error) {
switch ipv {
case IPVersion4, IPVersion6:
// Go on.
default:
return nil, fmt.Errorf("invalid ip version %d", ipv)
}
addrs, err := iface.Addrs() addrs, err := iface.Addrs()
if err != nil { if err != nil {
return nil, err return nil, err
@ -41,21 +48,17 @@ func IfaceIPAddrs(iface NetIface, ipv IPVersion) (ips []net.IP, err error) {
continue continue
} }
// Assume that net.(*Interface).Addrs can only return valid IPv4 // Assume that net.(*Interface).Addrs can only return valid IPv4 and
// and IPv6 addresses. Thus, if it isn't an IPv4 address, it // IPv6 addresses. Thus, if it isn't an IPv4 address, it must be an
// must be an IPv6 one. // IPv6 one.
switch ipv { ip4 := ip.To4()
case IPVersion4: if ipv == IPVersion4 {
if ip4 := ip.To4(); ip4 != nil { if ip4 != nil {
ips = append(ips, ip4) ips = append(ips, ip4)
} }
case IPVersion6: } else if ip4 == nil {
if ip6 := ip.To4(); ip6 == nil {
ips = append(ips, ip) ips = append(ips, ip)
} }
default:
return nil, fmt.Errorf("invalid ip version %d", ipv)
}
} }
return ips, nil return ips, nil
@ -96,16 +99,16 @@ func IfaceDNSIPAddrs(
switch len(addrs) { switch len(addrs) {
case 0: case 0:
// Don't return errors in case the users want to try and enable // Don't return errors in case the users want to try and enable the DHCP
// the DHCP server later. // server later.
t := time.Duration(n) * backoff t := time.Duration(n) * backoff
log.Error("dhcpv%d: no ip for iface after %d attempts and %s", ipv, n, t) log.Error("dhcpv%d: no ip for iface after %d attempts and %s", ipv, n, t)
return nil, nil return nil, nil
case 1: case 1:
// Some Android devices use 8.8.8.8 if there is not a secondary // Some Android devices use 8.8.8.8 if there is not a secondary DNS
// DNS server. Fix that by setting the secondary DNS address to // server. Fix that by setting the secondary DNS address to the same
// the same address. // address.
// //
// See https://github.com/AdguardTeam/AdGuardHome/issues/1708. // See https://github.com/AdguardTeam/AdGuardHome/issues/1708.
log.Debug("dhcpv%d: setting secondary dns ip to itself", ipv) log.Debug("dhcpv%d: setting secondary dns ip to itself", ipv)

View File

@ -5,13 +5,15 @@ import (
"testing" "testing"
"github.com/AdguardTeam/golibs/errors" "github.com/AdguardTeam/golibs/errors"
"github.com/AdguardTeam/golibs/testutil"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
// fakeIface is a stub implementation of aghnet.NetIface to simplify testing.
type fakeIface struct { type fakeIface struct {
addrs []net.Addr
err error err error
addrs []net.Addr
} }
// Addrs implements the NetIface interface for *fakeIface. // Addrs implements the NetIface interface for *fakeIface.
@ -33,61 +35,86 @@ func TestIfaceIPAddrs(t *testing.T) {
addr6 := &net.IPNet{IP: ip6} addr6 := &net.IPNet{IP: ip6}
testCases := []struct { testCases := []struct {
name string
iface NetIface iface NetIface
ipv IPVersion name string
wantErrMsg string
want []net.IP want []net.IP
wantErr error ipv IPVersion
}{{ }{{
name: "ipv4_success",
iface: &fakeIface{addrs: []net.Addr{addr4}, err: nil}, iface: &fakeIface{addrs: []net.Addr{addr4}, err: nil},
ipv: IPVersion4, name: "ipv4_success",
wantErrMsg: "",
want: []net.IP{ip4}, want: []net.IP{ip4},
wantErr: nil, ipv: IPVersion4,
}, { }, {
iface: &fakeIface{addrs: []net.Addr{addr6, addr4}, err: nil},
name: "ipv4_success_with_ipv6", name: "ipv4_success_with_ipv6",
iface: &fakeIface{addrs: []net.Addr{addr6, addr4}, err: nil}, wantErrMsg: "",
ipv: IPVersion4,
want: []net.IP{ip4}, want: []net.IP{ip4},
wantErr: nil,
}, {
name: "ipv4_error",
iface: &fakeIface{addrs: []net.Addr{addr4}, err: errTest},
ipv: IPVersion4, ipv: IPVersion4,
want: nil,
wantErr: errTest,
}, { }, {
name: "ipv6_success", iface: &fakeIface{addrs: []net.Addr{addr4}, err: errTest},
name: "ipv4_error",
wantErrMsg: errTest.Error(),
want: nil,
ipv: IPVersion4,
}, {
iface: &fakeIface{addrs: []net.Addr{addr6}, err: nil}, iface: &fakeIface{addrs: []net.Addr{addr6}, err: nil},
ipv: IPVersion6, name: "ipv6_success",
wantErrMsg: "",
want: []net.IP{ip6}, want: []net.IP{ip6},
wantErr: nil, ipv: IPVersion6,
}, { }, {
name: "ipv6_success_with_ipv4",
iface: &fakeIface{addrs: []net.Addr{addr6, addr4}, err: nil}, iface: &fakeIface{addrs: []net.Addr{addr6, addr4}, err: nil},
ipv: IPVersion6, name: "ipv6_success_with_ipv4",
wantErrMsg: "",
want: []net.IP{ip6}, want: []net.IP{ip6},
wantErr: nil,
}, {
name: "ipv6_error",
iface: &fakeIface{addrs: []net.Addr{addr6}, err: errTest},
ipv: IPVersion6, ipv: IPVersion6,
}, {
iface: &fakeIface{addrs: []net.Addr{addr6}, err: errTest},
name: "ipv6_error",
wantErrMsg: errTest.Error(),
want: nil, want: nil,
wantErr: errTest, ipv: IPVersion6,
}, {
iface: &fakeIface{addrs: nil, err: nil},
name: "bad_proto",
wantErrMsg: "invalid ip version 10",
want: nil,
ipv: IPVersion6 + IPVersion4,
}, {
iface: &fakeIface{addrs: []net.Addr{&net.IPAddr{IP: ip4}}, err: nil},
name: "ipaddr_v4",
wantErrMsg: "",
want: []net.IP{ip4},
ipv: IPVersion4,
}, {
iface: &fakeIface{addrs: []net.Addr{&net.IPAddr{IP: ip6, Zone: ""}}, err: nil},
name: "ipaddr_v6",
wantErrMsg: "",
want: []net.IP{ip6},
ipv: IPVersion6,
}, {
iface: &fakeIface{addrs: []net.Addr{&net.UnixAddr{}}, err: nil},
name: "non-ipv4",
wantErrMsg: "",
want: nil,
ipv: IPVersion4,
}} }}
for _, tc := range testCases { for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) { t.Run(tc.name, func(t *testing.T) {
got, gotErr := IfaceIPAddrs(tc.iface, tc.ipv) got, err := IfaceIPAddrs(tc.iface, tc.ipv)
require.True(t, errors.Is(gotErr, tc.wantErr)) testutil.AssertErrorMsg(t, tc.wantErrMsg, err)
assert.Equal(t, tc.want, got) assert.Equal(t, tc.want, got)
}) })
} }
} }
type waitingFakeIface struct { type waitingFakeIface struct {
addrs []net.Addr
err error err error
addrs []net.Addr
n int n int
} }
@ -116,11 +143,11 @@ func TestIfaceDNSIPAddrs(t *testing.T) {
addr6 := &net.IPNet{IP: ip6} addr6 := &net.IPNet{IP: ip6}
testCases := []struct { testCases := []struct {
name string
iface NetIface iface NetIface
ipv IPVersion
want []net.IP
wantErr error wantErr error
name string
want []net.IP
ipv IPVersion
}{{ }{{
name: "ipv4_success", name: "ipv4_success",
iface: &fakeIface{addrs: []net.Addr{addr4}, err: nil}, iface: &fakeIface{addrs: []net.Addr{addr4}, err: nil},
@ -169,12 +196,25 @@ func TestIfaceDNSIPAddrs(t *testing.T) {
ipv: IPVersion6, ipv: IPVersion6,
want: []net.IP{ip6, ip6}, want: []net.IP{ip6, ip6},
wantErr: nil, wantErr: nil,
}, {
name: "empty",
iface: &fakeIface{addrs: nil, err: nil},
ipv: IPVersion4,
want: nil,
wantErr: nil,
}, {
name: "many",
iface: &fakeIface{addrs: []net.Addr{addr4, addr4}},
ipv: IPVersion4,
want: []net.IP{ip4, ip4},
wantErr: nil,
}} }}
for _, tc := range testCases { for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) { t.Run(tc.name, func(t *testing.T) {
got, gotErr := IfaceDNSIPAddrs(tc.iface, tc.ipv, 2, 0) got, err := IfaceDNSIPAddrs(tc.iface, tc.ipv, 2, 0)
require.True(t, errors.Is(gotErr, tc.wantErr)) require.ErrorIs(t, err, tc.wantErr)
assert.Equal(t, tc.want, got) assert.Equal(t, tc.want, got)
}) })
} }

View File

@ -0,0 +1,44 @@
package aghnet
import (
"net"
"testing"
"github.com/AdguardTeam/golibs/netutil"
"github.com/stretchr/testify/assert"
)
func TestIPMut(t *testing.T) {
testIPs := []net.IP{{
127, 0, 0, 1,
}, {
192, 168, 0, 1,
}, {
8, 8, 8, 8,
}}
t.Run("nil_no_mut", func(t *testing.T) {
ipmut := NewIPMut(nil)
ips := netutil.CloneIPs(testIPs)
for i := range ips {
ipmut.Load()(ips[i])
assert.True(t, ips[i].Equal(testIPs[i]))
}
})
t.Run("not_nil_mut", func(t *testing.T) {
ipmut := NewIPMut(func(ip net.IP) {
for i := range ip {
ip[i] = 0
}
})
want := netutil.IPv4Zero()
ips := netutil.CloneIPs(testIPs)
for i := range ips {
ipmut.Load()(ips[i])
assert.True(t, ips[i].Equal(want))
}
})
}

View File

@ -42,8 +42,7 @@ func GatewayIP(ifaceName string) net.IP {
fields := strings.Fields(string(d)) fields := strings.Fields(string(d))
// The meaningful "ip route" command output should contain the word // The meaningful "ip route" command output should contain the word
// "default" at first field and default gateway IP address at third // "default" at first field and default gateway IP address at third field.
// field.
if len(fields) < 3 || fields[0] != "default" { if len(fields) < 3 || fields[0] != "default" {
return nil return nil
} }
@ -218,28 +217,6 @@ func IsAddrInUse(err error) (ok bool) {
return isAddrInUse(sysErr) return isAddrInUse(sysErr)
} }
// SplitHost is a wrapper for net.SplitHostPort for the cases when the hostport
// does not necessarily contain a port.
func SplitHost(hostport string) (host string, err error) {
host, _, err = net.SplitHostPort(hostport)
if err != nil {
// Check for the missing port error. If it is that error, just
// use the host as is.
//
// See the source code for net.SplitHostPort.
const missingPort = "missing port in address"
addrErr := &net.AddrError{}
if !errors.As(err, &addrErr) || addrErr.Err != missingPort {
return "", err
}
host = hostport
}
return host, nil
}
// CollectAllIfacesAddrs returns the slice of all network interfaces IP // CollectAllIfacesAddrs returns the slice of all network interfaces IP
// addresses without port number. // addresses without port number.
func CollectAllIfacesAddrs() (addrs []string, err error) { func CollectAllIfacesAddrs() (addrs []string, err error) {

View File

@ -15,12 +15,20 @@ func TestMain(m *testing.M) {
aghtest.DiscardLogOutput(m) aghtest.DiscardLogOutput(m)
} }
func TestGetValidNetInterfacesForWeb(t *testing.T) { func TestGetInterfaceByIP(t *testing.T) {
ifaces, err := GetValidNetInterfacesForWeb() ifaces, err := GetValidNetInterfacesForWeb()
require.NoErrorf(t, err, "cannot get net interfaces: %s", err) require.NoError(t, err)
require.NotEmpty(t, ifaces, "no net interfaces found") require.NotEmpty(t, ifaces)
for _, iface := range ifaces { for _, iface := range ifaces {
require.NotEmptyf(t, iface.Addresses, "no addresses found for %s", iface.Name) t.Run(iface.Name, func(t *testing.T) {
require.NotEmpty(t, iface.Addresses)
for _, ip := range iface.Addresses {
ifaceName := GetInterfaceByIP(ip)
require.Equal(t, iface.Name, ifaceName)
}
})
} }
} }
@ -73,6 +81,7 @@ func TestBroadcastFromIPNet(t *testing.T) {
} }
func TestCheckPort(t *testing.T) { func TestCheckPort(t *testing.T) {
t.Run("tcp_bound", func(t *testing.T) {
l, err := net.Listen("tcp", "127.0.0.1:") l, err := net.Listen("tcp", "127.0.0.1:")
require.NoError(t, err) require.NoError(t, err)
testutil.CleanupAndRequireSuccess(t, l.Close) testutil.CleanupAndRequireSuccess(t, l.Close)
@ -87,4 +96,32 @@ func TestCheckPort(t *testing.T) {
require.ErrorAs(t, err, &target) require.ErrorAs(t, err, &target)
assert.Equal(t, "listen", target.Op) assert.Equal(t, "listen", target.Op)
})
t.Run("udp_bound", func(t *testing.T) {
conn, err := net.ListenPacket("udp", "127.0.0.1:")
require.NoError(t, err)
testutil.CleanupAndRequireSuccess(t, conn.Close)
ipp := netutil.IPPortFromAddr(conn.LocalAddr())
require.NotNil(t, ipp)
require.NotNil(t, ipp.IP)
require.NotZero(t, ipp.Port)
err = CheckPort("udp", ipp.IP, ipp.Port)
target := &net.OpError{}
require.ErrorAs(t, err, &target)
assert.Equal(t, "listen", target.Op)
})
t.Run("bad_network", func(t *testing.T) {
err := CheckPort("bad_network", nil, 0)
assert.NoError(t, err)
})
t.Run("can_bind", func(t *testing.T) {
err := CheckPort("udp", net.IP{0, 0, 0, 0}, 0)
assert.NoError(t, err)
})
} }

View File

@ -7,7 +7,7 @@ import (
"net/http" "net/http"
"strings" "strings"
"github.com/AdguardTeam/AdGuardHome/internal/aghalgo" "github.com/AdguardTeam/AdGuardHome/internal/aghalg"
"github.com/AdguardTeam/AdGuardHome/internal/aghhttp" "github.com/AdguardTeam/AdGuardHome/internal/aghhttp"
"github.com/AdguardTeam/golibs/log" "github.com/AdguardTeam/golibs/log"
"github.com/AdguardTeam/golibs/netutil" "github.com/AdguardTeam/golibs/netutil"
@ -214,7 +214,7 @@ func validateAccessSet(list *accessListJSON) (err error) {
} }
merged := allowed.Merge(disallowed) merged := allowed.Merge(disallowed)
err = merged.Validate(aghalgo.StringIsBefore) err = merged.Validate(aghalg.StringIsBefore)
if err != nil { if err != nil {
return fmt.Errorf("items in allowed and disallowed clients intersect: %w", err) return fmt.Errorf("items in allowed and disallowed clients intersect: %w", err)
} }
@ -223,13 +223,13 @@ func validateAccessSet(list *accessListJSON) (err error) {
} }
// validateStrUniq returns an informative error if clients are not unique. // validateStrUniq returns an informative error if clients are not unique.
func validateStrUniq(clients []string) (uv aghalgo.UniquenessValidator, err error) { func validateStrUniq(clients []string) (uc aghalg.UniqChecker, err error) {
uv = make(aghalgo.UniquenessValidator, len(clients)) uc = make(aghalg.UniqChecker, len(clients))
for _, c := range clients { for _, c := range clients {
uv.Add(c) uc.Add(c)
} }
return uv, uv.Validate(aghalgo.StringIsBefore) return uc, uc.Validate(aghalg.StringIsBefore)
} }
func (s *Server) handleAccessSet(w http.ResponseWriter, r *http.Request) { func (s *Server) handleAccessSet(w http.ResponseWriter, r *http.Request) {

View File

@ -7,7 +7,7 @@ import (
"path/filepath" "path/filepath"
"sync" "sync"
"github.com/AdguardTeam/AdGuardHome/internal/aghalgo" "github.com/AdguardTeam/AdGuardHome/internal/aghalg"
"github.com/AdguardTeam/AdGuardHome/internal/dhcpd" "github.com/AdguardTeam/AdGuardHome/internal/dhcpd"
"github.com/AdguardTeam/AdGuardHome/internal/dnsforward" "github.com/AdguardTeam/AdGuardHome/internal/dnsforward"
"github.com/AdguardTeam/AdGuardHome/internal/filtering" "github.com/AdguardTeam/AdGuardHome/internal/filtering"
@ -288,9 +288,9 @@ func parseConfig() (err error) {
return err return err
} }
uv := aghalgo.UniquenessValidator{} uc := aghalg.UniqChecker{}
addPorts( addPorts(
uv, uc,
config.BindPort, config.BindPort,
config.BetaBindPort, config.BetaBindPort,
config.DNS.Port, config.DNS.Port,
@ -298,14 +298,14 @@ func parseConfig() (err error) {
if config.TLS.Enabled { if config.TLS.Enabled {
addPorts( addPorts(
uv, uc,
config.TLS.PortHTTPS, config.TLS.PortHTTPS,
config.TLS.PortDNSOverTLS, config.TLS.PortDNSOverTLS,
config.TLS.PortDNSOverQUIC, config.TLS.PortDNSOverQUIC,
config.TLS.PortDNSCrypt, config.TLS.PortDNSCrypt,
) )
} }
if err = uv.Validate(aghalgo.IntIsBefore); err != nil { if err = uc.Validate(aghalg.IntIsBefore); err != nil {
return fmt.Errorf("validating ports: %w", err) return fmt.Errorf("validating ports: %w", err)
} }
@ -321,10 +321,10 @@ func parseConfig() (err error) {
} }
// addPorts is a helper for ports validation. It skips zero ports. // addPorts is a helper for ports validation. It skips zero ports.
func addPorts(uv aghalgo.UniquenessValidator, ports ...int) { func addPorts(uc aghalg.UniqChecker, ports ...int) {
for _, p := range ports { for _, p := range ports {
if p != 0 { if p != 0 {
uv.Add(p) uc.Add(p)
} }
} }
} }

View File

@ -14,7 +14,7 @@ import (
"strings" "strings"
"time" "time"
"github.com/AdguardTeam/AdGuardHome/internal/aghalgo" "github.com/AdguardTeam/AdGuardHome/internal/aghalg"
"github.com/AdguardTeam/AdGuardHome/internal/aghhttp" "github.com/AdguardTeam/AdGuardHome/internal/aghhttp"
"github.com/AdguardTeam/AdGuardHome/internal/aghnet" "github.com/AdguardTeam/AdGuardHome/internal/aghnet"
"github.com/AdguardTeam/AdGuardHome/internal/version" "github.com/AdguardTeam/AdGuardHome/internal/version"
@ -73,19 +73,19 @@ func (web *Web) handleInstallGetAddresses(w http.ResponseWriter, r *http.Request
} }
} }
type checkConfigReqEnt struct { type checkConfReqEnt struct {
IP net.IP `json:"ip"` IP net.IP `json:"ip"`
Port int `json:"port"` Port int `json:"port"`
Autofix bool `json:"autofix"` Autofix bool `json:"autofix"`
} }
type checkConfigReq struct { type checkConfReq struct {
Web checkConfigReqEnt `json:"web"` Web checkConfReqEnt `json:"web"`
DNS checkConfigReqEnt `json:"dns"` DNS checkConfReqEnt `json:"dns"`
SetStaticIP bool `json:"set_static_ip"` SetStaticIP bool `json:"set_static_ip"`
} }
type checkConfigRespEnt struct { type checkConfRespEnt struct {
Status string `json:"status"` Status string `json:"status"`
CanAutofix bool `json:"can_autofix"` CanAutofix bool `json:"can_autofix"`
} }
@ -96,79 +96,110 @@ type staticIPJSON struct {
Error string `json:"error"` Error string `json:"error"`
} }
type checkConfigResp struct { type checkConfResp struct {
StaticIP staticIPJSON `json:"static_ip"` StaticIP staticIPJSON `json:"static_ip"`
Web checkConfigRespEnt `json:"web"` Web checkConfRespEnt `json:"web"`
DNS checkConfigRespEnt `json:"dns"` DNS checkConfRespEnt `json:"dns"`
} }
// Check if ports are available, respond with results // validateWeb returns error is the web part if the initial configuration can't
func (web *Web) handleInstallCheckConfig(w http.ResponseWriter, r *http.Request) { // be set.
reqData := checkConfigReq{} func (req *checkConfReq) validateWeb(uc aghalg.UniqChecker) (err error) {
respData := checkConfigResp{} defer func() { err = errors.Annotate(err, "validating ports: %w") }()
err := json.NewDecoder(r.Body).Decode(&reqData) port := req.Web.Port
addPorts(uc, config.BetaBindPort, port)
if err = uc.Validate(aghalg.IntIsBefore); err != nil {
// Avoid duplicating the error into the status of DNS.
uc[port] = 1
return err
}
switch port {
case 0, config.BindPort:
return nil
default:
// Go on and check the port binding only if it's not zero or won't be
// unbound after install.
}
return aghnet.CheckPort("tcp", req.Web.IP, port)
}
// validateDNS returns error if the DNS part of the initial configuration can't
// be set. canAutofix is true if the port can be unbound by AdGuard Home
// automatically.
func (req *checkConfReq) validateDNS(uc aghalg.UniqChecker) (canAutofix bool, err error) {
defer func() { err = errors.Annotate(err, "validating ports: %w") }()
port := req.DNS.Port
addPorts(uc, port)
if err = uc.Validate(aghalg.IntIsBefore); err != nil {
return false, err
}
switch port {
case 0:
return false, nil
case config.BindPort:
// Go on and only check the UDP port since the TCP one is already bound
// by AdGuard Home for web interface.
default:
// Check TCP as well.
err = aghnet.CheckPort("tcp", req.DNS.IP, port)
if err != nil { if err != nil {
aghhttp.Error(r, w, http.StatusBadRequest, "Failed to parse 'check_config' JSON data: %s", err) return false, err
}
}
err = aghnet.CheckPort("udp", req.DNS.IP, port)
if !aghnet.IsAddrInUse(err) {
return false, err
}
// Try to fix automatically.
canAutofix = checkDNSStubListener()
if canAutofix && req.DNS.Autofix {
if derr := disableDNSStubListener(); derr != nil {
log.Error("disabling DNSStubListener: %s", err)
}
err = aghnet.CheckPort("udp", req.DNS.IP, port)
canAutofix = false
}
return canAutofix, err
}
// handleInstallCheckConfig handles the /check_config endpoint.
func (web *Web) handleInstallCheckConfig(w http.ResponseWriter, r *http.Request) {
req := &checkConfReq{}
err := json.NewDecoder(r.Body).Decode(req)
if err != nil {
aghhttp.Error(r, w, http.StatusBadRequest, "decoding the request: %s", err)
return return
} }
uv := aghalgo.UniquenessValidator{} resp := &checkConfResp{}
addPorts( uc := aghalg.UniqChecker{}
uv,
config.BindPort, if err = req.validateWeb(uc); err != nil {
config.BetaBindPort, resp.Web.Status = err.Error()
reqData.Web.Port,
)
if err = uv.Validate(aghalgo.IntIsBefore); err != nil {
err = fmt.Errorf("validating ports: %w", err)
respData.Web.Status = err.Error()
} else if reqData.Web.Port != 0 {
err = aghnet.CheckPort("tcp", reqData.Web.IP, reqData.Web.Port)
if err != nil {
respData.Web.Status = err.Error()
}
} }
addPorts(uv, reqData.DNS.Port) if resp.DNS.CanAutofix, err = req.validateDNS(uc); err != nil {
if err = uv.Validate(aghalgo.IntIsBefore); err != nil { resp.DNS.Status = err.Error()
err = fmt.Errorf("validating ports: %w", err) } else if !req.DNS.IP.IsUnspecified() {
respData.DNS.Status = err.Error() resp.StaticIP = handleStaticIP(req.DNS.IP, req.SetStaticIP)
} else if reqData.DNS.Port != 0 {
err = aghnet.CheckPort("udp", reqData.DNS.IP, reqData.DNS.Port)
if aghnet.IsAddrInUse(err) {
canAutofix := checkDNSStubListener()
if canAutofix && reqData.DNS.Autofix {
err = disableDNSStubListener()
if err != nil {
log.Error("Couldn't disable DNSStubListener: %s", err)
}
err = aghnet.CheckPort("udp", reqData.DNS.IP, reqData.DNS.Port)
canAutofix = false
}
respData.DNS.CanAutofix = canAutofix
}
if err == nil {
err = aghnet.CheckPort("tcp", reqData.DNS.IP, reqData.DNS.Port)
}
if err != nil {
respData.DNS.Status = err.Error()
} else if !reqData.DNS.IP.IsUnspecified() {
respData.StaticIP = handleStaticIP(reqData.DNS.IP, reqData.SetStaticIP)
}
} }
w.Header().Set("Content-Type", "application/json") w.Header().Set("Content-Type", "application/json")
err = json.NewEncoder(w).Encode(respData) err = json.NewEncoder(w).Encode(resp)
if err != nil { if err != nil {
aghhttp.Error(r, w, http.StatusInternalServerError, "Unable to marshal JSON: %s", err) aghhttp.Error(r, w, http.StatusInternalServerError, "encoding the response: %s", err)
return return
} }
@ -494,13 +525,13 @@ func (web *Web) handleInstallCheckConfigBeta(w http.ResponseWriter, r *http.Requ
return return
} }
nonBetaReqData := checkConfigReq{ nonBetaReqData := checkConfReq{
Web: checkConfigReqEnt{ Web: checkConfReqEnt{
IP: reqData.Web.IP[0], IP: reqData.Web.IP[0],
Port: reqData.Web.Port, Port: reqData.Web.Port,
Autofix: reqData.Web.Autofix, Autofix: reqData.Web.Autofix,
}, },
DNS: checkConfigReqEnt{ DNS: checkConfReqEnt{
IP: reqData.DNS.IP[0], IP: reqData.DNS.IP[0],
Port: reqData.DNS.Port, Port: reqData.DNS.Port,
Autofix: reqData.DNS.Autofix, Autofix: reqData.DNS.Autofix,

View File

@ -54,7 +54,7 @@ func initDNSServer() (err error) {
} }
Context.stats, err = stats.New(statsConf) Context.stats, err = stats.New(statsConf)
if err != nil { if err != nil {
return fmt.Errorf("couldn't initialize statistics module") return fmt.Errorf("init stats: %w", err)
} }
conf := querylog.Config{ conf := querylog.Config{

View File

@ -19,7 +19,7 @@ import (
"syscall" "syscall"
"time" "time"
"github.com/AdguardTeam/AdGuardHome/internal/aghalgo" "github.com/AdguardTeam/AdGuardHome/internal/aghalg"
"github.com/AdguardTeam/AdGuardHome/internal/aghnet" "github.com/AdguardTeam/AdGuardHome/internal/aghnet"
"github.com/AdguardTeam/AdGuardHome/internal/aghos" "github.com/AdguardTeam/AdGuardHome/internal/aghos"
"github.com/AdguardTeam/AdGuardHome/internal/dhcpd" "github.com/AdguardTeam/AdGuardHome/internal/dhcpd"
@ -296,23 +296,23 @@ func setupConfig(args options) (err error) {
Context.clients.Init(config.Clients, Context.dhcpServer, Context.etcHosts) Context.clients.Init(config.Clients, Context.dhcpServer, Context.etcHosts)
if args.bindPort != 0 { if args.bindPort != 0 {
uv := aghalgo.UniquenessValidator{} uc := aghalg.UniqChecker{}
addPorts( addPorts(
uv, uc,
args.bindPort, args.bindPort,
config.BetaBindPort, config.BetaBindPort,
config.DNS.Port, config.DNS.Port,
) )
if config.TLS.Enabled { if config.TLS.Enabled {
addPorts( addPorts(
uv, uc,
config.TLS.PortHTTPS, config.TLS.PortHTTPS,
config.TLS.PortDNSOverTLS, config.TLS.PortDNSOverTLS,
config.TLS.PortDNSOverQUIC, config.TLS.PortDNSOverQUIC,
config.TLS.PortDNSCrypt, config.TLS.PortDNSCrypt,
) )
} }
if err = uv.Validate(aghalgo.IntIsBefore); err != nil { if err = uc.Validate(aghalg.IntIsBefore); err != nil {
return fmt.Errorf("validating ports: %w", err) return fmt.Errorf("validating ports: %w", err)
} }

View File

@ -20,7 +20,7 @@ import (
"sync" "sync"
"time" "time"
"github.com/AdguardTeam/AdGuardHome/internal/aghalgo" "github.com/AdguardTeam/AdGuardHome/internal/aghalg"
"github.com/AdguardTeam/AdGuardHome/internal/aghhttp" "github.com/AdguardTeam/AdGuardHome/internal/aghhttp"
"github.com/AdguardTeam/AdGuardHome/internal/dnsforward" "github.com/AdguardTeam/AdGuardHome/internal/dnsforward"
"github.com/AdguardTeam/golibs/errors" "github.com/AdguardTeam/golibs/errors"
@ -251,9 +251,9 @@ func (t *TLSMod) handleTLSValidate(w http.ResponseWriter, r *http.Request) {
} }
if setts.Enabled { if setts.Enabled {
uv := aghalgo.UniquenessValidator{} uc := aghalg.UniqChecker{}
addPorts( addPorts(
uv, uc,
config.BindPort, config.BindPort,
config.BetaBindPort, config.BetaBindPort,
config.DNS.Port, config.DNS.Port,
@ -263,7 +263,7 @@ func (t *TLSMod) handleTLSValidate(w http.ResponseWriter, r *http.Request) {
setts.PortDNSCrypt, setts.PortDNSCrypt,
) )
err = uv.Validate(aghalgo.IntIsBefore) err = uc.Validate(aghalg.IntIsBefore)
if err != nil { if err != nil {
aghhttp.Error(r, w, http.StatusBadRequest, "validating ports: %s", err) aghhttp.Error(r, w, http.StatusBadRequest, "validating ports: %s", err)
@ -344,9 +344,9 @@ func (t *TLSMod) handleTLSConfigure(w http.ResponseWriter, r *http.Request) {
} }
if data.Enabled { if data.Enabled {
uv := aghalgo.UniquenessValidator{} uc := aghalg.UniqChecker{}
addPorts( addPorts(
uv, uc,
config.BindPort, config.BindPort,
config.BetaBindPort, config.BetaBindPort,
config.DNS.Port, config.DNS.Port,
@ -356,7 +356,7 @@ func (t *TLSMod) handleTLSConfigure(w http.ResponseWriter, r *http.Request) {
data.PortDNSCrypt, data.PortDNSCrypt,
) )
err = uv.Validate(aghalgo.IntIsBefore) err = uc.Validate(aghalg.IntIsBefore)
if err != nil { if err != nil {
aghhttp.Error(r, w, http.StatusBadRequest, "%s", err) aghhttp.Error(r, w, http.StatusBadRequest, "%s", err)

View File

@ -67,7 +67,29 @@ type unitDB struct {
TimeAvg uint32 // usec TimeAvg uint32 // usec
} }
// withRecovered turns the value recovered from panic if any into an error and
// combines it with the one pointed by orig. orig must be non-nil.
func withRecovered(orig *error) {
p := recover()
if p == nil {
return
}
var err error
switch p := p.(type) {
case error:
err = fmt.Errorf("panic: %w", p)
default:
err = fmt.Errorf("panic: recovered value of type %[1]T: %[1]v", p)
}
*orig = errors.WithDeferred(*orig, err)
}
// createObject creates s from conf and properly initializes it.
func createObject(conf Config) (s *statsCtx, err error) { func createObject(conf Config) (s *statsCtx, err error) {
defer withRecovered(&err)
s = &statsCtx{ s = &statsCtx{
mu: &sync.Mutex{}, mu: &sync.Mutex{},
} }

View File

@ -49,7 +49,7 @@ trap not_found EXIT
# Warnings # Warnings
go_version="$( "$GO" version )" go_version="$( "${GO:-go}" version )"
readonly go_version readonly go_version
go_min_version='go1.17' go_min_version='go1.17'
@ -62,7 +62,6 @@ for example:
" "
readonly go_min_version go_version_msg readonly go_min_version go_version_msg
case "$go_version" case "$go_version"
in in
('go version'*"$go_min_version"*) ('go version'*"$go_min_version"*)
@ -80,11 +79,11 @@ esac
# blocklist_imports is a simple check against unwanted packages. The following # blocklist_imports is a simple check against unwanted packages. The following
# packages are banned: # packages are banned:
# #
# * Package io/ioutil is soft-deprecated.
#
# * Packages errors and log are replaced by our own packages in the # * Packages errors and log are replaced by our own packages in the
# github.com/AdguardTeam/golibs module. # github.com/AdguardTeam/golibs module.
# #
# * Package io/ioutil is soft-deprecated.
#
# * Package reflect is often an overkill, and for deep comparisons there are # * Package reflect is often an overkill, and for deep comparisons there are
# much better functions in module github.com/google/go-cmp. Which is # much better functions in module github.com/google/go-cmp. Which is
# already our indirect dependency and which may or may not enter the stdlib # already our indirect dependency and which may or may not enter the stdlib
@ -94,6 +93,8 @@ esac
# #
# * Package unsafe is… unsafe. # * Package unsafe is… unsafe.
# #
# * Package golang.org/x/net/context has been moved into stdlib.
#
blocklist_imports() { blocklist_imports() {
git grep\ git grep\
-e '[[:space:]]"errors"$'\ -e '[[:space:]]"errors"$'\
@ -101,19 +102,34 @@ blocklist_imports() {
-e '[[:space:]]"log"$'\ -e '[[:space:]]"log"$'\
-e '[[:space:]]"reflect"$'\ -e '[[:space:]]"reflect"$'\
-e '[[:space:]]"unsafe"$'\ -e '[[:space:]]"unsafe"$'\
-- '*.go' || exit 0; -e '[[:space:]]"golang.org/x/net/context"$'\
-n\
-- '*.go'\
| sed -e 's/^\([^[:space:]]\+\)\(.*\)$/\1 blocked import:\2/'\
|| exit 0
} }
# method_const is a simple check against the usage of some raw strings and # method_const is a simple check against the usage of some raw strings and
# numbers where one should use named constants. # numbers where one should use named constants.
method_const() { method_const() {
git grep -F -e '"GET"' -e '"POST"' -- '*.go' || exit 0; git grep -F\
-e '"DELETE"'\
-e '"GET"'\
-e '"POST"'\
-e '"PUT"'\
-n\
-- '*.go'\
| sed -e 's/^\([^[:space:]]\+\)\(.*\)$/\1 http method literal:\2/'\
|| exit 0
} }
# underscores is a simple check against Go filenames with underscores. # underscores is a simple check against Go filenames with underscores. Add new
# build tags and OS as you go. The main goal of this check is to discourage the
# use of filenames like client_manager.go.
underscores() { underscores() {
git ls-files '*_*.go' | { underscore_files="$(
grep -F\ git ls-files '*_*.go'\
| grep -F\
-e '_big.go'\ -e '_big.go'\
-e '_bsd.go'\ -e '_bsd.go'\
-e '_darwin.go'\ -e '_darwin.go'\
@ -126,8 +142,15 @@ underscores() {
-e '_unix.go'\ -e '_unix.go'\
-e '_windows.go' \ -e '_windows.go' \
-v\ -v\
|| exit 0 | sed -e 's/./\t\0/'
} )"
readonly underscore_files
if [ "$underscore_files" != '' ]
then
echo 'found file names with underscores:'
echo "$underscore_files"
fi
} }
# TODO(a.garipov): Add an analyser to look for `fallthrough`, `goto`, and `new`? # TODO(a.garipov): Add an analyser to look for `fallthrough`, `goto`, and `new`?
@ -151,7 +174,7 @@ exit_on_output() (
output="$( "$cmd" "$@" 2>&1 )" output="$( "$cmd" "$@" 2>&1 )"
exitcode="$?" exitcode="$?"
if [ "$exitcode" != '0' ] if [ "$exitcode" -ne '0' ]
then then
echo "'$cmd' failed with code $exitcode" echo "'$cmd' failed with code $exitcode"
fi fi
@ -160,9 +183,9 @@ exit_on_output() (
then then
if [ "$*" != '' ] if [ "$*" != '' ]
then then
echo "combined output of '$cmd $*':" echo "combined output of linter '$cmd $*':"
else else
echo "combined output of '$cmd':" echo "combined output of linter '$cmd':"
fi fi
echo "$output" echo "$output"
@ -178,13 +201,6 @@ exit_on_output() (
# Constants
go_files='./main.go ./internal/'
readonly go_files
# Checks # Checks
exit_on_output blocklist_imports exit_on_output blocklist_imports
@ -208,8 +224,6 @@ gocyclo --over 10 ./internal/aghio/ ./internal/aghnet/ ./internal/aghos/\
./internal/aghtest/ ./internal/stats/ ./internal/tools/\ ./internal/aghtest/ ./internal/stats/ ./internal/tools/\
./internal/updater/ ./internal/version/ ./main.go ./internal/updater/ ./internal/version/ ./main.go
gosec --quiet $go_files
ineffassign ./... ineffassign ./...
unparam ./... unparam ./...
@ -222,6 +236,9 @@ nilness ./...
exit_on_output shadow --strict ./... exit_on_output shadow --strict ./...
# TODO(a.garipov): Enable in v0.108.0.
# gosec --quiet ./...
# TODO(a.garipov): Enable --blank? # TODO(a.garipov): Enable --blank?
errcheck --asserts ./... errcheck --asserts ./...