Confirm quit on macOS (#634)

To do so, must prevent window from closing.

Fixes #223
This commit is contained in:
Davide 2024-09-28 17:58:48 +02:00 committed by GitHub
parent 5deb8ec763
commit 28a2017da2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 339 additions and 272 deletions

View File

@ -33,8 +33,50 @@ final class AppDelegate: NSObject, UIApplicationDelegate {
#else
import AppKit
import AppUI
import CommonLibrary
import SwiftUI
final class AppDelegate: NSObject, NSApplicationDelegate {
@AppStorage(AppPreference.confirmsQuit.key)
private var confirmsQuit = true
func applicationDidFinishLaunching(_ notification: Notification) {
NSApp.windows[0].styleMask.remove(.closable)
}
func applicationShouldTerminate(_ sender: NSApplication) -> NSApplication.TerminateReply {
if confirmsQuit {
return quitConfirmationAlert()
}
return .terminateNow
}
}
@MainActor
private extension AppDelegate {
func quitConfirmationAlert() -> NSApplication.TerminateReply {
let alert = NSAlert()
alert.alertStyle = .warning
alert.messageText = Strings.Alerts.ConfirmQuit.title(Constants.shared.identifiers.displayName)
alert.informativeText = Strings.Alerts.ConfirmQuit.message
alert.addButton(withTitle: Strings.Global.ok)
alert.addButton(withTitle: Strings.Global.cancel)
alert.addButton(withTitle: Strings.Global.doNotAskAgain)
switch alert.runModal() {
case .alertSecondButtonReturn:
return .terminateCancel
case .alertThirdButtonReturn:
confirmsQuit = false
default:
break
}
return .terminateNow
}
}
#endif

View File

@ -54,10 +54,10 @@ struct PassepartoutApp: App {
Window(appName, id: appName, content: content)
.defaultSize(width: 600.0, height: 400.0)
// Settings {
// SettingsView()
// .frame(minWidth: 300, minHeight: 100)
// }
Settings {
SettingsView()
.frame(minWidth: 300, minHeight: 100)
}
#endif
}
}

View File

@ -9,549 +9,557 @@ import Foundation
// swiftlint:disable explicit_type_interface function_parameter_count identifier_name line_length
// swiftlint:disable nesting type_body_length type_name vertical_whitespace_opening_braces
internal enum Strings {
internal enum Alerts {
internal enum Iap {
internal enum Restricted {
public enum Strings {
public enum Alerts {
public enum ConfirmQuit {
/// The VPN, if enabled, will still run in the background. Do you want to quit?
public static let message = Strings.tr("Localizable", "alerts.confirm_quit.message", fallback: "The VPN, if enabled, will still run in the background. Do you want to quit?")
/// Quit %@
public static func title(_ p1: Any) -> String {
return Strings.tr("Localizable", "alerts.confirm_quit.title", String(describing: p1), fallback: "Quit %@")
}
}
public enum Iap {
public enum Restricted {
/// The requested feature is unavailable in this build.
internal static let message = Strings.tr("Localizable", "alerts.iap.restricted.message", fallback: "The requested feature is unavailable in this build.")
public static let message = Strings.tr("Localizable", "alerts.iap.restricted.message", fallback: "The requested feature is unavailable in this build.")
/// Restricted
internal static let title = Strings.tr("Localizable", "alerts.iap.restricted.title", fallback: "Restricted")
public static let title = Strings.tr("Localizable", "alerts.iap.restricted.title", fallback: "Restricted")
}
}
}
internal enum Entities {
internal enum ConnectionStatus {
public enum Entities {
public enum ConnectionStatus {
/// Connected
internal static let connected = Strings.tr("Localizable", "entities.connection_status.connected", fallback: "Connected")
public static let connected = Strings.tr("Localizable", "entities.connection_status.connected", fallback: "Connected")
/// Connecting
internal static let connecting = Strings.tr("Localizable", "entities.connection_status.connecting", fallback: "Connecting")
public static let connecting = Strings.tr("Localizable", "entities.connection_status.connecting", fallback: "Connecting")
/// Disconnected
internal static let disconnected = Strings.tr("Localizable", "entities.connection_status.disconnected", fallback: "Disconnected")
public static let disconnected = Strings.tr("Localizable", "entities.connection_status.disconnected", fallback: "Disconnected")
/// Disconnecting
internal static let disconnecting = Strings.tr("Localizable", "entities.connection_status.disconnecting", fallback: "Disconnecting")
public static let disconnecting = Strings.tr("Localizable", "entities.connection_status.disconnecting", fallback: "Disconnecting")
}
internal enum Dns {
public enum Dns {
/// Search domains
internal static let searchDomains = Strings.tr("Localizable", "entities.dns.search_domains", fallback: "Search domains")
public static let searchDomains = Strings.tr("Localizable", "entities.dns.search_domains", fallback: "Search domains")
/// Servers
internal static let servers = Strings.tr("Localizable", "entities.dns.servers", fallback: "Servers")
public static let servers = Strings.tr("Localizable", "entities.dns.servers", fallback: "Servers")
}
internal enum DnsProtocol {
public enum DnsProtocol {
/// Cleartext
internal static let cleartext = Strings.tr("Localizable", "entities.dns_protocol.cleartext", fallback: "Cleartext")
public static let cleartext = Strings.tr("Localizable", "entities.dns_protocol.cleartext", fallback: "Cleartext")
/// Over HTTPS
internal static let https = Strings.tr("Localizable", "entities.dns_protocol.https", fallback: "Over HTTPS")
public static let https = Strings.tr("Localizable", "entities.dns_protocol.https", fallback: "Over HTTPS")
/// Over TLS
internal static let tls = Strings.tr("Localizable", "entities.dns_protocol.tls", fallback: "Over TLS")
public static let tls = Strings.tr("Localizable", "entities.dns_protocol.tls", fallback: "Over TLS")
}
internal enum HttpProxy {
public enum HttpProxy {
/// Bypass domains
internal static let bypassDomains = Strings.tr("Localizable", "entities.http_proxy.bypass_domains", fallback: "Bypass domains")
public static let bypassDomains = Strings.tr("Localizable", "entities.http_proxy.bypass_domains", fallback: "Bypass domains")
}
internal enum OnDemand {
internal enum Policy {
public enum OnDemand {
public enum Policy {
/// All networks
internal static let any = Strings.tr("Localizable", "entities.on_demand.policy.any", fallback: "All networks")
public static let any = Strings.tr("Localizable", "entities.on_demand.policy.any", fallback: "All networks")
/// Excluding
internal static let excluding = Strings.tr("Localizable", "entities.on_demand.policy.excluding", fallback: "Excluding")
public static let excluding = Strings.tr("Localizable", "entities.on_demand.policy.excluding", fallback: "Excluding")
/// Including
internal static let including = Strings.tr("Localizable", "entities.on_demand.policy.including", fallback: "Including")
public static let including = Strings.tr("Localizable", "entities.on_demand.policy.including", fallback: "Including")
}
}
internal enum Openvpn {
internal enum CompressionAlgorithm {
public enum Openvpn {
public enum CompressionAlgorithm {
/// Unsupported
internal static let other = Strings.tr("Localizable", "entities.openvpn.compression_algorithm.other", fallback: "Unsupported")
public static let other = Strings.tr("Localizable", "entities.openvpn.compression_algorithm.other", fallback: "Unsupported")
}
internal enum OtpMethod {
public enum OtpMethod {
/// Append
internal static let append = Strings.tr("Localizable", "entities.openvpn.otp_method.append", fallback: "Append")
public static let append = Strings.tr("Localizable", "entities.openvpn.otp_method.append", fallback: "Append")
/// Encode
internal static let encode = Strings.tr("Localizable", "entities.openvpn.otp_method.encode", fallback: "Encode")
public static let encode = Strings.tr("Localizable", "entities.openvpn.otp_method.encode", fallback: "Encode")
/// None
internal static let `none` = Strings.tr("Localizable", "entities.openvpn.otp_method.none", fallback: "None")
public static let `none` = Strings.tr("Localizable", "entities.openvpn.otp_method.none", fallback: "None")
}
}
internal enum Profile {
internal enum Name {
public enum Profile {
public enum Name {
/// New profile
internal static let new = Strings.tr("Localizable", "entities.profile.name.new", fallback: "New profile")
public static let new = Strings.tr("Localizable", "entities.profile.name.new", fallback: "New profile")
}
}
internal enum TunnelStatus {
public enum TunnelStatus {
/// Activating
internal static let activating = Strings.tr("Localizable", "entities.tunnel_status.activating", fallback: "Activating")
public static let activating = Strings.tr("Localizable", "entities.tunnel_status.activating", fallback: "Activating")
/// Active
internal static let active = Strings.tr("Localizable", "entities.tunnel_status.active", fallback: "Active")
public static let active = Strings.tr("Localizable", "entities.tunnel_status.active", fallback: "Active")
/// Deactivating
internal static let deactivating = Strings.tr("Localizable", "entities.tunnel_status.deactivating", fallback: "Deactivating")
public static let deactivating = Strings.tr("Localizable", "entities.tunnel_status.deactivating", fallback: "Deactivating")
/// Inactive
internal static let inactive = Strings.tr("Localizable", "entities.tunnel_status.inactive", fallback: "Inactive")
public static let inactive = Strings.tr("Localizable", "entities.tunnel_status.inactive", fallback: "Inactive")
}
}
internal enum Errors {
internal enum App {
public enum Errors {
public enum App {
/// Unable to complete operation.
internal static let `default` = Strings.tr("Localizable", "errors.app.default", fallback: "Unable to complete operation.")
public static let `default` = Strings.tr("Localizable", "errors.app.default", fallback: "Unable to complete operation.")
/// Profile name is empty.
internal static let emptyProfileName = Strings.tr("Localizable", "errors.app.empty_profile_name", fallback: "Profile name is empty.")
public static let emptyProfileName = Strings.tr("Localizable", "errors.app.empty_profile_name", fallback: "Profile name is empty.")
/// IP module can only be enabled together with a connection.
internal static let ipModuleRequiresConnection = Strings.tr("Localizable", "errors.app.ip_module_requires_connection", fallback: "IP module can only be enabled together with a connection.")
public static let ipModuleRequiresConnection = Strings.tr("Localizable", "errors.app.ip_module_requires_connection", fallback: "IP module can only be enabled together with a connection.")
/// Module %@ is malformed. %@
internal static func malformedModule(_ p1: Any, _ p2: Any) -> String {
public static func malformedModule(_ p1: Any, _ p2: Any) -> String {
return Strings.tr("Localizable", "errors.app.malformed_module", String(describing: p1), String(describing: p2), fallback: "Module %@ is malformed. %@")
}
/// Only one connection module can be active at a time.
internal static let multipleConnectionModules = Strings.tr("Localizable", "errors.app.multiple_connection_modules", fallback: "Only one connection module can be active at a time.")
internal enum Passepartout {
public static let multipleConnectionModules = Strings.tr("Localizable", "errors.app.multiple_connection_modules", fallback: "Only one connection module can be active at a time.")
public enum Passepartout {
/// Unable to complete operation (code=%@).
internal static func `default`(_ p1: Any) -> String {
public static func `default`(_ p1: Any) -> String {
return Strings.tr("Localizable", "errors.app.passepartout.default", String(describing: p1), fallback: "Unable to complete operation (code=%@).")
}
/// Invalid fields (%@).
internal static func invalidFields(_ p1: Any) -> String {
public static func invalidFields(_ p1: Any) -> String {
return Strings.tr("Localizable", "errors.app.passepartout.invalid_fields", String(describing: p1), fallback: "Invalid fields (%@).")
}
/// Unable to parse file.
internal static let parsing = Strings.tr("Localizable", "errors.app.passepartout.parsing", fallback: "Unable to parse file.")
public static let parsing = Strings.tr("Localizable", "errors.app.passepartout.parsing", fallback: "Unable to parse file.")
}
}
internal enum Tunnel {
public enum Tunnel {
/// Auth failed
internal static let auth = Strings.tr("Localizable", "errors.tunnel.auth", fallback: "Auth failed")
public static let auth = Strings.tr("Localizable", "errors.tunnel.auth", fallback: "Auth failed")
/// Compression unsupported
internal static let compression = Strings.tr("Localizable", "errors.tunnel.compression", fallback: "Compression unsupported")
public static let compression = Strings.tr("Localizable", "errors.tunnel.compression", fallback: "Compression unsupported")
/// DNS failed
internal static let dns = Strings.tr("Localizable", "errors.tunnel.dns", fallback: "DNS failed")
public static let dns = Strings.tr("Localizable", "errors.tunnel.dns", fallback: "DNS failed")
/// Encryption failed
internal static let encryption = Strings.tr("Localizable", "errors.tunnel.encryption", fallback: "Encryption failed")
public static let encryption = Strings.tr("Localizable", "errors.tunnel.encryption", fallback: "Encryption failed")
/// Failed
internal static let generic = Strings.tr("Localizable", "errors.tunnel.generic", fallback: "Failed")
public static let generic = Strings.tr("Localizable", "errors.tunnel.generic", fallback: "Failed")
/// Missing routing
internal static let routing = Strings.tr("Localizable", "errors.tunnel.routing", fallback: "Missing routing")
public static let routing = Strings.tr("Localizable", "errors.tunnel.routing", fallback: "Missing routing")
/// Server shutdown
internal static let shutdown = Strings.tr("Localizable", "errors.tunnel.shutdown", fallback: "Server shutdown")
public static let shutdown = Strings.tr("Localizable", "errors.tunnel.shutdown", fallback: "Server shutdown")
/// Timeout
internal static let timeout = Strings.tr("Localizable", "errors.tunnel.timeout", fallback: "Timeout")
public static let timeout = Strings.tr("Localizable", "errors.tunnel.timeout", fallback: "Timeout")
/// TLS failed
internal static let tls = Strings.tr("Localizable", "errors.tunnel.tls", fallback: "TLS failed")
public static let tls = Strings.tr("Localizable", "errors.tunnel.tls", fallback: "TLS failed")
}
}
internal enum Global {
public enum Global {
/// About
internal static let about = Strings.tr("Localizable", "global.about", fallback: "About")
public static let about = Strings.tr("Localizable", "global.about", fallback: "About")
/// Account
internal static let account = Strings.tr("Localizable", "global.account", fallback: "Account")
public static let account = Strings.tr("Localizable", "global.account", fallback: "Account")
/// Address
internal static let address = Strings.tr("Localizable", "global.address", fallback: "Address")
public static let address = Strings.tr("Localizable", "global.address", fallback: "Address")
/// Addresses
internal static let addresses = Strings.tr("Localizable", "global.addresses", fallback: "Addresses")
public static let addresses = Strings.tr("Localizable", "global.addresses", fallback: "Addresses")
/// Any
internal static let any = Strings.tr("Localizable", "global.any", fallback: "Any")
public static let any = Strings.tr("Localizable", "global.any", fallback: "Any")
/// Cancel
internal static let cancel = Strings.tr("Localizable", "global.cancel", fallback: "Cancel")
public static let cancel = Strings.tr("Localizable", "global.cancel", fallback: "Cancel")
/// Certificate
internal static let certificate = Strings.tr("Localizable", "global.certificate", fallback: "Certificate")
public static let certificate = Strings.tr("Localizable", "global.certificate", fallback: "Certificate")
/// Compression
internal static let compression = Strings.tr("Localizable", "global.compression", fallback: "Compression")
public static let compression = Strings.tr("Localizable", "global.compression", fallback: "Compression")
/// Connect
internal static let connect = Strings.tr("Localizable", "global.connect", fallback: "Connect")
public static let connect = Strings.tr("Localizable", "global.connect", fallback: "Connect")
/// Connection
internal static let connection = Strings.tr("Localizable", "global.connection", fallback: "Connection")
public static let connection = Strings.tr("Localizable", "global.connection", fallback: "Connection")
/// Default
internal static let `default` = Strings.tr("Localizable", "global.default", fallback: "Default")
public static let `default` = Strings.tr("Localizable", "global.default", fallback: "Default")
/// Destination
internal static let destination = Strings.tr("Localizable", "global.destination", fallback: "Destination")
public static let destination = Strings.tr("Localizable", "global.destination", fallback: "Destination")
/// Disable
internal static let disable = Strings.tr("Localizable", "global.disable", fallback: "Disable")
public static let disable = Strings.tr("Localizable", "global.disable", fallback: "Disable")
/// Disabled
internal static let disabled = Strings.tr("Localizable", "global.disabled", fallback: "Disabled")
public static let disabled = Strings.tr("Localizable", "global.disabled", fallback: "Disabled")
/// Disconnect
internal static let disconnect = Strings.tr("Localizable", "global.disconnect", fallback: "Disconnect")
public static let disconnect = Strings.tr("Localizable", "global.disconnect", fallback: "Disconnect")
/// Don't ask again
public static let doNotAskAgain = Strings.tr("Localizable", "global.do_not_ask_again", fallback: "Don't ask again")
/// Domain
internal static let domain = Strings.tr("Localizable", "global.domain", fallback: "Domain")
public static let domain = Strings.tr("Localizable", "global.domain", fallback: "Domain")
/// Done
internal static let done = Strings.tr("Localizable", "global.done", fallback: "Done")
public static let done = Strings.tr("Localizable", "global.done", fallback: "Done")
/// Duplicate
internal static let duplicate = Strings.tr("Localizable", "global.duplicate", fallback: "Duplicate")
public static let duplicate = Strings.tr("Localizable", "global.duplicate", fallback: "Duplicate")
/// Edit
internal static let edit = Strings.tr("Localizable", "global.edit", fallback: "Edit")
public static let edit = Strings.tr("Localizable", "global.edit", fallback: "Edit")
/// Empty
internal static let empty = Strings.tr("Localizable", "global.empty", fallback: "Empty")
public static let empty = Strings.tr("Localizable", "global.empty", fallback: "Empty")
/// Enable
internal static let enable = Strings.tr("Localizable", "global.enable", fallback: "Enable")
public static let enable = Strings.tr("Localizable", "global.enable", fallback: "Enable")
/// Enabled
internal static let enabled = Strings.tr("Localizable", "global.enabled", fallback: "Enabled")
public static let enabled = Strings.tr("Localizable", "global.enabled", fallback: "Enabled")
/// Endpoint
internal static let endpoint = Strings.tr("Localizable", "global.endpoint", fallback: "Endpoint")
public static let endpoint = Strings.tr("Localizable", "global.endpoint", fallback: "Endpoint")
/// Folder
internal static let folder = Strings.tr("Localizable", "global.folder", fallback: "Folder")
public static let folder = Strings.tr("Localizable", "global.folder", fallback: "Folder")
/// Gateway
internal static let gateway = Strings.tr("Localizable", "global.gateway", fallback: "Gateway")
public static let gateway = Strings.tr("Localizable", "global.gateway", fallback: "Gateway")
/// General
internal static let general = Strings.tr("Localizable", "global.general", fallback: "General")
public static let general = Strings.tr("Localizable", "global.general", fallback: "General")
/// Hostname
internal static let hostname = Strings.tr("Localizable", "global.hostname", fallback: "Hostname")
public static let hostname = Strings.tr("Localizable", "global.hostname", fallback: "Hostname")
/// Interface
internal static let interface = Strings.tr("Localizable", "global.interface", fallback: "Interface")
public static let interface = Strings.tr("Localizable", "global.interface", fallback: "Interface")
/// Keep-alive
internal static let keepAlive = Strings.tr("Localizable", "global.keep_alive", fallback: "Keep-alive")
public static let keepAlive = Strings.tr("Localizable", "global.keep_alive", fallback: "Keep-alive")
/// Key
internal static let key = Strings.tr("Localizable", "global.key", fallback: "Key")
public static let key = Strings.tr("Localizable", "global.key", fallback: "Key")
/// Method
internal static let method = Strings.tr("Localizable", "global.method", fallback: "Method")
public static let method = Strings.tr("Localizable", "global.method", fallback: "Method")
/// Modules
internal static let modules = Strings.tr("Localizable", "global.modules", fallback: "Modules")
public static let modules = Strings.tr("Localizable", "global.modules", fallback: "Modules")
/// %d seconds
internal static func nSeconds(_ p1: Int) -> String {
public static func nSeconds(_ p1: Int) -> String {
return Strings.tr("Localizable", "global.n_seconds", p1, fallback: "%d seconds")
}
/// Name
internal static let name = Strings.tr("Localizable", "global.name", fallback: "Name")
public static let name = Strings.tr("Localizable", "global.name", fallback: "Name")
/// Networks
internal static let networks = Strings.tr("Localizable", "global.networks", fallback: "Networks")
public static let networks = Strings.tr("Localizable", "global.networks", fallback: "Networks")
/// No content
internal static let noContent = Strings.tr("Localizable", "global.no_content", fallback: "No content")
public static let noContent = Strings.tr("Localizable", "global.no_content", fallback: "No content")
/// No selection
internal static let noSelection = Strings.tr("Localizable", "global.no_selection", fallback: "No selection")
public static let noSelection = Strings.tr("Localizable", "global.no_selection", fallback: "No selection")
/// None
internal static let `none` = Strings.tr("Localizable", "global.none", fallback: "None")
public static let `none` = Strings.tr("Localizable", "global.none", fallback: "None")
/// OK
internal static let ok = Strings.tr("Localizable", "global.ok", fallback: "OK")
public static let ok = Strings.tr("Localizable", "global.ok", fallback: "OK")
/// On demand
internal static let onDemand = Strings.tr("Localizable", "global.on_demand", fallback: "On demand")
public static let onDemand = Strings.tr("Localizable", "global.on_demand", fallback: "On demand")
/// Other
internal static let other = Strings.tr("Localizable", "global.other", fallback: "Other")
public static let other = Strings.tr("Localizable", "global.other", fallback: "Other")
/// Password
internal static let password = Strings.tr("Localizable", "global.password", fallback: "Password")
public static let password = Strings.tr("Localizable", "global.password", fallback: "Password")
/// Port
internal static let port = Strings.tr("Localizable", "global.port", fallback: "Port")
public static let port = Strings.tr("Localizable", "global.port", fallback: "Port")
/// Private key
internal static let privateKey = Strings.tr("Localizable", "global.private_key", fallback: "Private key")
public static let privateKey = Strings.tr("Localizable", "global.private_key", fallback: "Private key")
/// Protocol
internal static let `protocol` = Strings.tr("Localizable", "global.protocol", fallback: "Protocol")
public static let `protocol` = Strings.tr("Localizable", "global.protocol", fallback: "Protocol")
/// Public key
internal static let publicKey = Strings.tr("Localizable", "global.public_key", fallback: "Public key")
public static let publicKey = Strings.tr("Localizable", "global.public_key", fallback: "Public key")
/// Delete
internal static let remove = Strings.tr("Localizable", "global.remove", fallback: "Delete")
public static let remove = Strings.tr("Localizable", "global.remove", fallback: "Delete")
/// Restart
internal static let restart = Strings.tr("Localizable", "global.restart", fallback: "Restart")
public static let restart = Strings.tr("Localizable", "global.restart", fallback: "Restart")
/// Route
internal static let route = Strings.tr("Localizable", "global.route", fallback: "Route")
public static let route = Strings.tr("Localizable", "global.route", fallback: "Route")
/// Routes
internal static let routes = Strings.tr("Localizable", "global.routes", fallback: "Routes")
public static let routes = Strings.tr("Localizable", "global.routes", fallback: "Routes")
/// Save
internal static let save = Strings.tr("Localizable", "global.save", fallback: "Save")
public static let save = Strings.tr("Localizable", "global.save", fallback: "Save")
/// Server
internal static let server = Strings.tr("Localizable", "global.server", fallback: "Server")
public static let server = Strings.tr("Localizable", "global.server", fallback: "Server")
/// Servers
internal static let servers = Strings.tr("Localizable", "global.servers", fallback: "Servers")
public static let servers = Strings.tr("Localizable", "global.servers", fallback: "Servers")
/// Settings
internal static let settings = Strings.tr("Localizable", "global.settings", fallback: "Settings")
public static let settings = Strings.tr("Localizable", "global.settings", fallback: "Settings")
/// Status
internal static let status = Strings.tr("Localizable", "global.status", fallback: "Status")
public static let status = Strings.tr("Localizable", "global.status", fallback: "Status")
/// Storage
internal static let storage = Strings.tr("Localizable", "global.storage", fallback: "Storage")
public static let storage = Strings.tr("Localizable", "global.storage", fallback: "Storage")
/// Subnet
internal static let subnet = Strings.tr("Localizable", "global.subnet", fallback: "Subnet")
public static let subnet = Strings.tr("Localizable", "global.subnet", fallback: "Subnet")
/// Uninstall
internal static let uninstall = Strings.tr("Localizable", "global.uninstall", fallback: "Uninstall")
public static let uninstall = Strings.tr("Localizable", "global.uninstall", fallback: "Uninstall")
/// Unknown
internal static let unknown = Strings.tr("Localizable", "global.unknown", fallback: "Unknown")
public static let unknown = Strings.tr("Localizable", "global.unknown", fallback: "Unknown")
/// Username
internal static let username = Strings.tr("Localizable", "global.username", fallback: "Username")
public static let username = Strings.tr("Localizable", "global.username", fallback: "Username")
/// Version
internal static let version = Strings.tr("Localizable", "global.version", fallback: "Version")
public static let version = Strings.tr("Localizable", "global.version", fallback: "Version")
}
internal enum Modules {
internal enum Dns {
internal enum SearchDomains {
public enum Modules {
public enum Dns {
public enum SearchDomains {
/// Add domain
internal static let add = Strings.tr("Localizable", "modules.dns.search_domains.add", fallback: "Add domain")
public static let add = Strings.tr("Localizable", "modules.dns.search_domains.add", fallback: "Add domain")
}
internal enum Servers {
public enum Servers {
/// Add address
internal static let add = Strings.tr("Localizable", "modules.dns.servers.add", fallback: "Add address")
public static let add = Strings.tr("Localizable", "modules.dns.servers.add", fallback: "Add address")
}
}
internal enum HttpProxy {
internal enum BypassDomains {
public enum HttpProxy {
public enum BypassDomains {
/// Add bypass domain
internal static let add = Strings.tr("Localizable", "modules.http_proxy.bypass_domains.add", fallback: "Add bypass domain")
public static let add = Strings.tr("Localizable", "modules.http_proxy.bypass_domains.add", fallback: "Add bypass domain")
}
}
internal enum Ip {
internal enum Routes {
public enum Ip {
public enum Routes {
/// Add %@
internal static func addFamily(_ p1: Any) -> String {
public static func addFamily(_ p1: Any) -> String {
return Strings.tr("Localizable", "modules.ip.routes.add_family", String(describing: p1), fallback: "Add %@")
}
/// Exclude route
internal static let exclude = Strings.tr("Localizable", "modules.ip.routes.exclude", fallback: "Exclude route")
public static let exclude = Strings.tr("Localizable", "modules.ip.routes.exclude", fallback: "Exclude route")
/// Excluded routes
internal static let excluded = Strings.tr("Localizable", "modules.ip.routes.excluded", fallback: "Excluded routes")
public static let excluded = Strings.tr("Localizable", "modules.ip.routes.excluded", fallback: "Excluded routes")
/// Include route
internal static let include = Strings.tr("Localizable", "modules.ip.routes.include", fallback: "Include route")
public static let include = Strings.tr("Localizable", "modules.ip.routes.include", fallback: "Include route")
/// Included routes
internal static let included = Strings.tr("Localizable", "modules.ip.routes.included", fallback: "Included routes")
public static let included = Strings.tr("Localizable", "modules.ip.routes.included", fallback: "Included routes")
}
}
internal enum OnDemand {
public enum OnDemand {
/// Ethernet
internal static let ethernet = Strings.tr("Localizable", "modules.on_demand.ethernet", fallback: "Ethernet")
public static let ethernet = Strings.tr("Localizable", "modules.on_demand.ethernet", fallback: "Ethernet")
/// Mobile
internal static let mobile = Strings.tr("Localizable", "modules.on_demand.mobile", fallback: "Mobile")
public static let mobile = Strings.tr("Localizable", "modules.on_demand.mobile", fallback: "Mobile")
/// Policy
internal static let policy = Strings.tr("Localizable", "modules.on_demand.policy", fallback: "Policy")
internal enum Policy {
public static let policy = Strings.tr("Localizable", "modules.on_demand.policy", fallback: "Policy")
public enum Policy {
/// Activate the VPN %@.
internal static func footer(_ p1: Any) -> String {
public static func footer(_ p1: Any) -> String {
return Strings.tr("Localizable", "modules.on_demand.policy.footer", String(describing: p1), fallback: "Activate the VPN %@.")
}
internal enum Footer {
public enum Footer {
/// in any network
internal static let any = Strings.tr("Localizable", "modules.on_demand.policy.footer.any", fallback: "in any network")
public static let any = Strings.tr("Localizable", "modules.on_demand.policy.footer.any", fallback: "in any network")
/// except in the networks below
internal static let excluding = Strings.tr("Localizable", "modules.on_demand.policy.footer.excluding", fallback: "except in the networks below")
public static let excluding = Strings.tr("Localizable", "modules.on_demand.policy.footer.excluding", fallback: "except in the networks below")
/// only in the networks below
internal static let including = Strings.tr("Localizable", "modules.on_demand.policy.footer.including", fallback: "only in the networks below")
public static let including = Strings.tr("Localizable", "modules.on_demand.policy.footer.including", fallback: "only in the networks below")
}
}
internal enum Ssid {
public enum Ssid {
/// Add SSID
internal static let add = Strings.tr("Localizable", "modules.on_demand.ssid.add", fallback: "Add SSID")
public static let add = Strings.tr("Localizable", "modules.on_demand.ssid.add", fallback: "Add SSID")
}
}
internal enum Openvpn {
public enum Openvpn {
/// Cipher
internal static let cipher = Strings.tr("Localizable", "modules.openvpn.cipher", fallback: "Cipher")
public static let cipher = Strings.tr("Localizable", "modules.openvpn.cipher", fallback: "Cipher")
/// Communication
internal static let communication = Strings.tr("Localizable", "modules.openvpn.communication", fallback: "Communication")
public static let communication = Strings.tr("Localizable", "modules.openvpn.communication", fallback: "Communication")
/// Compression
internal static let compression = Strings.tr("Localizable", "modules.openvpn.compression", fallback: "Compression")
public static let compression = Strings.tr("Localizable", "modules.openvpn.compression", fallback: "Compression")
/// Algorithm
internal static let compressionAlgorithm = Strings.tr("Localizable", "modules.openvpn.compression_algorithm", fallback: "Algorithm")
public static let compressionAlgorithm = Strings.tr("Localizable", "modules.openvpn.compression_algorithm", fallback: "Algorithm")
/// Framing
internal static let compressionFraming = Strings.tr("Localizable", "modules.openvpn.compression_framing", fallback: "Framing")
public static let compressionFraming = Strings.tr("Localizable", "modules.openvpn.compression_framing", fallback: "Framing")
/// Credentials
internal static let credentials = Strings.tr("Localizable", "modules.openvpn.credentials", fallback: "Credentials")
public static let credentials = Strings.tr("Localizable", "modules.openvpn.credentials", fallback: "Credentials")
/// Digest
internal static let digest = Strings.tr("Localizable", "modules.openvpn.digest", fallback: "Digest")
public static let digest = Strings.tr("Localizable", "modules.openvpn.digest", fallback: "Digest")
/// Extended verification
internal static let eku = Strings.tr("Localizable", "modules.openvpn.eku", fallback: "Extended verification")
public static let eku = Strings.tr("Localizable", "modules.openvpn.eku", fallback: "Extended verification")
/// Pull
internal static let pull = Strings.tr("Localizable", "modules.openvpn.pull", fallback: "Pull")
public static let pull = Strings.tr("Localizable", "modules.openvpn.pull", fallback: "Pull")
/// Randomize endpoint
internal static let randomizeEndpoint = Strings.tr("Localizable", "modules.openvpn.randomize_endpoint", fallback: "Randomize endpoint")
public static let randomizeEndpoint = Strings.tr("Localizable", "modules.openvpn.randomize_endpoint", fallback: "Randomize endpoint")
/// Randomize hostname
internal static let randomizeHostname = Strings.tr("Localizable", "modules.openvpn.randomize_hostname", fallback: "Randomize hostname")
public static let randomizeHostname = Strings.tr("Localizable", "modules.openvpn.randomize_hostname", fallback: "Randomize hostname")
/// Redirect gateway
internal static let redirectGateway = Strings.tr("Localizable", "modules.openvpn.redirect_gateway", fallback: "Redirect gateway")
public static let redirectGateway = Strings.tr("Localizable", "modules.openvpn.redirect_gateway", fallback: "Redirect gateway")
/// Remotes
internal static let remotes = Strings.tr("Localizable", "modules.openvpn.remotes", fallback: "Remotes")
public static let remotes = Strings.tr("Localizable", "modules.openvpn.remotes", fallback: "Remotes")
/// Renegotiation
internal static let renegotiation = Strings.tr("Localizable", "modules.openvpn.renegotiation", fallback: "Renegotiation")
public static let renegotiation = Strings.tr("Localizable", "modules.openvpn.renegotiation", fallback: "Renegotiation")
/// Wrapping
internal static let tlsWrap = Strings.tr("Localizable", "modules.openvpn.tls_wrap", fallback: "Wrapping")
internal enum Credentials {
public static let tlsWrap = Strings.tr("Localizable", "modules.openvpn.tls_wrap", fallback: "Wrapping")
public enum Credentials {
/// Interactive
internal static let interactive = Strings.tr("Localizable", "modules.openvpn.credentials.interactive", fallback: "Interactive")
internal enum Interactive {
public static let interactive = Strings.tr("Localizable", "modules.openvpn.credentials.interactive", fallback: "Interactive")
public enum Interactive {
/// On-demand will be disabled.
internal static let footer = Strings.tr("Localizable", "modules.openvpn.credentials.interactive.footer", fallback: "On-demand will be disabled.")
public static let footer = Strings.tr("Localizable", "modules.openvpn.credentials.interactive.footer", fallback: "On-demand will be disabled.")
}
internal enum OtpMethod {
internal enum Approach {
public enum OtpMethod {
public enum Approach {
/// The OTP will be appended to the password.
internal static let append = Strings.tr("Localizable", "modules.openvpn.credentials.otp_method.approach.append", fallback: "The OTP will be appended to the password.")
public static let append = Strings.tr("Localizable", "modules.openvpn.credentials.otp_method.approach.append", fallback: "The OTP will be appended to the password.")
/// The OTP will be encoded in Base64 with the password.
internal static let encode = Strings.tr("Localizable", "modules.openvpn.credentials.otp_method.approach.encode", fallback: "The OTP will be encoded in Base64 with the password.")
public static let encode = Strings.tr("Localizable", "modules.openvpn.credentials.otp_method.approach.encode", fallback: "The OTP will be encoded in Base64 with the password.")
}
}
}
}
internal enum Wireguard {
public enum Wireguard {
/// Allowed IPs
internal static let allowedIps = Strings.tr("Localizable", "modules.wireguard.allowed_ips", fallback: "Allowed IPs")
public static let allowedIps = Strings.tr("Localizable", "modules.wireguard.allowed_ips", fallback: "Allowed IPs")
/// Interface
internal static let interface = Strings.tr("Localizable", "modules.wireguard.interface", fallback: "Interface")
public static let interface = Strings.tr("Localizable", "modules.wireguard.interface", fallback: "Interface")
/// Peer #%d
internal static func peer(_ p1: Int) -> String {
public static func peer(_ p1: Int) -> String {
return Strings.tr("Localizable", "modules.wireguard.peer", p1, fallback: "Peer #%d")
}
/// Pre-shared key
internal static let presharedKey = Strings.tr("Localizable", "modules.wireguard.preshared_key", fallback: "Pre-shared key")
public static let presharedKey = Strings.tr("Localizable", "modules.wireguard.preshared_key", fallback: "Pre-shared key")
}
}
internal enum Placeholders {
public enum Placeholders {
/// secret
internal static let secret = Strings.tr("Localizable", "placeholders.secret", fallback: "secret")
public static let secret = Strings.tr("Localizable", "placeholders.secret", fallback: "secret")
/// username
internal static let username = Strings.tr("Localizable", "placeholders.username", fallback: "username")
internal enum OnDemand {
public static let username = Strings.tr("Localizable", "placeholders.username", fallback: "username")
public enum OnDemand {
/// My SSID
internal static let ssid = Strings.tr("Localizable", "placeholders.on_demand.ssid", fallback: "My SSID")
public static let ssid = Strings.tr("Localizable", "placeholders.on_demand.ssid", fallback: "My SSID")
}
internal enum Profile {
public enum Profile {
/// My profile
internal static let name = Strings.tr("Localizable", "placeholders.profile.name", fallback: "My profile")
public static let name = Strings.tr("Localizable", "placeholders.profile.name", fallback: "My profile")
}
}
internal enum Views {
internal enum About {
public enum Views {
public enum About {
/// About
internal static let title = Strings.tr("Localizable", "views.about.title", fallback: "About")
internal enum Credits {
public static let title = Strings.tr("Localizable", "views.about.title", fallback: "About")
public enum Credits {
/// Licenses
internal static let licenses = Strings.tr("Localizable", "views.about.credits.licenses", fallback: "Licenses")
public static let licenses = Strings.tr("Localizable", "views.about.credits.licenses", fallback: "Licenses")
/// Notices
internal static let notices = Strings.tr("Localizable", "views.about.credits.notices", fallback: "Notices")
public static let notices = Strings.tr("Localizable", "views.about.credits.notices", fallback: "Notices")
/// Credits
internal static let title = Strings.tr("Localizable", "views.about.credits.title", fallback: "Credits")
public static let title = Strings.tr("Localizable", "views.about.credits.title", fallback: "Credits")
/// Translations
internal static let translations = Strings.tr("Localizable", "views.about.credits.translations", fallback: "Translations")
public static let translations = Strings.tr("Localizable", "views.about.credits.translations", fallback: "Translations")
}
internal enum Links {
public enum Links {
/// Links
internal static let title = Strings.tr("Localizable", "views.about.links.title", fallback: "Links")
internal enum Rows {
public static let title = Strings.tr("Localizable", "views.about.links.title", fallback: "Links")
public enum Rows {
/// Disclaimer
internal static let disclaimer = Strings.tr("Localizable", "views.about.links.rows.disclaimer", fallback: "Disclaimer")
public static let disclaimer = Strings.tr("Localizable", "views.about.links.rows.disclaimer", fallback: "Disclaimer")
/// Home page
internal static let homePage = Strings.tr("Localizable", "views.about.links.rows.home_page", fallback: "Home page")
public static let homePage = Strings.tr("Localizable", "views.about.links.rows.home_page", fallback: "Home page")
/// Join community
internal static let joinCommunity = Strings.tr("Localizable", "views.about.links.rows.join_community", fallback: "Join community")
public static let joinCommunity = Strings.tr("Localizable", "views.about.links.rows.join_community", fallback: "Join community")
/// Privacy policy
internal static let privacyPolicy = Strings.tr("Localizable", "views.about.links.rows.privacy_policy", fallback: "Privacy policy")
public static let privacyPolicy = Strings.tr("Localizable", "views.about.links.rows.privacy_policy", fallback: "Privacy policy")
/// Write a review
internal static let writeReview = Strings.tr("Localizable", "views.about.links.rows.write_review", fallback: "Write a review")
public static let writeReview = Strings.tr("Localizable", "views.about.links.rows.write_review", fallback: "Write a review")
}
internal enum Sections {
public enum Sections {
/// Support
internal static let support = Strings.tr("Localizable", "views.about.links.sections.support", fallback: "Support")
public static let support = Strings.tr("Localizable", "views.about.links.sections.support", fallback: "Support")
/// Web
internal static let web = Strings.tr("Localizable", "views.about.links.sections.web", fallback: "Web")
public static let web = Strings.tr("Localizable", "views.about.links.sections.web", fallback: "Web")
}
}
internal enum Sections {
public enum Sections {
/// Resources
internal static let resources = Strings.tr("Localizable", "views.about.sections.resources", fallback: "Resources")
public static let resources = Strings.tr("Localizable", "views.about.sections.resources", fallback: "Resources")
}
}
internal enum Diagnostics {
public enum Diagnostics {
/// Diagnostics
internal static let title = Strings.tr("Localizable", "views.diagnostics.title", fallback: "Diagnostics")
internal enum Alerts {
internal enum ReportIssue {
public static let title = Strings.tr("Localizable", "views.diagnostics.title", fallback: "Diagnostics")
public enum Alerts {
public enum ReportIssue {
/// The device is not configured to send e-mails.
internal static let email = Strings.tr("Localizable", "views.diagnostics.alerts.report_issue.email", fallback: "The device is not configured to send e-mails.")
public static let email = Strings.tr("Localizable", "views.diagnostics.alerts.report_issue.email", fallback: "The device is not configured to send e-mails.")
}
}
internal enum Openvpn {
internal enum Rows {
public enum Openvpn {
public enum Rows {
/// Server configuration
internal static let serverConfiguration = Strings.tr("Localizable", "views.diagnostics.openvpn.rows.server_configuration", fallback: "Server configuration")
public static let serverConfiguration = Strings.tr("Localizable", "views.diagnostics.openvpn.rows.server_configuration", fallback: "Server configuration")
}
}
internal enum ReportIssue {
public enum ReportIssue {
/// Report issue
internal static let title = Strings.tr("Localizable", "views.diagnostics.report_issue.title", fallback: "Report issue")
public static let title = Strings.tr("Localizable", "views.diagnostics.report_issue.title", fallback: "Report issue")
}
internal enum Rows {
public enum Rows {
/// App
internal static let app = Strings.tr("Localizable", "views.diagnostics.rows.app", fallback: "App")
public static let app = Strings.tr("Localizable", "views.diagnostics.rows.app", fallback: "App")
/// Include private data
internal static let includePrivateData = Strings.tr("Localizable", "views.diagnostics.rows.include_private_data", fallback: "Include private data")
public static let includePrivateData = Strings.tr("Localizable", "views.diagnostics.rows.include_private_data", fallback: "Include private data")
/// Delete all logs
internal static let removeTunnelLogs = Strings.tr("Localizable", "views.diagnostics.rows.remove_tunnel_logs", fallback: "Delete all logs")
public static let removeTunnelLogs = Strings.tr("Localizable", "views.diagnostics.rows.remove_tunnel_logs", fallback: "Delete all logs")
/// Tunnel
internal static let tunnel = Strings.tr("Localizable", "views.diagnostics.rows.tunnel", fallback: "Tunnel")
public static let tunnel = Strings.tr("Localizable", "views.diagnostics.rows.tunnel", fallback: "Tunnel")
}
internal enum Sections {
public enum Sections {
/// Live log
internal static let live = Strings.tr("Localizable", "views.diagnostics.sections.live", fallback: "Live log")
public static let live = Strings.tr("Localizable", "views.diagnostics.sections.live", fallback: "Live log")
/// Tunnel logs
internal static let tunnel = Strings.tr("Localizable", "views.diagnostics.sections.tunnel", fallback: "Tunnel logs")
public static let tunnel = Strings.tr("Localizable", "views.diagnostics.sections.tunnel", fallback: "Tunnel logs")
}
}
internal enum Donate {
public enum Donate {
/// Make a donation
internal static let title = Strings.tr("Localizable", "views.donate.title", fallback: "Make a donation")
public static let title = Strings.tr("Localizable", "views.donate.title", fallback: "Make a donation")
}
internal enum Profile {
internal enum ModuleList {
internal enum Section {
public enum Profile {
public enum ModuleList {
public enum Section {
/// Drag modules to rearrange them, as their order determines priority.
internal static let footer = Strings.tr("Localizable", "views.profile.module_list.section.footer", fallback: "Drag modules to rearrange them, as their order determines priority.")
public static let footer = Strings.tr("Localizable", "views.profile.module_list.section.footer", fallback: "Drag modules to rearrange them, as their order determines priority.")
}
}
internal enum Rows {
public enum Rows {
/// Add module
internal static let addModule = Strings.tr("Localizable", "views.profile.rows.add_module", fallback: "Add module")
public static let addModule = Strings.tr("Localizable", "views.profile.rows.add_module", fallback: "Add module")
}
}
internal enum Profiles {
internal enum Alerts {
internal enum Import {
internal enum Passphrase {
public enum Profiles {
public enum Alerts {
public enum Import {
public enum Passphrase {
/// Enter passphrase for '%@'.
internal static func message(_ p1: Any) -> String {
public static func message(_ p1: Any) -> String {
return Strings.tr("Localizable", "views.profiles.alerts.import.passphrase.message", String(describing: p1), fallback: "Enter passphrase for '%@'.")
}
/// Decrypt
internal static let ok = Strings.tr("Localizable", "views.profiles.alerts.import.passphrase.ok", fallback: "Decrypt")
public static let ok = Strings.tr("Localizable", "views.profiles.alerts.import.passphrase.ok", fallback: "Decrypt")
}
}
}
internal enum Errors {
public enum Errors {
/// Unable to duplicate profile '%@'.
internal static func duplicate(_ p1: Any) -> String {
public static func duplicate(_ p1: Any) -> String {
return Strings.tr("Localizable", "views.profiles.errors.duplicate", String(describing: p1), fallback: "Unable to duplicate profile '%@'.")
}
/// Unable to import profiles.
internal static let `import` = Strings.tr("Localizable", "views.profiles.errors.import", fallback: "Unable to import profiles.")
public static let `import` = Strings.tr("Localizable", "views.profiles.errors.import", fallback: "Unable to import profiles.")
/// Unable to execute tunnel operation.
internal static let tunnel = Strings.tr("Localizable", "views.profiles.errors.tunnel", fallback: "Unable to execute tunnel operation.")
public static let tunnel = Strings.tr("Localizable", "views.profiles.errors.tunnel", fallback: "Unable to execute tunnel operation.")
}
internal enum Folders {
public enum Folders {
/// Installed profile
internal static let activeProfile = Strings.tr("Localizable", "views.profiles.folders.active_profile", fallback: "Installed profile")
public static let activeProfile = Strings.tr("Localizable", "views.profiles.folders.active_profile", fallback: "Installed profile")
/// Add profile
internal static let addProfile = Strings.tr("Localizable", "views.profiles.folders.add_profile", fallback: "Add profile")
public static let addProfile = Strings.tr("Localizable", "views.profiles.folders.add_profile", fallback: "Add profile")
/// My profiles
internal static let `default` = Strings.tr("Localizable", "views.profiles.folders.default", fallback: "My profiles")
public static let `default` = Strings.tr("Localizable", "views.profiles.folders.default", fallback: "My profiles")
/// No profiles
internal static let noProfiles = Strings.tr("Localizable", "views.profiles.folders.no_profiles", fallback: "No profiles")
public static let noProfiles = Strings.tr("Localizable", "views.profiles.folders.no_profiles", fallback: "No profiles")
}
internal enum Rows {
public enum Rows {
/// %d modules
internal static func modules(_ p1: Int) -> String {
public static func modules(_ p1: Int) -> String {
return Strings.tr("Localizable", "views.profiles.rows.modules", p1, fallback: "%d modules")
}
/// Select a profile
internal static let notInstalled = Strings.tr("Localizable", "views.profiles.rows.not_installed", fallback: "Select a profile")
public static let notInstalled = Strings.tr("Localizable", "views.profiles.rows.not_installed", fallback: "Select a profile")
}
internal enum Toolbar {
public enum Toolbar {
/// Import profile
internal static let importProfile = Strings.tr("Localizable", "views.profiles.toolbar.import_profile", fallback: "Import profile")
public static let importProfile = Strings.tr("Localizable", "views.profiles.toolbar.import_profile", fallback: "Import profile")
/// New profile
internal static let newProfile = Strings.tr("Localizable", "views.profiles.toolbar.new_profile", fallback: "New profile")
public static let newProfile = Strings.tr("Localizable", "views.profiles.toolbar.new_profile", fallback: "New profile")
}
}
internal enum Settings {
internal enum Rows {
public enum Settings {
public enum Rows {
/// Confirm quit
public static let confirmQuit = Strings.tr("Localizable", "views.settings.rows.confirm_quit", fallback: "Confirm quit")
/// Lock in background
internal static let lockInBackground = Strings.tr("Localizable", "views.settings.rows.lock_in_background", fallback: "Lock in background")
internal enum LockInBackground {
public static let lockInBackground = Strings.tr("Localizable", "views.settings.rows.lock_in_background", fallback: "Lock in background")
public enum LockInBackground {
/// Passepartout is locked
internal static let message = Strings.tr("Localizable", "views.settings.rows.lock_in_background.message", fallback: "Passepartout is locked")
public static let message = Strings.tr("Localizable", "views.settings.rows.lock_in_background.message", fallback: "Passepartout is locked")
}
}
internal enum Sections {
/// Lock
internal static let lock = Strings.tr("Localizable", "views.settings.sections.lock", fallback: "Lock")
}
}
}
}

View File

@ -17,6 +17,7 @@
"global.disconnect" = "Disconnect";
"global.domain" = "Domain";
"global.done" = "Done";
"global.do_not_ask_again" = "Don't ask again";
"global.duplicate" = "Duplicate";
"global.edit" = "Edit";
"global.empty" = "Empty";
@ -120,7 +121,7 @@
"views.profile.rows.add_module" = "Add module";
"views.profile.module_list.section.footer" = "Drag modules to rearrange them, as their order determines priority.";
"views.settings.sections.lock" = "Lock";
"views.settings.rows.confirm_quit" = "Confirm quit";
"views.settings.rows.lock_in_background" = "Lock in background";
"views.settings.rows.lock_in_background.message" = "Passepartout is locked";
@ -207,6 +208,9 @@
"alerts.iap.restricted.title" = "Restricted";
"alerts.iap.restricted.message" = "The requested feature is unavailable in this build.";
"alerts.confirm_quit.title" = "Quit %@";
"alerts.confirm_quit.message" = "The VPN, if enabled, will still run in the background. Do you want to quit?";
// MARK: - Errors
"errors.app.empty_profile_name" = "Profile name is empty.";

View File

@ -28,6 +28,9 @@ import SwiftUI
public struct SettingsView: View {
@AppStorage(AppPreference.confirmsQuit.key)
private var confirmsQuit = true
@AppStorage(AppPreference.locksInBackground.key)
private var locksInBackground = false
@ -40,9 +43,12 @@ public struct SettingsView: View {
public var body: some View {
Form {
Section {
#if os(macOS)
confirmsQuitToggle
#endif
#if os(iOS)
lockInBackgroundToggle
} header: {
Text(Strings.Views.Settings.Sections.lock)
#endif
}
}
.themeForm()
@ -55,6 +61,10 @@ public struct SettingsView: View {
}
private extension SettingsView {
var confirmsQuitToggle: some View {
Toggle(Strings.Views.Settings.Rows.confirmQuit, isOn: $confirmsQuit)
}
var lockInBackgroundToggle: some View {
Toggle(Strings.Views.Settings.Rows.lockInBackground, isOn: $locksInBackground)
}

View File

@ -26,6 +26,8 @@
import Foundation
public enum AppPreference: String {
case confirmsQuit
case locksInBackground
case logsPrivateData

View File

@ -7,3 +7,4 @@ strings:
params:
bundle: Bundle.main
enumName: Strings
publicAccess: true