Merge branch 'rearrange-about'
This commit is contained in:
commit
23eaf78e35
|
@ -22,10 +22,10 @@
|
||||||
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
|
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
|
||||||
<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="414" height="491"/>
|
<rect key="frame" x="0.0" y="0.0" width="414" height="395"/>
|
||||||
<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="358" height="411"/>
|
<rect key="frame" x="28" y="40" width="358" height="315"/>
|
||||||
<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="79" y="0.0" width="200" height="200"/>
|
<rect key="frame" x="79" y="0.0" width="200" height="200"/>
|
||||||
|
@ -48,42 +48,20 @@
|
||||||
<nil key="textColor"/>
|
<nil key="textColor"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="wV2-Nx-RuF">
|
|
||||||
<rect key="frame" x="0.0" y="335" width="358" height="33"/>
|
|
||||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
|
||||||
<state key="normal" title="<CL>"/>
|
|
||||||
<connections>
|
|
||||||
<action selector="visitChangelog" destination="PMT-gj-ARE" eventType="touchUpInside" id="hSv-6o-eXI"/>
|
|
||||||
</connections>
|
|
||||||
</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="358" height="33"/>
|
|
||||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
|
||||||
<state key="normal" title="<CRD>"/>
|
|
||||||
<connections>
|
|
||||||
<segue destination="duu-Yq-oor" kind="show" id="w0a-1I-6Nc"/>
|
|
||||||
</connections>
|
|
||||||
</button>
|
|
||||||
</subviews>
|
</subviews>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="trailing" secondItem="wV2-Nx-RuF" secondAttribute="trailing" id="1jj-cq-2Ja"/>
|
|
||||||
<constraint firstItem="eRj-AM-Edq" firstAttribute="centerX" secondItem="RP1-au-v0h" secondAttribute="centerX" id="39V-6k-m1r"/>
|
<constraint firstItem="eRj-AM-Edq" firstAttribute="centerX" secondItem="RP1-au-v0h" secondAttribute="centerX" id="39V-6k-m1r"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="F6g-5X-yGY" secondAttribute="trailing" id="4NF-Ha-rCB"/>
|
<constraint firstAttribute="trailing" secondItem="F6g-5X-yGY" secondAttribute="trailing" id="4NF-Ha-rCB"/>
|
||||||
<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="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 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 firstAttribute="bottom" secondItem="F6g-5X-yGY" secondAttribute="bottom" id="tqI-4a-Mbr"/>
|
||||||
<constraint firstItem="wV2-Nx-RuF" firstAttribute="top" secondItem="F6g-5X-yGY" secondAttribute="bottom" constant="20" id="y5I-Du-MiY"/>
|
|
||||||
</constraints>
|
</constraints>
|
||||||
</view>
|
</view>
|
||||||
</subviews>
|
</subviews>
|
||||||
|
@ -115,8 +93,6 @@
|
||||||
<viewLayoutGuide key="safeArea" id="1um-xX-wxp"/>
|
<viewLayoutGuide key="safeArea" id="1um-xX-wxp"/>
|
||||||
</view>
|
</view>
|
||||||
<connections>
|
<connections>
|
||||||
<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"/>
|
||||||
|
@ -172,7 +148,7 @@
|
||||||
</tableViewController>
|
</tableViewController>
|
||||||
<placeholder placeholderIdentifier="IBFirstResponder" id="A5e-dW-BFv" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
<placeholder placeholderIdentifier="IBFirstResponder" id="A5e-dW-BFv" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||||
</objects>
|
</objects>
|
||||||
<point key="canvasLocation" x="-1786" y="-2247"/>
|
<point key="canvasLocation" x="-2552" y="-1544"/>
|
||||||
</scene>
|
</scene>
|
||||||
<!--Navigation Controller-->
|
<!--Navigation Controller-->
|
||||||
<scene sceneID="bMd-7b-j9C">
|
<scene sceneID="bMd-7b-j9C">
|
||||||
|
@ -238,6 +214,7 @@
|
||||||
</navigationItem>
|
</navigationItem>
|
||||||
<connections>
|
<connections>
|
||||||
<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="duu-Yq-oor" kind="show" identifier="CreditsSegueIdentifier" id="8oK-Gy-3Vg"/>
|
||||||
</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"/>
|
||||||
|
@ -316,7 +293,7 @@
|
||||||
</viewController>
|
</viewController>
|
||||||
<placeholder placeholderIdentifier="IBFirstResponder" id="Urb-bq-a19" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
<placeholder placeholderIdentifier="IBFirstResponder" id="Urb-bq-a19" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||||
</objects>
|
</objects>
|
||||||
<point key="canvasLocation" x="-1012" y="-2248"/>
|
<point key="canvasLocation" x="-1542" y="-1544"/>
|
||||||
</scene>
|
</scene>
|
||||||
</scenes>
|
</scenes>
|
||||||
<resources>
|
<resources>
|
||||||
|
|
|
@ -286,6 +286,7 @@ internal enum Asset {
|
||||||
internal static let pia = ImageAsset(name: "pia")
|
internal static let pia = ImageAsset(name: "pia")
|
||||||
internal static let protonvpn = ImageAsset(name: "protonvpn")
|
internal static let protonvpn = ImageAsset(name: "protonvpn")
|
||||||
internal static let tunnelbear = ImageAsset(name: "tunnelbear")
|
internal static let tunnelbear = ImageAsset(name: "tunnelbear")
|
||||||
|
internal static let vyprvpn = ImageAsset(name: "vyprvpn")
|
||||||
internal static let windscribe = ImageAsset(name: "windscribe")
|
internal static let windscribe = ImageAsset(name: "windscribe")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,7 @@ import UIKit
|
||||||
// swiftlint:disable explicit_type_interface identifier_name line_length type_body_length type_name
|
// swiftlint:disable explicit_type_interface identifier_name line_length type_body_length type_name
|
||||||
internal enum StoryboardSegue {
|
internal enum StoryboardSegue {
|
||||||
internal enum About: String, SegueType {
|
internal enum About: String, SegueType {
|
||||||
|
case creditsSegueIdentifier = "CreditsSegueIdentifier"
|
||||||
case versionSegueIdentifier = "VersionSegueIdentifier"
|
case versionSegueIdentifier = "VersionSegueIdentifier"
|
||||||
}
|
}
|
||||||
internal enum Main: String, SegueType {
|
internal enum Main: String, SegueType {
|
||||||
|
|
|
@ -33,11 +33,14 @@ class AboutViewController: UITableViewController, TableModelHost {
|
||||||
let model: TableModel<SectionType, RowType> = {
|
let model: TableModel<SectionType, RowType> = {
|
||||||
let model: TableModel<SectionType, RowType> = TableModel()
|
let model: TableModel<SectionType, RowType> = TableModel()
|
||||||
model.add(.info)
|
model.add(.info)
|
||||||
|
model.add(.moreInfo)
|
||||||
model.add(.web)
|
model.add(.web)
|
||||||
model.add(.share)
|
model.add(.share)
|
||||||
|
model.setHeader("", for: .info)
|
||||||
model.setHeader(L10n.About.Sections.Web.header, for: .web)
|
model.setHeader(L10n.About.Sections.Web.header, for: .web)
|
||||||
model.setHeader(L10n.About.Sections.Share.header, for: .share)
|
model.setHeader(L10n.About.Sections.Share.header, for: .share)
|
||||||
model.set([.version], in: .info)
|
model.set([.version], in: .info)
|
||||||
|
model.set([.seeChangelog, .seeCredits], in: .moreInfo)
|
||||||
model.set([.website, .faq, .disclaimer, .privacyPolicy], in: .web)
|
model.set([.website, .faq, .disclaimer, .privacyPolicy], in: .web)
|
||||||
model.set([.shareTwitter, .shareGeneric], in: .share)
|
model.set([.shareTwitter, .shareGeneric], in: .share)
|
||||||
return model
|
return model
|
||||||
|
@ -66,30 +69,14 @@ class AboutViewController: UITableViewController, TableModelHost {
|
||||||
perform(segue: StoryboardSegue.About.versionSegueIdentifier)
|
perform(segue: StoryboardSegue.About.versionSegueIdentifier)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func visitWebsite() {
|
private func openCredits() {
|
||||||
UIApplication.shared.open(AppConstants.URLs.website, options: [:], completionHandler: nil)
|
perform(segue: StoryboardSegue.About.creditsSegueIdentifier)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func visitFAQ() {
|
private func visit(_ url: URL) {
|
||||||
UIApplication.shared.open(AppConstants.URLs.faq, 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) {
|
|
||||||
UIApplication.shared.open(url, options: [:], completionHandler: nil)
|
UIApplication.shared.open(url, options: [:], completionHandler: nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func tweetAboutApp() {
|
|
||||||
UIApplication.shared.open(AppConstants.URLs.twitterIntent, options: [:], completionHandler: nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
private func inviteFriend(sender: UITableViewCell?) {
|
private func inviteFriend(sender: UITableViewCell?) {
|
||||||
let message = "\(L10n.Share.message) \(AppConstants.URLs.website)"
|
let message = "\(L10n.Share.message) \(AppConstants.URLs.website)"
|
||||||
let vc = UIActivityViewController(activityItems: [message], applicationActivities: nil)
|
let vc = UIActivityViewController(activityItems: [message], applicationActivities: nil)
|
||||||
|
@ -108,6 +95,8 @@ extension AboutViewController {
|
||||||
enum SectionType: Int {
|
enum SectionType: Int {
|
||||||
case info
|
case info
|
||||||
|
|
||||||
|
case moreInfo
|
||||||
|
|
||||||
case web
|
case web
|
||||||
|
|
||||||
case share
|
case share
|
||||||
|
@ -116,6 +105,10 @@ extension AboutViewController {
|
||||||
enum RowType: Int {
|
enum RowType: Int {
|
||||||
case version
|
case version
|
||||||
|
|
||||||
|
case seeChangelog
|
||||||
|
|
||||||
|
case seeCredits
|
||||||
|
|
||||||
case website
|
case website
|
||||||
|
|
||||||
case faq
|
case faq
|
||||||
|
@ -141,48 +134,50 @@ extension AboutViewController {
|
||||||
return model.footer(for: section)
|
return model.footer(for: section)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
|
||||||
|
return model.headerHeight(for: section)
|
||||||
|
}
|
||||||
|
|
||||||
|
override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
|
||||||
|
return model.footerHeight(for: section)
|
||||||
|
}
|
||||||
|
|
||||||
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
|
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
|
||||||
return model.count(for: section)
|
return model.count(for: section)
|
||||||
}
|
}
|
||||||
|
|
||||||
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
|
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
|
||||||
|
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
|
||||||
switch model.row(at: indexPath) {
|
switch model.row(at: indexPath) {
|
||||||
case .version:
|
case .version:
|
||||||
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
|
|
||||||
cell.leftText = L10n.Version.title
|
cell.leftText = L10n.Version.title
|
||||||
cell.rightText = Utils.versionString()
|
cell.rightText = Utils.versionString()
|
||||||
return cell
|
|
||||||
|
case .seeChangelog:
|
||||||
|
cell.leftText = L10n.About.Cells.Changelog.caption
|
||||||
|
|
||||||
|
case .seeCredits:
|
||||||
|
cell.leftText = L10n.About.Cells.Credits.caption
|
||||||
|
|
||||||
case .website:
|
case .website:
|
||||||
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
|
|
||||||
|
|
||||||
case .faq:
|
case .faq:
|
||||||
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
|
|
||||||
cell.leftText = L10n.About.Cells.Faq.caption
|
cell.leftText = L10n.About.Cells.Faq.caption
|
||||||
return cell
|
|
||||||
|
|
||||||
case .disclaimer:
|
case .disclaimer:
|
||||||
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
|
|
||||||
cell.leftText = L10n.About.Cells.Disclaimer.caption
|
cell.leftText = L10n.About.Cells.Disclaimer.caption
|
||||||
return cell
|
|
||||||
|
|
||||||
case .privacyPolicy:
|
case .privacyPolicy:
|
||||||
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
|
|
||||||
cell.leftText = L10n.About.Cells.PrivacyPolicy.caption
|
cell.leftText = L10n.About.Cells.PrivacyPolicy.caption
|
||||||
return cell
|
|
||||||
|
|
||||||
case .shareTwitter:
|
case .shareTwitter:
|
||||||
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
|
|
||||||
cell.leftText = L10n.About.Cells.ShareTwitter.caption
|
cell.leftText = L10n.About.Cells.ShareTwitter.caption
|
||||||
return cell
|
|
||||||
|
|
||||||
case .shareGeneric:
|
case .shareGeneric:
|
||||||
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
|
|
||||||
cell.leftText = L10n.About.Cells.ShareGeneric.caption
|
cell.leftText = L10n.About.Cells.ShareGeneric.caption
|
||||||
return cell
|
|
||||||
}
|
}
|
||||||
|
return cell
|
||||||
}
|
}
|
||||||
|
|
||||||
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
|
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
|
||||||
|
@ -190,20 +185,26 @@ extension AboutViewController {
|
||||||
case .version:
|
case .version:
|
||||||
showVersion()
|
showVersion()
|
||||||
|
|
||||||
|
case .seeChangelog:
|
||||||
|
visit(AppConstants.URLs.changelog)
|
||||||
|
|
||||||
|
case .seeCredits:
|
||||||
|
openCredits()
|
||||||
|
|
||||||
case .website:
|
case .website:
|
||||||
visitWebsite()
|
visit(AppConstants.URLs.website)
|
||||||
|
|
||||||
case .faq:
|
case .faq:
|
||||||
visitFAQ()
|
visit(AppConstants.URLs.faq)
|
||||||
|
|
||||||
case .disclaimer:
|
case .disclaimer:
|
||||||
visitDisclaimer()
|
visit(AppConstants.URLs.disclaimer)
|
||||||
|
|
||||||
case .privacyPolicy:
|
case .privacyPolicy:
|
||||||
visitPrivacyPolicy()
|
visit(AppConstants.URLs.privacyPolicy)
|
||||||
|
|
||||||
case .shareTwitter:
|
case .shareTwitter:
|
||||||
tweetAboutApp()
|
visit(AppConstants.URLs.twitterIntent)
|
||||||
|
|
||||||
case .shareGeneric:
|
case .shareGeneric:
|
||||||
inviteFriend(sender: tableView.cellForRow(at: indexPath))
|
inviteFriend(sender: tableView.cellForRow(at: indexPath))
|
||||||
|
|
|
@ -35,10 +35,6 @@ class VersionViewController: UIViewController {
|
||||||
|
|
||||||
@IBOutlet private weak var labelIntro: UILabel?
|
@IBOutlet private weak var labelIntro: UILabel?
|
||||||
|
|
||||||
@IBOutlet private weak var buttonChangelog: UIButton?
|
|
||||||
|
|
||||||
@IBOutlet private weak var buttonCredits: UIButton?
|
|
||||||
|
|
||||||
override func awakeFromNib() {
|
override func awakeFromNib() {
|
||||||
super.awakeFromNib()
|
super.awakeFromNib()
|
||||||
|
|
||||||
|
@ -52,18 +48,10 @@ class VersionViewController: UIViewController {
|
||||||
labelTitle?.text = GroupConstants.App.name
|
labelTitle?.text = GroupConstants.App.name
|
||||||
labelVersion?.text = Utils.versionString()
|
labelVersion?.text = Utils.versionString()
|
||||||
labelIntro?.text = L10n.Version.Labels.intro
|
labelIntro?.text = L10n.Version.Labels.intro
|
||||||
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, labelIntro] {
|
for label in [labelTitle, labelVersion, labelIntro] {
|
||||||
label?.applyLight(Theme.current)
|
label?.applyLight(Theme.current)
|
||||||
}
|
}
|
||||||
buttonChangelog?.apply(Theme.current)
|
|
||||||
buttonCredits?.apply(Theme.current)
|
|
||||||
}
|
|
||||||
|
|
||||||
@IBAction private func visitChangelog() {
|
|
||||||
UIApplication.shared.open(AppConstants.URLs.changelog, options: [:], completionHandler: nil)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -246,6 +246,8 @@
|
||||||
"about.title" = "Über";
|
"about.title" = "Über";
|
||||||
"about.sections.web.header" = "Web";
|
"about.sections.web.header" = "Web";
|
||||||
"about.sections.share.header" = "Teilen";
|
"about.sections.share.header" = "Teilen";
|
||||||
|
"about.cells.changelog.caption" = "Changelog";
|
||||||
|
"about.cells.credits.caption" = "Credits";
|
||||||
"about.cells.website.caption" = "Homepage";
|
"about.cells.website.caption" = "Homepage";
|
||||||
"about.cells.faq.caption" = "FAQ";
|
"about.cells.faq.caption" = "FAQ";
|
||||||
"about.cells.disclaimer.caption" = "Haftungsausschluss";
|
"about.cells.disclaimer.caption" = "Haftungsausschluss";
|
||||||
|
@ -266,8 +268,6 @@
|
||||||
|
|
||||||
"version.title" = "Version";
|
"version.title" = "Version";
|
||||||
"version.labels.intro" = "Passepartout und TunnelKit sind geschrieben und gewartet von by Davide De Rosa (keeshux).\n\nQuellcode für Passepartout und TunnelKit ist öffentlich auf GitHub unter GPLv3 verfügbar, du findest die Links auf der Homepage.\n\nPassepartout ist ein inoffizieller client und auf keine Art und Weise mit OpenVPN Inc. verbunden.";
|
"version.labels.intro" = "Passepartout und TunnelKit sind geschrieben und gewartet von by Davide De Rosa (keeshux).\n\nQuellcode für Passepartout und TunnelKit ist öffentlich auf GitHub unter GPLv3 verfügbar, du findest die Links auf der Homepage.\n\nPassepartout ist ein inoffizieller client und auf keine Art und Weise mit OpenVPN Inc. verbunden.";
|
||||||
"version.buttons.changelog" = "CHANGELOG";
|
|
||||||
"version.buttons.credits" = "CREDITS";
|
|
||||||
|
|
||||||
"credits.title" = "Credits";
|
"credits.title" = "Credits";
|
||||||
"credits.sections.licenses.header" = "Lizenzen";
|
"credits.sections.licenses.header" = "Lizenzen";
|
||||||
|
|
|
@ -244,6 +244,8 @@
|
||||||
"about.title" = "About";
|
"about.title" = "About";
|
||||||
"about.sections.web.header" = "Web";
|
"about.sections.web.header" = "Web";
|
||||||
"about.sections.share.header" = "Share";
|
"about.sections.share.header" = "Share";
|
||||||
|
"about.cells.changelog.caption" = "Changelog";
|
||||||
|
"about.cells.credits.caption" = "Credits";
|
||||||
"about.cells.website.caption" = "Home page";
|
"about.cells.website.caption" = "Home page";
|
||||||
"about.cells.faq.caption" = "FAQ";
|
"about.cells.faq.caption" = "FAQ";
|
||||||
"about.cells.disclaimer.caption" = "Disclaimer";
|
"about.cells.disclaimer.caption" = "Disclaimer";
|
||||||
|
@ -264,8 +266,6 @@
|
||||||
|
|
||||||
"version.title" = "Version";
|
"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, you can find links in the home page.\n\nPassepartout is a non-official client and is in no way affiliated with OpenVPN Inc.";
|
"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, you can find links in the home page.\n\nPassepartout is a non-official client and is in no way affiliated with OpenVPN Inc.";
|
||||||
"version.buttons.changelog" = "CHANGELOG";
|
|
||||||
"version.buttons.credits" = "CREDITS";
|
|
||||||
|
|
||||||
"credits.title" = "Credits";
|
"credits.title" = "Credits";
|
||||||
"credits.sections.licenses.header" = "Licenses";
|
"credits.sections.licenses.header" = "Licenses";
|
||||||
|
|
|
@ -246,6 +246,8 @@
|
||||||
"about.title" = "Informazioni su";
|
"about.title" = "Informazioni su";
|
||||||
"about.sections.web.header" = "Web";
|
"about.sections.web.header" = "Web";
|
||||||
"about.sections.share.header" = "Condividi";
|
"about.sections.share.header" = "Condividi";
|
||||||
|
"about.cells.changelog.caption" = "Changelog";
|
||||||
|
"about.cells.credits.caption" = "Credits";
|
||||||
"about.cells.website.caption" = "Home page";
|
"about.cells.website.caption" = "Home page";
|
||||||
"about.cells.faq.caption" = "FAQ";
|
"about.cells.faq.caption" = "FAQ";
|
||||||
"about.cells.disclaimer.caption" = "Disclaimer";
|
"about.cells.disclaimer.caption" = "Disclaimer";
|
||||||
|
@ -266,8 +268,6 @@
|
||||||
|
|
||||||
"version.title" = "Versione";
|
"version.title" = "Versione";
|
||||||
"version.labels.intro" = "Passepartout e TunnelKit sono scritti e mantenuti da Davide De Rosa (keeshux).\n\nIl codice sorgente di Passepartout e TunnelKit è pubblicamente disponibile su GitHub in accordo con la GPLv3, puoi trovare i link nella home page.\n\nPassepartout è un client non ufficiale e non è affiliato ad OpenVPN Inc. in alcuna maniera.";
|
"version.labels.intro" = "Passepartout e TunnelKit sono scritti e mantenuti da Davide De Rosa (keeshux).\n\nIl codice sorgente di Passepartout e TunnelKit è pubblicamente disponibile su GitHub in accordo con la GPLv3, puoi trovare i link nella home page.\n\nPassepartout è un client non ufficiale e non è affiliato ad OpenVPN Inc. in alcuna maniera.";
|
||||||
"version.buttons.changelog" = "CHANGELOG";
|
|
||||||
"version.buttons.credits" = "CREDITS";
|
|
||||||
|
|
||||||
"credits.title" = "Credits";
|
"credits.title" = "Credits";
|
||||||
"credits.sections.licenses.header" = "Licenze";
|
"credits.sections.licenses.header" = "Licenze";
|
||||||
|
|
|
@ -250,6 +250,8 @@
|
||||||
"about.title" = "Sobre";
|
"about.title" = "Sobre";
|
||||||
"about.sections.web.header" = "Web";
|
"about.sections.web.header" = "Web";
|
||||||
"about.sections.share.header" = "Compartilhar";
|
"about.sections.share.header" = "Compartilhar";
|
||||||
|
"about.cells.changelog.caption" = "Changelog";
|
||||||
|
"about.cells.credits.caption" = "Créditos";
|
||||||
"about.cells.website.caption" = "Home page";
|
"about.cells.website.caption" = "Home page";
|
||||||
"about.cells.faq.caption" = "FAQ";
|
"about.cells.faq.caption" = "FAQ";
|
||||||
"about.cells.disclaimer.caption" = "Disclaimer";
|
"about.cells.disclaimer.caption" = "Disclaimer";
|
||||||
|
@ -270,8 +272,6 @@
|
||||||
|
|
||||||
"version.title" = "Versão";
|
"version.title" = "Versão";
|
||||||
"version.labels.intro" = "Passepartout e TunnelKit são desenvolvidos e mantidos por Davide De Rosa (keeshux).\n\nO código de fonte está disponível no GitHub sobre a licença GPLv3, você pode encontrar links na home page.\n\nPassepartout não é um cliente oficial e não possui nenhuma ligação com a OpenVPN Inc.";
|
"version.labels.intro" = "Passepartout e TunnelKit são desenvolvidos e mantidos por Davide De Rosa (keeshux).\n\nO código de fonte está disponível no GitHub sobre a licença GPLv3, você pode encontrar links na home page.\n\nPassepartout não é um cliente oficial e não possui nenhuma ligação com a OpenVPN Inc.";
|
||||||
"version.buttons.changelog" = "CHANGELOG";
|
|
||||||
"version.buttons.credits" = "CRÉDITOS";
|
|
||||||
|
|
||||||
"credits.title" = "Créditos";
|
"credits.title" = "Créditos";
|
||||||
"credits.sections.licenses.header" = "Licenças";
|
"credits.sections.licenses.header" = "Licenças";
|
||||||
|
|
|
@ -246,6 +246,8 @@
|
||||||
"about.title" = "О нас";
|
"about.title" = "О нас";
|
||||||
"about.sections.web.header" = "Веб";
|
"about.sections.web.header" = "Веб";
|
||||||
"about.sections.share.header" = "Поделиться";
|
"about.sections.share.header" = "Поделиться";
|
||||||
|
"about.cells.changelog.caption" = "Журнал изменений";
|
||||||
|
"about.cells.credits.caption" = "Благодарности";
|
||||||
"about.cells.website.caption" = "Домашняя страница";
|
"about.cells.website.caption" = "Домашняя страница";
|
||||||
"about.cells.faq.caption" = "FAQ";
|
"about.cells.faq.caption" = "FAQ";
|
||||||
"about.cells.disclaimer.caption" = "Предупреждение";
|
"about.cells.disclaimer.caption" = "Предупреждение";
|
||||||
|
@ -266,8 +268,6 @@
|
||||||
|
|
||||||
"version.title" = "Версия";
|
"version.title" = "Версия";
|
||||||
"version.labels.intro" = "Passepartout и TunnelKit написаны и установлены Davide De Rosa (keeshux).\n\nИсходные коды для Passepartout и TunnelKit публично доступны на GitHub под GPLv3, вы можете найти ссылки на домашней странице.\n\nPassepartout является неофициальным клиентом, и никаким образом не связан с OpenVPN Inc.";
|
"version.labels.intro" = "Passepartout и TunnelKit написаны и установлены Davide De Rosa (keeshux).\n\nИсходные коды для Passepartout и TunnelKit публично доступны на GitHub под GPLv3, вы можете найти ссылки на домашней странице.\n\nPassepartout является неофициальным клиентом, и никаким образом не связан с OpenVPN Inc.";
|
||||||
"version.buttons.changelog" = "ЖУРНАЛ ИЗМЕНЕНИЙ";
|
|
||||||
"version.buttons.credits" = "БЛАГОДАРНОСТИ";
|
|
||||||
|
|
||||||
"credits.title" = "Благодарность";
|
"credits.title" = "Благодарность";
|
||||||
"credits.sections.licenses.header" = "Лицензии";
|
"credits.sections.licenses.header" = "Лицензии";
|
||||||
|
|
|
@ -16,6 +16,14 @@ public enum L10n {
|
||||||
/// About
|
/// About
|
||||||
public static let title = L10n.tr("Localizable", "about.title")
|
public static let title = L10n.tr("Localizable", "about.title")
|
||||||
public enum Cells {
|
public enum Cells {
|
||||||
|
public enum Changelog {
|
||||||
|
/// Changelog
|
||||||
|
public static let caption = L10n.tr("Localizable", "about.cells.changelog.caption")
|
||||||
|
}
|
||||||
|
public enum Credits {
|
||||||
|
/// Credits
|
||||||
|
public static let caption = L10n.tr("Localizable", "about.cells.credits.caption")
|
||||||
|
}
|
||||||
public enum Disclaimer {
|
public enum Disclaimer {
|
||||||
/// Disclaimer
|
/// Disclaimer
|
||||||
public static let caption = L10n.tr("Localizable", "about.cells.disclaimer.caption")
|
public static let caption = L10n.tr("Localizable", "about.cells.disclaimer.caption")
|
||||||
|
@ -892,12 +900,6 @@ public enum L10n {
|
||||||
public enum Version {
|
public enum Version {
|
||||||
/// Version
|
/// Version
|
||||||
public static let title = L10n.tr("Localizable", "version.title")
|
public static let title = L10n.tr("Localizable", "version.title")
|
||||||
public enum Buttons {
|
|
||||||
/// CHANGELOG
|
|
||||||
public static let changelog = L10n.tr("Localizable", "version.buttons.changelog")
|
|
||||||
/// CREDITS
|
|
||||||
public static let credits = L10n.tr("Localizable", "version.buttons.credits")
|
|
||||||
}
|
|
||||||
public enum Labels {
|
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.
|
/// 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("Localizable", "version.labels.intro")
|
public static let intro = L10n.tr("Localizable", "version.labels.intro")
|
||||||
|
|
Loading…
Reference in New Issue