Merge branch 'adjust-metadata-and-about'

This commit is contained in:
Davide De Rosa 2018-10-29 21:37:30 +01:00
commit e566b2483e
12 changed files with 83 additions and 83 deletions

View File

@ -23,8 +23,6 @@ internal enum StoryboardSegue {
internal enum Organizer: String, SegueType { internal enum Organizer: String, SegueType {
case aboutSegueIdentifier = "AboutSegueIdentifier" case aboutSegueIdentifier = "AboutSegueIdentifier"
case addProviderSegueIdentifier = "AddProviderSegueIdentifier" case addProviderSegueIdentifier = "AddProviderSegueIdentifier"
case creditsSegueIdentifier = "CreditsSegueIdentifier"
case disclaimerSegueIdentifier = "DisclaimerSegueIdentifier"
case importHostSegueIdentifier = "ImportHostSegueIdentifier" case importHostSegueIdentifier = "ImportHostSegueIdentifier"
case selectProfileSegueIdentifier = "SelectProfileSegueIdentifier" case selectProfileSegueIdentifier = "SelectProfileSegueIdentifier"
case showImportedHostsSegueIdentifier = "ShowImportedHostsSegueIdentifier" case showImportedHostsSegueIdentifier = "ShowImportedHostsSegueIdentifier"

View File

@ -39,7 +39,7 @@ class AboutViewController: UITableViewController, TableModelHost {
model.setHeader(L10n.About.Sections.Source.header, for: .source) model.setHeader(L10n.About.Sections.Source.header, for: .source)
model.setHeader(L10n.About.Sections.Share.header, for: .share) model.setHeader(L10n.About.Sections.Share.header, for: .share)
model.setHeader(L10n.About.Sections.Feedback.header, for: .feedback) model.setHeader(L10n.About.Sections.Feedback.header, for: .feedback)
model.set([.version, .credits, .disclaimer, .website], in: .info) model.set([.version, .website, .disclaimer, .privacyPolicy], in: .info)
model.set([.sourcePassepartout, .sourceTunnelKit], in: .source) model.set([.sourcePassepartout, .sourceTunnelKit], in: .source)
model.set([.shareTwitter, .shareGeneric], in: .share) model.set([.shareTwitter, .shareGeneric], in: .share)
model.set([.joinCommunity, .writeReview], in: .feedback) model.set([.joinCommunity, .writeReview], in: .feedback)
@ -69,18 +69,18 @@ class AboutViewController: UITableViewController, TableModelHost {
perform(segue: StoryboardSegue.Organizer.versionSegueIdentifier) perform(segue: StoryboardSegue.Organizer.versionSegueIdentifier)
} }
private func showCredits() {
perform(segue: StoryboardSegue.Organizer.creditsSegueIdentifier)
}
private func showDisclaimer() {
perform(segue: StoryboardSegue.Organizer.disclaimerSegueIdentifier)
}
private func visitWebsite() { private func visitWebsite() {
UIApplication.shared.open(AppConstants.URLs.website, options: [:], completionHandler: nil) UIApplication.shared.open(AppConstants.URLs.website, options: [:], completionHandler: nil)
} }
private func visitDisclaimer() {
UIApplication.shared.open(AppConstants.URLs.disclaimer, options: [:], completionHandler: nil)
}
private func visitPrivacyPolicy() {
UIApplication.shared.open(AppConstants.URLs.privacyPolicy, options: [:], completionHandler: nil)
}
private func visitRepository(_ url: URL) { private func visitRepository(_ url: URL) {
UIApplication.shared.open(url, options: [:], completionHandler: nil) UIApplication.shared.open(url, options: [:], completionHandler: nil)
} }
@ -108,28 +108,6 @@ class AboutViewController: UITableViewController, TableModelHost {
@IBAction private func dismiss() { @IBAction private func dismiss() {
dismiss(animated: true, completion: nil) dismiss(animated: true, completion: nil)
} }
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard let sid = segue.identifier, let segueType = StoryboardSegue.Organizer(rawValue: sid) else {
return
}
guard let vc = segue.destination as? LabelViewController else {
return
}
switch segueType {
case .creditsSegueIdentifier:
var notices = AppConstants.Notices.all
notices.insert(L10n.Credits.Labels.thirdParties, at: 0)
vc.text = notices.joined(separator: "\n\n")
case .disclaimerSegueIdentifier:
vc.text = L10n.Disclaimer.Labels.text
default:
break
}
}
} }
// MARK: - // MARK: -
@ -148,11 +126,11 @@ extension AboutViewController {
enum RowType: Int { enum RowType: Int {
case version case version
case credits case website
case disclaimer case disclaimer
case website case privacyPolicy
case sourcePassepartout case sourcePassepartout
@ -187,25 +165,25 @@ extension AboutViewController {
switch model.row(at: indexPath) { switch model.row(at: indexPath) {
case .version: case .version:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath) let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.leftText = L10n.About.Cells.Version.caption cell.leftText = L10n.Version.title
cell.rightText = Utils.versionString() cell.rightText = Utils.versionString()
return cell return cell
case .credits:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.leftText = L10n.Credits.title
return cell
case .disclaimer:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.leftText = L10n.Disclaimer.title
return cell
case .website: case .website:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath) let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.leftText = L10n.About.Cells.Website.caption cell.leftText = L10n.About.Cells.Website.caption
return cell return cell
case .disclaimer:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.leftText = L10n.About.Cells.Disclaimer.caption
return cell
case .privacyPolicy:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.leftText = L10n.About.Cells.PrivacyPolicy.caption
return cell
case .sourcePassepartout: case .sourcePassepartout:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath) let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.leftText = GroupConstants.App.name cell.leftText = GroupConstants.App.name
@ -243,15 +221,15 @@ extension AboutViewController {
case .version: case .version:
showVersion() showVersion()
case .credits:
showCredits()
case .disclaimer:
showDisclaimer()
case .website: case .website:
visitWebsite() visitWebsite()
case .disclaimer:
visitDisclaimer()
case .privacyPolicy:
visitPrivacyPolicy()
case .sourcePassepartout: case .sourcePassepartout:
visitRepository(AppConstants.Repos.passepartout) visitRepository(AppConstants.Repos.passepartout)

View File

@ -32,12 +32,12 @@ class VersionViewController: UIViewController {
@IBOutlet private weak var labelVersion: UILabel? @IBOutlet private weak var labelVersion: UILabel?
@IBOutlet private weak var labelCopyright: UILabel?
@IBOutlet private weak var labelIntro: UILabel? @IBOutlet private weak var labelIntro: UILabel?
@IBOutlet private weak var buttonChangelog: UIButton? @IBOutlet private weak var buttonChangelog: UIButton?
@IBOutlet private weak var buttonCredits: UIButton?
override func awakeFromNib() { override func awakeFromNib() {
super.awakeFromNib() super.awakeFromNib()
@ -47,20 +47,32 @@ class VersionViewController: UIViewController {
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
title = L10n.Version.title
labelTitle?.text = GroupConstants.App.name labelTitle?.text = GroupConstants.App.name
labelVersion?.text = Utils.versionString() labelVersion?.text = Utils.versionString()
labelCopyright?.text = GroupConstants.App.name
labelIntro?.text = L10n.Version.Labels.intro labelIntro?.text = L10n.Version.Labels.intro
buttonChangelog?.setTitle(L10n.Version.Buttons.changelog, for: .normal) buttonChangelog?.setTitle(L10n.Version.Buttons.changelog, for: .normal)
buttonCredits?.setTitle(L10n.Version.Buttons.credits, for: .normal)
scrollView?.applyPrimaryBackground(Theme.current) scrollView?.applyPrimaryBackground(Theme.current)
for label in [labelTitle, labelVersion, labelCopyright, labelIntro] { for label in [labelTitle, labelVersion, labelIntro] {
label?.applyLight(Theme.current) label?.applyLight(Theme.current)
} }
buttonChangelog?.apply(Theme.current) buttonChangelog?.apply(Theme.current)
buttonCredits?.apply(Theme.current)
} }
@IBAction private func visitChangelog() { @IBAction private func visitChangelog() {
UIApplication.shared.open(AppConstants.URLs.changelog, options: [:], completionHandler: nil) UIApplication.shared.open(AppConstants.URLs.changelog, options: [:], completionHandler: nil)
} }
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard let vc = segue.destination as? LabelViewController else {
return
}
vc.title = L10n.Credits.title
var notices = AppConstants.Notices.all
notices.insert(L10n.Credits.Labels.thirdParties, at: 0)
vc.text = notices.joined(separator: "\n\n")
}
} }

View File

@ -328,10 +328,10 @@
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/> <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<subviews> <subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Kan-Ro-DbI"> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Kan-Ro-DbI">
<rect key="frame" x="0.0" y="0.0" width="375" height="448"/> <rect key="frame" x="0.0" y="0.0" width="375" height="491"/>
<subviews> <subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="RP1-au-v0h"> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="RP1-au-v0h">
<rect key="frame" x="28" y="40" width="319" height="368"/> <rect key="frame" x="28" y="40" width="319" height="411"/>
<subviews> <subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="logo" translatesAutoresizingMaskIntoConstraints="NO" id="eRj-AM-Edq"> <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="logo" translatesAutoresizingMaskIntoConstraints="NO" id="eRj-AM-Edq">
<rect key="frame" x="59.5" y="0.0" width="200" height="200"/> <rect key="frame" x="59.5" y="0.0" width="200" height="200"/>
@ -362,6 +362,14 @@
<action selector="visitChangelog" destination="PMT-gj-ARE" eventType="touchUpInside" id="hSv-6o-eXI"/> <action selector="visitChangelog" destination="PMT-gj-ARE" eventType="touchUpInside" id="hSv-6o-eXI"/>
</connections> </connections>
</button> </button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="rtK-wa-fgh">
<rect key="frame" x="0.0" y="378" width="319" height="33"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
<state key="normal" title="&lt;CRD&gt;"/>
<connections>
<segue destination="2d7-Ad-AZr" kind="show" id="SQ0-O9-E5E"/>
</connections>
</button>
</subviews> </subviews>
<constraints> <constraints>
<constraint firstAttribute="trailing" secondItem="wV2-Nx-RuF" secondAttribute="trailing" id="1jj-cq-2Ja"/> <constraint firstAttribute="trailing" secondItem="wV2-Nx-RuF" secondAttribute="trailing" id="1jj-cq-2Ja"/>
@ -370,14 +378,17 @@
<constraint firstItem="Zek-qD-saW" firstAttribute="leading" secondItem="RP1-au-v0h" secondAttribute="leading" id="4r5-es-LKj"/> <constraint firstItem="Zek-qD-saW" firstAttribute="leading" secondItem="RP1-au-v0h" secondAttribute="leading" id="4r5-es-LKj"/>
<constraint firstItem="tOJ-Gb-6TL" firstAttribute="top" secondItem="Zek-qD-saW" secondAttribute="bottom" constant="5" id="5EV-6h-af6"/> <constraint firstItem="tOJ-Gb-6TL" firstAttribute="top" secondItem="Zek-qD-saW" secondAttribute="bottom" constant="5" id="5EV-6h-af6"/>
<constraint firstItem="F6g-5X-yGY" firstAttribute="leading" secondItem="RP1-au-v0h" secondAttribute="leading" id="Bbh-jl-eyk"/> <constraint firstItem="F6g-5X-yGY" firstAttribute="leading" secondItem="RP1-au-v0h" secondAttribute="leading" id="Bbh-jl-eyk"/>
<constraint firstItem="rtK-wa-fgh" firstAttribute="top" secondItem="wV2-Nx-RuF" secondAttribute="bottom" constant="10" id="ChX-qg-yan"/>
<constraint firstItem="Zek-qD-saW" firstAttribute="top" secondItem="eRj-AM-Edq" secondAttribute="bottom" constant="20" id="E5v-Gd-4FH"/> <constraint firstItem="Zek-qD-saW" firstAttribute="top" secondItem="eRj-AM-Edq" secondAttribute="bottom" constant="20" id="E5v-Gd-4FH"/>
<constraint firstItem="wV2-Nx-RuF" firstAttribute="leading" secondItem="RP1-au-v0h" secondAttribute="leading" id="Iop-zX-3fL"/> <constraint firstItem="wV2-Nx-RuF" firstAttribute="leading" secondItem="RP1-au-v0h" secondAttribute="leading" id="Iop-zX-3fL"/>
<constraint firstItem="F6g-5X-yGY" firstAttribute="top" secondItem="tOJ-Gb-6TL" secondAttribute="bottom" constant="20" id="Vla-uy-lL8"/> <constraint firstItem="F6g-5X-yGY" firstAttribute="top" secondItem="tOJ-Gb-6TL" secondAttribute="bottom" constant="20" id="Vla-uy-lL8"/>
<constraint firstAttribute="trailing" secondItem="Zek-qD-saW" secondAttribute="trailing" id="WL1-SB-5gf"/> <constraint firstAttribute="trailing" secondItem="Zek-qD-saW" secondAttribute="trailing" id="WL1-SB-5gf"/>
<constraint firstAttribute="bottom" secondItem="rtK-wa-fgh" secondAttribute="bottom" id="XDo-fJ-IOo"/>
<constraint firstAttribute="trailing" secondItem="tOJ-Gb-6TL" secondAttribute="trailing" id="a5o-c7-BD5"/> <constraint firstAttribute="trailing" secondItem="tOJ-Gb-6TL" secondAttribute="trailing" id="a5o-c7-BD5"/>
<constraint firstAttribute="trailing" secondItem="rtK-wa-fgh" secondAttribute="trailing" id="dBQ-XF-2mE"/>
<constraint firstItem="tOJ-Gb-6TL" firstAttribute="leading" secondItem="RP1-au-v0h" secondAttribute="leading" id="grT-YM-rGi"/> <constraint firstItem="tOJ-Gb-6TL" firstAttribute="leading" secondItem="RP1-au-v0h" secondAttribute="leading" id="grT-YM-rGi"/>
<constraint firstAttribute="bottom" secondItem="wV2-Nx-RuF" secondAttribute="bottom" id="m4p-a0-sqe"/>
<constraint firstItem="eRj-AM-Edq" firstAttribute="top" secondItem="RP1-au-v0h" secondAttribute="top" id="q35-KT-uTl"/> <constraint firstItem="eRj-AM-Edq" firstAttribute="top" secondItem="RP1-au-v0h" secondAttribute="top" id="q35-KT-uTl"/>
<constraint firstItem="rtK-wa-fgh" firstAttribute="leading" secondItem="RP1-au-v0h" secondAttribute="leading" id="weH-qk-nTh"/>
<constraint firstItem="wV2-Nx-RuF" firstAttribute="top" secondItem="F6g-5X-yGY" secondAttribute="bottom" constant="20" id="y5I-Du-MiY"/> <constraint firstItem="wV2-Nx-RuF" firstAttribute="top" secondItem="F6g-5X-yGY" secondAttribute="bottom" constant="20" id="y5I-Du-MiY"/>
</constraints> </constraints>
</view> </view>
@ -411,6 +422,7 @@
</view> </view>
<connections> <connections>
<outlet property="buttonChangelog" destination="wV2-Nx-RuF" id="E0X-ek-Ii2"/> <outlet property="buttonChangelog" destination="wV2-Nx-RuF" id="E0X-ek-Ii2"/>
<outlet property="buttonCredits" destination="rtK-wa-fgh" id="56A-mE-YHa"/>
<outlet property="labelIntro" destination="F6g-5X-yGY" id="QSg-VO-Wf4"/> <outlet property="labelIntro" destination="F6g-5X-yGY" id="QSg-VO-Wf4"/>
<outlet property="labelTitle" destination="Zek-qD-saW" id="TL8-Vb-B58"/> <outlet property="labelTitle" destination="Zek-qD-saW" id="TL8-Vb-B58"/>
<outlet property="labelVersion" destination="tOJ-Gb-6TL" id="O7w-Ne-L0R"/> <outlet property="labelVersion" destination="tOJ-Gb-6TL" id="O7w-Ne-L0R"/>
@ -419,7 +431,7 @@
</viewController> </viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="n7m-Yv-Puo" userLabel="First Responder" sceneMemberID="firstResponder"/> <placeholder placeholderIdentifier="IBFirstResponder" id="n7m-Yv-Puo" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects> </objects>
<point key="canvasLocation" x="-2551.1999999999998" y="-2224.1379310344828"/> <point key="canvasLocation" x="-2551" y="-2246"/>
</scene> </scene>
<!--Navigation Controller--> <!--Navigation Controller-->
<scene sceneID="bMd-7b-j9C"> <scene sceneID="bMd-7b-j9C">
@ -484,9 +496,7 @@
</barButtonItem> </barButtonItem>
</navigationItem> </navigationItem>
<connections> <connections>
<segue destination="2d7-Ad-AZr" kind="show" identifier="CreditsSegueIdentifier" id="tGv-dr-20P"/>
<segue destination="PMT-gj-ARE" kind="show" identifier="VersionSegueIdentifier" id="uYt-4N-PPL"/> <segue destination="PMT-gj-ARE" kind="show" identifier="VersionSegueIdentifier" id="uYt-4N-PPL"/>
<segue destination="2d7-Ad-AZr" kind="show" identifier="DisclaimerSegueIdentifier" id="HW6-RJ-VFY"/>
</connections> </connections>
</tableViewController> </tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="AnH-Vt-JJn" userLabel="First Responder" sceneMemberID="firstResponder"/> <placeholder placeholderIdentifier="IBFirstResponder" id="AnH-Vt-JJn" userLabel="First Responder" sceneMemberID="firstResponder"/>
@ -566,7 +576,6 @@
<image name="logo" width="200" height="200"/> <image name="logo" width="200" height="200"/>
</resources> </resources>
<inferredMetricsTieBreakers> <inferredMetricsTieBreakers>
<segue reference="HW6-RJ-VFY"/>
<segue reference="kwN-PZ-Zg5"/> <segue reference="kwN-PZ-Zg5"/>
</inferredMetricsTieBreakers> </inferredMetricsTieBreakers>
</document> </document>

View File

@ -189,8 +189,9 @@
"about.sections.source.header" = "Source code"; "about.sections.source.header" = "Source code";
"about.sections.share.header" = "Share"; "about.sections.share.header" = "Share";
"about.sections.feedback.header" = "Feedback"; "about.sections.feedback.header" = "Feedback";
"about.cells.version.caption" = "Version";
"about.cells.website.caption" = "Visit website"; "about.cells.website.caption" = "Visit website";
"about.cells.disclaimer.caption" = "Disclaimer";
"about.cells.privacy_policy.caption" = "Privacy policy";
"about.cells.share_twitter.caption" = "Tweet about it!"; "about.cells.share_twitter.caption" = "Tweet about it!";
"about.cells.share_generic.caption" = "Invite a friend"; "about.cells.share_generic.caption" = "Invite a friend";
"about.cells.join_community.caption" = "Join community"; "about.cells.join_community.caption" = "Join community";
@ -198,11 +199,10 @@
"share.message" = "Passepartout is an user-friendly, open source OpenVPN client for iOS and macOS"; "share.message" = "Passepartout is an user-friendly, open source OpenVPN client for iOS and macOS";
"version.labels.intro" = "Passepartout and TunnelKit are written and maintained by Davide De Rosa (keeshux).\n\nTunnelKit is a native OpenVPN client originally forked from PIATunnel by Private Internet Access.\n\nSource code for Passepartout and TunnelKit is publicly available on GitHub under the GPLv3."; "version.title" = "Version";
"version.labels.intro" = "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.\n\nPassepartout is a non-official client and is in no way affiliated with OpenVPN Inc.";
"version.buttons.changelog" = "CHANGELOG"; "version.buttons.changelog" = "CHANGELOG";
"version.buttons.credits" = "CREDITS";
"credits.title" = "Credits"; "credits.title" = "Credits";
"credits.labels.third_parties" = "Passepartout is a non-official client and is in no way affiliated with OpenVPN Inc.\n\nThe logo is taken from the awesome Circle Icons set by Nick Roach."; "credits.labels.third_parties" = "The logo is taken from the awesome Circle Icons set by Nick Roach.";
"disclaimer.title" = "Disclaimer";
"disclaimer.labels.text" = "Passepartout is a VPN client based on independent work. As such, the developer -while making his best efforts to avoid it- takes no responsibility about any damage caused by the use of this software.\n\nAdditionally, the developer takes no responsibility about data usage, monitoring, logging etc. by the servers you connect to. Passepartout is not even involved in the above choices, as they're part of server-side policies.\n\nFor more information about data usage by third parties, please review the privacy policy of your VPN provider.";

View File

@ -122,6 +122,10 @@ class AppConstants {
class URLs { class URLs {
static let website = URL(string: "https://\(Domain.name)")! static let website = URL(string: "https://\(Domain.name)")!
static let disclaimer = website.appendingPathComponent("disclaimer")
static let privacyPolicy = website.appendingPathComponent("privacy")
static let changelog = Repos.passepartout.appendingPathComponent("blob/master/CHANGELOG.md") static let changelog = Repos.passepartout.appendingPathComponent("blob/master/CHANGELOG.md")
static let subreddit = URL(string: "https://www.reddit.com/r/passepartout")! static let subreddit = URL(string: "https://www.reddit.com/r/passepartout")!

View File

@ -16,10 +16,18 @@ internal enum L10n {
/// About /// About
internal static let title = L10n.tr("Localizable", "about.title") internal static let title = L10n.tr("Localizable", "about.title")
internal enum Cells { internal enum Cells {
internal enum Disclaimer {
/// Disclaimer
internal static let caption = L10n.tr("Localizable", "about.cells.disclaimer.caption")
}
internal enum JoinCommunity { internal enum JoinCommunity {
/// Join community /// Join community
internal static let caption = L10n.tr("Localizable", "about.cells.join_community.caption") internal static let caption = L10n.tr("Localizable", "about.cells.join_community.caption")
} }
internal enum PrivacyPolicy {
/// Privacy policy
internal static let caption = L10n.tr("Localizable", "about.cells.privacy_policy.caption")
}
internal enum ShareGeneric { internal enum ShareGeneric {
/// Invite a friend /// Invite a friend
internal static let caption = L10n.tr("Localizable", "about.cells.share_generic.caption") internal static let caption = L10n.tr("Localizable", "about.cells.share_generic.caption")
@ -28,10 +36,6 @@ internal enum L10n {
/// Tweet about it! /// Tweet about it!
internal static let caption = L10n.tr("Localizable", "about.cells.share_twitter.caption") internal static let caption = L10n.tr("Localizable", "about.cells.share_twitter.caption")
} }
internal enum Version {
/// Version
internal static let caption = L10n.tr("Localizable", "about.cells.version.caption")
}
internal enum Website { internal enum Website {
/// Visit website /// Visit website
internal static let caption = L10n.tr("Localizable", "about.cells.website.caption") internal static let caption = L10n.tr("Localizable", "about.cells.website.caption")
@ -193,7 +197,7 @@ internal enum L10n {
/// Credits /// Credits
internal static let title = L10n.tr("Localizable", "credits.title") internal static let title = L10n.tr("Localizable", "credits.title")
internal enum Labels { internal enum Labels {
/// Passepartout is a non-official client and is in no way affiliated with OpenVPN Inc.\n\nThe logo is taken from the awesome Circle Icons set by Nick Roach. /// The logo is taken from the awesome Circle Icons set by Nick Roach.
internal static let thirdParties = L10n.tr("Localizable", "credits.labels.third_parties") internal static let thirdParties = L10n.tr("Localizable", "credits.labels.third_parties")
} }
} }
@ -213,15 +217,6 @@ internal enum L10n {
} }
} }
internal enum Disclaimer {
/// Disclaimer
internal static let title = L10n.tr("Localizable", "disclaimer.title")
internal enum Labels {
/// Passepartout is a VPN client based on independent work. As such, the developer -while making his best efforts to avoid it- takes no responsibility about any damage caused by the use of this software.\n\nAdditionally, the developer takes no responsibility about data usage, monitoring, logging etc. by the servers you connect to. Passepartout is not even involved in the above choices, as they're part of server-side policies.\n\nFor more information about data usage by third parties, please review the privacy policy of your VPN provider.
internal static let text = L10n.tr("Localizable", "disclaimer.labels.text")
}
}
internal enum Endpoint { internal enum Endpoint {
internal enum Cells { internal enum Cells {
internal enum AnyAddress { internal enum AnyAddress {
@ -611,12 +606,16 @@ internal enum L10n {
} }
internal enum Version { internal enum Version {
/// Version
internal static let title = L10n.tr("Localizable", "version.title")
internal enum Buttons { internal enum Buttons {
/// CHANGELOG /// CHANGELOG
internal static let changelog = L10n.tr("Localizable", "version.buttons.changelog") internal static let changelog = L10n.tr("Localizable", "version.buttons.changelog")
/// CREDITS
internal static let credits = L10n.tr("Localizable", "version.buttons.credits")
} }
internal enum Labels { internal enum Labels {
/// Passepartout and TunnelKit are written and maintained by Davide De Rosa (keeshux).\n\nTunnelKit is a native OpenVPN client originally forked from PIATunnel by Private Internet Access.\n\nSource code for Passepartout and TunnelKit is publicly available on GitHub under the GPLv3. /// 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.\n\nPassepartout is a non-official client and is in no way affiliated with OpenVPN Inc.
internal static let intro = L10n.tr("Localizable", "version.labels.intro") internal static let intro = L10n.tr("Localizable", "version.labels.intro")
} }
} }

View File

@ -52,7 +52,7 @@ Keeping the VPN active in the background provides smoother operation, but may be
### No unrequested activity ### No unrequested activity
Passepartout is a VPN client and does absolutely nothing else without your consent. The providers infrastructures are obtained via a [static GitHub API][app-api] only and only if you manually refresh them. Passepartout is a VPN client and does absolutely nothing else without your consent. The providers infrastructures are obtained via a [static GitHub API][app-api] if and only if you manually refresh them.
### Presets for major providers ### Presets for major providers
@ -84,7 +84,7 @@ Ignored:
- `--mssfix` - `--mssfix`
- Multiple `--remote` with different `host` values (first wins) - Multiple `--remote` with different `host` values (first wins)
Other flags are ignored too but planned to be implemented. Many other flags are ignored too but it's normally not an issue.
## Installation ## Installation

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

After

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 132 KiB

After

Width:  |  Height:  |  Size: 161 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 187 KiB

After

Width:  |  Height:  |  Size: 181 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 202 KiB

After

Width:  |  Height:  |  Size: 190 KiB