Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DNS: Add option to route queries through VPN #1227

Merged
merged 5 commits into from
Mar 4, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions Packages/App/Sources/AppUIMain/Views/Modules/DNSView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ struct DNSView: View, ModuleDraftEditing {
debugChanges()
return Group {
protocolSection
routingSection
Group {
domainSection
serversSection
Expand Down Expand Up @@ -91,6 +92,21 @@ private extension DNSView {
}
}

var routingSection: some View {
Group {
Picker(Strings.Modules.Dns.routeThroughVpn, selection: draft.routesThroughVPN) {
Text(Strings.Global.Nouns.default)
.tag(nil as Bool?)
Text(Strings.Global.Nouns.yes)
.tag(true as Bool?)
Text(Strings.Global.Nouns.no)
.tag(false as Bool?)
}
.themeRowWithSubtitle(Strings.Modules.Dns.RouteThroughVpn.footer)
}
.themeSection(footer: Strings.Modules.Dns.RouteThroughVpn.footer)
}

var domainSection: some View {
Group {
ThemeTextField(Strings.Global.Nouns.domain, text: draft.domainName ?? "", placeholder: Strings.Unlocalized.Placeholders.hostname)
Expand Down
10 changes: 10 additions & 0 deletions Packages/App/Sources/UILibrary/L10n/SwiftGen+Strings.swift
Original file line number Diff line number Diff line change
Expand Up @@ -318,6 +318,8 @@ public enum Strings {
public static let name = Strings.tr("Localizable", "global.nouns.name", fallback: "Name")
/// Networks
public static let networks = Strings.tr("Localizable", "global.nouns.networks", fallback: "Networks")
/// No
public static let no = Strings.tr("Localizable", "global.nouns.no", fallback: "No")
/// No content
public static let noContent = Strings.tr("Localizable", "global.nouns.no_content", fallback: "No content")
/// No selection
Expand Down Expand Up @@ -374,10 +376,18 @@ public enum Strings {
public static let username = Strings.tr("Localizable", "global.nouns.username", fallback: "Username")
/// Version
public static let version = Strings.tr("Localizable", "global.nouns.version", fallback: "Version")
/// Yes
public static let yes = Strings.tr("Localizable", "global.nouns.yes", fallback: "Yes")
}
}
public enum Modules {
public enum Dns {
/// Route through VPN
public static let routeThroughVpn = Strings.tr("Localizable", "modules.dns.route_through_vpn", fallback: "Route through VPN")
public enum RouteThroughVpn {
/// If enabled, DNS queries will be routed through the VPN tunnel.
public static let footer = Strings.tr("Localizable", "modules.dns.route_through_vpn.footer", fallback: "If enabled, DNS queries will be routed through the VPN tunnel.")
}
public enum SearchDomains {
/// Add domain
public static let add = Strings.tr("Localizable", "modules.dns.search_domains.add", fallback: "Add domain")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@
"global.nouns.n_seconds" = "%d Sekunden";
"global.nouns.name" = "Name";
"global.nouns.networks" = "Netzwerke";
"global.nouns.no" = "Nein";
"global.nouns.no_content" = "Kein Inhalt";
"global.nouns.no_selection" = "Keine Auswahl";
"global.nouns.none" = "Keiner";
Expand Down Expand Up @@ -143,6 +144,9 @@
"global.nouns.unknown" = "Unbekannt";
"global.nouns.username" = "Benutzername";
"global.nouns.version" = "Version";
"global.nouns.yes" = "Ja";
"modules.dns.route_through_vpn" = "Über VPN routen";
"modules.dns.route_through_vpn.footer" = "Wenn aktiviert, werden DNS-Anfragen durch den VPN-Tunnel geleitet.";
"modules.dns.search_domains.add" = "Domain hinzufügen";
"modules.dns.servers.add" = "Adresse hinzufügen";
"modules.general.rows.appletv" = "%@";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@
"global.nouns.n_seconds" = "%d δευτερόλεπτα";
"global.nouns.name" = "Όνομα";
"global.nouns.networks" = "Δίκτυα";
"global.nouns.no" = "Όχι";
"global.nouns.no_content" = "Χωρίς περιεχόμενο";
"global.nouns.no_selection" = "Καμία επιλογή";
"global.nouns.none" = "Κανένα";
Expand Down Expand Up @@ -143,6 +144,9 @@
"global.nouns.unknown" = "Άγνωστο";
"global.nouns.username" = "Όνομα χρήστη";
"global.nouns.version" = "Έκδοση";
"global.nouns.yes" = "Ναι";
"modules.dns.route_through_vpn" = "Δρομολόγηση μέσω VPN";
"modules.dns.route_through_vpn.footer" = "Εάν ενεργοποιηθεί, τα DNS ερωτήματα θα δρομολογούνται μέσω της σήραγγας VPN.";
"modules.dns.search_domains.add" = "Προσθήκη τομέα";
"modules.dns.servers.add" = "Προσθήκη διεύθυνσης";
"modules.general.rows.appletv" = "%@";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,8 @@
"modules.general.rows.keep_alive_on_sleep" = "Keep alive on sleep";
"modules.general.rows.keep_alive_on_sleep.footer" = "Disable to improve battery usage, at the expense of occasional slowdowns due to wake-up reconnections.";

"modules.dns.route_through_vpn" = "Route through VPN";
"modules.dns.route_through_vpn.footer" = "If enabled, DNS queries will be routed through the VPN tunnel.";
"modules.dns.servers.add" = "Add address";
"modules.dns.search_domains.add" = "Add domain";
"modules.http_proxy.bypass_domains.add" = "Add bypass domain";
Expand Down Expand Up @@ -325,6 +327,7 @@
"global.nouns.n_seconds" = "%d seconds";
"global.nouns.name" = "Name";
"global.nouns.networks" = "Networks";
"global.nouns.no" = "No";
"global.nouns.no_content" = "No content";
"global.nouns.no_selection" = "No selection";
"global.nouns.none" = "None";
Expand Down Expand Up @@ -353,6 +356,7 @@
"global.nouns.unknown" = "Unknown";
"global.nouns.username" = "Username";
"global.nouns.version" = "Version";
"global.nouns.yes" = "Yes";

// MARK: Global (Placeholders)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@
"global.nouns.n_seconds" = "%d segundos";
"global.nouns.name" = "Nombre";
"global.nouns.networks" = "Redes";
"global.nouns.no" = "No";
"global.nouns.no_content" = "Sin contenido";
"global.nouns.no_selection" = "Sin selección";
"global.nouns.none" = "Ninguno";
Expand Down Expand Up @@ -143,6 +144,9 @@
"global.nouns.unknown" = "Desconocido";
"global.nouns.username" = "Nombre de usuario";
"global.nouns.version" = "Versión";
"global.nouns.yes" = "Sí";
"modules.dns.route_through_vpn" = "Encaminar a través de VPN";
"modules.dns.route_through_vpn.footer" = "Si está habilitado, las consultas DNS se enviarán a través del túnel VPN.";
"modules.dns.search_domains.add" = "Añadir dominio";
"modules.dns.servers.add" = "Añadir dirección";
"modules.general.rows.appletv" = "%@";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@
"global.nouns.n_seconds" = "%d secondes";
"global.nouns.name" = "Nom";
"global.nouns.networks" = "Réseaux";
"global.nouns.no" = "Non";
"global.nouns.no_content" = "Aucun contenu";
"global.nouns.no_selection" = "Aucune sélection";
"global.nouns.none" = "Aucun";
Expand Down Expand Up @@ -143,6 +144,9 @@
"global.nouns.unknown" = "Inconnu";
"global.nouns.username" = "Nom d'utilisateur";
"global.nouns.version" = "Version";
"global.nouns.yes" = "Oui";
"modules.dns.route_through_vpn" = "Acheminer via VPN";
"modules.dns.route_through_vpn.footer" = "Si activé, les requêtes DNS seront acheminées via le tunnel VPN.";
"modules.dns.search_domains.add" = "Ajouter un domaine";
"modules.dns.servers.add" = "Ajouter une adresse";
"modules.general.rows.appletv" = "%@";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@
"global.nouns.n_seconds" = "%d secondi";
"global.nouns.name" = "Nome";
"global.nouns.networks" = "Reti";
"global.nouns.no" = "No";
"global.nouns.no_content" = "Nessun contenuto";
"global.nouns.no_selection" = "Nessuna selezione";
"global.nouns.none" = "Nessuno";
Expand Down Expand Up @@ -143,6 +144,9 @@
"global.nouns.unknown" = "Sconosciuto";
"global.nouns.username" = "Nome utente";
"global.nouns.version" = "Versione";
"global.nouns.yes" = "Sì";
"modules.dns.route_through_vpn" = "Instrada tramite VPN";
"modules.dns.route_through_vpn.footer" = "Se abilitato, le query DNS verranno instradate attraverso il tunnel VPN.";
"modules.dns.search_domains.add" = "Aggiungi dominio";
"modules.dns.servers.add" = "Aggiungi indirizzo";
"modules.general.rows.appletv" = "%@";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@
"global.nouns.n_seconds" = "%d seconden";
"global.nouns.name" = "Naam";
"global.nouns.networks" = "Netwerken";
"global.nouns.no" = "Nee";
"global.nouns.no_content" = "Geen inhoud";
"global.nouns.no_selection" = "Geen selectie";
"global.nouns.none" = "Geen";
Expand Down Expand Up @@ -143,6 +144,9 @@
"global.nouns.unknown" = "Onbekend";
"global.nouns.username" = "Gebruikersnaam";
"global.nouns.version" = "Versie";
"global.nouns.yes" = "Ja";
"modules.dns.route_through_vpn" = "Routeren via VPN";
"modules.dns.route_through_vpn.footer" = "Indien ingeschakeld, worden DNS-verzoeken via de VPN-tunnel geleid.";
"modules.dns.search_domains.add" = "Domein toevoegen";
"modules.dns.servers.add" = "Adres toevoegen";
"modules.general.rows.appletv" = "%@";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@
"global.nouns.n_seconds" = "%d sekund";
"global.nouns.name" = "Nazwa";
"global.nouns.networks" = "Sieci";
"global.nouns.no" = "Nie";
"global.nouns.no_content" = "Brak treści";
"global.nouns.no_selection" = "Brak wyboru";
"global.nouns.none" = "Brak";
Expand Down Expand Up @@ -143,6 +144,9 @@
"global.nouns.unknown" = "Nieznane";
"global.nouns.username" = "Nazwa użytkownika";
"global.nouns.version" = "Wersja";
"global.nouns.yes" = "Tak";
"modules.dns.route_through_vpn" = "Trasuj przez VPN";
"modules.dns.route_through_vpn.footer" = "Jeśli włączone, zapytania DNS będą kierowane przez tunel VPN.";
"modules.dns.search_domains.add" = "Dodaj domenę";
"modules.dns.servers.add" = "Dodaj adres";
"modules.general.rows.appletv" = "%@";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@
"global.nouns.n_seconds" = "%d segundos";
"global.nouns.name" = "Nome";
"global.nouns.networks" = "Redes";
"global.nouns.no" = "Não";
"global.nouns.no_content" = "Sem conteúdo";
"global.nouns.no_selection" = "Nenhuma seleção";
"global.nouns.none" = "Nenhum";
Expand Down Expand Up @@ -143,6 +144,9 @@
"global.nouns.unknown" = "Desconhecido";
"global.nouns.username" = "Nome de usuário";
"global.nouns.version" = "Versão";
"global.nouns.yes" = "Sim";
"modules.dns.route_through_vpn" = "Roteamento através do VPN";
"modules.dns.route_through_vpn.footer" = "Se ativado, as consultas DNS serão roteadas através do túnel VPN.";
"modules.dns.search_domains.add" = "Adicionar domínio";
"modules.dns.servers.add" = "Adicionar endereço";
"modules.general.rows.appletv" = "%@";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@
"global.nouns.n_seconds" = "%d секунд";
"global.nouns.name" = "Имя";
"global.nouns.networks" = "Сети";
"global.nouns.no" = "Нет";
"global.nouns.no_content" = "Нет содержимого";
"global.nouns.no_selection" = "Не выбрано";
"global.nouns.none" = "Нет";
Expand Down Expand Up @@ -143,6 +144,9 @@
"global.nouns.unknown" = "Неизвестно";
"global.nouns.username" = "Имя пользователя";
"global.nouns.version" = "Версия";
"global.nouns.yes" = "Да";
"modules.dns.route_through_vpn" = "Маршрутизировать через VPN";
"modules.dns.route_through_vpn.footer" = "Если включено, DNS-запросы будут направляться через VPN-туннель.";
"modules.dns.search_domains.add" = "Добавить домен";
"modules.dns.servers.add" = "Добавить адрес";
"modules.general.rows.appletv" = "%@";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@
"global.nouns.n_seconds" = "%d sekunder";
"global.nouns.name" = "Namn";
"global.nouns.networks" = "Nätverk";
"global.nouns.no" = "Nej";
"global.nouns.no_content" = "Inget innehåll";
"global.nouns.no_selection" = "Ingen val";
"global.nouns.none" = "Ingen";
Expand Down Expand Up @@ -143,6 +144,9 @@
"global.nouns.unknown" = "Okänd";
"global.nouns.username" = "Användarnamn";
"global.nouns.version" = "Version";
"global.nouns.yes" = "Ja";
"modules.dns.route_through_vpn" = "Routa via VPN";
"modules.dns.route_through_vpn.footer" = "Om aktiverat, kommer DNS-förfrågningar att routas genom VPN-tunneln.";
"modules.dns.search_domains.add" = "Lägg till domän";
"modules.dns.servers.add" = "Lägg till adress";
"modules.general.rows.appletv" = "%@";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@
"global.nouns.n_seconds" = "%d секунд";
"global.nouns.name" = "Ім'я";
"global.nouns.networks" = "Мережі";
"global.nouns.no" = "Ні";
"global.nouns.no_content" = "Немає вмісту";
"global.nouns.no_selection" = "Немає вибору";
"global.nouns.none" = "Жодний";
Expand Down Expand Up @@ -143,6 +144,9 @@
"global.nouns.unknown" = "Невідомо";
"global.nouns.username" = "Ім'я користувача";
"global.nouns.version" = "Версія";
"global.nouns.yes" = "Так";
"modules.dns.route_through_vpn" = "Маршрутизувати через VPN";
"modules.dns.route_through_vpn.footer" = "Якщо ввімкнено, DNS-запити будуть спрямовані через VPN-тунель.";
"modules.dns.search_domains.add" = "Додати домен";
"modules.dns.servers.add" = "Додати адресу";
"modules.general.rows.appletv" = "%@";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@
"global.nouns.n_seconds" = "%d 秒";
"global.nouns.name" = "名称";
"global.nouns.networks" = "网络";
"global.nouns.no" = "否";
"global.nouns.no_content" = "无内容";
"global.nouns.no_selection" = "未选择";
"global.nouns.none" = "无";
Expand Down Expand Up @@ -143,6 +144,9 @@
"global.nouns.unknown" = "未知";
"global.nouns.username" = "用户名";
"global.nouns.version" = "版本";
"global.nouns.yes" = "是";
"modules.dns.route_through_vpn" = "通过 VPN 路由";
"modules.dns.route_through_vpn.footer" = "如果启用,DNS 查询将通过 VPN 隧道进行路由。";
"modules.dns.search_domains.add" = "添加域名";
"modules.dns.servers.add" = "添加地址";
"modules.general.rows.appletv" = "%@";
Expand Down
2 changes: 1 addition & 1 deletion Packages/PassepartoutKit-Source
2 changes: 1 addition & 1 deletion scripts/import-translations.sh
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ for lang in `ls $translations_input_path`; do
tmp_path="$output_path.tmp"

# remove keys
sed -E 's/^"(.*)" = .*$/\1/' $input_path >$keys_path
sed -E 's/^"(.*)" = .*$/"\1"/' $input_path >$keys_path
grep -vf $keys_path $output_path >$tmp_path

# append new strings
Expand Down