diff --git a/Passepartout.xcodeproj/project.pbxproj b/Passepartout.xcodeproj/project.pbxproj index be512e3b..e3135b89 100644 --- a/Passepartout.xcodeproj/project.pbxproj +++ b/Passepartout.xcodeproj/project.pbxproj @@ -59,7 +59,6 @@ 0E36D25C224034AD006AF062 /* ShortcutsConnectToViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E36D25B224034AD006AF062 /* ShortcutsConnectToViewController.swift */; }; 0E3CAFC0229AAE770008E5C8 /* Intents.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = 0E3CAFAD229AAE760008E5C8 /* Intents.intentdefinition */; }; 0E3CAFC4229AAF8E0008E5C8 /* API in Resources */ = {isa = PBXBuildFile; fileRef = 0E3CAFC3229AAF8E0008E5C8 /* API */; }; - 0E45E6E422BD799700F19312 /* SwiftGen+Strings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E45E6E322BD799700F19312 /* SwiftGen+Strings.swift */; }; 0E45E71022BE108100F19312 /* OpenVPNOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E45E70F22BE108100F19312 /* OpenVPNOptions.swift */; }; 0E4B0D6B2366E3C100C890B4 /* PurchaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E4B0D6A2366E3C000C890B4 /* PurchaseViewController.swift */; }; 0E4B0D742366E6C800C890B4 /* Purchase.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0E4B0D762366E6C800C890B4 /* Purchase.storyboard */; }; @@ -99,7 +98,6 @@ 0E52037A259F593B00CBAB56 /* WindowManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E569F92259F41690022DFB8 /* WindowManager.swift */; }; 0E52037B259F593B00CBAB56 /* IssueReporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E569F8F259F41690022DFB8 /* IssueReporter.swift */; }; 0E52037C259F593B00CBAB56 /* Theme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E569FA1259F41690022DFB8 /* Theme.swift */; }; - 0E52037D259F593B00CBAB56 /* SwiftGen+Strings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E569F9C259F41690022DFB8 /* SwiftGen+Strings.swift */; }; 0E52037E259F593B00CBAB56 /* SwiftGen+Segues.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E569FA5259F41690022DFB8 /* SwiftGen+Segues.swift */; }; 0E52037F259F593B00CBAB56 /* Theme+Views.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E569F9A259F41690022DFB8 /* Theme+Views.swift */; }; 0E520381259F593B00CBAB56 /* NSTextView+Search.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E569F94259F41690022DFB8 /* NSTextView+Search.swift */; }; @@ -117,8 +115,6 @@ 0E52047C259F642600CBAB56 /* Service.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0E569F83259F41690022DFB8 /* Service.storyboard */; }; 0E52047D259F642600CBAB56 /* Preferences.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0E569F81259F41690022DFB8 /* Preferences.storyboard */; }; 0E5204A7259F66F700CBAB56 /* PassepartoutCore.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E31529D223F9EF500F61841 /* PassepartoutCore.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0E5204A9259F673000CBAB56 /* Core.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0E3CAF98229AAE760008E5C8 /* Core.strings */; }; - 0E5204AA259F673100CBAB56 /* Core.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0E3CAF98229AAE760008E5C8 /* Core.strings */; }; 0E5204AF259F673D00CBAB56 /* ApplicationError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E6BE13920CFB76800A6DD36 /* ApplicationError.swift */; }; 0E5204B0259F673D00CBAB56 /* Issue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E569F14259F2D3E0022DFB8 /* Issue.swift */; }; 0E5204B1259F673D00CBAB56 /* GroupConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EDE8DED20C93E4C004C739C /* GroupConstants.swift */; }; @@ -219,6 +215,10 @@ 0ED38AEC2141260D0004D387 /* ConfigurationModificationDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ED38AEB2141260D0004D387 /* ConfigurationModificationDelegate.swift */; }; 0ED993B1223FF8C700B0F9C9 /* IntentDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ED993B0223FF8C700B0F9C9 /* IntentDispatcher.swift */; }; 0EDE8DC820C86910004C739C /* PassepartoutTunnel.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 0EDE8DBF20C86910004C739C /* PassepartoutTunnel.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 0EE247F326C114F60080A4CE /* Core.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0E3CAF98229AAE760008E5C8 /* Core.strings */; }; + 0EE247F426C114F70080A4CE /* Core.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0E3CAF98229AAE760008E5C8 /* Core.strings */; }; + 0EE247F626C115890080A4CE /* SwiftGen+Strings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE247F526C115890080A4CE /* SwiftGen+Strings.swift */; }; + 0EE247F726C115890080A4CE /* SwiftGen+Strings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE247F526C115890080A4CE /* SwiftGen+Strings.swift */; }; 0EE3BBB2215ED3A900F30952 /* AboutViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE3BBB1215ED3A900F30952 /* AboutViewController.swift */; }; 0EEDC551C74496360E09994F /* Pods_ios_Passepartout_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E070D15674A07F40A22BFA7E /* Pods_ios_Passepartout_iOS.framework */; }; 0EF56BBB2185AC8500B0C8AB /* SwiftGen+Segues.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EF56BBA2185AC8500B0C8AB /* SwiftGen+Segues.swift */; }; @@ -392,7 +392,6 @@ 0E3CAFB3229AAE760008E5C8 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Core.strings; sourceTree = ""; }; 0E3CAFB5229AAE760008E5C8 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Core.strings; sourceTree = ""; }; 0E3CAFC3229AAF8E0008E5C8 /* API */ = {isa = PBXFileReference; lastKnownFileType = folder; path = API; sourceTree = ""; }; - 0E45E6E322BD799700F19312 /* SwiftGen+Strings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SwiftGen+Strings.swift"; sourceTree = ""; }; 0E45E70F22BE108100F19312 /* OpenVPNOptions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenVPNOptions.swift; sourceTree = ""; }; 0E4B0D6A2366E3C000C890B4 /* PurchaseViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PurchaseViewController.swift; sourceTree = ""; }; 0E4B0D752366E6C800C890B4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Purchase.storyboard; sourceTree = ""; }; @@ -457,7 +456,6 @@ 0E569F97259F41690022DFB8 /* TextInputViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextInputViewController.swift; sourceTree = ""; }; 0E569F98259F41690022DFB8 /* SwiftGen+Assets.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SwiftGen+Assets.swift"; sourceTree = ""; }; 0E569F9A259F41690022DFB8 /* Theme+Views.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Theme+Views.swift"; sourceTree = ""; }; - 0E569F9C259F41690022DFB8 /* SwiftGen+Strings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SwiftGen+Strings.swift"; sourceTree = ""; }; 0E569F9D259F41690022DFB8 /* SwiftGen+Scenes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SwiftGen+Scenes.swift"; sourceTree = ""; }; 0E569FA1259F41690022DFB8 /* Theme.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Theme.swift; sourceTree = ""; }; 0E569FA4259F41690022DFB8 /* Credits.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = Credits.html; sourceTree = ""; }; @@ -556,6 +554,7 @@ 0EDE8DE320C89028004C739C /* SwiftGen+Scenes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SwiftGen+Scenes.swift"; sourceTree = ""; }; 0EDE8DE620C93945004C739C /* Credentials.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Credentials.swift; sourceTree = ""; }; 0EDE8DED20C93E4C004C739C /* GroupConstants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupConstants.swift; sourceTree = ""; }; + 0EE247F526C115890080A4CE /* SwiftGen+Strings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SwiftGen+Strings.swift"; sourceTree = ""; }; 0EE3BBB1215ED3A900F30952 /* AboutViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutViewController.swift; sourceTree = ""; }; 0EF56BBA2185AC8500B0C8AB /* SwiftGen+Segues.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SwiftGen+Segues.swift"; sourceTree = ""; }; 0EFB901722764689006405E4 /* ProfileNetworkSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileNetworkSettings.swift; sourceTree = ""; }; @@ -864,7 +863,6 @@ 0E569F98259F41690022DFB8 /* SwiftGen+Assets.swift */, 0E569F9D259F41690022DFB8 /* SwiftGen+Scenes.swift */, 0E569FA5259F41690022DFB8 /* SwiftGen+Segues.swift */, - 0E569F9C259F41690022DFB8 /* SwiftGen+Strings.swift */, 0E569F97259F41690022DFB8 /* TextInputViewController.swift */, 0E569FA1259F41690022DFB8 /* Theme.swift */, 0E569F9A259F41690022DFB8 /* Theme+Views.swift */, @@ -1061,7 +1059,6 @@ 0ECC60DD2256B6890020BEAC /* SwiftGen+Assets.swift */, 0EDE8DE320C89028004C739C /* SwiftGen+Scenes.swift */, 0EF56BBA2185AC8500B0C8AB /* SwiftGen+Segues.swift */, - 0E45E6E322BD799700F19312 /* SwiftGen+Strings.swift */, 0E05C61C20D27C82006EE732 /* Theme.swift */, 0ECEE44F20E1182E00A6BB43 /* Theme+Cells.swift */, 0E2B493F20FCFF990094784C /* Theme+Titles.swift */, @@ -1081,6 +1078,7 @@ 0E6BE13920CFB76800A6DD36 /* ApplicationError.swift */, 0EDE8DED20C93E4C004C739C /* GroupConstants.swift */, 0E569F14259F2D3E0022DFB8 /* Issue.swift */, + 0EE247F526C115890080A4CE /* SwiftGen+Strings.swift */, 0E4FD7ED20D539A0002221FF /* Utils.swift */, ); path = Sources; @@ -1477,6 +1475,7 @@ buildActionMask = 2147483647; files = ( 0E3CAFC4229AAF8E0008E5C8 /* API in Resources */, + 0EE247F326C114F60080A4CE /* Core.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1493,7 +1492,6 @@ 0E52047C259F642600CBAB56 /* Service.storyboard in Resources */, 0E52032B259F58DD00CBAB56 /* TextTableView.xib in Resources */, 0E52047B259F642600CBAB56 /* Main.storyboard in Resources */, - 0E5204AA259F673100CBAB56 /* Core.strings in Resources */, 0E520334259F58F500CBAB56 /* OrganizerProfileTableView.xib in Resources */, 0E9AAABE259F7FFF003FAFF1 /* PassepartoutLauncher.app in Resources */, 0E52031E259F58BF00CBAB56 /* Assets.xcassets in Resources */, @@ -1514,6 +1512,7 @@ buildActionMask = 2147483647; files = ( 0E5204E5259F67A000CBAB56 /* API in Resources */, + 0EE247F426C114F70080A4CE /* Core.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1521,7 +1520,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 0E5204A9259F673000CBAB56 /* Core.strings in Resources */, 0E36D25822403469006AF062 /* Shortcuts.storyboard in Resources */, 0E0C0729236087A100155AAC /* InfoPlist.strings in Resources */, 0ED38ADA213F44D00004D387 /* Organizer.storyboard in Resources */, @@ -1824,6 +1822,7 @@ files = ( 0E3152BD223FA03D00F61841 /* GroupConstants.swift in Sources */, 0ECEB10A224FECEA00E9E551 /* DataUnit.swift in Sources */, + 0EE247F626C115890080A4CE /* SwiftGen+Strings.swift in Sources */, 0E66A270225FE25800F9C779 /* PoolCategory.swift in Sources */, 0E533B162258E03B00EF94FC /* PoolGroup.swift in Sources */, 0E3152D2223FA05400F61841 /* DebugLog.swift in Sources */, @@ -1878,7 +1877,6 @@ 0E520355259F590600CBAB56 /* DebugLogViewController.swift in Sources */, 0E52034A259F58FE00CBAB56 /* DefaultGatewayViewController.swift in Sources */, 0E520345259F58FE00CBAB56 /* DNSViewController.swift in Sources */, - 0E52037D259F593B00CBAB56 /* SwiftGen+Strings.swift in Sources */, 0E520320259F58BF00CBAB56 /* AppDelegate.swift in Sources */, 0E520344259F58FE00CBAB56 /* TrustedNetworksAddViewController.swift in Sources */, 0E52033A259F58F500CBAB56 /* AccountViewController.swift in Sources */, @@ -1946,6 +1944,7 @@ 0E5204B0259F673D00CBAB56 /* Issue.swift in Sources */, 0E5204CB259F675400CBAB56 /* EndpointDataSource.swift in Sources */, 0E5204DE259F675400CBAB56 /* OpenVPNOptions.swift in Sources */, + 0EE247F726C115890080A4CE /* SwiftGen+Strings.swift in Sources */, 0E5204C5259F675400CBAB56 /* ProviderConnectionProfile.swift in Sources */, 0E5204D0259F675400CBAB56 /* Infrastructure.swift in Sources */, 0E5204D4259F675400CBAB56 /* ConnectionService.swift in Sources */, @@ -1971,7 +1970,6 @@ 0EE3BBB2215ED3A900F30952 /* AboutViewController.swift in Sources */, 0EBE3A79213C4E5500BFA2F5 /* OrganizerViewController.swift in Sources */, 0E4FD7F120D58618002221FF /* Macros.swift in Sources */, - 0E45E6E422BD799700F19312 /* SwiftGen+Strings.swift in Sources */, 0E05C5D720D1645F006EE732 /* ToggleTableViewCell.swift in Sources */, 0EFB901A2276D7F1006405E4 /* NetworkSettingsViewController.swift in Sources */, 0E05C5D420D1645F006EE732 /* FieldTableViewCell.swift in Sources */, diff --git a/Passepartout/App/iOS/CHANGELOG.md b/Passepartout/App/iOS/CHANGELOG.md index 777df8df..7614970f 100644 --- a/Passepartout/App/iOS/CHANGELOG.md +++ b/Passepartout/App/iOS/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Fixed + +- Missing account guidance footer in some providers. + ## 1.16.0 (2021-08-09) ### Added diff --git a/Passepartout/App/iOS/Global/SwiftGen+Strings.swift b/Passepartout/App/iOS/Global/SwiftGen+Strings.swift deleted file mode 100644 index 89db1ec4..00000000 --- a/Passepartout/App/iOS/Global/SwiftGen+Strings.swift +++ /dev/null @@ -1,1289 +0,0 @@ -// swiftlint:disable all -// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen - -import Foundation - -// swiftlint:disable superfluous_disable_command file_length implicit_return - -// MARK: - Strings - -// 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 L10n { - - internal enum About { - /// About - internal static let title = L10n.tr("Core", "about.title") - internal enum Cells { - internal enum Credits { - /// Credits - internal static let caption = L10n.tr("Core", "about.cells.credits.caption") - } - internal enum Disclaimer { - /// Disclaimer - internal static let caption = L10n.tr("Core", "about.cells.disclaimer.caption") - } - internal enum Faq { - /// FAQ - internal static let caption = L10n.tr("Core", "about.cells.faq.caption") - } - internal enum PrivacyPolicy { - /// Privacy policy - internal static let caption = L10n.tr("Core", "about.cells.privacy_policy.caption") - } - internal enum ShareGeneric { - /// Invite a friend - internal static let caption = L10n.tr("Core", "about.cells.share_generic.caption") - } - internal enum ShareTwitter { - /// Tweet about it! - internal static let caption = L10n.tr("Core", "about.cells.share_twitter.caption") - } - internal enum Website { - /// Home page - internal static let caption = L10n.tr("Core", "about.cells.website.caption") - } - } - internal enum Sections { - internal enum Share { - /// Share - internal static let header = L10n.tr("Core", "about.sections.share.header") - } - internal enum Web { - /// Web - internal static let header = L10n.tr("Core", "about.sections.web.header") - } - } - } - - internal enum Account { - /// Account - internal static let title = L10n.tr("Core", "account.title") - internal enum Cells { - internal enum OpenGuide { - /// See your credentials - internal static let caption = L10n.tr("Core", "account.cells.open_guide.caption") - } - internal enum Password { - /// Password - internal static let caption = L10n.tr("Core", "account.cells.password.caption") - /// secret - internal static let placeholder = L10n.tr("Core", "account.cells.password.placeholder") - } - internal enum Signup { - /// Register with %@ - internal static func caption(_ p1: Any) -> String { - return L10n.tr("Core", "account.cells.signup.caption", String(describing: p1)) - } - } - internal enum Username { - /// Username - internal static let caption = L10n.tr("Core", "account.cells.username.caption") - /// username - internal static let placeholder = L10n.tr("Core", "account.cells.username.placeholder") - } - } - internal enum Sections { - internal enum Credentials { - /// Credentials - internal static let header = L10n.tr("Core", "account.sections.credentials.header") - } - internal enum Guidance { - internal enum Footer { - internal enum Infrastructure { - /// Use your %@ website credentials. Your username is usually numeric (without spaces). - internal static func mullvad(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.mullvad", String(describing: p1)) - } - /// Use your %@ website credentials. Your username is usually your e-mail. - internal static func nordvpn(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.nordvpn", String(describing: p1)) - } - /// Use your %@ website credentials. Your username is usually numeric with a "p" prefix. - internal static func pia(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.pia", String(describing: p1)) - } - /// Find your %@ credentials in the "Account > OpenVPN / IKEv2 Username" section of the website. - internal static func protonvpn(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.protonvpn", String(describing: p1)) - } - /// Use your %@ website credentials. Your username is usually your e-mail. - internal static func tunnelbear(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.tunnelbear", String(describing: p1)) - } - /// Use your %@ website credentials. Your username is usually your e-mail. - internal static func vyprvpn(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.vyprvpn", String(describing: p1)) - } - /// Find your %@ credentials in the OpenVPN Config Generator on the website. - internal static func windscribe(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.windscribe", String(describing: p1)) - } - internal enum Default { - /// Use your %@ service credentials, which may differ from website credentials. - internal static func specific(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.default.specific", String(describing: p1)) - } - /// Use your %@ website credentials. - internal static func web(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.default.web", String(describing: p1)) - } - } - } - } - } - internal enum Registration { - /// Go get an account on the %@ website. - internal static func footer(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.registration.footer", String(describing: p1)) - } - } - } - } - - internal enum Configuration { - /// Configuration - internal static let title = L10n.tr("Core", "configuration.title") - internal enum Alerts { - internal enum Commit { - /// New parameters will not be effective until you reconnect manually. Changes in trusted networks will apply immediately. - internal static let message = L10n.tr("Core", "configuration.alerts.commit.message") - internal enum Buttons { - /// Reconnect now - internal static let reconnect = L10n.tr("Core", "configuration.alerts.commit.buttons.reconnect") - /// Skip - internal static let skip = L10n.tr("Core", "configuration.alerts.commit.buttons.skip") - } - } - } - internal enum Cells { - internal enum Cipher { - /// Cipher - internal static let caption = L10n.tr("Core", "configuration.cells.cipher.caption") - } - internal enum Client { - /// Client certificate - internal static let caption = L10n.tr("Core", "configuration.cells.client.caption") - internal enum Value { - /// Not verified - internal static let disabled = L10n.tr("Core", "configuration.cells.client.value.disabled") - /// Verified - internal static let enabled = L10n.tr("Core", "configuration.cells.client.value.enabled") - } - } - internal enum CompressionAlgorithm { - /// Algorithm - internal static let caption = L10n.tr("Core", "configuration.cells.compression_algorithm.caption") - internal enum Value { - /// LZO - internal static let lzo = L10n.tr("Core", "configuration.cells.compression_algorithm.value.lzo") - /// Unsupported - internal static let other = L10n.tr("Core", "configuration.cells.compression_algorithm.value.other") - } - } - internal enum CompressionFraming { - /// Framing - internal static let caption = L10n.tr("Core", "configuration.cells.compression_framing.caption") - internal enum Value { - /// --compress - internal static let compress = L10n.tr("Core", "configuration.cells.compression_framing.value.compress") - /// --comp-lzo - internal static let lzo = L10n.tr("Core", "configuration.cells.compression_framing.value.lzo") - } - } - internal enum Digest { - /// Authentication - internal static let caption = L10n.tr("Core", "configuration.cells.digest.caption") - internal enum Value { - /// Embedded - internal static let embedded = L10n.tr("Core", "configuration.cells.digest.value.embedded") - } - } - internal enum Eku { - /// Extended verification - internal static let caption = L10n.tr("Core", "configuration.cells.eku.caption") - } - internal enum KeepAlive { - /// Keep-alive - internal static let caption = L10n.tr("Core", "configuration.cells.keep_alive.caption") - internal enum Value { - /// %d seconds - internal static func seconds(_ p1: Int) -> String { - return L10n.tr("Core", "configuration.cells.keep_alive.value.seconds", p1) - } - } - } - internal enum RandomEndpoint { - /// Randomize endpoint - internal static let caption = L10n.tr("Core", "configuration.cells.random_endpoint.caption") - } - internal enum RenegotiationSeconds { - /// Renegotiation - internal static let caption = L10n.tr("Core", "configuration.cells.renegotiation_seconds.caption") - internal enum Value { - /// after %@ - internal static func after(_ p1: Any) -> String { - return L10n.tr("Core", "configuration.cells.renegotiation_seconds.value.after", String(describing: p1)) - } - } - } - internal enum ResetOriginal { - /// Reset configuration - internal static let caption = L10n.tr("Core", "configuration.cells.reset_original.caption") - } - internal enum TlsWrapping { - /// Wrapping - internal static let caption = L10n.tr("Core", "configuration.cells.tls_wrapping.caption") - internal enum Value { - /// Authentication - internal static let auth = L10n.tr("Core", "configuration.cells.tls_wrapping.value.auth") - /// Encryption - internal static let crypt = L10n.tr("Core", "configuration.cells.tls_wrapping.value.crypt") - } - } - } - internal enum Sections { - internal enum Communication { - /// Communication - internal static let header = L10n.tr("Core", "configuration.sections.communication.header") - } - internal enum Compression { - /// Compression - internal static let header = L10n.tr("Core", "configuration.sections.compression.header") - } - internal enum Network { - /// Network - internal static let header = L10n.tr("Core", "configuration.sections.network.header") - } - internal enum Other { - /// Other - internal static let header = L10n.tr("Core", "configuration.sections.other.header") - } - internal enum Reset { - /// If you ended up with broken connectivity after changing the communication parameters, tap to revert to the original configuration. - internal static let footer = L10n.tr("Core", "configuration.sections.reset.footer") - } - internal enum Tls { - /// TLS - internal static let header = L10n.tr("Core", "configuration.sections.tls.header") - } - } - } - - internal enum Credits { - /// Credits - internal static let title = L10n.tr("Core", "credits.title") - internal enum Sections { - internal enum Licenses { - /// Licenses - internal static let header = L10n.tr("Core", "credits.sections.licenses.header") - } - internal enum Notices { - /// Notices - internal static let header = L10n.tr("Core", "credits.sections.notices.header") - } - internal enum Translations { - /// Translations - internal static let header = L10n.tr("Core", "credits.sections.translations.header") - } - } - } - - internal enum DebugLog { - internal enum Alerts { - internal enum EmptyLog { - /// The debug log is empty. - internal static let message = L10n.tr("Core", "debug_log.alerts.empty_log.message") - } - } - internal enum Buttons { - /// Copy - internal static let copy = L10n.tr("Core", "debug_log.buttons.copy") - /// Next - internal static let next = L10n.tr("Core", "debug_log.buttons.next") - /// Previous - internal static let previous = L10n.tr("Core", "debug_log.buttons.previous") - } - } - - internal enum Donation { - /// Donate - internal static let title = L10n.tr("Core", "donation.title") - internal enum Alerts { - internal enum Purchase { - internal enum Failure { - /// Unable to perform the donation. %@ - internal static func message(_ p1: Any) -> String { - return L10n.tr("Core", "donation.alerts.purchase.failure.message", String(describing: p1)) - } - } - internal enum Success { - /// This means a lot to me and I really hope you keep using and promoting this app. - internal static let message = L10n.tr("Core", "donation.alerts.purchase.success.message") - /// Thank you - internal static let title = L10n.tr("Core", "donation.alerts.purchase.success.title") - } - } - } - internal enum Cells { - internal enum Loading { - /// Loading donations - internal static let caption = L10n.tr("Core", "donation.cells.loading.caption") - } - internal enum Purchasing { - /// Performing donation - internal static let caption = L10n.tr("Core", "donation.cells.purchasing.caption") - } - } - internal enum Sections { - internal enum OneTime { - /// If you want to display gratitude for my free work, here are a couple amounts you can donate instantly.\n\nYou will only be charged once per donation, and you can donate multiple times. - internal static let footer = L10n.tr("Core", "donation.sections.one_time.footer") - /// One time - internal static let header = L10n.tr("Core", "donation.sections.one_time.header") - } - } - } - - internal enum Endpoint { - /// Endpoint - internal static let title = L10n.tr("Core", "endpoint.title") - internal enum Cells { - /// Address - internal static let address = L10n.tr("Core", "endpoint.cells.address") - /// Protocol - internal static let `protocol` = L10n.tr("Core", "endpoint.cells.protocol") - internal enum AnyAddress { - /// Automatic - internal static let caption = L10n.tr("Core", "endpoint.cells.any_address.caption") - } - internal enum AnyProtocol { - /// Automatic - internal static let caption = L10n.tr("Core", "endpoint.cells.any_protocol.caption") - } - } - internal enum Sections { - internal enum LocationAddresses { - /// Addresses - internal static let header = L10n.tr("Core", "endpoint.sections.location_addresses.header") - } - internal enum LocationProtocols { - /// Protocols - internal static let header = L10n.tr("Core", "endpoint.sections.location_protocols.header") - } - } - } - - internal enum Global { - /// Cancel - internal static let cancel = L10n.tr("Core", "global.cancel") - /// Close - internal static let close = L10n.tr("Core", "global.close") - /// No e-mail account is configured. - internal static let emailNotConfigured = L10n.tr("Core", "global.email_not_configured") - /// Next - internal static let next = L10n.tr("Core", "global.next") - /// OK - internal static let ok = L10n.tr("Core", "global.ok") - internal enum Captions { - /// Address - internal static let address = L10n.tr("Core", "global.captions.address") - /// Port - internal static let port = L10n.tr("Core", "global.captions.port") - /// Protocol - internal static let `protocol` = L10n.tr("Core", "global.captions.protocol") - } - internal enum Host { - internal enum TitleInput { - /// Acceptable characters are alphanumerics plus dash "-", underscore "_" and dot ".". - internal static let message = L10n.tr("Core", "global.host.title_input.message") - /// My profile - internal static let placeholder = L10n.tr("Core", "global.host.title_input.placeholder") - } - } - internal enum Values { - /// Automatic - internal static let automatic = L10n.tr("Core", "global.values.automatic") - /// Default - internal static let `default` = L10n.tr("Core", "global.values.default") - /// Disabled - internal static let disabled = L10n.tr("Core", "global.values.disabled") - /// Enabled - internal static let enabled = L10n.tr("Core", "global.values.enabled") - /// Manual - internal static let manual = L10n.tr("Core", "global.values.manual") - /// None - internal static let `none` = L10n.tr("Core", "global.values.none") - } - } - - internal enum ImportedHosts { - /// Imported hosts - internal static let title = L10n.tr("Core", "imported_hosts.title") - } - - internal enum IssueReporter { - /// The debug log of your latest connections is crucial to resolve your connectivity issues and is completely anonymous.\n\nThe .ovpn configuration file, if any, is attached stripped of any sensitive data.\n\nPlease double check the e-mail attachments if unsure. - internal static let message = L10n.tr("Core", "issue_reporter.message") - /// Report issue - internal static let title = L10n.tr("Core", "issue_reporter.title") - internal enum Buttons { - /// I understand - internal static let accept = L10n.tr("Core", "issue_reporter.buttons.accept") - } - } - - internal enum Label { - internal enum License { - /// Unable to download full license content. - internal static let error = L10n.tr("Core", "label.license.error") - } - } - - internal enum Menu { - internal enum ActiveProfile { - internal enum Items { - internal enum Customize { - /// Customize... - internal static let title = L10n.tr("Core", "menu.active_profile.items.customize.title") - } - } - internal enum Messages { - /// No account configured - internal static let missingCredentials = L10n.tr("Core", "menu.active_profile.messages.missing_credentials") - } - internal enum Title { - /// No active profile - internal static let `none` = L10n.tr("Core", "menu.active_profile.title.none") - } - } - internal enum Organizer { - /// Organizer - internal static let title = L10n.tr("Core", "menu.organizer.title") - } - internal enum Preferences { - /// Preferences - internal static let title = L10n.tr("Core", "menu.preferences.title") - } - internal enum Quit { - /// Quit %@ - internal static func title(_ p1: Any) -> String { - return L10n.tr("Core", "menu.quit.title", String(describing: p1)) - } - internal enum Messages { - /// The VPN, if enabled, will still run in the background. Do you want to quit? - internal static let confirm = L10n.tr("Core", "menu.quit.messages.confirm") - } - } - internal enum Show { - /// Show - internal static let title = L10n.tr("Core", "menu.show.title") - } - internal enum Support { - /// Support - internal static let title = L10n.tr("Core", "menu.support.title") - } - internal enum SwitchProfile { - /// Active profile - internal static let title = L10n.tr("Core", "menu.switch_profile.title") - } - } - - internal enum NetworkChoice { - /// Read .ovpn - internal static let client = L10n.tr("Core", "network_choice.client") - /// Pull from server - internal static let server = L10n.tr("Core", "network_choice.server") - } - - internal enum NetworkSettings { - /// Network settings - internal static let title = L10n.tr("Core", "network_settings.title") - internal enum Cells { - internal enum AddDnsDomain { - /// Add search domain - internal static let caption = L10n.tr("Core", "network_settings.cells.add_dns_domain.caption") - } - internal enum AddDnsServer { - /// Add address - internal static let caption = L10n.tr("Core", "network_settings.cells.add_dns_server.caption") - } - internal enum AddProxyBypass { - /// Add bypass domain - internal static let caption = L10n.tr("Core", "network_settings.cells.add_proxy_bypass.caption") - } - internal enum ProxyBypass { - /// Bypass domain - internal static let caption = L10n.tr("Core", "network_settings.cells.proxy_bypass.caption") - } - } - internal enum Dns { - /// DNS - internal static let title = L10n.tr("Core", "network_settings.dns.title") - internal enum Cells { - internal enum Addresses { - /// Servers - internal static let title = L10n.tr("Core", "network_settings.dns.cells.addresses.title") - } - internal enum Domain { - /// Domain - internal static let caption = L10n.tr("Core", "network_settings.dns.cells.domain.caption") - } - internal enum Domains { - /// Domains - internal static let title = L10n.tr("Core", "network_settings.dns.cells.domains.title") - } - } - } - internal enum Gateway { - /// Default gateway - internal static let title = L10n.tr("Core", "network_settings.gateway.title") - } - internal enum Mtu { - /// MTU - internal static let title = L10n.tr("Core", "network_settings.mtu.title") - internal enum Cells { - internal enum Bytes { - /// Bytes - internal static let caption = L10n.tr("Core", "network_settings.mtu.cells.bytes.caption") - } - } - } - internal enum Proxy { - /// Proxy - internal static let title = L10n.tr("Core", "network_settings.proxy.title") - internal enum Cells { - internal enum BypassDomains { - /// Bypass domains - internal static let title = L10n.tr("Core", "network_settings.proxy.cells.bypass_domains.title") - } - } - } - } - - internal enum Organizer { - /// %@ - internal static func title(_ p1: Any) -> String { - return L10n.tr("Core", "organizer.title", String(describing: p1)) - } - internal enum Alerts { - internal enum AddHost { - /// Open an URL to an .ovpn configuration file from Safari, Mail or another app to set up a host profile.\n\nYou can also import an .ovpn with iTunes File Sharing. - internal static let message = L10n.tr("Core", "organizer.alerts.add_host.message") - } - internal enum CannotDonate { - /// There is no payment method configured on this device. - internal static let message = L10n.tr("Core", "organizer.alerts.cannot_donate.message") - } - internal enum DeleteVpnProfile { - /// Do you really want to erase the VPN configuration from your device settings? This may fix some broken VPN states and will not affect your provider and host profiles. - internal static let message = L10n.tr("Core", "organizer.alerts.delete_vpn_profile.message") - } - internal enum ExhaustedProviders { - /// You have created profiles for any available provider. - internal static let message = L10n.tr("Core", "organizer.alerts.exhausted_providers.message") - } - internal enum OpenHostFile { - /// Select an .ovpn file - internal static let title = L10n.tr("Core", "organizer.alerts.open_host_file.title") - } - internal enum RemoveProfile { - /// Are you sure you want to delete profile %@? - internal static func message(_ p1: Any) -> String { - return L10n.tr("Core", "organizer.alerts.remove_profile.message", String(describing: p1)) - } - /// Remove profile - internal static let title = L10n.tr("Core", "organizer.alerts.remove_profile.title") - } - } - internal enum Cells { - internal enum About { - /// About %@ - internal static func caption(_ p1: Any) -> String { - return L10n.tr("Core", "organizer.cells.about.caption", String(describing: p1)) - } - } - internal enum AddHost { - /// Add from Files - internal static let caption = L10n.tr("Core", "organizer.cells.add_host.caption") - } - internal enum AddProvider { - /// Add new provider - internal static let caption = L10n.tr("Core", "organizer.cells.add_provider.caption") - } - internal enum Donate { - /// Make a donation - internal static let caption = L10n.tr("Core", "organizer.cells.donate.caption") - } - internal enum FollowTwitch { - /// Watch Passepartout on Twitch - internal static let caption = L10n.tr("Core", "organizer.cells.follow_twitch.caption") - } - internal enum GithubSponsors { - /// Support me on GitHub - internal static let caption = L10n.tr("Core", "organizer.cells.github_sponsors.caption") - } - internal enum ImportHost { - /// Add from imported - internal static let caption = L10n.tr("Core", "organizer.cells.import_host.caption") - } - internal enum JoinCommunity { - /// Join community - internal static let caption = L10n.tr("Core", "organizer.cells.join_community.caption") - } - internal enum Profile { - internal enum Value { - /// In use - internal static let current = L10n.tr("Core", "organizer.cells.profile.value.current") - } - } - internal enum SiriShortcuts { - /// Manage shortcuts - internal static let caption = L10n.tr("Core", "organizer.cells.siri_shortcuts.caption") - } - internal enum Translate { - /// Offer to translate - internal static let caption = L10n.tr("Core", "organizer.cells.translate.caption") - } - internal enum Uninstall { - /// Remove VPN configuration - internal static let caption = L10n.tr("Core", "organizer.cells.uninstall.caption") - } - internal enum WriteReview { - /// Write a review - internal static let caption = L10n.tr("Core", "organizer.cells.write_review.caption") - } - } - internal enum Menus { - /// Host - internal static let host = L10n.tr("Core", "organizer.menus.host") - /// Provider - internal static let provider = L10n.tr("Core", "organizer.menus.provider") - internal enum Provider { - /// No providers left - internal static let unavailable = L10n.tr("Core", "organizer.menus.provider.unavailable") - } - } - internal enum Sections { - internal enum Feedback { - /// Feedback - internal static let header = L10n.tr("Core", "organizer.sections.feedback.header") - } - internal enum Hosts { - /// Import hosts from raw .ovpn configuration files. - internal static let footer = L10n.tr("Core", "organizer.sections.hosts.footer") - /// Hosts - internal static let header = L10n.tr("Core", "organizer.sections.hosts.header") - } - internal enum Providers { - /// Here you find a few providers with preset configuration profiles. - internal static let footer = L10n.tr("Core", "organizer.sections.providers.footer") - /// Providers - internal static let header = L10n.tr("Core", "organizer.sections.providers.header") - } - internal enum Siri { - /// Get help from Siri to speed up your most common interactions with the app. - internal static let footer = L10n.tr("Core", "organizer.sections.siri.footer") - /// Siri - internal static let header = L10n.tr("Core", "organizer.sections.siri.header") - } - internal enum Support { - /// Support - internal static let header = L10n.tr("Core", "organizer.sections.support.header") - } - internal enum Twitch { - /// Come watch me make Passepartout live on Twitch, join the chat to interact and contribute! - internal static let footer = L10n.tr("Core", "organizer.sections.twitch.footer") - /// Twitch - internal static let header = L10n.tr("Core", "organizer.sections.twitch.header") - } - } - } - - internal enum ParsedFile { - internal enum Alerts { - internal enum Buttons { - /// Report an issue - internal static let report = L10n.tr("Core", "parsed_file.alerts.buttons.report") - } - internal enum Decryption { - /// The configuration contains an encrypted private key and it could not be decrypted. Double check your entered passphrase. - internal static let message = L10n.tr("Core", "parsed_file.alerts.decryption.message") - } - internal enum EncryptionPassphrase { - /// Please enter the encryption passphrase. - internal static let message = L10n.tr("Core", "parsed_file.alerts.encryption_passphrase.message") - } - internal enum Malformed { - /// The configuration file contains a malformed option (%@). - internal static func message(_ p1: Any) -> String { - return L10n.tr("Core", "parsed_file.alerts.malformed.message", String(describing: p1)) - } - } - internal enum Missing { - /// The configuration file lacks a required option (%@). - internal static func message(_ p1: Any) -> String { - return L10n.tr("Core", "parsed_file.alerts.missing.message", String(describing: p1)) - } - } - internal enum Parsing { - /// Unable to parse the provided configuration file (%@). - internal static func message(_ p1: Any) -> String { - return L10n.tr("Core", "parsed_file.alerts.parsing.message", String(describing: p1)) - } - } - internal enum PotentiallyUnsupported { - /// The configuration file is correct but contains a potentially unsupported option (%@).\n\nConnectivity may break depending on server settings. - internal static func message(_ p1: Any) -> String { - return L10n.tr("Core", "parsed_file.alerts.potentially_unsupported.message", String(describing: p1)) - } - } - internal enum Unsupported { - /// The configuration file contains an unsupported option (%@). - internal static func message(_ p1: Any) -> String { - return L10n.tr("Core", "parsed_file.alerts.unsupported.message", String(describing: p1)) - } - } - } - } - - internal enum Preferences { - /// Preferences - internal static let title = L10n.tr("Core", "preferences.title") - internal enum Cells { - internal enum ConfirmQuit { - /// Confirm quit - internal static let caption = L10n.tr("Core", "preferences.cells.confirm_quit.caption") - /// Check to present a quit confirmation alert. - internal static let footer = L10n.tr("Core", "preferences.cells.confirm_quit.footer") - } - internal enum LaunchesOnLogin { - /// Launch on login - internal static let caption = L10n.tr("Core", "preferences.cells.launches_on_login.caption") - /// Check to automatically launch the app on boot or login. - internal static let footer = L10n.tr("Core", "preferences.cells.launches_on_login.footer") - } - } - internal enum Sections { - internal enum General { - /// General - internal static let header = L10n.tr("Core", "preferences.sections.general.header") - } - } - } - - internal enum Provider { - internal enum Pool { - internal enum Actions { - /// Favorite - internal static let favorite = L10n.tr("Core", "provider.pool.actions.favorite") - /// Unfavorite - internal static let unfavorite = L10n.tr("Core", "provider.pool.actions.unfavorite") - } - internal enum Sections { - internal enum EmptyFavorites { - /// Swipe left on a location to add or remove it from Favorites. - internal static let footer = L10n.tr("Core", "provider.pool.sections.empty_favorites.footer") - } - } - } - internal enum Preset { - internal enum Cells { - internal enum TechDetails { - /// Technical details - internal static let caption = L10n.tr("Core", "provider.preset.cells.tech_details.caption") - } - } - } - } - - internal enum Purchase { - /// Purchase - internal static let title = L10n.tr("Core", "purchase.title") - internal enum Cells { - internal enum FullVersion { - /// All providers (including future ones)\n%@ - internal static func extraDescription(_ p1: Any) -> String { - return L10n.tr("Core", "purchase.cells.full_version.extra_description", String(describing: p1)) - } - } - internal enum Restore { - /// If you bought this app or feature in the past, you can restore your purchases and this screen won't show again. - internal static let description = L10n.tr("Core", "purchase.cells.restore.description") - /// Restore purchases - internal static let title = L10n.tr("Core", "purchase.cells.restore.title") - } - } - internal enum Sections { - internal enum Products { - /// Every product is a one-time purchase. Provider purchases do not include a VPN subscription. - internal static let footer = L10n.tr("Core", "purchase.sections.products.footer") - } - } - } - - internal enum Reddit { - /// Did you know that Passepartout has a subreddit? Subscribe for updates or to discuss issues, features, new platforms or whatever you like.\n\nIt's also a great way to show you care about this project. - internal static let message = L10n.tr("Core", "reddit.message") - /// Reddit - internal static let title = L10n.tr("Core", "reddit.title") - internal enum Buttons { - /// Don't ask again - internal static let never = L10n.tr("Core", "reddit.buttons.never") - /// Remind me later - internal static let remind = L10n.tr("Core", "reddit.buttons.remind") - /// Subscribe now! - internal static let subscribe = L10n.tr("Core", "reddit.buttons.subscribe") - } - } - - internal enum ServerNetwork { - internal enum Cells { - internal enum Route { - /// Route - internal static let caption = L10n.tr("Core", "server_network.cells.route.caption") - } - } - } - - internal enum Service { - internal enum Alerts { - internal enum Buttons { - /// Reconnect - internal static let reconnect = L10n.tr("Core", "service.alerts.buttons.reconnect") - } - internal enum Configuration { - /// Configuration unavailable, make sure you are connected to the VPN. - internal static let disconnected = L10n.tr("Core", "service.alerts.configuration.disconnected") - } - internal enum CredentialsNeeded { - /// You need to enter account credentials first. - internal static let message = L10n.tr("Core", "service.alerts.credentials_needed.message") - } - internal enum Download { - /// Failed to download configuration files. %@ - internal static func failed(_ p1: Any) -> String { - return L10n.tr("Core", "service.alerts.download.failed", String(describing: p1)) - } - /// %@ requires the download of additional configuration files.\n\nConfirm to start the download. - internal static func message(_ p1: Any) -> String { - return L10n.tr("Core", "service.alerts.download.message", String(describing: p1)) - } - /// Download required - internal static let title = L10n.tr("Core", "service.alerts.download.title") - internal enum Hud { - /// Extracting files, please be patient... - internal static let extracting = L10n.tr("Core", "service.alerts.download.hud.extracting") - } - } - internal enum Location { - internal enum Button { - /// Settings - internal static let settings = L10n.tr("Core", "service.alerts.location.button.settings") - } - internal enum Message { - /// You must allow location access to trust this Wi-Fi network. Go to iOS settings and review your location permissions for Passepartout. - internal static let denied = L10n.tr("Core", "service.alerts.location.message.denied") - } - } - internal enum MasksPrivateData { - internal enum Messages { - /// In order to safely reset the current debug log and apply the new masking preference, you must reconnect to the VPN now. - internal static let mustReconnect = L10n.tr("Core", "service.alerts.masks_private_data.messages.must_reconnect") - } - } - internal enum ReconnectVpn { - /// Do you want to reconnect to the VPN? - internal static let message = L10n.tr("Core", "service.alerts.reconnect_vpn.message") - } - internal enum Rename { - /// Rename profile - internal static let title = L10n.tr("Core", "service.alerts.rename.title") - } - internal enum TestConnectivity { - /// Connectivity - internal static let title = L10n.tr("Core", "service.alerts.test_connectivity.title") - internal enum Messages { - /// Your device has no Internet connectivity, please review your profile parameters. - internal static let failure = L10n.tr("Core", "service.alerts.test_connectivity.messages.failure") - /// Your device is connected to the Internet! - internal static let success = L10n.tr("Core", "service.alerts.test_connectivity.messages.success") - } - } - internal enum Trusted { - internal enum NoNetwork { - /// You are not connected to any Wi-Fi network. - internal static let message = L10n.tr("Core", "service.alerts.trusted.no_network.message") - } - internal enum WillDisconnectPolicy { - /// By changing the trust policy, the VPN may be disconnected. Continue? - internal static let message = L10n.tr("Core", "service.alerts.trusted.will_disconnect_policy.message") - } - internal enum WillDisconnectTrusted { - /// By trusting this network, the VPN may be disconnected. Continue? - internal static let message = L10n.tr("Core", "service.alerts.trusted.will_disconnect_trusted.message") - } - } - } - internal enum Cells { - internal enum Addresses { - /// Addresses - internal static let caption = L10n.tr("Core", "service.cells.addresses.caption") - } - internal enum Category { - /// Category - internal static let caption = L10n.tr("Core", "service.cells.category.caption") - } - internal enum ConnectionStatus { - /// Status - internal static let caption = L10n.tr("Core", "service.cells.connection_status.caption") - } - internal enum DataCount { - /// Exchanged data - internal static let caption = L10n.tr("Core", "service.cells.data_count.caption") - /// Unavailable - internal static let `none` = L10n.tr("Core", "service.cells.data_count.none") - } - internal enum DebugLog { - /// Debug log - internal static let caption = L10n.tr("Core", "service.cells.debug_log.caption") - } - internal enum Host { - internal enum Parameters { - /// Parameters - internal static let caption = L10n.tr("Core", "service.cells.host.parameters.caption") - } - } - internal enum MasksPrivateData { - /// Mask network data - internal static let caption = L10n.tr("Core", "service.cells.masks_private_data.caption") - } - internal enum OnlyShowsFavorites { - /// Only show favorite locations - internal static let caption = L10n.tr("Core", "service.cells.only_shows_favorites.caption") - } - internal enum Provider { - internal enum Pool { - /// Location - internal static let caption = L10n.tr("Core", "service.cells.provider.pool.caption") - } - internal enum Preset { - /// Preset - internal static let caption = L10n.tr("Core", "service.cells.provider.preset.caption") - } - internal enum Refresh { - /// Refresh infrastructure - internal static let caption = L10n.tr("Core", "service.cells.provider.refresh.caption") - } - } - internal enum Reconnect { - /// Reconnect - internal static let caption = L10n.tr("Core", "service.cells.reconnect.caption") - } - internal enum ReportIssue { - /// Report connectivity issue - internal static let caption = L10n.tr("Core", "service.cells.report_issue.caption") - } - internal enum ServerConfiguration { - /// Server configuration - internal static let caption = L10n.tr("Core", "service.cells.server_configuration.caption") - } - internal enum ServerNetwork { - /// Server network - internal static let caption = L10n.tr("Core", "service.cells.server_network.caption") - } - internal enum TestConnectivity { - /// Test connectivity - internal static let caption = L10n.tr("Core", "service.cells.test_connectivity.caption") - } - internal enum TrustedAddWifi { - /// Add Wi-Fi - internal static let caption = L10n.tr("Core", "service.cells.trusted_add_wifi.caption") - } - internal enum TrustedMobile { - /// Cellular network - internal static let caption = L10n.tr("Core", "service.cells.trusted_mobile.caption") - } - internal enum TrustedPolicy { - /// Trust disables VPN - internal static let caption = L10n.tr("Core", "service.cells.trusted_policy.caption") - } - internal enum UseProfile { - /// Use this profile - internal static let caption = L10n.tr("Core", "service.cells.use_profile.caption") - } - internal enum Vpn { - internal enum TurnOff { - /// Disable VPN - internal static let caption = L10n.tr("Core", "service.cells.vpn.turn_off.caption") - } - internal enum TurnOn { - /// Enable VPN - internal static let caption = L10n.tr("Core", "service.cells.vpn.turn_on.caption") - } - } - internal enum VpnResolvesHostname { - /// Resolve provider hostname - internal static let caption = L10n.tr("Core", "service.cells.vpn_resolves_hostname.caption") - } - internal enum VpnService { - /// Enabled - internal static let caption = L10n.tr("Core", "service.cells.vpn_service.caption") - } - internal enum VpnSurvivesSleep { - /// Keep alive on sleep - internal static let caption = L10n.tr("Core", "service.cells.vpn_survives_sleep.caption") - } - } - internal enum Sections { - internal enum Configuration { - /// Configuration - internal static let header = L10n.tr("Core", "service.sections.configuration.header") - } - internal enum Diagnostics { - /// Masking status will be effective after reconnecting. Network data are hostnames, IP addresses, routing, SSID. Credentials and private keys are not logged regardless. - internal static let footer = L10n.tr("Core", "service.sections.diagnostics.footer") - /// Diagnostics - internal static let header = L10n.tr("Core", "service.sections.diagnostics.header") - } - internal enum ProviderInfrastructure { - /// Last updated on %@. - internal static func footer(_ p1: Any) -> String { - return L10n.tr("Core", "service.sections.provider_infrastructure.footer", String(describing: p1)) - } - } - internal enum Status { - /// Connection - internal static let header = L10n.tr("Core", "service.sections.status.header") - } - internal enum Trusted { - /// When entering a trusted network, the VPN is normally shut down and kept disconnected. Disable this option to not enforce such behavior. - internal static let footer = L10n.tr("Core", "service.sections.trusted.footer") - /// Trusted networks - internal static let header = L10n.tr("Core", "service.sections.trusted.header") - } - internal enum Vpn { - /// The connection will be established whenever necessary. - internal static let footer = L10n.tr("Core", "service.sections.vpn.footer") - /// VPN - internal static let header = L10n.tr("Core", "service.sections.vpn.header") - } - internal enum VpnResolvesHostname { - /// Preferred in most networks and required in some IPv6 networks. Disable where DNS is blocked, or to speed up negotiation when DNS is slow to respond. - internal static let footer = L10n.tr("Core", "service.sections.vpn_resolves_hostname.footer") - } - internal enum VpnSurvivesSleep { - /// Disable to improve battery usage, at the expense of occasional slowdowns due to wake-up reconnections. - internal static let footer = L10n.tr("Core", "service.sections.vpn_survives_sleep.footer") - } - } - internal enum Welcome { - /// Welcome to Passepartout!\n\nUse the organizer to add a new profile. - internal static let message = L10n.tr("Core", "service.welcome.message") - } - } - - internal enum Share { - /// Passepartout is an user-friendly, open source OpenVPN client for iOS and macOS - internal static let message = L10n.tr("Core", "share.message") - } - - internal enum Shortcuts { - internal enum Add { - /// Add shortcut - internal static let title = L10n.tr("Core", "shortcuts.add.title") - internal enum Alerts { - internal enum NoProfiles { - /// There is no profile to connect to. - internal static let message = L10n.tr("Core", "shortcuts.add.alerts.no_profiles.message") - } - } - internal enum Cells { - internal enum Connect { - /// Connect to - internal static let caption = L10n.tr("Core", "shortcuts.add.cells.connect.caption") - } - internal enum DisableVpn { - /// Disable VPN - internal static let caption = L10n.tr("Core", "shortcuts.add.cells.disable_vpn.caption") - } - internal enum EnableVpn { - /// Enable VPN - internal static let caption = L10n.tr("Core", "shortcuts.add.cells.enable_vpn.caption") - } - internal enum TrustCellular { - /// Trust cellular network - internal static let caption = L10n.tr("Core", "shortcuts.add.cells.trust_cellular.caption") - } - internal enum TrustCurrentWifi { - /// Trust current Wi-Fi - internal static let caption = L10n.tr("Core", "shortcuts.add.cells.trust_current_wifi.caption") - } - internal enum UntrustCellular { - /// Untrust cellular network - internal static let caption = L10n.tr("Core", "shortcuts.add.cells.untrust_cellular.caption") - } - internal enum UntrustCurrentWifi { - /// Untrust current Wi-Fi - internal static let caption = L10n.tr("Core", "shortcuts.add.cells.untrust_current_wifi.caption") - } - } - internal enum Sections { - internal enum Cellular { - /// Cellular - internal static let header = L10n.tr("Core", "shortcuts.add.sections.cellular.header") - } - internal enum Vpn { - /// VPN - internal static let header = L10n.tr("Core", "shortcuts.add.sections.vpn.header") - } - internal enum Wifi { - /// Wi-Fi - internal static let header = L10n.tr("Core", "shortcuts.add.sections.wifi.header") - } - } - } - internal enum Edit { - /// Manage shortcuts - internal static let title = L10n.tr("Core", "shortcuts.edit.title") - internal enum Cells { - internal enum AddShortcut { - /// Add shortcut - internal static let caption = L10n.tr("Core", "shortcuts.edit.cells.add_shortcut.caption") - } - } - internal enum Sections { - internal enum All { - /// Existing shortcuts - internal static let header = L10n.tr("Core", "shortcuts.edit.sections.all.header") - } - } - } - } - - internal enum Translations { - /// Translations - internal static let title = L10n.tr("Core", "translations.title") - } - - internal enum Trusted { - internal enum Columns { - internal enum Trust { - /// Trust - internal static let title = L10n.tr("Core", "trusted.columns.trust.title") - } - } - internal enum Ethernet { - /// Check to trust any wired cable connection. - internal static let description = L10n.tr("Core", "trusted.ethernet.description") - /// Trust wired connections - internal static let title = L10n.tr("Core", "trusted.ethernet.title") - } - } - - internal enum Version { - /// Version - internal static let title = L10n.tr("Core", "version.title") - internal enum Labels { - /// Passepartout and TunnelKit are written and maintained by Davide De Rosa (keeshux).\n\nSource code for Passepartout and TunnelKit is publicly available on GitHub under the GPLv3, you can find links in the home page.\n\nPassepartout is a non-official client and is in no way affiliated with OpenVPN Inc. - internal static let intro = L10n.tr("Core", "version.labels.intro") - } - } - - internal enum Vpn { - /// Active - internal static let active = L10n.tr("Core", "vpn.active") - /// Connecting - internal static let connecting = L10n.tr("Core", "vpn.connecting") - /// Disabled - internal static let disabled = L10n.tr("Core", "vpn.disabled") - /// Disconnecting - internal static let disconnecting = L10n.tr("Core", "vpn.disconnecting") - /// Inactive - internal static let inactive = L10n.tr("Core", "vpn.inactive") - /// Off - internal static let unused = L10n.tr("Core", "vpn.unused") - internal enum Errors { - /// Auth failed - internal static let auth = L10n.tr("Core", "vpn.errors.auth") - /// Compression unsupported - internal static let compression = L10n.tr("Core", "vpn.errors.compression") - /// DNS failed - internal static let dns = L10n.tr("Core", "vpn.errors.dns") - /// Encryption failed - internal static let encryption = L10n.tr("Core", "vpn.errors.encryption") - /// No gateway - internal static let gateway = L10n.tr("Core", "vpn.errors.gateway") - /// Network changed - internal static let network = L10n.tr("Core", "vpn.errors.network") - /// Missing routing - internal static let routing = L10n.tr("Core", "vpn.errors.routing") - /// Server shutdown - internal static let shutdown = L10n.tr("Core", "vpn.errors.shutdown") - /// Timeout - internal static let timeout = L10n.tr("Core", "vpn.errors.timeout") - /// TLS failed - internal static let tls = L10n.tr("Core", "vpn.errors.tls") - } - } - - internal enum Wizards { - internal enum Host { - internal enum Alerts { - internal enum Existing { - /// A host profile with the same title already exists. Replace it? - internal static let message = L10n.tr("Core", "wizards.host.alerts.existing.message") - } - } - internal enum Cells { - internal enum TitleInput { - /// Title - internal static let caption = L10n.tr("Core", "wizards.host.cells.title_input.caption") - } - } - internal enum Sections { - internal enum Existing { - /// Existing profiles - internal static let header = L10n.tr("Core", "wizards.host.sections.existing.header") - } - } - } - internal enum Provider { - internal enum Alerts { - internal enum Unavailable { - /// Could not download provider infrastructure, please retry later. - internal static let message = L10n.tr("Core", "wizards.provider.alerts.unavailable.message") - } - } - internal enum Cells { - internal enum UpdateList { - /// Update list - internal static let caption = L10n.tr("Core", "wizards.provider.cells.update_list.caption") - } - } - } - } -} -// swiftlint:enable explicit_type_interface function_parameter_count identifier_name line_length -// swiftlint:enable nesting type_body_length type_name vertical_whitespace_opening_braces - -// MARK: - Implementation Details - -extension L10n { - private static func tr(_ table: String, _ key: String, _ args: CVarArg...) -> String { - let format = BundleToken.bundle.localizedString(forKey: key, value: nil, table: table) - return String(format: format, locale: Locale.current, arguments: args) - } -} - -// swiftlint:disable convenience_type -private final class BundleToken { - static let bundle: Bundle = { - #if SWIFT_PACKAGE - return Bundle.module - #else - return Bundle(for: BundleToken.self) - #endif - }() -} -// swiftlint:enable convenience_type diff --git a/Passepartout/App/iOS/swiftgen.yml b/Passepartout/App/iOS/swiftgen.yml index fb50ec8b..759455ea 100644 --- a/Passepartout/App/iOS/swiftgen.yml +++ b/Passepartout/App/iOS/swiftgen.yml @@ -1,10 +1,3 @@ -strings: - inputs: - - ../../Core/Resources/en.lproj/Core.strings - outputs: - - templateName: structured-swift4 - output: Global/SwiftGen+Strings.swift - ib: inputs: - Base.lproj/About.storyboard diff --git a/Passepartout/App/macOS/Global/SwiftGen+Strings.swift b/Passepartout/App/macOS/Global/SwiftGen+Strings.swift deleted file mode 100644 index 89db1ec4..00000000 --- a/Passepartout/App/macOS/Global/SwiftGen+Strings.swift +++ /dev/null @@ -1,1289 +0,0 @@ -// swiftlint:disable all -// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen - -import Foundation - -// swiftlint:disable superfluous_disable_command file_length implicit_return - -// MARK: - Strings - -// 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 L10n { - - internal enum About { - /// About - internal static let title = L10n.tr("Core", "about.title") - internal enum Cells { - internal enum Credits { - /// Credits - internal static let caption = L10n.tr("Core", "about.cells.credits.caption") - } - internal enum Disclaimer { - /// Disclaimer - internal static let caption = L10n.tr("Core", "about.cells.disclaimer.caption") - } - internal enum Faq { - /// FAQ - internal static let caption = L10n.tr("Core", "about.cells.faq.caption") - } - internal enum PrivacyPolicy { - /// Privacy policy - internal static let caption = L10n.tr("Core", "about.cells.privacy_policy.caption") - } - internal enum ShareGeneric { - /// Invite a friend - internal static let caption = L10n.tr("Core", "about.cells.share_generic.caption") - } - internal enum ShareTwitter { - /// Tweet about it! - internal static let caption = L10n.tr("Core", "about.cells.share_twitter.caption") - } - internal enum Website { - /// Home page - internal static let caption = L10n.tr("Core", "about.cells.website.caption") - } - } - internal enum Sections { - internal enum Share { - /// Share - internal static let header = L10n.tr("Core", "about.sections.share.header") - } - internal enum Web { - /// Web - internal static let header = L10n.tr("Core", "about.sections.web.header") - } - } - } - - internal enum Account { - /// Account - internal static let title = L10n.tr("Core", "account.title") - internal enum Cells { - internal enum OpenGuide { - /// See your credentials - internal static let caption = L10n.tr("Core", "account.cells.open_guide.caption") - } - internal enum Password { - /// Password - internal static let caption = L10n.tr("Core", "account.cells.password.caption") - /// secret - internal static let placeholder = L10n.tr("Core", "account.cells.password.placeholder") - } - internal enum Signup { - /// Register with %@ - internal static func caption(_ p1: Any) -> String { - return L10n.tr("Core", "account.cells.signup.caption", String(describing: p1)) - } - } - internal enum Username { - /// Username - internal static let caption = L10n.tr("Core", "account.cells.username.caption") - /// username - internal static let placeholder = L10n.tr("Core", "account.cells.username.placeholder") - } - } - internal enum Sections { - internal enum Credentials { - /// Credentials - internal static let header = L10n.tr("Core", "account.sections.credentials.header") - } - internal enum Guidance { - internal enum Footer { - internal enum Infrastructure { - /// Use your %@ website credentials. Your username is usually numeric (without spaces). - internal static func mullvad(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.mullvad", String(describing: p1)) - } - /// Use your %@ website credentials. Your username is usually your e-mail. - internal static func nordvpn(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.nordvpn", String(describing: p1)) - } - /// Use your %@ website credentials. Your username is usually numeric with a "p" prefix. - internal static func pia(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.pia", String(describing: p1)) - } - /// Find your %@ credentials in the "Account > OpenVPN / IKEv2 Username" section of the website. - internal static func protonvpn(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.protonvpn", String(describing: p1)) - } - /// Use your %@ website credentials. Your username is usually your e-mail. - internal static func tunnelbear(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.tunnelbear", String(describing: p1)) - } - /// Use your %@ website credentials. Your username is usually your e-mail. - internal static func vyprvpn(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.vyprvpn", String(describing: p1)) - } - /// Find your %@ credentials in the OpenVPN Config Generator on the website. - internal static func windscribe(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.windscribe", String(describing: p1)) - } - internal enum Default { - /// Use your %@ service credentials, which may differ from website credentials. - internal static func specific(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.default.specific", String(describing: p1)) - } - /// Use your %@ website credentials. - internal static func web(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.default.web", String(describing: p1)) - } - } - } - } - } - internal enum Registration { - /// Go get an account on the %@ website. - internal static func footer(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.registration.footer", String(describing: p1)) - } - } - } - } - - internal enum Configuration { - /// Configuration - internal static let title = L10n.tr("Core", "configuration.title") - internal enum Alerts { - internal enum Commit { - /// New parameters will not be effective until you reconnect manually. Changes in trusted networks will apply immediately. - internal static let message = L10n.tr("Core", "configuration.alerts.commit.message") - internal enum Buttons { - /// Reconnect now - internal static let reconnect = L10n.tr("Core", "configuration.alerts.commit.buttons.reconnect") - /// Skip - internal static let skip = L10n.tr("Core", "configuration.alerts.commit.buttons.skip") - } - } - } - internal enum Cells { - internal enum Cipher { - /// Cipher - internal static let caption = L10n.tr("Core", "configuration.cells.cipher.caption") - } - internal enum Client { - /// Client certificate - internal static let caption = L10n.tr("Core", "configuration.cells.client.caption") - internal enum Value { - /// Not verified - internal static let disabled = L10n.tr("Core", "configuration.cells.client.value.disabled") - /// Verified - internal static let enabled = L10n.tr("Core", "configuration.cells.client.value.enabled") - } - } - internal enum CompressionAlgorithm { - /// Algorithm - internal static let caption = L10n.tr("Core", "configuration.cells.compression_algorithm.caption") - internal enum Value { - /// LZO - internal static let lzo = L10n.tr("Core", "configuration.cells.compression_algorithm.value.lzo") - /// Unsupported - internal static let other = L10n.tr("Core", "configuration.cells.compression_algorithm.value.other") - } - } - internal enum CompressionFraming { - /// Framing - internal static let caption = L10n.tr("Core", "configuration.cells.compression_framing.caption") - internal enum Value { - /// --compress - internal static let compress = L10n.tr("Core", "configuration.cells.compression_framing.value.compress") - /// --comp-lzo - internal static let lzo = L10n.tr("Core", "configuration.cells.compression_framing.value.lzo") - } - } - internal enum Digest { - /// Authentication - internal static let caption = L10n.tr("Core", "configuration.cells.digest.caption") - internal enum Value { - /// Embedded - internal static let embedded = L10n.tr("Core", "configuration.cells.digest.value.embedded") - } - } - internal enum Eku { - /// Extended verification - internal static let caption = L10n.tr("Core", "configuration.cells.eku.caption") - } - internal enum KeepAlive { - /// Keep-alive - internal static let caption = L10n.tr("Core", "configuration.cells.keep_alive.caption") - internal enum Value { - /// %d seconds - internal static func seconds(_ p1: Int) -> String { - return L10n.tr("Core", "configuration.cells.keep_alive.value.seconds", p1) - } - } - } - internal enum RandomEndpoint { - /// Randomize endpoint - internal static let caption = L10n.tr("Core", "configuration.cells.random_endpoint.caption") - } - internal enum RenegotiationSeconds { - /// Renegotiation - internal static let caption = L10n.tr("Core", "configuration.cells.renegotiation_seconds.caption") - internal enum Value { - /// after %@ - internal static func after(_ p1: Any) -> String { - return L10n.tr("Core", "configuration.cells.renegotiation_seconds.value.after", String(describing: p1)) - } - } - } - internal enum ResetOriginal { - /// Reset configuration - internal static let caption = L10n.tr("Core", "configuration.cells.reset_original.caption") - } - internal enum TlsWrapping { - /// Wrapping - internal static let caption = L10n.tr("Core", "configuration.cells.tls_wrapping.caption") - internal enum Value { - /// Authentication - internal static let auth = L10n.tr("Core", "configuration.cells.tls_wrapping.value.auth") - /// Encryption - internal static let crypt = L10n.tr("Core", "configuration.cells.tls_wrapping.value.crypt") - } - } - } - internal enum Sections { - internal enum Communication { - /// Communication - internal static let header = L10n.tr("Core", "configuration.sections.communication.header") - } - internal enum Compression { - /// Compression - internal static let header = L10n.tr("Core", "configuration.sections.compression.header") - } - internal enum Network { - /// Network - internal static let header = L10n.tr("Core", "configuration.sections.network.header") - } - internal enum Other { - /// Other - internal static let header = L10n.tr("Core", "configuration.sections.other.header") - } - internal enum Reset { - /// If you ended up with broken connectivity after changing the communication parameters, tap to revert to the original configuration. - internal static let footer = L10n.tr("Core", "configuration.sections.reset.footer") - } - internal enum Tls { - /// TLS - internal static let header = L10n.tr("Core", "configuration.sections.tls.header") - } - } - } - - internal enum Credits { - /// Credits - internal static let title = L10n.tr("Core", "credits.title") - internal enum Sections { - internal enum Licenses { - /// Licenses - internal static let header = L10n.tr("Core", "credits.sections.licenses.header") - } - internal enum Notices { - /// Notices - internal static let header = L10n.tr("Core", "credits.sections.notices.header") - } - internal enum Translations { - /// Translations - internal static let header = L10n.tr("Core", "credits.sections.translations.header") - } - } - } - - internal enum DebugLog { - internal enum Alerts { - internal enum EmptyLog { - /// The debug log is empty. - internal static let message = L10n.tr("Core", "debug_log.alerts.empty_log.message") - } - } - internal enum Buttons { - /// Copy - internal static let copy = L10n.tr("Core", "debug_log.buttons.copy") - /// Next - internal static let next = L10n.tr("Core", "debug_log.buttons.next") - /// Previous - internal static let previous = L10n.tr("Core", "debug_log.buttons.previous") - } - } - - internal enum Donation { - /// Donate - internal static let title = L10n.tr("Core", "donation.title") - internal enum Alerts { - internal enum Purchase { - internal enum Failure { - /// Unable to perform the donation. %@ - internal static func message(_ p1: Any) -> String { - return L10n.tr("Core", "donation.alerts.purchase.failure.message", String(describing: p1)) - } - } - internal enum Success { - /// This means a lot to me and I really hope you keep using and promoting this app. - internal static let message = L10n.tr("Core", "donation.alerts.purchase.success.message") - /// Thank you - internal static let title = L10n.tr("Core", "donation.alerts.purchase.success.title") - } - } - } - internal enum Cells { - internal enum Loading { - /// Loading donations - internal static let caption = L10n.tr("Core", "donation.cells.loading.caption") - } - internal enum Purchasing { - /// Performing donation - internal static let caption = L10n.tr("Core", "donation.cells.purchasing.caption") - } - } - internal enum Sections { - internal enum OneTime { - /// If you want to display gratitude for my free work, here are a couple amounts you can donate instantly.\n\nYou will only be charged once per donation, and you can donate multiple times. - internal static let footer = L10n.tr("Core", "donation.sections.one_time.footer") - /// One time - internal static let header = L10n.tr("Core", "donation.sections.one_time.header") - } - } - } - - internal enum Endpoint { - /// Endpoint - internal static let title = L10n.tr("Core", "endpoint.title") - internal enum Cells { - /// Address - internal static let address = L10n.tr("Core", "endpoint.cells.address") - /// Protocol - internal static let `protocol` = L10n.tr("Core", "endpoint.cells.protocol") - internal enum AnyAddress { - /// Automatic - internal static let caption = L10n.tr("Core", "endpoint.cells.any_address.caption") - } - internal enum AnyProtocol { - /// Automatic - internal static let caption = L10n.tr("Core", "endpoint.cells.any_protocol.caption") - } - } - internal enum Sections { - internal enum LocationAddresses { - /// Addresses - internal static let header = L10n.tr("Core", "endpoint.sections.location_addresses.header") - } - internal enum LocationProtocols { - /// Protocols - internal static let header = L10n.tr("Core", "endpoint.sections.location_protocols.header") - } - } - } - - internal enum Global { - /// Cancel - internal static let cancel = L10n.tr("Core", "global.cancel") - /// Close - internal static let close = L10n.tr("Core", "global.close") - /// No e-mail account is configured. - internal static let emailNotConfigured = L10n.tr("Core", "global.email_not_configured") - /// Next - internal static let next = L10n.tr("Core", "global.next") - /// OK - internal static let ok = L10n.tr("Core", "global.ok") - internal enum Captions { - /// Address - internal static let address = L10n.tr("Core", "global.captions.address") - /// Port - internal static let port = L10n.tr("Core", "global.captions.port") - /// Protocol - internal static let `protocol` = L10n.tr("Core", "global.captions.protocol") - } - internal enum Host { - internal enum TitleInput { - /// Acceptable characters are alphanumerics plus dash "-", underscore "_" and dot ".". - internal static let message = L10n.tr("Core", "global.host.title_input.message") - /// My profile - internal static let placeholder = L10n.tr("Core", "global.host.title_input.placeholder") - } - } - internal enum Values { - /// Automatic - internal static let automatic = L10n.tr("Core", "global.values.automatic") - /// Default - internal static let `default` = L10n.tr("Core", "global.values.default") - /// Disabled - internal static let disabled = L10n.tr("Core", "global.values.disabled") - /// Enabled - internal static let enabled = L10n.tr("Core", "global.values.enabled") - /// Manual - internal static let manual = L10n.tr("Core", "global.values.manual") - /// None - internal static let `none` = L10n.tr("Core", "global.values.none") - } - } - - internal enum ImportedHosts { - /// Imported hosts - internal static let title = L10n.tr("Core", "imported_hosts.title") - } - - internal enum IssueReporter { - /// The debug log of your latest connections is crucial to resolve your connectivity issues and is completely anonymous.\n\nThe .ovpn configuration file, if any, is attached stripped of any sensitive data.\n\nPlease double check the e-mail attachments if unsure. - internal static let message = L10n.tr("Core", "issue_reporter.message") - /// Report issue - internal static let title = L10n.tr("Core", "issue_reporter.title") - internal enum Buttons { - /// I understand - internal static let accept = L10n.tr("Core", "issue_reporter.buttons.accept") - } - } - - internal enum Label { - internal enum License { - /// Unable to download full license content. - internal static let error = L10n.tr("Core", "label.license.error") - } - } - - internal enum Menu { - internal enum ActiveProfile { - internal enum Items { - internal enum Customize { - /// Customize... - internal static let title = L10n.tr("Core", "menu.active_profile.items.customize.title") - } - } - internal enum Messages { - /// No account configured - internal static let missingCredentials = L10n.tr("Core", "menu.active_profile.messages.missing_credentials") - } - internal enum Title { - /// No active profile - internal static let `none` = L10n.tr("Core", "menu.active_profile.title.none") - } - } - internal enum Organizer { - /// Organizer - internal static let title = L10n.tr("Core", "menu.organizer.title") - } - internal enum Preferences { - /// Preferences - internal static let title = L10n.tr("Core", "menu.preferences.title") - } - internal enum Quit { - /// Quit %@ - internal static func title(_ p1: Any) -> String { - return L10n.tr("Core", "menu.quit.title", String(describing: p1)) - } - internal enum Messages { - /// The VPN, if enabled, will still run in the background. Do you want to quit? - internal static let confirm = L10n.tr("Core", "menu.quit.messages.confirm") - } - } - internal enum Show { - /// Show - internal static let title = L10n.tr("Core", "menu.show.title") - } - internal enum Support { - /// Support - internal static let title = L10n.tr("Core", "menu.support.title") - } - internal enum SwitchProfile { - /// Active profile - internal static let title = L10n.tr("Core", "menu.switch_profile.title") - } - } - - internal enum NetworkChoice { - /// Read .ovpn - internal static let client = L10n.tr("Core", "network_choice.client") - /// Pull from server - internal static let server = L10n.tr("Core", "network_choice.server") - } - - internal enum NetworkSettings { - /// Network settings - internal static let title = L10n.tr("Core", "network_settings.title") - internal enum Cells { - internal enum AddDnsDomain { - /// Add search domain - internal static let caption = L10n.tr("Core", "network_settings.cells.add_dns_domain.caption") - } - internal enum AddDnsServer { - /// Add address - internal static let caption = L10n.tr("Core", "network_settings.cells.add_dns_server.caption") - } - internal enum AddProxyBypass { - /// Add bypass domain - internal static let caption = L10n.tr("Core", "network_settings.cells.add_proxy_bypass.caption") - } - internal enum ProxyBypass { - /// Bypass domain - internal static let caption = L10n.tr("Core", "network_settings.cells.proxy_bypass.caption") - } - } - internal enum Dns { - /// DNS - internal static let title = L10n.tr("Core", "network_settings.dns.title") - internal enum Cells { - internal enum Addresses { - /// Servers - internal static let title = L10n.tr("Core", "network_settings.dns.cells.addresses.title") - } - internal enum Domain { - /// Domain - internal static let caption = L10n.tr("Core", "network_settings.dns.cells.domain.caption") - } - internal enum Domains { - /// Domains - internal static let title = L10n.tr("Core", "network_settings.dns.cells.domains.title") - } - } - } - internal enum Gateway { - /// Default gateway - internal static let title = L10n.tr("Core", "network_settings.gateway.title") - } - internal enum Mtu { - /// MTU - internal static let title = L10n.tr("Core", "network_settings.mtu.title") - internal enum Cells { - internal enum Bytes { - /// Bytes - internal static let caption = L10n.tr("Core", "network_settings.mtu.cells.bytes.caption") - } - } - } - internal enum Proxy { - /// Proxy - internal static let title = L10n.tr("Core", "network_settings.proxy.title") - internal enum Cells { - internal enum BypassDomains { - /// Bypass domains - internal static let title = L10n.tr("Core", "network_settings.proxy.cells.bypass_domains.title") - } - } - } - } - - internal enum Organizer { - /// %@ - internal static func title(_ p1: Any) -> String { - return L10n.tr("Core", "organizer.title", String(describing: p1)) - } - internal enum Alerts { - internal enum AddHost { - /// Open an URL to an .ovpn configuration file from Safari, Mail or another app to set up a host profile.\n\nYou can also import an .ovpn with iTunes File Sharing. - internal static let message = L10n.tr("Core", "organizer.alerts.add_host.message") - } - internal enum CannotDonate { - /// There is no payment method configured on this device. - internal static let message = L10n.tr("Core", "organizer.alerts.cannot_donate.message") - } - internal enum DeleteVpnProfile { - /// Do you really want to erase the VPN configuration from your device settings? This may fix some broken VPN states and will not affect your provider and host profiles. - internal static let message = L10n.tr("Core", "organizer.alerts.delete_vpn_profile.message") - } - internal enum ExhaustedProviders { - /// You have created profiles for any available provider. - internal static let message = L10n.tr("Core", "organizer.alerts.exhausted_providers.message") - } - internal enum OpenHostFile { - /// Select an .ovpn file - internal static let title = L10n.tr("Core", "organizer.alerts.open_host_file.title") - } - internal enum RemoveProfile { - /// Are you sure you want to delete profile %@? - internal static func message(_ p1: Any) -> String { - return L10n.tr("Core", "organizer.alerts.remove_profile.message", String(describing: p1)) - } - /// Remove profile - internal static let title = L10n.tr("Core", "organizer.alerts.remove_profile.title") - } - } - internal enum Cells { - internal enum About { - /// About %@ - internal static func caption(_ p1: Any) -> String { - return L10n.tr("Core", "organizer.cells.about.caption", String(describing: p1)) - } - } - internal enum AddHost { - /// Add from Files - internal static let caption = L10n.tr("Core", "organizer.cells.add_host.caption") - } - internal enum AddProvider { - /// Add new provider - internal static let caption = L10n.tr("Core", "organizer.cells.add_provider.caption") - } - internal enum Donate { - /// Make a donation - internal static let caption = L10n.tr("Core", "organizer.cells.donate.caption") - } - internal enum FollowTwitch { - /// Watch Passepartout on Twitch - internal static let caption = L10n.tr("Core", "organizer.cells.follow_twitch.caption") - } - internal enum GithubSponsors { - /// Support me on GitHub - internal static let caption = L10n.tr("Core", "organizer.cells.github_sponsors.caption") - } - internal enum ImportHost { - /// Add from imported - internal static let caption = L10n.tr("Core", "organizer.cells.import_host.caption") - } - internal enum JoinCommunity { - /// Join community - internal static let caption = L10n.tr("Core", "organizer.cells.join_community.caption") - } - internal enum Profile { - internal enum Value { - /// In use - internal static let current = L10n.tr("Core", "organizer.cells.profile.value.current") - } - } - internal enum SiriShortcuts { - /// Manage shortcuts - internal static let caption = L10n.tr("Core", "organizer.cells.siri_shortcuts.caption") - } - internal enum Translate { - /// Offer to translate - internal static let caption = L10n.tr("Core", "organizer.cells.translate.caption") - } - internal enum Uninstall { - /// Remove VPN configuration - internal static let caption = L10n.tr("Core", "organizer.cells.uninstall.caption") - } - internal enum WriteReview { - /// Write a review - internal static let caption = L10n.tr("Core", "organizer.cells.write_review.caption") - } - } - internal enum Menus { - /// Host - internal static let host = L10n.tr("Core", "organizer.menus.host") - /// Provider - internal static let provider = L10n.tr("Core", "organizer.menus.provider") - internal enum Provider { - /// No providers left - internal static let unavailable = L10n.tr("Core", "organizer.menus.provider.unavailable") - } - } - internal enum Sections { - internal enum Feedback { - /// Feedback - internal static let header = L10n.tr("Core", "organizer.sections.feedback.header") - } - internal enum Hosts { - /// Import hosts from raw .ovpn configuration files. - internal static let footer = L10n.tr("Core", "organizer.sections.hosts.footer") - /// Hosts - internal static let header = L10n.tr("Core", "organizer.sections.hosts.header") - } - internal enum Providers { - /// Here you find a few providers with preset configuration profiles. - internal static let footer = L10n.tr("Core", "organizer.sections.providers.footer") - /// Providers - internal static let header = L10n.tr("Core", "organizer.sections.providers.header") - } - internal enum Siri { - /// Get help from Siri to speed up your most common interactions with the app. - internal static let footer = L10n.tr("Core", "organizer.sections.siri.footer") - /// Siri - internal static let header = L10n.tr("Core", "organizer.sections.siri.header") - } - internal enum Support { - /// Support - internal static let header = L10n.tr("Core", "organizer.sections.support.header") - } - internal enum Twitch { - /// Come watch me make Passepartout live on Twitch, join the chat to interact and contribute! - internal static let footer = L10n.tr("Core", "organizer.sections.twitch.footer") - /// Twitch - internal static let header = L10n.tr("Core", "organizer.sections.twitch.header") - } - } - } - - internal enum ParsedFile { - internal enum Alerts { - internal enum Buttons { - /// Report an issue - internal static let report = L10n.tr("Core", "parsed_file.alerts.buttons.report") - } - internal enum Decryption { - /// The configuration contains an encrypted private key and it could not be decrypted. Double check your entered passphrase. - internal static let message = L10n.tr("Core", "parsed_file.alerts.decryption.message") - } - internal enum EncryptionPassphrase { - /// Please enter the encryption passphrase. - internal static let message = L10n.tr("Core", "parsed_file.alerts.encryption_passphrase.message") - } - internal enum Malformed { - /// The configuration file contains a malformed option (%@). - internal static func message(_ p1: Any) -> String { - return L10n.tr("Core", "parsed_file.alerts.malformed.message", String(describing: p1)) - } - } - internal enum Missing { - /// The configuration file lacks a required option (%@). - internal static func message(_ p1: Any) -> String { - return L10n.tr("Core", "parsed_file.alerts.missing.message", String(describing: p1)) - } - } - internal enum Parsing { - /// Unable to parse the provided configuration file (%@). - internal static func message(_ p1: Any) -> String { - return L10n.tr("Core", "parsed_file.alerts.parsing.message", String(describing: p1)) - } - } - internal enum PotentiallyUnsupported { - /// The configuration file is correct but contains a potentially unsupported option (%@).\n\nConnectivity may break depending on server settings. - internal static func message(_ p1: Any) -> String { - return L10n.tr("Core", "parsed_file.alerts.potentially_unsupported.message", String(describing: p1)) - } - } - internal enum Unsupported { - /// The configuration file contains an unsupported option (%@). - internal static func message(_ p1: Any) -> String { - return L10n.tr("Core", "parsed_file.alerts.unsupported.message", String(describing: p1)) - } - } - } - } - - internal enum Preferences { - /// Preferences - internal static let title = L10n.tr("Core", "preferences.title") - internal enum Cells { - internal enum ConfirmQuit { - /// Confirm quit - internal static let caption = L10n.tr("Core", "preferences.cells.confirm_quit.caption") - /// Check to present a quit confirmation alert. - internal static let footer = L10n.tr("Core", "preferences.cells.confirm_quit.footer") - } - internal enum LaunchesOnLogin { - /// Launch on login - internal static let caption = L10n.tr("Core", "preferences.cells.launches_on_login.caption") - /// Check to automatically launch the app on boot or login. - internal static let footer = L10n.tr("Core", "preferences.cells.launches_on_login.footer") - } - } - internal enum Sections { - internal enum General { - /// General - internal static let header = L10n.tr("Core", "preferences.sections.general.header") - } - } - } - - internal enum Provider { - internal enum Pool { - internal enum Actions { - /// Favorite - internal static let favorite = L10n.tr("Core", "provider.pool.actions.favorite") - /// Unfavorite - internal static let unfavorite = L10n.tr("Core", "provider.pool.actions.unfavorite") - } - internal enum Sections { - internal enum EmptyFavorites { - /// Swipe left on a location to add or remove it from Favorites. - internal static let footer = L10n.tr("Core", "provider.pool.sections.empty_favorites.footer") - } - } - } - internal enum Preset { - internal enum Cells { - internal enum TechDetails { - /// Technical details - internal static let caption = L10n.tr("Core", "provider.preset.cells.tech_details.caption") - } - } - } - } - - internal enum Purchase { - /// Purchase - internal static let title = L10n.tr("Core", "purchase.title") - internal enum Cells { - internal enum FullVersion { - /// All providers (including future ones)\n%@ - internal static func extraDescription(_ p1: Any) -> String { - return L10n.tr("Core", "purchase.cells.full_version.extra_description", String(describing: p1)) - } - } - internal enum Restore { - /// If you bought this app or feature in the past, you can restore your purchases and this screen won't show again. - internal static let description = L10n.tr("Core", "purchase.cells.restore.description") - /// Restore purchases - internal static let title = L10n.tr("Core", "purchase.cells.restore.title") - } - } - internal enum Sections { - internal enum Products { - /// Every product is a one-time purchase. Provider purchases do not include a VPN subscription. - internal static let footer = L10n.tr("Core", "purchase.sections.products.footer") - } - } - } - - internal enum Reddit { - /// Did you know that Passepartout has a subreddit? Subscribe for updates or to discuss issues, features, new platforms or whatever you like.\n\nIt's also a great way to show you care about this project. - internal static let message = L10n.tr("Core", "reddit.message") - /// Reddit - internal static let title = L10n.tr("Core", "reddit.title") - internal enum Buttons { - /// Don't ask again - internal static let never = L10n.tr("Core", "reddit.buttons.never") - /// Remind me later - internal static let remind = L10n.tr("Core", "reddit.buttons.remind") - /// Subscribe now! - internal static let subscribe = L10n.tr("Core", "reddit.buttons.subscribe") - } - } - - internal enum ServerNetwork { - internal enum Cells { - internal enum Route { - /// Route - internal static let caption = L10n.tr("Core", "server_network.cells.route.caption") - } - } - } - - internal enum Service { - internal enum Alerts { - internal enum Buttons { - /// Reconnect - internal static let reconnect = L10n.tr("Core", "service.alerts.buttons.reconnect") - } - internal enum Configuration { - /// Configuration unavailable, make sure you are connected to the VPN. - internal static let disconnected = L10n.tr("Core", "service.alerts.configuration.disconnected") - } - internal enum CredentialsNeeded { - /// You need to enter account credentials first. - internal static let message = L10n.tr("Core", "service.alerts.credentials_needed.message") - } - internal enum Download { - /// Failed to download configuration files. %@ - internal static func failed(_ p1: Any) -> String { - return L10n.tr("Core", "service.alerts.download.failed", String(describing: p1)) - } - /// %@ requires the download of additional configuration files.\n\nConfirm to start the download. - internal static func message(_ p1: Any) -> String { - return L10n.tr("Core", "service.alerts.download.message", String(describing: p1)) - } - /// Download required - internal static let title = L10n.tr("Core", "service.alerts.download.title") - internal enum Hud { - /// Extracting files, please be patient... - internal static let extracting = L10n.tr("Core", "service.alerts.download.hud.extracting") - } - } - internal enum Location { - internal enum Button { - /// Settings - internal static let settings = L10n.tr("Core", "service.alerts.location.button.settings") - } - internal enum Message { - /// You must allow location access to trust this Wi-Fi network. Go to iOS settings and review your location permissions for Passepartout. - internal static let denied = L10n.tr("Core", "service.alerts.location.message.denied") - } - } - internal enum MasksPrivateData { - internal enum Messages { - /// In order to safely reset the current debug log and apply the new masking preference, you must reconnect to the VPN now. - internal static let mustReconnect = L10n.tr("Core", "service.alerts.masks_private_data.messages.must_reconnect") - } - } - internal enum ReconnectVpn { - /// Do you want to reconnect to the VPN? - internal static let message = L10n.tr("Core", "service.alerts.reconnect_vpn.message") - } - internal enum Rename { - /// Rename profile - internal static let title = L10n.tr("Core", "service.alerts.rename.title") - } - internal enum TestConnectivity { - /// Connectivity - internal static let title = L10n.tr("Core", "service.alerts.test_connectivity.title") - internal enum Messages { - /// Your device has no Internet connectivity, please review your profile parameters. - internal static let failure = L10n.tr("Core", "service.alerts.test_connectivity.messages.failure") - /// Your device is connected to the Internet! - internal static let success = L10n.tr("Core", "service.alerts.test_connectivity.messages.success") - } - } - internal enum Trusted { - internal enum NoNetwork { - /// You are not connected to any Wi-Fi network. - internal static let message = L10n.tr("Core", "service.alerts.trusted.no_network.message") - } - internal enum WillDisconnectPolicy { - /// By changing the trust policy, the VPN may be disconnected. Continue? - internal static let message = L10n.tr("Core", "service.alerts.trusted.will_disconnect_policy.message") - } - internal enum WillDisconnectTrusted { - /// By trusting this network, the VPN may be disconnected. Continue? - internal static let message = L10n.tr("Core", "service.alerts.trusted.will_disconnect_trusted.message") - } - } - } - internal enum Cells { - internal enum Addresses { - /// Addresses - internal static let caption = L10n.tr("Core", "service.cells.addresses.caption") - } - internal enum Category { - /// Category - internal static let caption = L10n.tr("Core", "service.cells.category.caption") - } - internal enum ConnectionStatus { - /// Status - internal static let caption = L10n.tr("Core", "service.cells.connection_status.caption") - } - internal enum DataCount { - /// Exchanged data - internal static let caption = L10n.tr("Core", "service.cells.data_count.caption") - /// Unavailable - internal static let `none` = L10n.tr("Core", "service.cells.data_count.none") - } - internal enum DebugLog { - /// Debug log - internal static let caption = L10n.tr("Core", "service.cells.debug_log.caption") - } - internal enum Host { - internal enum Parameters { - /// Parameters - internal static let caption = L10n.tr("Core", "service.cells.host.parameters.caption") - } - } - internal enum MasksPrivateData { - /// Mask network data - internal static let caption = L10n.tr("Core", "service.cells.masks_private_data.caption") - } - internal enum OnlyShowsFavorites { - /// Only show favorite locations - internal static let caption = L10n.tr("Core", "service.cells.only_shows_favorites.caption") - } - internal enum Provider { - internal enum Pool { - /// Location - internal static let caption = L10n.tr("Core", "service.cells.provider.pool.caption") - } - internal enum Preset { - /// Preset - internal static let caption = L10n.tr("Core", "service.cells.provider.preset.caption") - } - internal enum Refresh { - /// Refresh infrastructure - internal static let caption = L10n.tr("Core", "service.cells.provider.refresh.caption") - } - } - internal enum Reconnect { - /// Reconnect - internal static let caption = L10n.tr("Core", "service.cells.reconnect.caption") - } - internal enum ReportIssue { - /// Report connectivity issue - internal static let caption = L10n.tr("Core", "service.cells.report_issue.caption") - } - internal enum ServerConfiguration { - /// Server configuration - internal static let caption = L10n.tr("Core", "service.cells.server_configuration.caption") - } - internal enum ServerNetwork { - /// Server network - internal static let caption = L10n.tr("Core", "service.cells.server_network.caption") - } - internal enum TestConnectivity { - /// Test connectivity - internal static let caption = L10n.tr("Core", "service.cells.test_connectivity.caption") - } - internal enum TrustedAddWifi { - /// Add Wi-Fi - internal static let caption = L10n.tr("Core", "service.cells.trusted_add_wifi.caption") - } - internal enum TrustedMobile { - /// Cellular network - internal static let caption = L10n.tr("Core", "service.cells.trusted_mobile.caption") - } - internal enum TrustedPolicy { - /// Trust disables VPN - internal static let caption = L10n.tr("Core", "service.cells.trusted_policy.caption") - } - internal enum UseProfile { - /// Use this profile - internal static let caption = L10n.tr("Core", "service.cells.use_profile.caption") - } - internal enum Vpn { - internal enum TurnOff { - /// Disable VPN - internal static let caption = L10n.tr("Core", "service.cells.vpn.turn_off.caption") - } - internal enum TurnOn { - /// Enable VPN - internal static let caption = L10n.tr("Core", "service.cells.vpn.turn_on.caption") - } - } - internal enum VpnResolvesHostname { - /// Resolve provider hostname - internal static let caption = L10n.tr("Core", "service.cells.vpn_resolves_hostname.caption") - } - internal enum VpnService { - /// Enabled - internal static let caption = L10n.tr("Core", "service.cells.vpn_service.caption") - } - internal enum VpnSurvivesSleep { - /// Keep alive on sleep - internal static let caption = L10n.tr("Core", "service.cells.vpn_survives_sleep.caption") - } - } - internal enum Sections { - internal enum Configuration { - /// Configuration - internal static let header = L10n.tr("Core", "service.sections.configuration.header") - } - internal enum Diagnostics { - /// Masking status will be effective after reconnecting. Network data are hostnames, IP addresses, routing, SSID. Credentials and private keys are not logged regardless. - internal static let footer = L10n.tr("Core", "service.sections.diagnostics.footer") - /// Diagnostics - internal static let header = L10n.tr("Core", "service.sections.diagnostics.header") - } - internal enum ProviderInfrastructure { - /// Last updated on %@. - internal static func footer(_ p1: Any) -> String { - return L10n.tr("Core", "service.sections.provider_infrastructure.footer", String(describing: p1)) - } - } - internal enum Status { - /// Connection - internal static let header = L10n.tr("Core", "service.sections.status.header") - } - internal enum Trusted { - /// When entering a trusted network, the VPN is normally shut down and kept disconnected. Disable this option to not enforce such behavior. - internal static let footer = L10n.tr("Core", "service.sections.trusted.footer") - /// Trusted networks - internal static let header = L10n.tr("Core", "service.sections.trusted.header") - } - internal enum Vpn { - /// The connection will be established whenever necessary. - internal static let footer = L10n.tr("Core", "service.sections.vpn.footer") - /// VPN - internal static let header = L10n.tr("Core", "service.sections.vpn.header") - } - internal enum VpnResolvesHostname { - /// Preferred in most networks and required in some IPv6 networks. Disable where DNS is blocked, or to speed up negotiation when DNS is slow to respond. - internal static let footer = L10n.tr("Core", "service.sections.vpn_resolves_hostname.footer") - } - internal enum VpnSurvivesSleep { - /// Disable to improve battery usage, at the expense of occasional slowdowns due to wake-up reconnections. - internal static let footer = L10n.tr("Core", "service.sections.vpn_survives_sleep.footer") - } - } - internal enum Welcome { - /// Welcome to Passepartout!\n\nUse the organizer to add a new profile. - internal static let message = L10n.tr("Core", "service.welcome.message") - } - } - - internal enum Share { - /// Passepartout is an user-friendly, open source OpenVPN client for iOS and macOS - internal static let message = L10n.tr("Core", "share.message") - } - - internal enum Shortcuts { - internal enum Add { - /// Add shortcut - internal static let title = L10n.tr("Core", "shortcuts.add.title") - internal enum Alerts { - internal enum NoProfiles { - /// There is no profile to connect to. - internal static let message = L10n.tr("Core", "shortcuts.add.alerts.no_profiles.message") - } - } - internal enum Cells { - internal enum Connect { - /// Connect to - internal static let caption = L10n.tr("Core", "shortcuts.add.cells.connect.caption") - } - internal enum DisableVpn { - /// Disable VPN - internal static let caption = L10n.tr("Core", "shortcuts.add.cells.disable_vpn.caption") - } - internal enum EnableVpn { - /// Enable VPN - internal static let caption = L10n.tr("Core", "shortcuts.add.cells.enable_vpn.caption") - } - internal enum TrustCellular { - /// Trust cellular network - internal static let caption = L10n.tr("Core", "shortcuts.add.cells.trust_cellular.caption") - } - internal enum TrustCurrentWifi { - /// Trust current Wi-Fi - internal static let caption = L10n.tr("Core", "shortcuts.add.cells.trust_current_wifi.caption") - } - internal enum UntrustCellular { - /// Untrust cellular network - internal static let caption = L10n.tr("Core", "shortcuts.add.cells.untrust_cellular.caption") - } - internal enum UntrustCurrentWifi { - /// Untrust current Wi-Fi - internal static let caption = L10n.tr("Core", "shortcuts.add.cells.untrust_current_wifi.caption") - } - } - internal enum Sections { - internal enum Cellular { - /// Cellular - internal static let header = L10n.tr("Core", "shortcuts.add.sections.cellular.header") - } - internal enum Vpn { - /// VPN - internal static let header = L10n.tr("Core", "shortcuts.add.sections.vpn.header") - } - internal enum Wifi { - /// Wi-Fi - internal static let header = L10n.tr("Core", "shortcuts.add.sections.wifi.header") - } - } - } - internal enum Edit { - /// Manage shortcuts - internal static let title = L10n.tr("Core", "shortcuts.edit.title") - internal enum Cells { - internal enum AddShortcut { - /// Add shortcut - internal static let caption = L10n.tr("Core", "shortcuts.edit.cells.add_shortcut.caption") - } - } - internal enum Sections { - internal enum All { - /// Existing shortcuts - internal static let header = L10n.tr("Core", "shortcuts.edit.sections.all.header") - } - } - } - } - - internal enum Translations { - /// Translations - internal static let title = L10n.tr("Core", "translations.title") - } - - internal enum Trusted { - internal enum Columns { - internal enum Trust { - /// Trust - internal static let title = L10n.tr("Core", "trusted.columns.trust.title") - } - } - internal enum Ethernet { - /// Check to trust any wired cable connection. - internal static let description = L10n.tr("Core", "trusted.ethernet.description") - /// Trust wired connections - internal static let title = L10n.tr("Core", "trusted.ethernet.title") - } - } - - internal enum Version { - /// Version - internal static let title = L10n.tr("Core", "version.title") - internal enum Labels { - /// Passepartout and TunnelKit are written and maintained by Davide De Rosa (keeshux).\n\nSource code for Passepartout and TunnelKit is publicly available on GitHub under the GPLv3, you can find links in the home page.\n\nPassepartout is a non-official client and is in no way affiliated with OpenVPN Inc. - internal static let intro = L10n.tr("Core", "version.labels.intro") - } - } - - internal enum Vpn { - /// Active - internal static let active = L10n.tr("Core", "vpn.active") - /// Connecting - internal static let connecting = L10n.tr("Core", "vpn.connecting") - /// Disabled - internal static let disabled = L10n.tr("Core", "vpn.disabled") - /// Disconnecting - internal static let disconnecting = L10n.tr("Core", "vpn.disconnecting") - /// Inactive - internal static let inactive = L10n.tr("Core", "vpn.inactive") - /// Off - internal static let unused = L10n.tr("Core", "vpn.unused") - internal enum Errors { - /// Auth failed - internal static let auth = L10n.tr("Core", "vpn.errors.auth") - /// Compression unsupported - internal static let compression = L10n.tr("Core", "vpn.errors.compression") - /// DNS failed - internal static let dns = L10n.tr("Core", "vpn.errors.dns") - /// Encryption failed - internal static let encryption = L10n.tr("Core", "vpn.errors.encryption") - /// No gateway - internal static let gateway = L10n.tr("Core", "vpn.errors.gateway") - /// Network changed - internal static let network = L10n.tr("Core", "vpn.errors.network") - /// Missing routing - internal static let routing = L10n.tr("Core", "vpn.errors.routing") - /// Server shutdown - internal static let shutdown = L10n.tr("Core", "vpn.errors.shutdown") - /// Timeout - internal static let timeout = L10n.tr("Core", "vpn.errors.timeout") - /// TLS failed - internal static let tls = L10n.tr("Core", "vpn.errors.tls") - } - } - - internal enum Wizards { - internal enum Host { - internal enum Alerts { - internal enum Existing { - /// A host profile with the same title already exists. Replace it? - internal static let message = L10n.tr("Core", "wizards.host.alerts.existing.message") - } - } - internal enum Cells { - internal enum TitleInput { - /// Title - internal static let caption = L10n.tr("Core", "wizards.host.cells.title_input.caption") - } - } - internal enum Sections { - internal enum Existing { - /// Existing profiles - internal static let header = L10n.tr("Core", "wizards.host.sections.existing.header") - } - } - } - internal enum Provider { - internal enum Alerts { - internal enum Unavailable { - /// Could not download provider infrastructure, please retry later. - internal static let message = L10n.tr("Core", "wizards.provider.alerts.unavailable.message") - } - } - internal enum Cells { - internal enum UpdateList { - /// Update list - internal static let caption = L10n.tr("Core", "wizards.provider.cells.update_list.caption") - } - } - } - } -} -// swiftlint:enable explicit_type_interface function_parameter_count identifier_name line_length -// swiftlint:enable nesting type_body_length type_name vertical_whitespace_opening_braces - -// MARK: - Implementation Details - -extension L10n { - private static func tr(_ table: String, _ key: String, _ args: CVarArg...) -> String { - let format = BundleToken.bundle.localizedString(forKey: key, value: nil, table: table) - return String(format: format, locale: Locale.current, arguments: args) - } -} - -// swiftlint:disable convenience_type -private final class BundleToken { - static let bundle: Bundle = { - #if SWIFT_PACKAGE - return Bundle.module - #else - return Bundle(for: BundleToken.self) - #endif - }() -} -// swiftlint:enable convenience_type diff --git a/Passepartout/App/macOS/Global/Theme.swift b/Passepartout/App/macOS/Global/Theme.swift index 7991e936..b3bc87bd 100644 --- a/Passepartout/App/macOS/Global/Theme.swift +++ b/Passepartout/App/macOS/Global/Theme.swift @@ -58,21 +58,6 @@ extension Infrastructure.Metadata { } return image } - - var guidanceString: String? { - let prefix = "account.sections.guidance.footer.infrastructure" - let key = "\(prefix).\(name)" - var format = NSLocalizedString(key, tableName: "Core", bundle: Bundle(for: AppDelegate.self), comment: "") - - // i.e. key not found - if format == key { - let purpose = name.credentialsPurpose - let defaultKey = "\(prefix).default.\(purpose)" - format = NSLocalizedString(defaultKey, tableName: "Core", bundle: Bundle(for: AppDelegate.self), comment: "") - } - - return String(format: format, locale: .current, description) - } } extension ConnectionProfile { diff --git a/Passepartout/App/macOS/swiftgen.yml b/Passepartout/App/macOS/swiftgen.yml index 69094b21..d502e5d3 100644 --- a/Passepartout/App/macOS/swiftgen.yml +++ b/Passepartout/App/macOS/swiftgen.yml @@ -1,10 +1,3 @@ -strings: - inputs: - - ../../Core/Resources/en.lproj/Core.strings - outputs: - - templateName: structured-swift4 - output: Global/SwiftGen+Strings.swift - ib: inputs: - Base.lproj/Main.storyboard diff --git a/Passepartout/Core/Sources/SwiftGen+Strings.swift b/Passepartout/Core/Sources/SwiftGen+Strings.swift new file mode 100644 index 00000000..9c221550 --- /dev/null +++ b/Passepartout/Core/Sources/SwiftGen+Strings.swift @@ -0,0 +1,1289 @@ +// swiftlint:disable all +// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen + +import Foundation + +// swiftlint:disable superfluous_disable_command file_length implicit_return + +// MARK: - Strings + +// swiftlint:disable explicit_type_interface function_parameter_count identifier_name line_length +// swiftlint:disable nesting type_body_length type_name vertical_whitespace_opening_braces +public enum L10n { + + public enum About { + /// About + public static let title = L10n.tr("Core", "about.title") + public enum Cells { + public enum Credits { + /// Credits + public static let caption = L10n.tr("Core", "about.cells.credits.caption") + } + public enum Disclaimer { + /// Disclaimer + public static let caption = L10n.tr("Core", "about.cells.disclaimer.caption") + } + public enum Faq { + /// FAQ + public static let caption = L10n.tr("Core", "about.cells.faq.caption") + } + public enum PrivacyPolicy { + /// Privacy policy + public static let caption = L10n.tr("Core", "about.cells.privacy_policy.caption") + } + public enum ShareGeneric { + /// Invite a friend + public static let caption = L10n.tr("Core", "about.cells.share_generic.caption") + } + public enum ShareTwitter { + /// Tweet about it! + public static let caption = L10n.tr("Core", "about.cells.share_twitter.caption") + } + public enum Website { + /// Home page + public static let caption = L10n.tr("Core", "about.cells.website.caption") + } + } + public enum Sections { + public enum Share { + /// Share + public static let header = L10n.tr("Core", "about.sections.share.header") + } + public enum Web { + /// Web + public static let header = L10n.tr("Core", "about.sections.web.header") + } + } + } + + public enum Account { + /// Account + public static let title = L10n.tr("Core", "account.title") + public enum Cells { + public enum OpenGuide { + /// See your credentials + public static let caption = L10n.tr("Core", "account.cells.open_guide.caption") + } + public enum Password { + /// Password + public static let caption = L10n.tr("Core", "account.cells.password.caption") + /// secret + public static let placeholder = L10n.tr("Core", "account.cells.password.placeholder") + } + public enum Signup { + /// Register with %@ + public static func caption(_ p1: Any) -> String { + return L10n.tr("Core", "account.cells.signup.caption", String(describing: p1)) + } + } + public enum Username { + /// Username + public static let caption = L10n.tr("Core", "account.cells.username.caption") + /// username + public static let placeholder = L10n.tr("Core", "account.cells.username.placeholder") + } + } + public enum Sections { + public enum Credentials { + /// Credentials + public static let header = L10n.tr("Core", "account.sections.credentials.header") + } + public enum Guidance { + public enum Footer { + public enum Infrastructure { + /// Use your %@ website credentials. Your username is usually numeric (without spaces). + public static func mullvad(_ p1: Any) -> String { + return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.mullvad", String(describing: p1)) + } + /// Use your %@ website credentials. Your username is usually your e-mail. + public static func nordvpn(_ p1: Any) -> String { + return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.nordvpn", String(describing: p1)) + } + /// Use your %@ website credentials. Your username is usually numeric with a "p" prefix. + public static func pia(_ p1: Any) -> String { + return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.pia", String(describing: p1)) + } + /// Find your %@ credentials in the "Account > OpenVPN / IKEv2 Username" section of the website. + public static func protonvpn(_ p1: Any) -> String { + return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.protonvpn", String(describing: p1)) + } + /// Use your %@ website credentials. Your username is usually your e-mail. + public static func tunnelbear(_ p1: Any) -> String { + return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.tunnelbear", String(describing: p1)) + } + /// Use your %@ website credentials. Your username is usually your e-mail. + public static func vyprvpn(_ p1: Any) -> String { + return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.vyprvpn", String(describing: p1)) + } + /// Find your %@ credentials in the OpenVPN Config Generator on the website. + public static func windscribe(_ p1: Any) -> String { + return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.windscribe", String(describing: p1)) + } + public enum Default { + /// Use your %@ service credentials, which may differ from website credentials. + public static func specific(_ p1: Any) -> String { + return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.default.specific", String(describing: p1)) + } + /// Use your %@ website credentials. + public static func web(_ p1: Any) -> String { + return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.default.web", String(describing: p1)) + } + } + } + } + } + public enum Registration { + /// Go get an account on the %@ website. + public static func footer(_ p1: Any) -> String { + return L10n.tr("Core", "account.sections.registration.footer", String(describing: p1)) + } + } + } + } + + public enum Configuration { + /// Configuration + public static let title = L10n.tr("Core", "configuration.title") + public enum Alerts { + public enum Commit { + /// New parameters will not be effective until you reconnect manually. Changes in trusted networks will apply immediately. + public static let message = L10n.tr("Core", "configuration.alerts.commit.message") + public enum Buttons { + /// Reconnect now + public static let reconnect = L10n.tr("Core", "configuration.alerts.commit.buttons.reconnect") + /// Skip + public static let skip = L10n.tr("Core", "configuration.alerts.commit.buttons.skip") + } + } + } + public enum Cells { + public enum Cipher { + /// Cipher + public static let caption = L10n.tr("Core", "configuration.cells.cipher.caption") + } + public enum Client { + /// Client certificate + public static let caption = L10n.tr("Core", "configuration.cells.client.caption") + public enum Value { + /// Not verified + public static let disabled = L10n.tr("Core", "configuration.cells.client.value.disabled") + /// Verified + public static let enabled = L10n.tr("Core", "configuration.cells.client.value.enabled") + } + } + public enum CompressionAlgorithm { + /// Algorithm + public static let caption = L10n.tr("Core", "configuration.cells.compression_algorithm.caption") + public enum Value { + /// LZO + public static let lzo = L10n.tr("Core", "configuration.cells.compression_algorithm.value.lzo") + /// Unsupported + public static let other = L10n.tr("Core", "configuration.cells.compression_algorithm.value.other") + } + } + public enum CompressionFraming { + /// Framing + public static let caption = L10n.tr("Core", "configuration.cells.compression_framing.caption") + public enum Value { + /// --compress + public static let compress = L10n.tr("Core", "configuration.cells.compression_framing.value.compress") + /// --comp-lzo + public static let lzo = L10n.tr("Core", "configuration.cells.compression_framing.value.lzo") + } + } + public enum Digest { + /// Authentication + public static let caption = L10n.tr("Core", "configuration.cells.digest.caption") + public enum Value { + /// Embedded + public static let embedded = L10n.tr("Core", "configuration.cells.digest.value.embedded") + } + } + public enum Eku { + /// Extended verification + public static let caption = L10n.tr("Core", "configuration.cells.eku.caption") + } + public enum KeepAlive { + /// Keep-alive + public static let caption = L10n.tr("Core", "configuration.cells.keep_alive.caption") + public enum Value { + /// %d seconds + public static func seconds(_ p1: Int) -> String { + return L10n.tr("Core", "configuration.cells.keep_alive.value.seconds", p1) + } + } + } + public enum RandomEndpoint { + /// Randomize endpoint + public static let caption = L10n.tr("Core", "configuration.cells.random_endpoint.caption") + } + public enum RenegotiationSeconds { + /// Renegotiation + public static let caption = L10n.tr("Core", "configuration.cells.renegotiation_seconds.caption") + public enum Value { + /// after %@ + public static func after(_ p1: Any) -> String { + return L10n.tr("Core", "configuration.cells.renegotiation_seconds.value.after", String(describing: p1)) + } + } + } + public enum ResetOriginal { + /// Reset configuration + public static let caption = L10n.tr("Core", "configuration.cells.reset_original.caption") + } + public enum TlsWrapping { + /// Wrapping + public static let caption = L10n.tr("Core", "configuration.cells.tls_wrapping.caption") + public enum Value { + /// Authentication + public static let auth = L10n.tr("Core", "configuration.cells.tls_wrapping.value.auth") + /// Encryption + public static let crypt = L10n.tr("Core", "configuration.cells.tls_wrapping.value.crypt") + } + } + } + public enum Sections { + public enum Communication { + /// Communication + public static let header = L10n.tr("Core", "configuration.sections.communication.header") + } + public enum Compression { + /// Compression + public static let header = L10n.tr("Core", "configuration.sections.compression.header") + } + public enum Network { + /// Network + public static let header = L10n.tr("Core", "configuration.sections.network.header") + } + public enum Other { + /// Other + public static let header = L10n.tr("Core", "configuration.sections.other.header") + } + public enum Reset { + /// If you ended up with broken connectivity after changing the communication parameters, tap to revert to the original configuration. + public static let footer = L10n.tr("Core", "configuration.sections.reset.footer") + } + public enum Tls { + /// TLS + public static let header = L10n.tr("Core", "configuration.sections.tls.header") + } + } + } + + public enum Credits { + /// Credits + public static let title = L10n.tr("Core", "credits.title") + public enum Sections { + public enum Licenses { + /// Licenses + public static let header = L10n.tr("Core", "credits.sections.licenses.header") + } + public enum Notices { + /// Notices + public static let header = L10n.tr("Core", "credits.sections.notices.header") + } + public enum Translations { + /// Translations + public static let header = L10n.tr("Core", "credits.sections.translations.header") + } + } + } + + public enum DebugLog { + public enum Alerts { + public enum EmptyLog { + /// The debug log is empty. + public static let message = L10n.tr("Core", "debug_log.alerts.empty_log.message") + } + } + public enum Buttons { + /// Copy + public static let copy = L10n.tr("Core", "debug_log.buttons.copy") + /// Next + public static let next = L10n.tr("Core", "debug_log.buttons.next") + /// Previous + public static let previous = L10n.tr("Core", "debug_log.buttons.previous") + } + } + + public enum Donation { + /// Donate + public static let title = L10n.tr("Core", "donation.title") + public enum Alerts { + public enum Purchase { + public enum Failure { + /// Unable to perform the donation. %@ + public static func message(_ p1: Any) -> String { + return L10n.tr("Core", "donation.alerts.purchase.failure.message", String(describing: p1)) + } + } + public enum Success { + /// This means a lot to me and I really hope you keep using and promoting this app. + public static let message = L10n.tr("Core", "donation.alerts.purchase.success.message") + /// Thank you + public static let title = L10n.tr("Core", "donation.alerts.purchase.success.title") + } + } + } + public enum Cells { + public enum Loading { + /// Loading donations + public static let caption = L10n.tr("Core", "donation.cells.loading.caption") + } + public enum Purchasing { + /// Performing donation + public static let caption = L10n.tr("Core", "donation.cells.purchasing.caption") + } + } + public enum Sections { + public enum OneTime { + /// If you want to display gratitude for my free work, here are a couple amounts you can donate instantly.\n\nYou will only be charged once per donation, and you can donate multiple times. + public static let footer = L10n.tr("Core", "donation.sections.one_time.footer") + /// One time + public static let header = L10n.tr("Core", "donation.sections.one_time.header") + } + } + } + + public enum Endpoint { + /// Endpoint + public static let title = L10n.tr("Core", "endpoint.title") + public enum Cells { + /// Address + public static let address = L10n.tr("Core", "endpoint.cells.address") + /// Protocol + public static let `protocol` = L10n.tr("Core", "endpoint.cells.protocol") + public enum AnyAddress { + /// Automatic + public static let caption = L10n.tr("Core", "endpoint.cells.any_address.caption") + } + public enum AnyProtocol { + /// Automatic + public static let caption = L10n.tr("Core", "endpoint.cells.any_protocol.caption") + } + } + public enum Sections { + public enum LocationAddresses { + /// Addresses + public static let header = L10n.tr("Core", "endpoint.sections.location_addresses.header") + } + public enum LocationProtocols { + /// Protocols + public static let header = L10n.tr("Core", "endpoint.sections.location_protocols.header") + } + } + } + + public enum Global { + /// Cancel + public static let cancel = L10n.tr("Core", "global.cancel") + /// Close + public static let close = L10n.tr("Core", "global.close") + /// No e-mail account is configured. + public static let emailNotConfigured = L10n.tr("Core", "global.email_not_configured") + /// Next + public static let next = L10n.tr("Core", "global.next") + /// OK + public static let ok = L10n.tr("Core", "global.ok") + public enum Captions { + /// Address + public static let address = L10n.tr("Core", "global.captions.address") + /// Port + public static let port = L10n.tr("Core", "global.captions.port") + /// Protocol + public static let `protocol` = L10n.tr("Core", "global.captions.protocol") + } + public enum Host { + public enum TitleInput { + /// Acceptable characters are alphanumerics plus dash "-", underscore "_" and dot ".". + public static let message = L10n.tr("Core", "global.host.title_input.message") + /// My profile + public static let placeholder = L10n.tr("Core", "global.host.title_input.placeholder") + } + } + public enum Values { + /// Automatic + public static let automatic = L10n.tr("Core", "global.values.automatic") + /// Default + public static let `default` = L10n.tr("Core", "global.values.default") + /// Disabled + public static let disabled = L10n.tr("Core", "global.values.disabled") + /// Enabled + public static let enabled = L10n.tr("Core", "global.values.enabled") + /// Manual + public static let manual = L10n.tr("Core", "global.values.manual") + /// None + public static let `none` = L10n.tr("Core", "global.values.none") + } + } + + public enum ImportedHosts { + /// Imported hosts + public static let title = L10n.tr("Core", "imported_hosts.title") + } + + public enum IssueReporter { + /// The debug log of your latest connections is crucial to resolve your connectivity issues and is completely anonymous.\n\nThe .ovpn configuration file, if any, is attached stripped of any sensitive data.\n\nPlease double check the e-mail attachments if unsure. + public static let message = L10n.tr("Core", "issue_reporter.message") + /// Report issue + public static let title = L10n.tr("Core", "issue_reporter.title") + public enum Buttons { + /// I understand + public static let accept = L10n.tr("Core", "issue_reporter.buttons.accept") + } + } + + public enum Label { + public enum License { + /// Unable to download full license content. + public static let error = L10n.tr("Core", "label.license.error") + } + } + + public enum Menu { + public enum ActiveProfile { + public enum Items { + public enum Customize { + /// Customize... + public static let title = L10n.tr("Core", "menu.active_profile.items.customize.title") + } + } + public enum Messages { + /// No account configured + public static let missingCredentials = L10n.tr("Core", "menu.active_profile.messages.missing_credentials") + } + public enum Title { + /// No active profile + public static let `none` = L10n.tr("Core", "menu.active_profile.title.none") + } + } + public enum Organizer { + /// Organizer + public static let title = L10n.tr("Core", "menu.organizer.title") + } + public enum Preferences { + /// Preferences + public static let title = L10n.tr("Core", "menu.preferences.title") + } + public enum Quit { + /// Quit %@ + public static func title(_ p1: Any) -> String { + return L10n.tr("Core", "menu.quit.title", String(describing: p1)) + } + public enum Messages { + /// The VPN, if enabled, will still run in the background. Do you want to quit? + public static let confirm = L10n.tr("Core", "menu.quit.messages.confirm") + } + } + public enum Show { + /// Show + public static let title = L10n.tr("Core", "menu.show.title") + } + public enum Support { + /// Support + public static let title = L10n.tr("Core", "menu.support.title") + } + public enum SwitchProfile { + /// Active profile + public static let title = L10n.tr("Core", "menu.switch_profile.title") + } + } + + public enum NetworkChoice { + /// Read .ovpn + public static let client = L10n.tr("Core", "network_choice.client") + /// Pull from server + public static let server = L10n.tr("Core", "network_choice.server") + } + + public enum NetworkSettings { + /// Network settings + public static let title = L10n.tr("Core", "network_settings.title") + public enum Cells { + public enum AddDnsDomain { + /// Add search domain + public static let caption = L10n.tr("Core", "network_settings.cells.add_dns_domain.caption") + } + public enum AddDnsServer { + /// Add address + public static let caption = L10n.tr("Core", "network_settings.cells.add_dns_server.caption") + } + public enum AddProxyBypass { + /// Add bypass domain + public static let caption = L10n.tr("Core", "network_settings.cells.add_proxy_bypass.caption") + } + public enum ProxyBypass { + /// Bypass domain + public static let caption = L10n.tr("Core", "network_settings.cells.proxy_bypass.caption") + } + } + public enum Dns { + /// DNS + public static let title = L10n.tr("Core", "network_settings.dns.title") + public enum Cells { + public enum Addresses { + /// Servers + public static let title = L10n.tr("Core", "network_settings.dns.cells.addresses.title") + } + public enum Domain { + /// Domain + public static let caption = L10n.tr("Core", "network_settings.dns.cells.domain.caption") + } + public enum Domains { + /// Domains + public static let title = L10n.tr("Core", "network_settings.dns.cells.domains.title") + } + } + } + public enum Gateway { + /// Default gateway + public static let title = L10n.tr("Core", "network_settings.gateway.title") + } + public enum Mtu { + /// MTU + public static let title = L10n.tr("Core", "network_settings.mtu.title") + public enum Cells { + public enum Bytes { + /// Bytes + public static let caption = L10n.tr("Core", "network_settings.mtu.cells.bytes.caption") + } + } + } + public enum Proxy { + /// Proxy + public static let title = L10n.tr("Core", "network_settings.proxy.title") + public enum Cells { + public enum BypassDomains { + /// Bypass domains + public static let title = L10n.tr("Core", "network_settings.proxy.cells.bypass_domains.title") + } + } + } + } + + public enum Organizer { + /// %@ + public static func title(_ p1: Any) -> String { + return L10n.tr("Core", "organizer.title", String(describing: p1)) + } + public enum Alerts { + public enum AddHost { + /// Open an URL to an .ovpn configuration file from Safari, Mail or another app to set up a host profile.\n\nYou can also import an .ovpn with iTunes File Sharing. + public static let message = L10n.tr("Core", "organizer.alerts.add_host.message") + } + public enum CannotDonate { + /// There is no payment method configured on this device. + public static let message = L10n.tr("Core", "organizer.alerts.cannot_donate.message") + } + public enum DeleteVpnProfile { + /// Do you really want to erase the VPN configuration from your device settings? This may fix some broken VPN states and will not affect your provider and host profiles. + public static let message = L10n.tr("Core", "organizer.alerts.delete_vpn_profile.message") + } + public enum ExhaustedProviders { + /// You have created profiles for any available provider. + public static let message = L10n.tr("Core", "organizer.alerts.exhausted_providers.message") + } + public enum OpenHostFile { + /// Select an .ovpn file + public static let title = L10n.tr("Core", "organizer.alerts.open_host_file.title") + } + public enum RemoveProfile { + /// Are you sure you want to delete profile %@? + public static func message(_ p1: Any) -> String { + return L10n.tr("Core", "organizer.alerts.remove_profile.message", String(describing: p1)) + } + /// Remove profile + public static let title = L10n.tr("Core", "organizer.alerts.remove_profile.title") + } + } + public enum Cells { + public enum About { + /// About %@ + public static func caption(_ p1: Any) -> String { + return L10n.tr("Core", "organizer.cells.about.caption", String(describing: p1)) + } + } + public enum AddHost { + /// Add from Files + public static let caption = L10n.tr("Core", "organizer.cells.add_host.caption") + } + public enum AddProvider { + /// Add new provider + public static let caption = L10n.tr("Core", "organizer.cells.add_provider.caption") + } + public enum Donate { + /// Make a donation + public static let caption = L10n.tr("Core", "organizer.cells.donate.caption") + } + public enum FollowTwitch { + /// Watch Passepartout on Twitch + public static let caption = L10n.tr("Core", "organizer.cells.follow_twitch.caption") + } + public enum GithubSponsors { + /// Support me on GitHub + public static let caption = L10n.tr("Core", "organizer.cells.github_sponsors.caption") + } + public enum ImportHost { + /// Add from imported + public static let caption = L10n.tr("Core", "organizer.cells.import_host.caption") + } + public enum JoinCommunity { + /// Join community + public static let caption = L10n.tr("Core", "organizer.cells.join_community.caption") + } + public enum Profile { + public enum Value { + /// In use + public static let current = L10n.tr("Core", "organizer.cells.profile.value.current") + } + } + public enum SiriShortcuts { + /// Manage shortcuts + public static let caption = L10n.tr("Core", "organizer.cells.siri_shortcuts.caption") + } + public enum Translate { + /// Offer to translate + public static let caption = L10n.tr("Core", "organizer.cells.translate.caption") + } + public enum Uninstall { + /// Remove VPN configuration + public static let caption = L10n.tr("Core", "organizer.cells.uninstall.caption") + } + public enum WriteReview { + /// Write a review + public static let caption = L10n.tr("Core", "organizer.cells.write_review.caption") + } + } + public enum Menus { + /// Host + public static let host = L10n.tr("Core", "organizer.menus.host") + /// Provider + public static let provider = L10n.tr("Core", "organizer.menus.provider") + public enum Provider { + /// No providers left + public static let unavailable = L10n.tr("Core", "organizer.menus.provider.unavailable") + } + } + public enum Sections { + public enum Feedback { + /// Feedback + public static let header = L10n.tr("Core", "organizer.sections.feedback.header") + } + public enum Hosts { + /// Import hosts from raw .ovpn configuration files. + public static let footer = L10n.tr("Core", "organizer.sections.hosts.footer") + /// Hosts + public static let header = L10n.tr("Core", "organizer.sections.hosts.header") + } + public enum Providers { + /// Here you find a few providers with preset configuration profiles. + public static let footer = L10n.tr("Core", "organizer.sections.providers.footer") + /// Providers + public static let header = L10n.tr("Core", "organizer.sections.providers.header") + } + public enum Siri { + /// Get help from Siri to speed up your most common interactions with the app. + public static let footer = L10n.tr("Core", "organizer.sections.siri.footer") + /// Siri + public static let header = L10n.tr("Core", "organizer.sections.siri.header") + } + public enum Support { + /// Support + public static let header = L10n.tr("Core", "organizer.sections.support.header") + } + public enum Twitch { + /// Come watch me make Passepartout live on Twitch, join the chat to interact and contribute! + public static let footer = L10n.tr("Core", "organizer.sections.twitch.footer") + /// Twitch + public static let header = L10n.tr("Core", "organizer.sections.twitch.header") + } + } + } + + public enum ParsedFile { + public enum Alerts { + public enum Buttons { + /// Report an issue + public static let report = L10n.tr("Core", "parsed_file.alerts.buttons.report") + } + public enum Decryption { + /// The configuration contains an encrypted private key and it could not be decrypted. Double check your entered passphrase. + public static let message = L10n.tr("Core", "parsed_file.alerts.decryption.message") + } + public enum EncryptionPassphrase { + /// Please enter the encryption passphrase. + public static let message = L10n.tr("Core", "parsed_file.alerts.encryption_passphrase.message") + } + public enum Malformed { + /// The configuration file contains a malformed option (%@). + public static func message(_ p1: Any) -> String { + return L10n.tr("Core", "parsed_file.alerts.malformed.message", String(describing: p1)) + } + } + public enum Missing { + /// The configuration file lacks a required option (%@). + public static func message(_ p1: Any) -> String { + return L10n.tr("Core", "parsed_file.alerts.missing.message", String(describing: p1)) + } + } + public enum Parsing { + /// Unable to parse the provided configuration file (%@). + public static func message(_ p1: Any) -> String { + return L10n.tr("Core", "parsed_file.alerts.parsing.message", String(describing: p1)) + } + } + public enum PotentiallyUnsupported { + /// The configuration file is correct but contains a potentially unsupported option (%@).\n\nConnectivity may break depending on server settings. + public static func message(_ p1: Any) -> String { + return L10n.tr("Core", "parsed_file.alerts.potentially_unsupported.message", String(describing: p1)) + } + } + public enum Unsupported { + /// The configuration file contains an unsupported option (%@). + public static func message(_ p1: Any) -> String { + return L10n.tr("Core", "parsed_file.alerts.unsupported.message", String(describing: p1)) + } + } + } + } + + public enum Preferences { + /// Preferences + public static let title = L10n.tr("Core", "preferences.title") + public enum Cells { + public enum ConfirmQuit { + /// Confirm quit + public static let caption = L10n.tr("Core", "preferences.cells.confirm_quit.caption") + /// Check to present a quit confirmation alert. + public static let footer = L10n.tr("Core", "preferences.cells.confirm_quit.footer") + } + public enum LaunchesOnLogin { + /// Launch on login + public static let caption = L10n.tr("Core", "preferences.cells.launches_on_login.caption") + /// Check to automatically launch the app on boot or login. + public static let footer = L10n.tr("Core", "preferences.cells.launches_on_login.footer") + } + } + public enum Sections { + public enum General { + /// General + public static let header = L10n.tr("Core", "preferences.sections.general.header") + } + } + } + + public enum Provider { + public enum Pool { + public enum Actions { + /// Favorite + public static let favorite = L10n.tr("Core", "provider.pool.actions.favorite") + /// Unfavorite + public static let unfavorite = L10n.tr("Core", "provider.pool.actions.unfavorite") + } + public enum Sections { + public enum EmptyFavorites { + /// Swipe left on a location to add or remove it from Favorites. + public static let footer = L10n.tr("Core", "provider.pool.sections.empty_favorites.footer") + } + } + } + public enum Preset { + public enum Cells { + public enum TechDetails { + /// Technical details + public static let caption = L10n.tr("Core", "provider.preset.cells.tech_details.caption") + } + } + } + } + + public enum Purchase { + /// Purchase + public static let title = L10n.tr("Core", "purchase.title") + public enum Cells { + public enum FullVersion { + /// All providers (including future ones)\n%@ + public static func extraDescription(_ p1: Any) -> String { + return L10n.tr("Core", "purchase.cells.full_version.extra_description", String(describing: p1)) + } + } + public enum Restore { + /// If you bought this app or feature in the past, you can restore your purchases and this screen won't show again. + public static let description = L10n.tr("Core", "purchase.cells.restore.description") + /// Restore purchases + public static let title = L10n.tr("Core", "purchase.cells.restore.title") + } + } + public enum Sections { + public enum Products { + /// Every product is a one-time purchase. Provider purchases do not include a VPN subscription. + public static let footer = L10n.tr("Core", "purchase.sections.products.footer") + } + } + } + + public enum Reddit { + /// Did you know that Passepartout has a subreddit? Subscribe for updates or to discuss issues, features, new platforms or whatever you like.\n\nIt's also a great way to show you care about this project. + public static let message = L10n.tr("Core", "reddit.message") + /// Reddit + public static let title = L10n.tr("Core", "reddit.title") + public enum Buttons { + /// Don't ask again + public static let never = L10n.tr("Core", "reddit.buttons.never") + /// Remind me later + public static let remind = L10n.tr("Core", "reddit.buttons.remind") + /// Subscribe now! + public static let subscribe = L10n.tr("Core", "reddit.buttons.subscribe") + } + } + + public enum ServerNetwork { + public enum Cells { + public enum Route { + /// Route + public static let caption = L10n.tr("Core", "server_network.cells.route.caption") + } + } + } + + public enum Service { + public enum Alerts { + public enum Buttons { + /// Reconnect + public static let reconnect = L10n.tr("Core", "service.alerts.buttons.reconnect") + } + public enum Configuration { + /// Configuration unavailable, make sure you are connected to the VPN. + public static let disconnected = L10n.tr("Core", "service.alerts.configuration.disconnected") + } + public enum CredentialsNeeded { + /// You need to enter account credentials first. + public static let message = L10n.tr("Core", "service.alerts.credentials_needed.message") + } + public enum Download { + /// Failed to download configuration files. %@ + public static func failed(_ p1: Any) -> String { + return L10n.tr("Core", "service.alerts.download.failed", String(describing: p1)) + } + /// %@ requires the download of additional configuration files.\n\nConfirm to start the download. + public static func message(_ p1: Any) -> String { + return L10n.tr("Core", "service.alerts.download.message", String(describing: p1)) + } + /// Download required + public static let title = L10n.tr("Core", "service.alerts.download.title") + public enum Hud { + /// Extracting files, please be patient... + public static let extracting = L10n.tr("Core", "service.alerts.download.hud.extracting") + } + } + public enum Location { + public enum Button { + /// Settings + public static let settings = L10n.tr("Core", "service.alerts.location.button.settings") + } + public enum Message { + /// You must allow location access to trust this Wi-Fi network. Go to iOS settings and review your location permissions for Passepartout. + public static let denied = L10n.tr("Core", "service.alerts.location.message.denied") + } + } + public enum MasksPrivateData { + public enum Messages { + /// In order to safely reset the current debug log and apply the new masking preference, you must reconnect to the VPN now. + public static let mustReconnect = L10n.tr("Core", "service.alerts.masks_private_data.messages.must_reconnect") + } + } + public enum ReconnectVpn { + /// Do you want to reconnect to the VPN? + public static let message = L10n.tr("Core", "service.alerts.reconnect_vpn.message") + } + public enum Rename { + /// Rename profile + public static let title = L10n.tr("Core", "service.alerts.rename.title") + } + public enum TestConnectivity { + /// Connectivity + public static let title = L10n.tr("Core", "service.alerts.test_connectivity.title") + public enum Messages { + /// Your device has no Internet connectivity, please review your profile parameters. + public static let failure = L10n.tr("Core", "service.alerts.test_connectivity.messages.failure") + /// Your device is connected to the Internet! + public static let success = L10n.tr("Core", "service.alerts.test_connectivity.messages.success") + } + } + public enum Trusted { + public enum NoNetwork { + /// You are not connected to any Wi-Fi network. + public static let message = L10n.tr("Core", "service.alerts.trusted.no_network.message") + } + public enum WillDisconnectPolicy { + /// By changing the trust policy, the VPN may be disconnected. Continue? + public static let message = L10n.tr("Core", "service.alerts.trusted.will_disconnect_policy.message") + } + public enum WillDisconnectTrusted { + /// By trusting this network, the VPN may be disconnected. Continue? + public static let message = L10n.tr("Core", "service.alerts.trusted.will_disconnect_trusted.message") + } + } + } + public enum Cells { + public enum Addresses { + /// Addresses + public static let caption = L10n.tr("Core", "service.cells.addresses.caption") + } + public enum Category { + /// Category + public static let caption = L10n.tr("Core", "service.cells.category.caption") + } + public enum ConnectionStatus { + /// Status + public static let caption = L10n.tr("Core", "service.cells.connection_status.caption") + } + public enum DataCount { + /// Exchanged data + public static let caption = L10n.tr("Core", "service.cells.data_count.caption") + /// Unavailable + public static let `none` = L10n.tr("Core", "service.cells.data_count.none") + } + public enum DebugLog { + /// Debug log + public static let caption = L10n.tr("Core", "service.cells.debug_log.caption") + } + public enum Host { + public enum Parameters { + /// Parameters + public static let caption = L10n.tr("Core", "service.cells.host.parameters.caption") + } + } + public enum MasksPrivateData { + /// Mask network data + public static let caption = L10n.tr("Core", "service.cells.masks_private_data.caption") + } + public enum OnlyShowsFavorites { + /// Only show favorite locations + public static let caption = L10n.tr("Core", "service.cells.only_shows_favorites.caption") + } + public enum Provider { + public enum Pool { + /// Location + public static let caption = L10n.tr("Core", "service.cells.provider.pool.caption") + } + public enum Preset { + /// Preset + public static let caption = L10n.tr("Core", "service.cells.provider.preset.caption") + } + public enum Refresh { + /// Refresh infrastructure + public static let caption = L10n.tr("Core", "service.cells.provider.refresh.caption") + } + } + public enum Reconnect { + /// Reconnect + public static let caption = L10n.tr("Core", "service.cells.reconnect.caption") + } + public enum ReportIssue { + /// Report connectivity issue + public static let caption = L10n.tr("Core", "service.cells.report_issue.caption") + } + public enum ServerConfiguration { + /// Server configuration + public static let caption = L10n.tr("Core", "service.cells.server_configuration.caption") + } + public enum ServerNetwork { + /// Server network + public static let caption = L10n.tr("Core", "service.cells.server_network.caption") + } + public enum TestConnectivity { + /// Test connectivity + public static let caption = L10n.tr("Core", "service.cells.test_connectivity.caption") + } + public enum TrustedAddWifi { + /// Add Wi-Fi + public static let caption = L10n.tr("Core", "service.cells.trusted_add_wifi.caption") + } + public enum TrustedMobile { + /// Cellular network + public static let caption = L10n.tr("Core", "service.cells.trusted_mobile.caption") + } + public enum TrustedPolicy { + /// Trust disables VPN + public static let caption = L10n.tr("Core", "service.cells.trusted_policy.caption") + } + public enum UseProfile { + /// Use this profile + public static let caption = L10n.tr("Core", "service.cells.use_profile.caption") + } + public enum Vpn { + public enum TurnOff { + /// Disable VPN + public static let caption = L10n.tr("Core", "service.cells.vpn.turn_off.caption") + } + public enum TurnOn { + /// Enable VPN + public static let caption = L10n.tr("Core", "service.cells.vpn.turn_on.caption") + } + } + public enum VpnResolvesHostname { + /// Resolve provider hostname + public static let caption = L10n.tr("Core", "service.cells.vpn_resolves_hostname.caption") + } + public enum VpnService { + /// Enabled + public static let caption = L10n.tr("Core", "service.cells.vpn_service.caption") + } + public enum VpnSurvivesSleep { + /// Keep alive on sleep + public static let caption = L10n.tr("Core", "service.cells.vpn_survives_sleep.caption") + } + } + public enum Sections { + public enum Configuration { + /// Configuration + public static let header = L10n.tr("Core", "service.sections.configuration.header") + } + public enum Diagnostics { + /// Masking status will be effective after reconnecting. Network data are hostnames, IP addresses, routing, SSID. Credentials and private keys are not logged regardless. + public static let footer = L10n.tr("Core", "service.sections.diagnostics.footer") + /// Diagnostics + public static let header = L10n.tr("Core", "service.sections.diagnostics.header") + } + public enum ProviderInfrastructure { + /// Last updated on %@. + public static func footer(_ p1: Any) -> String { + return L10n.tr("Core", "service.sections.provider_infrastructure.footer", String(describing: p1)) + } + } + public enum Status { + /// Connection + public static let header = L10n.tr("Core", "service.sections.status.header") + } + public enum Trusted { + /// When entering a trusted network, the VPN is normally shut down and kept disconnected. Disable this option to not enforce such behavior. + public static let footer = L10n.tr("Core", "service.sections.trusted.footer") + /// Trusted networks + public static let header = L10n.tr("Core", "service.sections.trusted.header") + } + public enum Vpn { + /// The connection will be established whenever necessary. + public static let footer = L10n.tr("Core", "service.sections.vpn.footer") + /// VPN + public static let header = L10n.tr("Core", "service.sections.vpn.header") + } + public enum VpnResolvesHostname { + /// Preferred in most networks and required in some IPv6 networks. Disable where DNS is blocked, or to speed up negotiation when DNS is slow to respond. + public static let footer = L10n.tr("Core", "service.sections.vpn_resolves_hostname.footer") + } + public enum VpnSurvivesSleep { + /// Disable to improve battery usage, at the expense of occasional slowdowns due to wake-up reconnections. + public static let footer = L10n.tr("Core", "service.sections.vpn_survives_sleep.footer") + } + } + public enum Welcome { + /// Welcome to Passepartout!\n\nUse the organizer to add a new profile. + public static let message = L10n.tr("Core", "service.welcome.message") + } + } + + public enum Share { + /// Passepartout is an user-friendly, open source OpenVPN client for iOS and macOS + public static let message = L10n.tr("Core", "share.message") + } + + public enum Shortcuts { + public enum Add { + /// Add shortcut + public static let title = L10n.tr("Core", "shortcuts.add.title") + public enum Alerts { + public enum NoProfiles { + /// There is no profile to connect to. + public static let message = L10n.tr("Core", "shortcuts.add.alerts.no_profiles.message") + } + } + public enum Cells { + public enum Connect { + /// Connect to + public static let caption = L10n.tr("Core", "shortcuts.add.cells.connect.caption") + } + public enum DisableVpn { + /// Disable VPN + public static let caption = L10n.tr("Core", "shortcuts.add.cells.disable_vpn.caption") + } + public enum EnableVpn { + /// Enable VPN + public static let caption = L10n.tr("Core", "shortcuts.add.cells.enable_vpn.caption") + } + public enum TrustCellular { + /// Trust cellular network + public static let caption = L10n.tr("Core", "shortcuts.add.cells.trust_cellular.caption") + } + public enum TrustCurrentWifi { + /// Trust current Wi-Fi + public static let caption = L10n.tr("Core", "shortcuts.add.cells.trust_current_wifi.caption") + } + public enum UntrustCellular { + /// Untrust cellular network + public static let caption = L10n.tr("Core", "shortcuts.add.cells.untrust_cellular.caption") + } + public enum UntrustCurrentWifi { + /// Untrust current Wi-Fi + public static let caption = L10n.tr("Core", "shortcuts.add.cells.untrust_current_wifi.caption") + } + } + public enum Sections { + public enum Cellular { + /// Cellular + public static let header = L10n.tr("Core", "shortcuts.add.sections.cellular.header") + } + public enum Vpn { + /// VPN + public static let header = L10n.tr("Core", "shortcuts.add.sections.vpn.header") + } + public enum Wifi { + /// Wi-Fi + public static let header = L10n.tr("Core", "shortcuts.add.sections.wifi.header") + } + } + } + public enum Edit { + /// Manage shortcuts + public static let title = L10n.tr("Core", "shortcuts.edit.title") + public enum Cells { + public enum AddShortcut { + /// Add shortcut + public static let caption = L10n.tr("Core", "shortcuts.edit.cells.add_shortcut.caption") + } + } + public enum Sections { + public enum All { + /// Existing shortcuts + public static let header = L10n.tr("Core", "shortcuts.edit.sections.all.header") + } + } + } + } + + public enum Translations { + /// Translations + public static let title = L10n.tr("Core", "translations.title") + } + + public enum Trusted { + public enum Columns { + public enum Trust { + /// Trust + public static let title = L10n.tr("Core", "trusted.columns.trust.title") + } + } + public enum Ethernet { + /// Check to trust any wired cable connection. + public static let description = L10n.tr("Core", "trusted.ethernet.description") + /// Trust wired connections + public static let title = L10n.tr("Core", "trusted.ethernet.title") + } + } + + public enum Version { + /// Version + public static let title = L10n.tr("Core", "version.title") + public enum Labels { + /// Passepartout and TunnelKit are written and maintained by Davide De Rosa (keeshux).\n\nSource code for Passepartout and TunnelKit is publicly available on GitHub under the GPLv3, you can find links in the home page.\n\nPassepartout is a non-official client and is in no way affiliated with OpenVPN Inc. + public static let intro = L10n.tr("Core", "version.labels.intro") + } + } + + public enum Vpn { + /// Active + public static let active = L10n.tr("Core", "vpn.active") + /// Connecting + public static let connecting = L10n.tr("Core", "vpn.connecting") + /// Disabled + public static let disabled = L10n.tr("Core", "vpn.disabled") + /// Disconnecting + public static let disconnecting = L10n.tr("Core", "vpn.disconnecting") + /// Inactive + public static let inactive = L10n.tr("Core", "vpn.inactive") + /// Off + public static let unused = L10n.tr("Core", "vpn.unused") + public enum Errors { + /// Auth failed + public static let auth = L10n.tr("Core", "vpn.errors.auth") + /// Compression unsupported + public static let compression = L10n.tr("Core", "vpn.errors.compression") + /// DNS failed + public static let dns = L10n.tr("Core", "vpn.errors.dns") + /// Encryption failed + public static let encryption = L10n.tr("Core", "vpn.errors.encryption") + /// No gateway + public static let gateway = L10n.tr("Core", "vpn.errors.gateway") + /// Network changed + public static let network = L10n.tr("Core", "vpn.errors.network") + /// Missing routing + public static let routing = L10n.tr("Core", "vpn.errors.routing") + /// Server shutdown + public static let shutdown = L10n.tr("Core", "vpn.errors.shutdown") + /// Timeout + public static let timeout = L10n.tr("Core", "vpn.errors.timeout") + /// TLS failed + public static let tls = L10n.tr("Core", "vpn.errors.tls") + } + } + + public enum Wizards { + public enum Host { + public enum Alerts { + public enum Existing { + /// A host profile with the same title already exists. Replace it? + public static let message = L10n.tr("Core", "wizards.host.alerts.existing.message") + } + } + public enum Cells { + public enum TitleInput { + /// Title + public static let caption = L10n.tr("Core", "wizards.host.cells.title_input.caption") + } + } + public enum Sections { + public enum Existing { + /// Existing profiles + public static let header = L10n.tr("Core", "wizards.host.sections.existing.header") + } + } + } + public enum Provider { + public enum Alerts { + public enum Unavailable { + /// Could not download provider infrastructure, please retry later. + public static let message = L10n.tr("Core", "wizards.provider.alerts.unavailable.message") + } + } + public enum Cells { + public enum UpdateList { + /// Update list + public static let caption = L10n.tr("Core", "wizards.provider.cells.update_list.caption") + } + } + } + } +} +// swiftlint:enable explicit_type_interface function_parameter_count identifier_name line_length +// swiftlint:enable nesting type_body_length type_name vertical_whitespace_opening_braces + +// MARK: - Implementation Details + +extension L10n { + private static func tr(_ table: String, _ key: String, _ args: CVarArg...) -> String { + let format = BundleToken.bundle.localizedString(forKey: key, value: nil, table: table) + return String(format: format, locale: Locale.current, arguments: args) + } +} + +// swiftlint:disable convenience_type +private final class BundleToken { + static let bundle: Bundle = { + #if SWIFT_PACKAGE + return Bundle.module + #else + return Bundle(for: BundleToken.self) + #endif + }() +} +// swiftlint:enable convenience_type diff --git a/Passepartout/Core/Sources/Utils.swift b/Passepartout/Core/Sources/Utils.swift index 6227503c..727c0bef 100644 --- a/Passepartout/Core/Sources/Utils.swift +++ b/Passepartout/Core/Sources/Utils.swift @@ -201,11 +201,17 @@ public extension Array where Element: CustomStringConvertible { public extension Infrastructure.Metadata { var guidanceString: String? { - let key = "account.sections.guidance.footer.infrastructure.\(name)" - let format = NSLocalizedString(key, tableName: "Core", bundle: .main, comment: "") - guard format != key else { - return nil + let prefix = "account.sections.guidance.footer.infrastructure" + let key = "\(prefix).\(name)" + var format = NSLocalizedString(key, tableName: "Core", bundle: Bundle(for: Infrastructure.self), comment: "") + + // i.e. key not found + if format == key { + let purpose = name.credentialsPurpose + let defaultKey = "\(prefix).default.\(purpose)" + format = NSLocalizedString(defaultKey, tableName: "Core", bundle: Bundle(for: Infrastructure.self), comment: "") } + return String(format: format, locale: .current, description) } diff --git a/Passepartout/Core/swiftgen.yml b/Passepartout/Core/swiftgen.yml new file mode 100644 index 00000000..320d6740 --- /dev/null +++ b/Passepartout/Core/swiftgen.yml @@ -0,0 +1,8 @@ +strings: + inputs: + - Resources/en.lproj/Core.strings + outputs: + - templateName: structured-swift4 + output: Sources/SwiftGen+Strings.swift + params: + publicAccess: true