Drop unused app strings and redo SwiftGen

Prefix is now just L10n without strings filename.
This commit is contained in:
Davide De Rosa 2021-08-07 13:57:22 +02:00
parent c985ed4256
commit 0ebddc6a68
77 changed files with 2871 additions and 4331 deletions

View File

@ -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 */; };
0E45E6E022BD793800F19312 /* App.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0E45E6E222BD793800F19312 /* App.strings */; };
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 */; };
@ -109,7 +108,6 @@
0E520385259F593B00CBAB56 /* Credits.html in Resources */ = {isa = PBXBuildFile; fileRef = 0E569FA4259F41690022DFB8 /* Credits.html */; };
0E520387259F593B00CBAB56 /* TextInputViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E569F97259F41690022DFB8 /* TextInputViewController.swift */; };
0E520388259F593B00CBAB56 /* HostImporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E569F93259F41690022DFB8 /* HostImporter.swift */; };
0E52038F259F593F00CBAB56 /* App.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0E569F8D259F41690022DFB8 /* App.strings */; };
0E5203B6259F5F3F00CBAB56 /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0ED31C3920CF39510027975F /* NetworkExtension.framework */; };
0E5203BE259F5F3F00CBAB56 /* PassepartoutTunnel.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 0E5203B5259F5F3F00CBAB56 /* PassepartoutTunnel.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
0E5203F1259F60D600CBAB56 /* PassepartoutCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0E5203EA259F60D600CBAB56 /* PassepartoutCore.framework */; };
@ -361,7 +359,6 @@
0E1066C820E0F84A004F98B7 /* Cells.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Cells.swift; sourceTree = "<group>"; };
0E158AD920E11B0B00C85A82 /* EndpointViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EndpointViewController.swift; sourceTree = "<group>"; };
0E1C0A50238FFF97009FC087 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Intents.strings; sourceTree = "<group>"; };
0E1C0A51238FFF97009FC087 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/App.strings; sourceTree = "<group>"; };
0E1C0A52238FFF97009FC087 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/InfoPlist.strings; sourceTree = "<group>"; };
0E1C0A53238FFF97009FC087 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Core.strings; sourceTree = "<group>"; };
0E1D72B1213BFFCF00BA1586 /* ProviderPresetViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProviderPresetViewController.swift; sourceTree = "<group>"; };
@ -375,7 +372,6 @@
0E2B494120FD16540094784C /* TransientStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransientStore.swift; sourceTree = "<group>"; };
0E2C54C3230056C800F59453 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Intents.strings"; sourceTree = "<group>"; };
0E2C54C4230056EF00F59453 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Core.strings"; sourceTree = "<group>"; };
0E2C54C52300570200F59453 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/App.strings"; sourceTree = "<group>"; };
0E2D11B9217DBEDE0096822C /* ConnectionService+Configurations.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ConnectionService+Configurations.swift"; sourceTree = "<group>"; };
0E31529B223F9EF400F61841 /* PassepartoutCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PassepartoutCore.framework; sourceTree = BUILT_PRODUCTS_DIR; };
0E31529D223F9EF500F61841 /* PassepartoutCore.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PassepartoutCore.h; sourceTree = "<group>"; };
@ -396,17 +392,7 @@
0E3CAFB3229AAE760008E5C8 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Core.strings; sourceTree = "<group>"; };
0E3CAFB5229AAE760008E5C8 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Core.strings; sourceTree = "<group>"; };
0E3CAFC3229AAF8E0008E5C8 /* API */ = {isa = PBXFileReference; lastKnownFileType = folder; path = API; sourceTree = "<group>"; };
0E45E6E122BD793800F19312 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/App.strings; sourceTree = "<group>"; };
0E45E6E322BD799700F19312 /* SwiftGen+Strings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SwiftGen+Strings.swift"; sourceTree = "<group>"; };
0E45E6F122BD897E00F19312 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/App.strings; sourceTree = "<group>"; };
0E45E6F222BD898000F19312 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/App.strings; sourceTree = "<group>"; };
0E45E6F322BD898200F19312 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/App.strings; sourceTree = "<group>"; };
0E45E6F422BD898300F19312 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/App.strings; sourceTree = "<group>"; };
0E45E6F522BD898500F19312 /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/App.strings; sourceTree = "<group>"; };
0E45E6F622BD898700F19312 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/App.strings; sourceTree = "<group>"; };
0E45E6F722BD898800F19312 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/App.strings; sourceTree = "<group>"; };
0E45E6F822BD898A00F19312 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/App.strings; sourceTree = "<group>"; };
0E45E6F922BD898B00F19312 /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/App.strings; sourceTree = "<group>"; };
0E45E70F22BE108100F19312 /* OpenVPNOptions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenVPNOptions.swift; sourceTree = "<group>"; };
0E4B0D6A2366E3C000C890B4 /* PurchaseViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PurchaseViewController.swift; sourceTree = "<group>"; };
0E4B0D752366E6C800C890B4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Purchase.storyboard; sourceTree = "<group>"; };
@ -465,7 +451,6 @@
0E569F8A259F41690022DFB8 /* MainMenu.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MainMenu.xib; sourceTree = "<group>"; };
0E569F8B259F41690022DFB8 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
0E569F8F259F41690022DFB8 /* IssueReporter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IssueReporter.swift; sourceTree = "<group>"; };
0E569F91259F41690022DFB8 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/App.strings; sourceTree = "<group>"; };
0E569F92259F41690022DFB8 /* WindowManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WindowManager.swift; sourceTree = "<group>"; };
0E569F93259F41690022DFB8 /* HostImporter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HostImporter.swift; sourceTree = "<group>"; };
0E569F94259F41690022DFB8 /* NSTextView+Search.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSTextView+Search.swift"; sourceTree = "<group>"; };
@ -544,17 +529,6 @@
0EBE3A9F213DC1A100BFA2F5 /* ConnectionService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConnectionService.swift; sourceTree = "<group>"; };
0EBE3AA3213DC1B000BFA2F5 /* HostConnectionProfile.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HostConnectionProfile.swift; sourceTree = "<group>"; };
0EBE3AA4213DC1B000BFA2F5 /* ProviderConnectionProfile.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProviderConnectionProfile.swift; sourceTree = "<group>"; };
0EBE8D2E25C076F900798607 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/App.strings; sourceTree = "<group>"; };
0EC12E9726283DEC007287DD /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/App.strings"; sourceTree = "<group>"; };
0EC12E9826283DEE007287DD /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/App.strings; sourceTree = "<group>"; };
0EC12E9926283DEF007287DD /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/App.strings; sourceTree = "<group>"; };
0EC12E9A26283DF0007287DD /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/App.strings; sourceTree = "<group>"; };
0EC12E9B26283DF2007287DD /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/App.strings; sourceTree = "<group>"; };
0EC12E9C26283DF3007287DD /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/App.strings; sourceTree = "<group>"; };
0EC12E9D26283DF4007287DD /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/App.strings; sourceTree = "<group>"; };
0EC12E9E26283DF6007287DD /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/App.strings; sourceTree = "<group>"; };
0EC12E9F26283DF8007287DD /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/App.strings; sourceTree = "<group>"; };
0EC12EA026283DF9007287DD /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/App.strings; sourceTree = "<group>"; };
0EC7F20420E24308004EA58E /* DebugLog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DebugLog.swift; sourceTree = "<group>"; };
0ECC60DD2256B6890020BEAC /* SwiftGen+Assets.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SwiftGen+Assets.swift"; sourceTree = "<group>"; };
0ECEB105224FE51400E9E551 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
@ -783,7 +757,6 @@
0E569F59259F41690022DFB8 /* Tables */,
0E569F7E259F41690022DFB8 /* App.entitlements */,
0E569FA8259F41690022DFB8 /* Info.plist */,
0E569F8D259F41690022DFB8 /* App.strings */,
0E569F8B259F41690022DFB8 /* AppDelegate.swift */,
0E569F7F259F41690022DFB8 /* Assets.xcassets */,
0E569FA7259F41690022DFB8 /* Flags.xcassets */,
@ -937,7 +910,6 @@
0E2AC24422EC3AC10037B4B0 /* Settings.bundle */,
0EDE8DE220C86A13004C739C /* App.entitlements */,
0E57F64720C83FC7008323CF /* Info.plist */,
0E45E6E222BD793800F19312 /* App.strings */,
0E0C072B236087A100155AAC /* InfoPlist.strings */,
0E57F63B20C83FC5008323CF /* AppDelegate.swift */,
0E57F64220C83FC7008323CF /* Assets.xcassets */,
@ -1516,7 +1488,6 @@
0E520336259F58F500CBAB56 /* HostServiceView.xib in Resources */,
0E52031D259F58BF00CBAB56 /* Providers.xcassets in Resources */,
0E52047D259F642600CBAB56 /* Preferences.storyboard in Resources */,
0E52038F259F593F00CBAB56 /* App.strings in Resources */,
0E6BA54B25C9EE3A000CDFAC /* Purchase.storyboard in Resources */,
0E520385259F593B00CBAB56 /* Credits.html in Resources */,
0E52047C259F642600CBAB56 /* Service.storyboard in Resources */,
@ -1562,7 +1533,6 @@
0E57F64120C83FC5008323CF /* Main.storyboard in Resources */,
0E4B0D742366E6C800C890B4 /* Purchase.storyboard in Resources */,
0E2AC24522EC3AC10037B4B0 /* Settings.bundle in Resources */,
0E45E6E022BD793800F19312 /* App.strings in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -2199,25 +2169,6 @@
name = Intents.intentdefinition;
sourceTree = "<group>";
};
0E45E6E222BD793800F19312 /* App.strings */ = {
isa = PBXVariantGroup;
children = (
0E45E6E122BD793800F19312 /* en */,
0E45E6F122BD897E00F19312 /* it */,
0E45E6F222BD898000F19312 /* de */,
0E45E6F322BD898200F19312 /* ru */,
0E45E6F422BD898300F19312 /* nl */,
0E45E6F522BD898500F19312 /* el */,
0E45E6F622BD898700F19312 /* sv */,
0E45E6F722BD898800F19312 /* fr */,
0E45E6F822BD898A00F19312 /* es */,
0E45E6F922BD898B00F19312 /* pt */,
0E2C54C52300570200F59453 /* zh-Hans */,
0E1C0A51238FFF97009FC087 /* pl */,
);
name = App.strings;
sourceTree = "<group>";
};
0E4B0D762366E6C800C890B4 /* Purchase.storyboard */ = {
isa = PBXVariantGroup;
children = (
@ -2258,25 +2209,6 @@
name = Main.storyboard;
sourceTree = "<group>";
};
0E569F8D259F41690022DFB8 /* App.strings */ = {
isa = PBXVariantGroup;
children = (
0E569F91259F41690022DFB8 /* en */,
0EBE8D2E25C076F900798607 /* it */,
0EC12E9726283DEC007287DD /* zh-Hans */,
0EC12E9826283DEE007287DD /* nl */,
0EC12E9926283DEF007287DD /* fr */,
0EC12E9A26283DF0007287DD /* de */,
0EC12E9B26283DF2007287DD /* el */,
0EC12E9C26283DF3007287DD /* pl */,
0EC12E9D26283DF4007287DD /* pt */,
0EC12E9E26283DF6007287DD /* ru */,
0EC12E9F26283DF8007287DD /* es */,
0EC12EA026283DF9007287DD /* sv */,
);
name = App.strings;
sourceTree = "<group>";
};
0E57F63F20C83FC5008323CF /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (

View File

@ -45,10 +45,10 @@ extension OpenVPN.Digest: UIDescriptible {
extension OpenVPN.CompressionFraming: UIDescriptible {
public var uiDescription: String {
let V = L10n.Core.Configuration.Cells.self
let V = L10n.Configuration.Cells.self
switch self {
case .disabled:
return L10n.Core.Global.Values.disabled
return L10n.Global.Values.disabled
case .compLZO:
return V.CompressionFraming.Value.lzo
@ -61,10 +61,10 @@ extension OpenVPN.CompressionFraming: UIDescriptible {
extension OpenVPN.CompressionAlgorithm: UIDescriptible {
public var uiDescription: String {
let V = L10n.Core.Configuration.Cells.self
let V = L10n.Configuration.Cells.self
switch self {
case .disabled:
return L10n.Core.Global.Values.disabled
return L10n.Global.Values.disabled
case .LZO:
return V.CompressionAlgorithm.Value.lzo
@ -77,7 +77,7 @@ extension OpenVPN.CompressionAlgorithm: UIDescriptible {
extension OpenVPN.ConfigurationBuilder {
public var uiDescriptionForTLSWrap: String {
let V = L10n.Core.Configuration.Cells.self
let V = L10n.Configuration.Cells.self
if let strategy = tlsWrap?.strategy {
switch strategy {
case .auth:
@ -87,45 +87,45 @@ extension OpenVPN.ConfigurationBuilder {
return V.TlsWrapping.Value.crypt
}
} else {
return L10n.Core.Global.Values.disabled
return L10n.Global.Values.disabled
}
}
public var uiDescriptionForKeepAlive: String {
let V = L10n.Core.Configuration.Cells.self
let V = L10n.Configuration.Cells.self
if let keepAlive = keepAliveInterval, keepAlive > 0 {
return V.KeepAlive.Value.seconds(Int(keepAlive))
} else {
return L10n.Core.Global.Values.disabled
return L10n.Global.Values.disabled
}
}
public var uiDescriptionForClientCertificate: String {
let V = L10n.Core.Configuration.Cells.Client.Value.self
let V = L10n.Configuration.Cells.Client.Value.self
return (clientCertificate != nil) ? V.enabled : V.disabled
}
public var uiDescriptionForEKU: String {
let V = L10n.Core.Global.Values.self
let V = L10n.Global.Values.self
return (checksEKU ?? false) ? V.enabled : V.disabled
}
public var uiDescriptionForRenegotiatesAfter: String {
let V = L10n.Core.Configuration.Cells.self
let V = L10n.Configuration.Cells.self
if let reneg = renegotiatesAfter, reneg > 0 {
return V.RenegotiationSeconds.Value.after(TimeInterval(reneg).localized)
} else {
return L10n.Core.Global.Values.disabled
return L10n.Global.Values.disabled
}
}
public var uiDescriptionForRandomizeEndpoint: String {
let V = L10n.Core.Global.Values.self
let V = L10n.Global.Values.self
return (randomizeEndpoint ?? false) ? V.enabled : V.disabled
}
public var uiDescriptionForXOR: String {
let V = L10n.Core.Global.Values.self
let V = L10n.Global.Values.self
guard let mask = xorMask, mask != 0 else {
return V.disabled
}
@ -138,13 +138,13 @@ extension NetworkChoice: CustomStringConvertible {
public var description: String {
switch self {
case .client:
return L10n.Core.NetworkChoice.client
return L10n.NetworkChoice.client
case .server:
return L10n.Core.NetworkChoice.server
return L10n.NetworkChoice.server
case .manual:
return L10n.Core.Global.Values.manual
return L10n.Global.Values.manual
}
}
}
@ -168,16 +168,16 @@ extension VPNStatus: UIDescriptible {
public var uiDescription: String {
switch self {
case .connecting:
return L10n.Core.Vpn.connecting
return L10n.Vpn.connecting
case .connected:
return L10n.Core.Vpn.active
return L10n.Vpn.active
case .disconnecting:
return L10n.Core.Vpn.disconnecting
return L10n.Vpn.disconnecting
case .disconnected:
return L10n.Core.Vpn.inactive
return L10n.Vpn.inactive
}
}
}

View File

@ -75,7 +75,7 @@ class HostImporter {
private func alertImportError(_ error: Error, removeOnError: Bool) {
let message = HostImporter.localizedMessage(forError: error)
let alert = UIAlertController.asAlert(configurationURL.normalizedFilename, message)
alert.addCancelAction(L10n.Core.Global.ok)
alert.addCancelAction(L10n.Global.ok)
viewController?.present(alert, animated: true, completion: nil)
if removeOnError {
@ -85,11 +85,11 @@ class HostImporter {
private func alertImportWarning(_ warning: ConfigurationError, removeOnCancel: Bool, completionHandler: @escaping () -> Void) {
let message = HostImporter.localizedDetailsMessage(forWarning: warning)
let alert = UIAlertController.asAlert(configurationURL.normalizedFilename, L10n.Core.ParsedFile.Alerts.PotentiallyUnsupported.message(message))
alert.addPreferredAction(L10n.Core.Global.ok) {
let alert = UIAlertController.asAlert(configurationURL.normalizedFilename, L10n.ParsedFile.Alerts.PotentiallyUnsupported.message(message))
alert.addPreferredAction(L10n.Global.ok) {
completionHandler()
}
alert.addCancelAction(L10n.Core.Global.cancel) {
alert.addCancelAction(L10n.Global.cancel) {
if removeOnCancel {
try? FileManager.default.removeItem(at: self.configurationURL)
}
@ -98,11 +98,11 @@ class HostImporter {
}
private func enterPassphraseForHost(at url: URL, removeOnError: Bool, removeOnCancel: Bool, completionHandler: @escaping (OpenVPN.ConfigurationParser.Result) -> Void) {
let alert = UIAlertController.asAlert(configurationURL.normalizedFilename, L10n.Core.ParsedFile.Alerts.EncryptionPassphrase.message)
let alert = UIAlertController.asAlert(configurationURL.normalizedFilename, L10n.ParsedFile.Alerts.EncryptionPassphrase.message)
alert.addTextField { (field) in
field.isSecureTextEntry = true
}
alert.addPreferredAction(L10n.Core.Global.ok) {
alert.addPreferredAction(L10n.Global.ok) {
guard let passphrase = alert.textFields?.first?.text else {
return
}
@ -113,7 +113,7 @@ class HostImporter {
completionHandler: completionHandler
)
}
alert.addCancelAction(L10n.Core.Global.cancel) {
alert.addCancelAction(L10n.Global.cancel) {
if removeOnCancel {
try? FileManager.default.removeItem(at: url)
}
@ -128,25 +128,25 @@ class HostImporter {
switch appError {
case .malformed(let option):
log.error("Could not parse configuration URL: malformed option, \(option)")
return L10n.Core.ParsedFile.Alerts.Malformed.message(option)
return L10n.ParsedFile.Alerts.Malformed.message(option)
case .missingConfiguration(let option):
log.error("Could not parse configuration URL: missing configuration, \(option)")
return L10n.Core.ParsedFile.Alerts.Missing.message(option)
return L10n.ParsedFile.Alerts.Missing.message(option)
case .unsupportedConfiguration(var option):
if option.contains("external") {
option.append(" (see FAQ)")
}
log.error("Could not parse configuration URL: unsupported configuration, \(option)")
return L10n.Core.ParsedFile.Alerts.Unsupported.message(option)
return L10n.ParsedFile.Alerts.Unsupported.message(option)
default:
break
}
}
log.error("Could not parse configuration URL: \(error)")
return L10n.Core.ParsedFile.Alerts.Parsing.message(error.localizedDescription)
return L10n.ParsedFile.Alerts.Parsing.message(error.localizedDescription)
}
private static func localizedDetailsMessage(forWarning warning: ConfigurationError) -> String {

View File

@ -43,8 +43,8 @@ class IssueReporter: NSObject {
let V = AppConstants.IssueReporter.Email.self
let body = V.body(V.template, DebugLog(raw: "--").decoratedString())
guard let url = URL.mailto(to: V.recipient, subject: V.subject, body: body), app.canOpenURL(url) else {
let alert = UIAlertController.asAlert(L10n.Core.IssueReporter.title, L10n.Core.Global.emailNotConfigured)
alert.addCancelAction(L10n.Core.Global.ok)
let alert = UIAlertController.asAlert(L10n.IssueReporter.title, L10n.Global.emailNotConfigured)
alert.addCancelAction(L10n.Global.ok)
viewController.present(alert, animated: true, completion: nil)
return
}
@ -55,13 +55,13 @@ class IssueReporter: NSObject {
self.viewController = viewController
if issue.debugLog {
let alert = UIAlertController.asAlert(L10n.Core.IssueReporter.title, L10n.Core.IssueReporter.message)
alert.addPreferredAction(L10n.Core.IssueReporter.Buttons.accept) {
let alert = UIAlertController.asAlert(L10n.IssueReporter.title, L10n.IssueReporter.message)
alert.addPreferredAction(L10n.IssueReporter.Buttons.accept) {
VPN.shared.requestDebugLog(fallback: AppConstants.Log.debugSnapshot) {
self.composeEmail(withDebugLog: $0, issue: issue)
}
}
alert.addCancelAction(L10n.Core.Global.cancel)
alert.addCancelAction(L10n.Global.cancel)
viewController.present(alert, animated: true, completion: nil)
} else {
composeEmail(withDebugLog: nil, issue: issue)

File diff suppressed because it is too large Load Diff

View File

@ -100,18 +100,18 @@ extension SettingTableViewCell {
leftTextColor = theme.palette.primaryText
guard let vpnStatus = vpnStatus else {
rightText = L10n.Core.Vpn.disabled
rightText = L10n.Vpn.disabled
rightTextColor = theme.palette.secondaryText
return
}
switch vpnStatus {
case .connecting:
rightText = L10n.Core.Vpn.connecting
rightText = L10n.Vpn.connecting
rightTextColor = theme.palette.indeterminate
case .connected:
rightText = L10n.Core.Vpn.active
rightText = L10n.Vpn.active
rightTextColor = theme.palette.on
case .disconnecting, .disconnected:
@ -119,34 +119,34 @@ extension SettingTableViewCell {
if let error = error {
switch error {
case .socketActivity, .timeout:
disconnectionReason = L10n.Core.Vpn.Errors.timeout
disconnectionReason = L10n.Vpn.Errors.timeout
case .dnsFailure:
disconnectionReason = L10n.Core.Vpn.Errors.dns
disconnectionReason = L10n.Vpn.Errors.dns
case .tlsInitialization, .tlsServerVerification, .tlsHandshake:
disconnectionReason = L10n.Core.Vpn.Errors.tls
disconnectionReason = L10n.Vpn.Errors.tls
case .authentication:
disconnectionReason = L10n.Core.Vpn.Errors.auth
disconnectionReason = L10n.Vpn.Errors.auth
case .encryptionInitialization, .encryptionData:
disconnectionReason = L10n.Core.Vpn.Errors.encryption
disconnectionReason = L10n.Vpn.Errors.encryption
case .serverCompression, .lzo:
disconnectionReason = L10n.Core.Vpn.Errors.compression
disconnectionReason = L10n.Vpn.Errors.compression
case .networkChanged:
disconnectionReason = L10n.Core.Vpn.Errors.network
disconnectionReason = L10n.Vpn.Errors.network
case .routing:
disconnectionReason = L10n.Core.Vpn.Errors.routing
disconnectionReason = L10n.Vpn.Errors.routing
case .gatewayUnattainable:
disconnectionReason = L10n.Core.Vpn.Errors.gateway
disconnectionReason = L10n.Vpn.Errors.gateway
case .serverShutdown:
disconnectionReason = L10n.Core.Vpn.Errors.shutdown
disconnectionReason = L10n.Vpn.Errors.shutdown
default:
break
@ -154,11 +154,11 @@ extension SettingTableViewCell {
}
switch vpnStatus {
case .disconnecting:
rightText = disconnectionReason ?? L10n.Core.Vpn.disconnecting
rightText = disconnectionReason ?? L10n.Vpn.disconnecting
rightTextColor = theme.palette.indeterminate
case .disconnected:
rightText = disconnectionReason ?? L10n.Core.Vpn.inactive
rightText = disconnectionReason ?? L10n.Vpn.inactive
rightTextColor = theme.palette.off
default:

View File

@ -156,7 +156,7 @@ extension UITextField {
func applyHostTitle(_ theme: Theme) {
applyAlert(theme)
placeholder = L10n.Core.Global.Host.TitleInput.placeholder
placeholder = L10n.Global.Host.TitleInput.placeholder
}
func applyWiFiTitle(_ theme: Theme) {

View File

@ -39,8 +39,8 @@ class AboutViewController: UITableViewController, StrongTableHost {
model.add(.share)
model.setHeader("", forSection: .info)
model.setHeader("GitHub", forSection: .github)
model.setHeader(L10n.Core.About.Sections.Web.header, forSection: .web)
model.setHeader(L10n.Core.About.Sections.Share.header, forSection: .share)
model.setHeader(L10n.About.Sections.Web.header, forSection: .web)
model.setHeader(L10n.About.Sections.Share.header, forSection: .share)
model.set([.version, .credits], forSection: .info)
model.set([.readme, .changelog], forSection: .github)
model.set([.website, .faq, .disclaimer, .privacyPolicy], forSection: .web)
@ -56,7 +56,7 @@ class AboutViewController: UITableViewController, StrongTableHost {
override func viewDidLoad() {
super.viewDidLoad()
title = L10n.Core.About.title
title = L10n.About.title
}
// MARK: Actions
@ -64,7 +64,7 @@ class AboutViewController: UITableViewController, StrongTableHost {
private func showVersion() {
let vc = VersionViewController()
vc.appIcon = Asset.Assets.logo.image
vc.extraText = L10n.Core.Version.Labels.intro
vc.extraText = L10n.Version.Labels.intro
vc.backgroundColor = Theme.current.palette.primaryBackground
vc.textColor = Theme.current.palette.primaryLightText
navigationController?.pushViewController(vc, animated: true)
@ -72,10 +72,10 @@ class AboutViewController: UITableViewController, StrongTableHost {
private func showCredits() {
let vc = CreditsViewController()
vc.title = L10n.Core.Credits.title
vc.licensesHeader = L10n.Core.Credits.Sections.Licenses.header
vc.noticesHeader = L10n.Core.Credits.Sections.Notices.header
vc.translationsHeader = L10n.Core.Credits.Sections.Translations.header
vc.title = L10n.Credits.title
vc.licensesHeader = L10n.Credits.Sections.Licenses.header
vc.noticesHeader = L10n.Credits.Sections.Notices.header
vc.translationsHeader = L10n.Credits.Sections.Translations.header
vc.software = AppConstants.Credits.software
vc.translators = AppConstants.Translations.translators
vc.accentColor = Theme.current.palette.accent1
@ -83,7 +83,7 @@ class AboutViewController: UITableViewController, StrongTableHost {
}
private func inviteFriend(sender: UITableViewCell?) {
let message = "\(L10n.Core.Share.message) \(AppConstants.URLs.website)"
let message = "\(L10n.Share.message) \(AppConstants.URLs.website)"
let vc = UIActivityViewController(activityItems: [message], applicationActivities: nil)
vc.popoverPresentationController?.sourceView = sender
present(vc, animated: true, completion: nil)
@ -159,11 +159,11 @@ extension AboutViewController {
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
switch model.row(at: indexPath) {
case .version:
cell.leftText = L10n.Core.Version.title
cell.leftText = L10n.Version.title
cell.rightText = ApplicationInfo.appVersion
case .credits:
cell.leftText = L10n.Core.About.Cells.Credits.caption
cell.leftText = L10n.About.Cells.Credits.caption
case .readme:
cell.leftText = "README"
@ -172,22 +172,22 @@ extension AboutViewController {
cell.leftText = "CHANGELOG"
case .website:
cell.leftText = L10n.Core.About.Cells.Website.caption
cell.leftText = L10n.About.Cells.Website.caption
case .faq:
cell.leftText = L10n.Core.About.Cells.Faq.caption
cell.leftText = L10n.About.Cells.Faq.caption
case .disclaimer:
cell.leftText = L10n.Core.About.Cells.Disclaimer.caption
cell.leftText = L10n.About.Cells.Disclaimer.caption
case .privacyPolicy:
cell.leftText = L10n.Core.About.Cells.PrivacyPolicy.caption
cell.leftText = L10n.About.Cells.PrivacyPolicy.caption
case .shareTwitter:
cell.leftText = L10n.Core.About.Cells.ShareTwitter.caption
cell.leftText = L10n.About.Cells.ShareTwitter.caption
case .shareGeneric:
cell.leftText = L10n.Core.About.Cells.ShareGeneric.caption
cell.leftText = L10n.About.Cells.ShareGeneric.caption
case .visitAlternativeTo:
cell.leftText = "AlternativeTo"
@ -222,7 +222,7 @@ extension AboutViewController {
visitURL(AppConstants.URLs.privacyPolicy)
case .shareTwitter:
visitURL(AppConstants.URLs.twitterIntent(withMessage: L10n.Core.Share.message))
visitURL(AppConstants.URLs.twitterIntent(withMessage: L10n.Share.message))
case .shareGeneric:
inviteFriend(sender: tableView.cellForRow(at: indexPath))

View File

@ -67,7 +67,7 @@ class AccountViewController: UIViewController, StrongTableHost {
model.clear()
model.add(.credentials)
model.setHeader(L10n.Core.Account.Sections.Credentials.header, forSection: .credentials)
model.setHeader(L10n.Account.Sections.Credentials.header, forSection: .credentials)
model.set([.username, .password], forSection: .credentials)
if let _ = infrastructureName {
@ -87,7 +87,7 @@ class AccountViewController: UIViewController, StrongTableHost {
}
// if let _ = referralURL {
// model.add(.registration)
// model.setFooter(L10n.Core.Account.Sections.Registration.footer(name.rawValue), forSection: .registration)
// model.setFooter(L10n.Account.Sections.Registration.footer(name.rawValue), forSection: .registration)
// model.set([.signUp], forSection: .registration)
// }
}
@ -98,7 +98,7 @@ class AccountViewController: UIViewController, StrongTableHost {
override func viewDidLoad() {
super.viewDidLoad()
title = L10n.Core.Account.title
title = L10n.Account.title
cellUsername?.field.text = currentCredentials?.username
cellPassword?.field.text = currentCredentials?.password
@ -190,8 +190,8 @@ extension AccountViewController: UITableViewDataSource, UITableViewDelegate, Fie
case .username:
let cell = Cells.field.dequeue(from: tableView, for: indexPath)
cellUsername = cell
cell.caption = L10n.Core.Account.Cells.Username.caption
cell.field.placeholder = usernamePlaceholder ?? L10n.Core.Account.Cells.Username.placeholder
cell.caption = L10n.Account.Cells.Username.caption
cell.field.placeholder = usernamePlaceholder ?? L10n.Account.Cells.Username.placeholder
cell.field.clearButtonMode = .always
cell.field.isSecureTextEntry = false
cell.field.text = currentCredentials?.username
@ -205,8 +205,8 @@ extension AccountViewController: UITableViewDataSource, UITableViewDelegate, Fie
case .password:
let cell = Cells.field.dequeue(from: tableView, for: indexPath)
cellPassword = cell
cell.caption = L10n.Core.Account.Cells.Password.caption
cell.field.placeholder = L10n.Core.Account.Cells.Password.placeholder
cell.caption = L10n.Account.Cells.Password.caption
cell.field.placeholder = L10n.Account.Cells.Password.placeholder
cell.field.clearButtonMode = .always
cell.field.isSecureTextEntry = true
cell.field.text = currentCredentials?.password
@ -218,7 +218,7 @@ extension AccountViewController: UITableViewDataSource, UITableViewDelegate, Fie
case .openGuide:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.leftText = L10n.Core.Account.Cells.OpenGuide.caption
cell.leftText = L10n.Account.Cells.OpenGuide.caption
cell.applyAction(.current)
return cell
@ -227,7 +227,7 @@ extension AccountViewController: UITableViewDataSource, UITableViewDelegate, Fie
fatalError("Sign-up shown when not a provider profile")
}
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.leftText = L10n.Core.Account.Cells.Signup.caption(name)
cell.leftText = L10n.Account.Cells.Signup.caption(name)
cell.applyAction(.current)
return cell
}

View File

@ -64,14 +64,14 @@ class ConfigurationViewController: UIViewController, StrongTableHost {
}
// headers
model.setHeader(L10n.Core.Configuration.Sections.Communication.header, forSection: .communication)
model.setHeader(L10n.Core.Configuration.Sections.Tls.header, forSection: .tls)
model.setHeader(L10n.Core.Configuration.Sections.Compression.header, forSection: .compression)
model.setHeader(L10n.Core.Configuration.Sections.Other.header, forSection: .other)
model.setHeader(L10n.Configuration.Sections.Communication.header, forSection: .communication)
model.setHeader(L10n.Configuration.Sections.Tls.header, forSection: .tls)
model.setHeader(L10n.Configuration.Sections.Compression.header, forSection: .compression)
model.setHeader(L10n.Configuration.Sections.Other.header, forSection: .other)
// footers
if isEditable {
model.setFooter(L10n.Core.Configuration.Sections.Reset.footer, forSection: .reset)
model.setFooter(L10n.Configuration.Sections.Reset.footer, forSection: .reset)
}
// rows
@ -190,17 +190,17 @@ class ConfigurationViewController: UIViewController, StrongTableHost {
}
private func askForResetConfigurationWithPassphrase(_ originalURL: URL) {
let alert = UIAlertController.asAlert(nil, L10n.Core.ParsedFile.Alerts.EncryptionPassphrase.message)
let alert = UIAlertController.asAlert(nil, L10n.ParsedFile.Alerts.EncryptionPassphrase.message)
alert.addTextField { (field) in
field.isSecureTextEntry = true
}
alert.addPreferredAction(L10n.Core.Global.ok) {
alert.addPreferredAction(L10n.Global.ok) {
guard let passphrase = alert.textFields?.first?.text else {
return
}
self.resetOriginalConfiguration(passphrase: passphrase)
}
alert.addCancelAction(L10n.Core.Global.cancel) {
alert.addCancelAction(L10n.Global.cancel) {
}
present(alert, animated: true, completion: nil)
}
@ -279,7 +279,7 @@ extension ConfigurationViewController: UITableViewDataSource, UITableViewDelegat
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let row = model.row(at: indexPath)
let V = L10n.Core.Configuration.Cells.self
let V = L10n.Configuration.Cells.self
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
if !isEditable {

View File

@ -44,7 +44,7 @@ class DebugLogViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
title = L10n.Core.Service.Cells.DebugLog.caption
title = L10n.Service.Cells.DebugLog.caption
textLog?.contentInsetAdjustmentBehavior = .never
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(toggleBars))
@ -79,8 +79,8 @@ class DebugLogViewController: UIViewController {
@IBAction private func share(_ sender: Any?) {
guard let raw = textLog?.text, !raw.isEmpty else {
let alert = UIAlertController.asAlert(title, L10n.Core.DebugLog.Alerts.EmptyLog.message)
alert.addCancelAction(L10n.Core.Global.ok)
let alert = UIAlertController.asAlert(title, L10n.DebugLog.Alerts.EmptyLog.message)
alert.addCancelAction(L10n.Global.ok)
present(alert, animated: true, completion: nil)
return
}

View File

@ -67,8 +67,8 @@ class EndpointViewController: UIViewController, StrongTableHost {
model.add(.locationAddresses)
model.add(.locationProtocols)
model.setHeader(L10n.Core.Endpoint.Sections.LocationAddresses.header, forSection: .locationAddresses)
model.setHeader(L10n.Core.Endpoint.Sections.LocationProtocols.header, forSection: .locationProtocols)
model.setHeader(L10n.Endpoint.Sections.LocationAddresses.header, forSection: .locationAddresses)
model.setHeader(L10n.Endpoint.Sections.LocationProtocols.header, forSection: .locationProtocols)
if dataSource.canCustomizeEndpoint {
var addressRows: [RowType] = Array(repeating: .availableAddress, count: dataSource.addresses.count)
@ -94,7 +94,7 @@ class EndpointViewController: UIViewController, StrongTableHost {
override func viewDidLoad() {
super.viewDidLoad()
title = L10n.Core.Endpoint.title
title = L10n.Endpoint.title
guard let _ = dataSource else {
fatalError("Data source not set")
}
@ -203,7 +203,7 @@ extension EndpointViewController: UITableViewDataSource, UITableViewDelegate {
switch row {
case .anyAddress:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.leftText = L10n.Core.Endpoint.Cells.AnyAddress.caption
cell.leftText = L10n.Endpoint.Cells.AnyAddress.caption
cell.accessoryType = .none
cell.isTappable = true
if let _ = currentAddress {
@ -230,7 +230,7 @@ extension EndpointViewController: UITableViewDataSource, UITableViewDelegate {
case .anyProtocol:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.leftText = L10n.Core.Endpoint.Cells.AnyProtocol.caption
cell.leftText = L10n.Endpoint.Cells.AnyProtocol.caption
cell.accessoryType = .none
cell.isTappable = true
if let _ = currentProtocol {

View File

@ -91,12 +91,12 @@ class NetworkSettingsViewController: UITableViewController {
// headers
model.setHeader("", forSection: .choices)
model.setHeader(L10n.Core.NetworkSettings.Gateway.title, forSection: .manualGateway)
model.setHeader(L10n.Core.NetworkSettings.Proxy.title, forSection: .manualProxy)
model.setHeader(L10n.Core.NetworkSettings.Mtu.title, forSection: .manualMTU)
model.setHeader(L10n.NetworkSettings.Gateway.title, forSection: .manualGateway)
model.setHeader(L10n.NetworkSettings.Proxy.title, forSection: .manualProxy)
model.setHeader(L10n.NetworkSettings.Mtu.title, forSection: .manualMTU)
// footers
// model.setFooter(L10n.Core.Configuration.Sections.Reset.footer, for: .reset)
// model.setFooter(L10n.Configuration.Sections.Reset.footer, for: .reset)
// rows
model.set([.gateway, .dns, .proxy, .mtu], forSection: .choices)
@ -135,7 +135,7 @@ class NetworkSettingsViewController: UITableViewController {
model.set(proxyRows, forSection: .manualProxy)
// refine sections before add (DNS is tricky)
model.setHeader(L10n.Core.NetworkSettings.Dns.title, forSection: .manualDNSProtocol)
model.setHeader(L10n.NetworkSettings.Dns.title, forSection: .manualDNSProtocol)
if !dnsServers.isEmpty {
} else if !dnsDomains.isEmpty {
sections.removeAll { $0 == .manualDNSServers }
@ -405,25 +405,25 @@ extension NetworkSettingsViewController {
switch row {
case .gateway:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.leftText = L10n.Core.NetworkSettings.Gateway.title
cell.leftText = L10n.NetworkSettings.Gateway.title
cell.rightText = networkChoices.gateway.description
return cell
case .dns:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.leftText = L10n.Core.NetworkSettings.Dns.title
cell.leftText = L10n.NetworkSettings.Dns.title
cell.rightText = networkChoices.dns.description
return cell
case .proxy:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.leftText = L10n.Core.NetworkSettings.Proxy.title
cell.leftText = L10n.NetworkSettings.Proxy.title
cell.rightText = networkChoices.proxy.description
return cell
case .mtu:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.leftText = L10n.Core.NetworkSettings.Mtu.title
cell.leftText = L10n.NetworkSettings.Mtu.title
cell.rightText = (networkChoices.mtu ?? ProfileNetworkChoices.defaultChoice).description
return cell
@ -443,7 +443,7 @@ extension NetworkSettingsViewController {
case .dnsProtocol:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.leftText = L10n.Core.Global.Captions.protocol
cell.leftText = L10n.Global.Captions.protocol
cell.rightText = (networkSettings.dnsProtocol ?? .fallback)?.description
if networkChoices.dns == .manual {
cell.accessoryType = .disclosureIndicator
@ -481,9 +481,9 @@ extension NetworkSettingsViewController {
let i = indexPath.row - Offsets.dnsAddress
let cell = Cells.field.dequeue(from: tableView, for: indexPath)
cell.caption = L10n.Core.Global.Captions.address
cell.caption = L10n.Global.Captions.address
cell.field.tag = FieldTag.dnsAddress.rawValue + i
cell.field.placeholder = L10n.Core.Global.Values.none
cell.field.placeholder = L10n.Global.Values.none
cell.field.text = networkSettings.dnsServers?[i]
cell.field.clearButtonMode = .always
cell.field.keyboardType = .numbersAndPunctuation
@ -495,16 +495,16 @@ extension NetworkSettingsViewController {
case .dnsAddAddress:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.applyAction(.current)
cell.leftText = L10n.Core.NetworkSettings.Cells.AddDnsServer.caption
cell.leftText = L10n.NetworkSettings.Cells.AddDnsServer.caption
return cell
case .dnsDomain:
let i = indexPath.row - Offsets.dnsDomain
let cell = Cells.field.dequeue(from: tableView, for: indexPath)
cell.caption = L10n.Core.NetworkSettings.Dns.Cells.Domain.caption
cell.caption = L10n.NetworkSettings.Dns.Cells.Domain.caption
cell.field.tag = FieldTag.dnsDomain.rawValue + i
cell.field.placeholder = L10n.Core.Global.Values.none
cell.field.placeholder = L10n.Global.Values.none
cell.field.text = networkSettings.dnsSearchDomains?[i]
cell.field.clearButtonMode = .always
cell.field.keyboardType = .asciiCapable
@ -516,14 +516,14 @@ extension NetworkSettingsViewController {
case .dnsAddDomain:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.applyAction(.current)
cell.leftText = L10n.Core.NetworkSettings.Cells.AddDnsDomain.caption
cell.leftText = L10n.NetworkSettings.Cells.AddDnsDomain.caption
return cell
case .proxyAddress:
let cell = Cells.field.dequeue(from: tableView, for: indexPath)
cell.caption = L10n.Core.Global.Captions.address
cell.caption = L10n.Global.Captions.address
cell.field.tag = FieldTag.proxyAddress.rawValue
cell.field.placeholder = L10n.Core.Global.Values.none
cell.field.placeholder = L10n.Global.Values.none
cell.field.text = networkSettings.proxyAddress
cell.field.clearButtonMode = .always
cell.field.keyboardType = .numbersAndPunctuation
@ -534,9 +534,9 @@ extension NetworkSettingsViewController {
case .proxyPort:
let cell = Cells.field.dequeue(from: tableView, for: indexPath)
cell.caption = L10n.Core.Global.Captions.port
cell.caption = L10n.Global.Captions.port
cell.field.tag = FieldTag.proxyPort.rawValue
cell.field.placeholder = L10n.Core.Global.Values.none
cell.field.placeholder = L10n.Global.Values.none
cell.field.text = networkSettings.proxyPort?.description
cell.field.clearButtonMode = .always
cell.field.keyboardType = .numberPad
@ -549,7 +549,7 @@ extension NetworkSettingsViewController {
let cell = Cells.field.dequeue(from: tableView, for: indexPath)
cell.caption = "PAC"
cell.field.tag = FieldTag.proxyAutoConfigurationURL.rawValue
cell.field.placeholder = L10n.Core.Global.Values.none
cell.field.placeholder = L10n.Global.Values.none
cell.field.text = networkSettings.proxyAutoConfigurationURL?.absoluteString
cell.field.clearButtonMode = .always
cell.field.keyboardType = .asciiCapable
@ -562,9 +562,9 @@ extension NetworkSettingsViewController {
let i = indexPath.row - Offsets.proxyBypass
let cell = Cells.field.dequeue(from: tableView, for: indexPath)
cell.caption = L10n.Core.NetworkSettings.Cells.ProxyBypass.caption
cell.caption = L10n.NetworkSettings.Cells.ProxyBypass.caption
cell.field.tag = FieldTag.proxyBypass.rawValue + i
cell.field.placeholder = L10n.Core.Global.Values.none
cell.field.placeholder = L10n.Global.Values.none
cell.field.text = networkSettings.proxyBypassDomains?[i]
cell.field.clearButtonMode = .always
cell.field.keyboardType = .asciiCapable
@ -576,13 +576,13 @@ extension NetworkSettingsViewController {
case .proxyAddBypass:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.applyAction(.current)
cell.leftText = L10n.Core.NetworkSettings.Cells.AddProxyBypass.caption
cell.leftText = L10n.NetworkSettings.Cells.AddProxyBypass.caption
return cell
case .mtuBytes:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.leftText = L10n.Core.NetworkSettings.Mtu.Cells.Bytes.caption
cell.rightText = networkSettings.mtuBytes?.description ?? L10n.Core.Global.Values.default
cell.leftText = L10n.NetworkSettings.Mtu.Cells.Bytes.caption
cell.rightText = networkSettings.mtuBytes?.description ?? L10n.Global.Values.default
return cell
}
}
@ -706,7 +706,7 @@ extension NetworkSettingsViewController {
vc.options = ProfileNetworkSettings.mtuOptions
vc.descriptionBlock = {
guard $0 != 0 else {
return L10n.Core.Global.Values.default
return L10n.Global.Values.default
}
return $0.description
}

View File

@ -57,8 +57,8 @@ class DonationViewController: UITableViewController, StrongTableHost {
model.clear()
model.add(.oneTime)
model.setHeader(L10n.Core.Donation.Sections.OneTime.header, forSection: .oneTime)
model.setFooter(L10n.Core.Donation.Sections.OneTime.footer, forSection: .oneTime)
model.setHeader(L10n.Donation.Sections.OneTime.header, forSection: .oneTime)
model.setFooter(L10n.Donation.Sections.OneTime.footer, forSection: .oneTime)
guard !isLoading else {
model.set([.loading], forSection: .oneTime)
@ -79,7 +79,7 @@ class DonationViewController: UITableViewController, StrongTableHost {
override func viewDidLoad() {
super.viewDidLoad()
title = L10n.Core.Donation.title
title = L10n.Donation.title
reloadModel()
ProductManager.shared.listProducts {
@ -118,12 +118,12 @@ class DonationViewController: UITableViewController, StrongTableHost {
switch model.row(at: indexPath) {
case .loading:
let cell = Cells.activity.dequeue(from: tableView, for: indexPath)
cell.textLabel?.text = L10n.Core.Donation.Cells.Loading.caption
cell.textLabel?.text = L10n.Donation.Cells.Loading.caption
return cell
case .purchasing:
let cell = Cells.activity.dequeue(from: tableView, for: indexPath)
cell.textLabel?.text = L10n.Core.Donation.Cells.Purchasing.caption
cell.textLabel?.text = L10n.Donation.Cells.Purchasing.caption
return cell
case .donation:
@ -174,12 +174,12 @@ class DonationViewController: UITableViewController, StrongTableHost {
return
case .success:
alert = UIAlertController.asAlert(L10n.Core.Donation.Alerts.Purchase.Success.title, L10n.Core.Donation.Alerts.Purchase.Success.message)
alert = UIAlertController.asAlert(L10n.Donation.Alerts.Purchase.Success.title, L10n.Donation.Alerts.Purchase.Success.message)
case .failure:
alert = UIAlertController.asAlert(title, L10n.Core.Donation.Alerts.Purchase.Failure.message(error?.localizedDescription ?? ""))
alert = UIAlertController.asAlert(title, L10n.Donation.Alerts.Purchase.Failure.message(error?.localizedDescription ?? ""))
}
alert.addCancelAction(L10n.Core.Global.ok) {
alert.addCancelAction(L10n.Global.ok) {
self.isPurchasing = false
self.reloadModel()
self.tableView.reloadData()

View File

@ -42,7 +42,7 @@ class ImportedHostsViewController: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
title = L10n.Core.ImportedHosts.title
title = L10n.ImportedHosts.title
}
private func selectHost(withUrl url: URL) {

View File

@ -61,22 +61,22 @@ class OrganizerViewController: UITableViewController, StrongTableHost {
model.add(.support)
if ProductManager.shared.isEligibleForFeedback() {
model.add(.feedback)
model.setHeader(L10n.Core.Organizer.Sections.Feedback.header, forSection: .feedback)
model.setHeader(L10n.Organizer.Sections.Feedback.header, forSection: .feedback)
model.set([.writeReview], forSection: .feedback)
}
model.add(.about)
model.add(.destruction)
model.setHeader(L10n.Core.Service.Sections.Vpn.header, forSection: .vpn)
model.setHeader(L10n.Core.Organizer.Sections.Providers.header, forSection: .providers)
model.setHeader(L10n.Core.Organizer.Sections.Hosts.header, forSection: .hosts)
model.setFooter(L10n.Core.Organizer.Sections.Providers.footer, forSection: .providers)
model.setFooter(L10n.Core.Organizer.Sections.Hosts.footer, forSection: .hosts)
model.setHeader(L10n.Service.Sections.Vpn.header, forSection: .vpn)
model.setHeader(L10n.Organizer.Sections.Providers.header, forSection: .providers)
model.setHeader(L10n.Organizer.Sections.Hosts.header, forSection: .hosts)
model.setFooter(L10n.Organizer.Sections.Providers.footer, forSection: .providers)
model.setFooter(L10n.Organizer.Sections.Hosts.footer, forSection: .hosts)
if #available(iOS 12, *) {
model.setHeader(L10n.Core.Organizer.Sections.Siri.header, forSection: .siri)
model.setFooter(L10n.Core.Organizer.Sections.Siri.footer, forSection: .siri)
model.setHeader(L10n.Organizer.Sections.Siri.header, forSection: .siri)
model.setFooter(L10n.Organizer.Sections.Siri.footer, forSection: .siri)
model.set([.siriShortcuts], forSection: .siri)
}
model.setHeader(L10n.Core.Organizer.Sections.Support.header, forSection: .support)
model.setHeader(L10n.Organizer.Sections.Support.header, forSection: .support)
model.set([.connectionStatus], forSection: .vpn)
model.set([.donate, .githubSponsors, .joinCommunity], forSection: .support)
@ -136,15 +136,15 @@ class OrganizerViewController: UITableViewController, StrongTableHost {
if !didShowSubreddit && !TransientStore.didHandleSubreddit {
didShowSubreddit = true
let alert = UIAlertController.asAlert(L10n.Core.Reddit.title, L10n.Core.Reddit.message)
alert.addPreferredAction(L10n.Core.Reddit.Buttons.subscribe) {
let alert = UIAlertController.asAlert(L10n.Reddit.title, L10n.Reddit.message)
alert.addPreferredAction(L10n.Reddit.Buttons.subscribe) {
TransientStore.didHandleSubreddit = true
self.subscribeSubreddit()
}
alert.addAction(L10n.Core.Reddit.Buttons.never) {
alert.addAction(L10n.Reddit.Buttons.never) {
TransientStore.didHandleSubreddit = true
}
alert.addCancelAction(L10n.Core.Reddit.Buttons.remind)
alert.addCancelAction(L10n.Reddit.Buttons.remind)
present(alert, animated: true, completion: nil)
}
}
@ -198,10 +198,10 @@ class OrganizerViewController: UITableViewController, StrongTableHost {
private func addNewProvider() {
guard service.hasAvailableProviders() else {
let alert = UIAlertController.asAlert(
L10n.Core.Organizer.Sections.Providers.header,
L10n.Core.Organizer.Alerts.ExhaustedProviders.message
L10n.Organizer.Sections.Providers.header,
L10n.Organizer.Alerts.ExhaustedProviders.message
)
alert.addCancelAction(L10n.Core.Global.ok)
alert.addCancelAction(L10n.Global.ok)
present(alert, animated: true, completion: nil)
return
}
@ -243,10 +243,10 @@ class OrganizerViewController: UITableViewController, StrongTableHost {
private func donateToDeveloper() {
guard SKPaymentQueue.canMakePayments() else {
let alert = UIAlertController.asAlert(
L10n.Core.Organizer.Cells.Donate.caption,
L10n.Core.Organizer.Alerts.CannotDonate.message
L10n.Organizer.Cells.Donate.caption,
L10n.Organizer.Alerts.CannotDonate.message
)
alert.addCancelAction(L10n.Core.Global.ok)
alert.addCancelAction(L10n.Global.ok)
present(alert, animated: true, completion: nil)
return
}
@ -262,8 +262,8 @@ class OrganizerViewController: UITableViewController, StrongTableHost {
guard MFMailComposeViewController.canSendMail() else {
let app = UIApplication.shared
guard let url = URL.mailto(to: recipient, subject: subject, body: body), app.canOpenURL(url) else {
let alert = UIAlertController.asAlert(L10n.Core.Translations.title, L10n.Core.Global.emailNotConfigured)
alert.addCancelAction(L10n.Core.Global.ok)
let alert = UIAlertController.asAlert(L10n.Translations.title, L10n.Global.emailNotConfigured)
alert.addCancelAction(L10n.Global.ok)
present(alert, animated: true, completion: nil)
return
}
@ -335,13 +335,13 @@ class OrganizerViewController: UITableViewController, StrongTableHost {
private func confirmVpnProfileDeletion() {
let alert = UIAlertController.asAlert(
L10n.Core.Organizer.Cells.Uninstall.caption,
L10n.Core.Organizer.Alerts.DeleteVpnProfile.message
L10n.Organizer.Cells.Uninstall.caption,
L10n.Organizer.Alerts.DeleteVpnProfile.message
)
alert.addPreferredAction(L10n.Core.Global.ok) {
alert.addPreferredAction(L10n.Global.ok) {
VPN.shared.uninstall(completionHandler: nil)
}
alert.addCancelAction(L10n.Core.Global.cancel)
alert.addCancelAction(L10n.Global.cancel)
present(alert, animated: true, completion: nil)
}
@ -362,7 +362,7 @@ class OrganizerViewController: UITableViewController, StrongTableHost {
private func testInterfaces() {
let alert = UIAlertController.asAlert("Test interfaces", nil)
alert.addCancelAction(L10n.Core.Global.ok)
alert.addCancelAction(L10n.Global.ok)
defer {
present(alert, animated: true, completion: nil)
}
@ -390,7 +390,7 @@ class OrganizerViewController: UITableViewController, StrongTableHost {
return
}
let alert = UIAlertController.asAlert("Debug log", log)
alert.addCancelAction(L10n.Core.Global.ok)
alert.addCancelAction(L10n.Global.ok)
present(alert, animated: true, completion: nil)
}
@ -496,7 +496,7 @@ extension OrganizerViewController {
case .connectionStatus:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.applyVPN(.current, with: VPN.shared.isEnabled ? VPN.shared.status : nil, error: nil)
cell.leftText = L10n.Core.Service.Cells.ConnectionStatus.caption
cell.leftText = L10n.Service.Cells.ConnectionStatus.caption
return cell
case .profile:
@ -509,67 +509,67 @@ extension OrganizerViewController {
cell.imageView?.image = nil
}
cell.leftText = service.screenTitle(rowProfile)
cell.rightText = service.isActiveProfile(rowProfile) ? L10n.Core.Organizer.Cells.Profile.Value.current : nil
cell.rightText = service.isActiveProfile(rowProfile) ? L10n.Organizer.Cells.Profile.Value.current : nil
return cell
case .addProvider:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.applyAction(.current)
cell.leftText = L10n.Core.Organizer.Cells.AddProvider.caption
cell.leftText = L10n.Organizer.Cells.AddProvider.caption
return cell
case .addHost:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.applyAction(.current)
cell.leftText = L10n.Core.Organizer.Cells.AddHost.caption
cell.leftText = L10n.Organizer.Cells.AddHost.caption
return cell
case .importHost:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.applyAction(.current)
cell.leftText = L10n.Core.Organizer.Cells.ImportHost.caption
cell.leftText = L10n.Organizer.Cells.ImportHost.caption
return cell
case .siriShortcuts:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.applyAction(.current)
cell.leftText = L10n.Core.Organizer.Cells.SiriShortcuts.caption
cell.leftText = L10n.Organizer.Cells.SiriShortcuts.caption
return cell
case .donate:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.leftText = L10n.Core.Organizer.Cells.Donate.caption
cell.leftText = L10n.Organizer.Cells.Donate.caption
return cell
case .githubSponsors:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.leftText = L10n.Core.Organizer.Cells.GithubSponsors.caption
cell.leftText = L10n.Organizer.Cells.GithubSponsors.caption
return cell
case .translate:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.leftText = L10n.Core.Organizer.Cells.Translate.caption
cell.leftText = L10n.Organizer.Cells.Translate.caption
return cell
case .joinCommunity:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.leftText = L10n.Core.Organizer.Cells.JoinCommunity.caption
cell.leftText = L10n.Organizer.Cells.JoinCommunity.caption
return cell
case .writeReview:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.leftText = L10n.Core.Organizer.Cells.WriteReview.caption
cell.leftText = L10n.Organizer.Cells.WriteReview.caption
return cell
case .openAbout:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.leftText = L10n.Core.Organizer.Cells.About.caption(GroupConstants.App.name)
cell.leftText = L10n.Organizer.Cells.About.caption(GroupConstants.App.name)
cell.rightText = ApplicationInfo.appVersion
return cell
case .uninstall:
let cell = Cells.destructive.dequeue(from: tableView, for: indexPath)
cell.caption = L10n.Core.Organizer.Cells.Uninstall.caption
cell.caption = L10n.Organizer.Cells.Uninstall.caption
return cell
case .testInterfaces:

View File

@ -55,10 +55,10 @@ class WizardHostViewController: UITableViewController, StrongTableHost {
lazy var model: StrongTableModel<SectionType, RowType> = {
let model: StrongTableModel<SectionType, RowType> = StrongTableModel()
model.add(.meta)
// model.setFooter(L10n.Core.Global.Host.TitleInput.message, forSection: .meta)
// model.setFooter(L10n.Global.Host.TitleInput.message, forSection: .meta)
if !existingHostIds.isEmpty {
model.add(.existing)
model.setHeader(L10n.Core.Wizards.Host.Sections.Existing.header, forSection: .existing)
model.setHeader(L10n.Wizards.Host.Sections.Existing.header, forSection: .existing)
}
model.set([.titleInput], forSection: .meta)
model.set(.existingHost, count: existingHostIds.count, forSection: .existing)
@ -73,8 +73,8 @@ class WizardHostViewController: UITableViewController, StrongTableHost {
override func viewDidLoad() {
super.viewDidLoad()
title = L10n.Core.Organizer.Sections.Hosts.header
itemNext.title = L10n.Core.Global.next
title = L10n.Organizer.Sections.Hosts.header
itemNext.title = L10n.Global.next
}
override func viewWillAppear(_ animated: Bool) {
@ -114,11 +114,11 @@ class WizardHostViewController: UITableViewController, StrongTableHost {
replacedProfile = nil
if let existingProfile = service.hostProfile(withTitle: enteredTitle) {
replacedProfile = existingProfile
let alert = UIAlertController.asAlert(title, L10n.Core.Wizards.Host.Alerts.Existing.message)
alert.addPreferredAction(L10n.Core.Global.ok) {
let alert = UIAlertController.asAlert(title, L10n.Wizards.Host.Alerts.Existing.message)
alert.addPreferredAction(L10n.Global.ok) {
self.next(withProfile: profile, title: enteredTitle)
}
alert.addCancelAction(L10n.Core.Global.cancel)
alert.addCancelAction(L10n.Global.cancel)
present(alert, animated: true, completion: nil)
return
}
@ -211,7 +211,7 @@ extension WizardHostViewController {
switch model.row(at: indexPath) {
case .titleInput:
let cell = Cells.field.dequeue(from: tableView, for: indexPath)
cell.caption = L10n.Core.Wizards.Host.Cells.TitleInput.caption
cell.caption = L10n.Wizards.Host.Cells.TitleInput.caption
cell.captionWidth = 100.0
// cell.allowedCharset = .filename
cell.field.applyHostTitle(.current)

View File

@ -63,7 +63,7 @@ class WizardProviderViewController: UITableViewController, StrongTableHost {
let nc = NotificationCenter.default
nc.addObserver(self, selector: #selector(didReloadReceipt), name: ProductManager.didReloadReceipt, object: nil)
title = L10n.Core.Organizer.Sections.Providers.header
title = L10n.Organizer.Sections.Providers.header
reloadModel()
}
@ -115,7 +115,7 @@ class WizardProviderViewController: UITableViewController, StrongTableHost {
}
private func alertMissingInfrastructure(forMetadata metadata: Infrastructure.Metadata, error: Error?) {
var message = L10n.Core.Wizards.Provider.Alerts.Unavailable.message
var message = L10n.Wizards.Provider.Alerts.Unavailable.message
if let error = error {
log.error("Unable to download missing \(metadata.description) infrastructure (network error): \(error.localizedDescription)")
message.append(" \(error.localizedDescription)")
@ -124,7 +124,7 @@ class WizardProviderViewController: UITableViewController, StrongTableHost {
}
let alert = UIAlertController.asAlert(metadata.description, message)
alert.addCancelAction(L10n.Core.Global.ok)
alert.addCancelAction(L10n.Global.ok)
present(alert, animated: true, completion: nil)
if let ip = tableView.indexPathForSelectedRow {
@ -197,7 +197,7 @@ extension WizardProviderViewController {
case .updateList:
cell.applyAction(.current)
cell.imageView?.image = nil
cell.leftText = L10n.Core.Wizards.Provider.Cells.UpdateList.caption
cell.leftText = L10n.Wizards.Provider.Cells.UpdateList.caption
}
return cell
}

View File

@ -79,7 +79,7 @@ class ProviderPoolViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
title = L10n.Core.Service.Cells.Provider.Pool.caption
title = L10n.Service.Cells.Provider.Pool.caption
tableView.reloadData()
if let ip = selectedIndexPath {
tableView.selectRowAsync(at: ip)
@ -181,7 +181,7 @@ extension ProviderPoolViewController: UITableViewDataSource, UITableViewDelegate
func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String? {
if isShowingEmptyFavorites {
return L10n.Core.Provider.Pool.Sections.EmptyFavorites.footer
return L10n.Provider.Pool.Sections.EmptyFavorites.footer
}
return nil
}
@ -232,7 +232,7 @@ extension ProviderPoolViewController: UITableViewDataSource, UITableViewDelegate
vc.title = group.localizedCountry
vc.options = group.pools.sortedPools()
vc.selectedOption = currentPool
vc.descriptionBlock = { !$0.secondaryId.isEmpty ? $0.secondaryId : L10n.Core.Global.Values.default }
vc.descriptionBlock = { !$0.secondaryId.isEmpty ? $0.secondaryId : L10n.Global.Values.default }
vc.selectionBlock = {
self.currentPool = $0
self.delegate?.providerPoolController(self, didSelectPool: $0)
@ -251,12 +251,12 @@ extension ProviderPoolViewController: UITableViewDataSource, UITableViewDelegate
let action: UIContextualAction
if favoriteGroupIds.contains(groupId) {
action = UIContextualAction(style: .destructive, title: L10n.Core.Provider.Pool.Actions.unfavorite) {
action = UIContextualAction(style: .destructive, title: L10n.Provider.Pool.Actions.unfavorite) {
self.unfavoriteGroup(in: category, withId: groupId, deletingRowAt: self.isShowingFavorites ? indexPath : nil)
$2(true)
}
} else if !isShowingFavorites {
action = UIContextualAction(style: .normal, title: L10n.Core.Provider.Pool.Actions.favorite) {
action = UIContextualAction(style: .normal, title: L10n.Provider.Pool.Actions.favorite) {
self.favoriteGroup(withId: groupId)
$2(true)
}

View File

@ -48,7 +48,7 @@ class ProviderPresetViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
title = L10n.Core.Service.Cells.Provider.Preset.caption
title = L10n.Service.Cells.Provider.Preset.caption
tableView.reloadData()
if let ip = selectedIndexPath {
tableView.scrollToRowAsync(at: ip)
@ -88,7 +88,7 @@ extension ProviderPresetViewController: UITableViewDataSource, UITableViewDelega
}
// func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String? {
// return L10n.Core.Provider.Preset.Sections.Main.footer
// return L10n.Provider.Preset.Sections.Main.footer
// }
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
@ -107,7 +107,7 @@ extension ProviderPresetViewController: UITableViewDataSource, UITableViewDelega
case .techDetails:
cell.applyAction(.current)
cell.leftText = L10n.Core.Provider.Preset.Cells.TechDetails.caption
cell.leftText = L10n.Provider.Preset.Cells.TechDetails.caption
cell.accessoryType = .none
}
return cell

View File

@ -59,7 +59,7 @@ class PurchaseViewController: UITableViewController, StrongTableHost {
func reloadModel() {
model.clear()
model.add(.products)
model.setFooter(L10n.Core.Purchase.Sections.Products.footer, forSection: .products)
model.setFooter(L10n.Purchase.Sections.Products.footer, forSection: .products)
var rows: [RowType] = []
let pm = ProductManager.shared
@ -94,7 +94,7 @@ class PurchaseViewController: UITableViewController, StrongTableHost {
override func viewDidLoad() {
super.viewDidLoad()
title = L10n.Core.Purchase.title
title = L10n.Purchase.title
navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .stop, target: self, action: #selector(close))
isLoading = true
@ -172,7 +172,7 @@ class PurchaseViewController: UITableViewController, StrongTableHost {
log.error("Unable to purchase \(product): \(error)")
let alert = UIAlertController.asAlert(product.localizedTitle, error.localizedDescription)
alert.addCancelAction(L10n.Core.Global.ok)
alert.addCancelAction(L10n.Global.ok)
present(alert, animated: true, completion: nil)
}
@ -234,8 +234,8 @@ extension PurchaseViewController {
case .restore:
cell.fill(
title: L10n.Core.Purchase.Cells.Restore.title,
description: L10n.Core.Purchase.Cells.Restore.description
title: L10n.Purchase.Cells.Restore.title,
description: L10n.Purchase.Cells.Restore.description
)
}
return cell

View File

@ -102,8 +102,8 @@ class ServerNetworkViewController: UITableViewController, StrongTableHost {
// headers
model.setHeader("IPv4", forSection: .ipv4)
model.setHeader("IPv6", forSection: .ipv6)
model.setHeader(L10n.Core.NetworkSettings.Dns.title, forSection: .dns)
model.setHeader(L10n.Core.NetworkSettings.Proxy.title, forSection: .proxy)
model.setHeader(L10n.NetworkSettings.Dns.title, forSection: .dns)
model.setHeader(L10n.NetworkSettings.Proxy.title, forSection: .proxy)
return model
}()
@ -182,22 +182,22 @@ extension ServerNetworkViewController {
case .ipv4:
switch row {
case .address:
cell.leftText = L10n.Core.Global.Captions.address
cell.leftText = L10n.Global.Captions.address
if let ipv4 = configuration.ipv4 {
cell.rightText = "\(ipv4.address)/\(ipv4.addressMask)"
} else {
cell.rightText = L10n.Core.Global.Values.none
cell.rightText = L10n.Global.Values.none
}
case .defaultGateway:
cell.leftText = L10n.Core.NetworkSettings.Gateway.title
cell.rightText = configuration.ipv4?.defaultGateway ?? L10n.Core.Global.Values.none
cell.leftText = L10n.NetworkSettings.Gateway.title
cell.rightText = configuration.ipv4?.defaultGateway ?? L10n.Global.Values.none
case .route:
guard let route = configuration.ipv4?.routes[indexPath.row - indexOfFirstRoute4] else {
fatalError("Got an IPv4 route cell with empty routes")
}
cell.leftText = L10n.Core.ServerNetwork.Cells.Route.caption
cell.leftText = L10n.ServerNetwork.Cells.Route.caption
cell.rightText = "\(route.destination)/\(route.mask) -> \(route.gateway)"
default:
@ -207,22 +207,22 @@ extension ServerNetworkViewController {
case .ipv6:
switch row {
case .address:
cell.leftText = L10n.Core.Global.Captions.address
cell.leftText = L10n.Global.Captions.address
if let ipv6 = configuration.ipv6 {
cell.rightText = "\(ipv6.address)/\(ipv6.addressPrefixLength)"
} else {
cell.rightText = L10n.Core.Global.Values.none
cell.rightText = L10n.Global.Values.none
}
case .defaultGateway:
cell.leftText = L10n.Core.NetworkSettings.Gateway.title
cell.rightText = configuration.ipv6?.defaultGateway ?? L10n.Core.Global.Values.none
cell.leftText = L10n.NetworkSettings.Gateway.title
cell.rightText = configuration.ipv6?.defaultGateway ?? L10n.Global.Values.none
case .route:
guard let route = configuration.ipv6?.routes[indexPath.row - indexOfFirstRoute6] else {
fatalError("Got an IPv6 route cell with empty routes")
}
cell.leftText = L10n.Core.ServerNetwork.Cells.Route.caption
cell.leftText = L10n.ServerNetwork.Cells.Route.caption
cell.rightText = "\(route.destination)/\(route.prefixLength) -> \(route.gateway)"
default:
@ -239,21 +239,21 @@ extension ServerNetworkViewController {
guard let domain = configuration.searchDomains?[indexPath.row] else {
fatalError("Got DNS search domain with empty search domains")
}
cell.leftText = L10n.Core.NetworkSettings.Dns.Cells.Domain.caption
cell.leftText = L10n.NetworkSettings.Dns.Cells.Domain.caption
cell.rightText = domain
case .dnsAddress:
guard let server = configuration.dnsServers?[indexPath.row - indexOfFirstDNSAddress] else {
fatalError("Got DNS server with empty servers")
}
cell.leftText = L10n.Core.Global.Captions.address
cell.leftText = L10n.Global.Captions.address
cell.rightText = server
case .proxyAddress:
guard let proxy = configuration.httpsProxy ?? configuration.httpProxy else {
fatalError("Got proxy section without a proxy")
}
cell.leftText = L10n.Core.Global.Captions.address
cell.leftText = L10n.Global.Captions.address
cell.rightText = "\(proxy.address):\(proxy.port)"
case .proxyAutoConfigurationURL:
@ -267,7 +267,7 @@ extension ServerNetworkViewController {
guard let domain = configuration.proxyBypassDomains?[indexPath.row - indexOfFirstProxyBypassDomain] else {
fatalError("Got proxy bypass domain with empty domains")
}
cell.leftText = L10n.Core.NetworkSettings.Cells.ProxyBypass.caption
cell.leftText = L10n.NetworkSettings.Cells.ProxyBypass.caption
cell.rightText = domain
default:

View File

@ -108,7 +108,7 @@ class ServiceViewController: UIViewController, StrongTableHost {
navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem
navigationItem.leftItemsSupplementBackButton = true
labelWelcome.text = L10n.Core.Service.Welcome.message
labelWelcome.text = L10n.Service.Welcome.message
labelWelcome.apply(.current)
let nc = NotificationCenter.default
@ -190,14 +190,14 @@ class ServiceViewController: UIViewController, StrongTableHost {
case .hostParametersSegueIdentifier:
let vc = destination as? ConfigurationViewController
vc?.title = L10n.Core.Service.Cells.Host.Parameters.caption
vc?.title = L10n.Service.Cells.Host.Parameters.caption
vc?.initialConfiguration = uncheckedHostProfile.parameters.sessionConfiguration
vc?.originalConfigurationURL = service.configurationURL(for: uncheckedHostProfile)
vc?.delegate = self
case .networkSettingsSegueIdentifier:
let vc = destination as? NetworkSettingsViewController
vc?.title = L10n.Core.NetworkSettings.title
vc?.title = L10n.NetworkSettings.title
vc?.profile = profile
case .serverNetworkSegueIdentifier:
@ -234,19 +234,19 @@ class ServiceViewController: UIViewController, StrongTableHost {
}
@IBAction private func renameProfile() {
let alert = UIAlertController.asAlert(L10n.Core.Service.Alerts.Rename.title, nil)
let alert = UIAlertController.asAlert(L10n.Service.Alerts.Rename.title, nil)
alert.addTextField { (field) in
field.text = self.service.screenTitle(ProfileKey(self.uncheckedProfile))
field.applyHostTitle(.current)
field.delegate = self
}
pendingRenameAction = alert.addPreferredAction(L10n.Core.Global.ok) {
pendingRenameAction = alert.addPreferredAction(L10n.Global.ok) {
guard let newTitle = alert.textFields?.first?.text else {
return
}
self.confirmRenameCurrentProfile(to: newTitle)
}
alert.addCancelAction(L10n.Core.Global.cancel)
alert.addCancelAction(L10n.Global.cancel)
pendingRenameAction?.isEnabled = false
present(alert, animated: true, completion: nil)
}
@ -256,11 +256,11 @@ class ServiceViewController: UIViewController, StrongTableHost {
return
}
if let existingProfile = service.hostProfile(withTitle: newTitle) {
let alert = UIAlertController.asAlert(L10n.Core.Service.Alerts.Rename.title, L10n.Core.Wizards.Host.Alerts.Existing.message)
alert.addPreferredAction(L10n.Core.Global.ok) {
let alert = UIAlertController.asAlert(L10n.Service.Alerts.Rename.title, L10n.Wizards.Host.Alerts.Existing.message)
alert.addPreferredAction(L10n.Global.ok) {
self.doReplaceProfile(profile, to: newTitle, existingProfile: existingProfile)
}
alert.addCancelAction(L10n.Core.Global.cancel)
alert.addCancelAction(L10n.Global.cancel)
present(alert, animated: true, completion: nil)
return
}
@ -290,10 +290,10 @@ class ServiceViewController: UIViewController, StrongTableHost {
}
guard !service.needsCredentials(for: uncheckedProfile) else {
let alert = UIAlertController.asAlert(
L10n.Core.Service.Sections.Vpn.header,
L10n.Core.Service.Alerts.CredentialsNeeded.message
L10n.Service.Sections.Vpn.header,
L10n.Service.Alerts.CredentialsNeeded.message
)
alert.addCancelAction(L10n.Core.Global.ok) {
alert.addCancelAction(L10n.Global.ok) {
cell.setOn(false, animated: true)
}
present(alert, animated: true, completion: nil)
@ -328,13 +328,13 @@ class ServiceViewController: UIViewController, StrongTableHost {
private func confirmVpnReconnection() {
guard vpn.status == .disconnected else {
let alert = UIAlertController.asAlert(
L10n.Core.Service.Cells.ConnectionStatus.caption,
L10n.Core.Service.Alerts.ReconnectVpn.message
L10n.Service.Cells.ConnectionStatus.caption,
L10n.Service.Alerts.ReconnectVpn.message
)
alert.addPreferredAction(L10n.Core.Global.ok) {
alert.addPreferredAction(L10n.Global.ok) {
self.vpn.reconnect(completionHandler: nil)
}
alert.addCancelAction(L10n.Core.Global.cancel)
alert.addCancelAction(L10n.Global.cancel)
present(alert, animated: true, completion: nil)
return
}
@ -420,11 +420,11 @@ class ServiceViewController: UIViewController, StrongTableHost {
case .denied:
isPendingTrustedWiFi = false
let alert = UIAlertController.asAlert(
L10n.Core.Service.Cells.TrustedAddWifi.caption,
L10n.Core.Service.Alerts.Location.Message.denied
L10n.Service.Cells.TrustedAddWifi.caption,
L10n.Service.Alerts.Location.Message.denied
)
alert.addCancelAction(L10n.Core.Global.ok)
alert.addPreferredAction(L10n.Core.Service.Alerts.Location.Button.settings) {
alert.addCancelAction(L10n.Global.ok)
alert.addPreferredAction(L10n.Service.Alerts.Location.Button.settings) {
UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!, options: [:], completionHandler: nil)
}
present(alert, animated: true, completion: nil)
@ -443,14 +443,14 @@ class ServiceViewController: UIViewController, StrongTableHost {
IntentDispatcher.donateUntrustCurrentNetwork()
}
let alert = UIAlertController.asAlert(L10n.Core.Service.Sections.Trusted.header, nil)
let alert = UIAlertController.asAlert(L10n.Service.Sections.Trusted.header, nil)
alert.addTextField { (field) in
field.text = Utils.currentWifiNetworkName() ?? ""
field.applyWiFiTitle(.current)
field.delegate = self
}
alert.addCancelAction(L10n.Core.Global.cancel)
alert.addPreferredAction(L10n.Core.Service.Cells.TrustedAddWifi.caption) {
alert.addCancelAction(L10n.Global.cancel)
alert.addPreferredAction(L10n.Service.Cells.TrustedAddWifi.caption) {
guard let wifi = alert.textFields?.first?.text else {
return
}
@ -499,13 +499,13 @@ class ServiceViewController: UIViewController, StrongTableHost {
return
}
let alert = UIAlertController.asAlert(
L10n.Core.Service.Sections.Trusted.header,
L10n.Core.Service.Alerts.Trusted.WillDisconnectPolicy.message
L10n.Service.Sections.Trusted.header,
L10n.Service.Alerts.Trusted.WillDisconnectPolicy.message
)
alert.addPreferredAction(L10n.Core.Global.ok) {
alert.addPreferredAction(L10n.Global.ok) {
completionHandler()
}
alert.addCancelAction(L10n.Core.Global.cancel) {
alert.addCancelAction(L10n.Global.cancel) {
sender.setOn(false, animated: true)
}
present(alert, animated: true, completion: nil)
@ -513,13 +513,13 @@ class ServiceViewController: UIViewController, StrongTableHost {
private func confirmPotentialTrustedDisconnection(at rowIndex: Int?, completionHandler: @escaping () -> Void) {
let alert = UIAlertController.asAlert(
L10n.Core.Service.Sections.Trusted.header,
L10n.Core.Service.Alerts.Trusted.WillDisconnectTrusted.message
L10n.Service.Sections.Trusted.header,
L10n.Service.Alerts.Trusted.WillDisconnectTrusted.message
)
alert.addPreferredAction(L10n.Core.Global.ok) {
alert.addPreferredAction(L10n.Global.ok) {
completionHandler()
}
alert.addCancelAction(L10n.Core.Global.cancel) {
alert.addCancelAction(L10n.Global.cancel) {
guard let rowIndex = rowIndex else {
return
}
@ -535,12 +535,12 @@ class ServiceViewController: UIViewController, StrongTableHost {
Utils.checkConnectivityURL(AppConstants.Services.connectivityURL, timeout: AppConstants.Services.connectivityTimeout) {
hud.hide()
let V = L10n.Core.Service.Alerts.TestConnectivity.Messages.self
let V = L10n.Service.Alerts.TestConnectivity.Messages.self
let alert = UIAlertController.asAlert(
L10n.Core.Service.Alerts.TestConnectivity.title,
L10n.Service.Alerts.TestConnectivity.title,
$0 ? V.success : V.failure
)
alert.addCancelAction(L10n.Core.Global.ok)
alert.addCancelAction(L10n.Global.ok)
self.present(alert, animated: true, completion: nil)
}
}
@ -548,10 +548,10 @@ class ServiceViewController: UIViewController, StrongTableHost {
// private func displayDataCount() {
// guard vpn.isEnabled else {
// let alert = UIAlertController.asAlert(
// L10n.Core.Service.Cells.DataCount.caption,
// L10n.Core.Service.Alerts.DataCount.Messages.notAvailable
// L10n.Service.Cells.DataCount.caption,
// L10n.Service.Alerts.DataCount.Messages.notAvailable
// )
// alert.addCancelAction(L10n.Core.Global.ok)
// alert.addCancelAction(L10n.Global.ok)
// present(alert, animated: true, completion: nil)
// return
// }
@ -559,21 +559,21 @@ class ServiceViewController: UIViewController, StrongTableHost {
// vpn.requestBytesCount {
// let message: String
// if let count = $0 {
// message = L10n.Core.Service.Alerts.DataCount.Messages.current(Int(count.0), Int(count.1))
// message = L10n.Service.Alerts.DataCount.Messages.current(Int(count.0), Int(count.1))
// } else {
// message = L10n.Core.Service.Alerts.DataCount.Messages.notAvailable
// message = L10n.Service.Alerts.DataCount.Messages.notAvailable
// }
// let alert = UIAlertController.asAlert(
// L10n.Core.Service.Cells.DataCount.caption,
// L10n.Service.Cells.DataCount.caption,
// message
// )
// alert.addCancelAction(L10n.Core.Global.ok)
// alert.addCancelAction(L10n.Global.ok)
// self.present(alert, animated: true, completion: nil)
// }
// }
private func discloseServerConfiguration() {
let caption = L10n.Core.Service.Cells.ServerConfiguration.caption
let caption = L10n.Service.Cells.ServerConfiguration.caption
tryRequestServerConfiguration(withCaption: caption) { [weak self] in
let vc = StoryboardScene.Main.configurationIdentifier.instantiate()
vc.title = caption
@ -584,7 +584,7 @@ class ServiceViewController: UIViewController, StrongTableHost {
}
private func discloseServerNetwork() {
let caption = L10n.Core.Service.Cells.ServerNetwork.caption
let caption = L10n.Service.Cells.ServerNetwork.caption
tryRequestServerConfiguration(withCaption: caption) { [weak self] in
let vc = StoryboardScene.Main.serverNetworkViewController.instantiate()
vc.title = caption
@ -598,9 +598,9 @@ class ServiceViewController: UIViewController, StrongTableHost {
guard let cfg = $0 as? OpenVPN.Configuration else {
let alert = UIAlertController.asAlert(
caption,
L10n.Core.Service.Alerts.Configuration.disconnected
L10n.Service.Alerts.Configuration.disconnected
)
alert.addCancelAction(L10n.Core.Global.ok)
alert.addCancelAction(L10n.Global.ok)
self?.present(alert, animated: true, completion: nil)
return
}
@ -616,15 +616,15 @@ class ServiceViewController: UIViewController, StrongTableHost {
guard vpn.status == .disconnected else {
let alert = UIAlertController.asAlert(
L10n.Core.Service.Cells.MasksPrivateData.caption,
L10n.Core.Service.Alerts.MasksPrivateData.Messages.mustReconnect
L10n.Service.Cells.MasksPrivateData.caption,
L10n.Service.Alerts.MasksPrivateData.Messages.mustReconnect
)
alert.addDestructiveAction(L10n.Core.Service.Alerts.Buttons.reconnect) {
alert.addDestructiveAction(L10n.Service.Alerts.Buttons.reconnect) {
handler()
self.shouldDeleteLogOnDisconnection = true
self.vpn.reconnect(completionHandler: nil)
}
alert.addCancelAction(L10n.Core.Global.cancel) {
alert.addCancelAction(L10n.Global.cancel) {
cell.setOn(!cell.isOn, animated: true)
}
present(alert, animated: true, completion: nil)
@ -650,11 +650,11 @@ class ServiceViewController: UIViewController, StrongTableHost {
}
let alert = UIAlertController.asAlert(
L10n.Core.Service.Alerts.Download.title,
L10n.Core.Service.Alerts.Download.message(providerProfile.name)
L10n.Service.Alerts.Download.title,
L10n.Service.Alerts.Download.message(providerProfile.name)
)
alert.addCancelAction(L10n.Core.Global.cancel)
alert.addPreferredAction(L10n.Core.Global.ok) {
alert.addCancelAction(L10n.Global.cancel)
alert.addPreferredAction(L10n.Global.ok) {
self.confirmDownload(URL(string: downloadURL)!)
}
present(alert, animated: true, completion: nil)
@ -669,15 +669,15 @@ class ServiceViewController: UIViewController, StrongTableHost {
private func handleDownloadedProviderResources(url: URL?, error: Error?) {
guard let url = url else {
let alert = UIAlertController.asAlert(
L10n.Core.Service.Alerts.Download.title,
L10n.Core.Service.Alerts.Download.failed(error?.localizedDescription ?? "")
L10n.Service.Alerts.Download.title,
L10n.Service.Alerts.Download.failed(error?.localizedDescription ?? "")
)
alert.addCancelAction(L10n.Core.Global.ok)
alert.addCancelAction(L10n.Global.ok)
present(alert, animated: true, completion: nil)
return
}
let hud = HUD(view: view.window!, label: L10n.Core.Service.Alerts.Download.Hud.extracting)
let hud = HUD(view: view.window!, label: L10n.Service.Alerts.Download.Hud.extracting)
hud.show()
uncheckedProviderProfile.name.importExternalResources(from: url) {
hud.hide()
@ -863,7 +863,7 @@ extension ServiceViewController: UITableViewDataSource, UITableViewDelegate, Tog
func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String? {
let rows = model.rows(forSection: section)
if rows.contains(.providerRefresh), let date = lastInfrastructureUpdate {
return L10n.Core.Service.Sections.ProviderInfrastructure.footer(date.timestamp)
return L10n.Service.Sections.ProviderInfrastructure.footer(date.timestamp)
}
return model.footer(forSection: section)
}
@ -882,7 +882,7 @@ extension ServiceViewController: UITableViewDataSource, UITableViewDelegate, Tog
case .useProfile:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.applyAction(.current)
cell.leftText = L10n.Core.Service.Cells.UseProfile.caption
cell.leftText = L10n.Service.Cells.UseProfile.caption
return cell
case .vpnService:
@ -891,7 +891,7 @@ extension ServiceViewController: UITableViewDataSource, UITableViewDelegate, Tog
}
let cell = Cells.toggle.dequeue(from: tableView, for: indexPath, tag: row.rawValue, delegate: self)
cell.caption = L10n.Core.Service.Cells.VpnService.caption
cell.caption = L10n.Service.Cells.VpnService.caption
cell.isOn = vpn.isEnabled
return cell
@ -902,7 +902,7 @@ extension ServiceViewController: UITableViewDataSource, UITableViewDelegate, Tog
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.applyVPN(.current, with: vpn.isEnabled ? vpn.status : nil, error: service.vpnLastError)
cell.leftText = L10n.Core.Service.Cells.ConnectionStatus.caption
cell.leftText = L10n.Service.Cells.ConnectionStatus.caption
cell.accessoryType = .none
cell.isTappable = false
return cell
@ -910,7 +910,7 @@ extension ServiceViewController: UITableViewDataSource, UITableViewDelegate, Tog
case .reconnect:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.applyAction(.current)
cell.leftText = L10n.Core.Service.Cells.Reconnect.caption
cell.leftText = L10n.Service.Cells.Reconnect.caption
cell.accessoryType = .none
cell.isTappable = !service.needsCredentials(for: uncheckedProfile) && vpn.isEnabled
return cell
@ -919,15 +919,15 @@ extension ServiceViewController: UITableViewDataSource, UITableViewDelegate, Tog
case .account:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.leftText = L10n.Core.Account.title
cell.leftText = L10n.Account.title
cell.rightText = profile?.username
return cell
case .endpoint:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.leftText = L10n.Core.Endpoint.title
cell.leftText = L10n.Endpoint.title
let V = L10n.Core.Global.Values.self
let V = L10n.Global.Values.self
if let provider = profile as? ProviderConnectionProfile {
cell.rightText = provider.usesCustomEndpoint ? V.manual : V.automatic
} else {
@ -937,27 +937,27 @@ extension ServiceViewController: UITableViewDataSource, UITableViewDelegate, Tog
case .networkSettings:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.leftText = L10n.Core.NetworkSettings.title
cell.leftText = L10n.NetworkSettings.title
return cell
// provider cells
case .providerPool:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.leftText = L10n.Core.Service.Cells.Provider.Pool.caption
cell.leftText = L10n.Service.Cells.Provider.Pool.caption
cell.rightText = uncheckedProviderProfile.pool?.localizedId
return cell
case .providerPreset:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.leftText = L10n.Core.Service.Cells.Provider.Preset.caption
cell.leftText = L10n.Service.Cells.Provider.Preset.caption
cell.rightText = uncheckedProviderProfile.preset?.name // XXX: localize?
return cell
case .providerRefresh:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.applyAction(.current)
cell.leftText = L10n.Core.Service.Cells.Provider.Refresh.caption
cell.leftText = L10n.Service.Cells.Provider.Refresh.caption
return cell
// host cells
@ -965,7 +965,7 @@ extension ServiceViewController: UITableViewDataSource, UITableViewDelegate, Tog
case .hostParameters:
let parameters = uncheckedHostProfile.parameters
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.leftText = L10n.Core.Service.Cells.Host.Parameters.caption
cell.leftText = L10n.Service.Cells.Host.Parameters.caption
if !parameters.sessionConfiguration.fallbackCipher.embedsDigest {
cell.rightText = "\(parameters.sessionConfiguration.fallbackCipher.genericName) / \(parameters.sessionConfiguration.fallbackDigest.genericName)"
} else {
@ -977,19 +977,19 @@ extension ServiceViewController: UITableViewDataSource, UITableViewDelegate, Tog
case .vpnResolvesHostname:
let cell = Cells.toggle.dequeue(from: tableView, for: indexPath, tag: row.rawValue, delegate: self)
cell.caption = L10n.Core.Service.Cells.VpnResolvesHostname.caption
cell.caption = L10n.Service.Cells.VpnResolvesHostname.caption
cell.isOn = service.preferences.resolvesHostname
return cell
case .vpnSurvivesSleep:
let cell = Cells.toggle.dequeue(from: tableView, for: indexPath, tag: row.rawValue, delegate: self)
cell.caption = L10n.Core.Service.Cells.VpnSurvivesSleep.caption
cell.caption = L10n.Service.Cells.VpnSurvivesSleep.caption
cell.isOn = !service.preferences.disconnectsOnSleep
return cell
case .trustedMobile:
let cell = Cells.toggle.dequeue(from: tableView, for: indexPath, tag: row.rawValue, delegate: self)
cell.caption = L10n.Core.Service.Cells.TrustedMobile.caption
cell.caption = L10n.Service.Cells.TrustedMobile.caption
cell.isOn = uncheckedProfile.trustedNetworks.includesMobile
return cell
@ -1003,12 +1003,12 @@ extension ServiceViewController: UITableViewDataSource, UITableViewDelegate, Tog
case .trustedAddCurrentWiFi:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.applyAction(.current)
cell.leftText = L10n.Core.Service.Cells.TrustedAddWifi.caption
cell.leftText = L10n.Service.Cells.TrustedAddWifi.caption
return cell
case .trustedPolicy:
let cell = Cells.toggle.dequeue(from: tableView, for: indexPath, tag: row.rawValue, delegate: self)
cell.caption = L10n.Core.Service.Cells.TrustedPolicy.caption
cell.caption = L10n.Service.Cells.TrustedPolicy.caption
cell.isOn = (uncheckedProfile.trustedNetworks.policy == .disconnect)
return cell
@ -1016,18 +1016,18 @@ extension ServiceViewController: UITableViewDataSource, UITableViewDelegate, Tog
case .testConnectivity:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.leftText = L10n.Core.Service.Cells.TestConnectivity.caption
cell.leftText = L10n.Service.Cells.TestConnectivity.caption
return cell
case .dataCount:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.leftText = L10n.Core.Service.Cells.DataCount.caption
cell.leftText = L10n.Service.Cells.DataCount.caption
if let count = currentDataCount, vpn.status == .connected {
let down = count.0.dataUnitDescription
let up = count.1.dataUnitDescription
cell.rightText = "\(down) / ↑\(up)"
} else {
cell.rightText = L10n.Core.Service.Cells.DataCount.none
cell.rightText = L10n.Service.Cells.DataCount.none
}
cell.accessoryType = .none
cell.isTappable = false
@ -1035,22 +1035,22 @@ extension ServiceViewController: UITableViewDataSource, UITableViewDelegate, Tog
case .serverConfiguration:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.leftText = L10n.Core.Service.Cells.ServerConfiguration.caption
cell.leftText = L10n.Service.Cells.ServerConfiguration.caption
return cell
case .serverNetwork:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.leftText = L10n.Core.Service.Cells.ServerNetwork.caption
cell.leftText = L10n.Service.Cells.ServerNetwork.caption
return cell
case .debugLog:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.leftText = L10n.Core.Service.Cells.DebugLog.caption
cell.leftText = L10n.Service.Cells.DebugLog.caption
return cell
case .masksPrivateData:
let cell = Cells.toggle.dequeue(from: tableView, for: indexPath, tag: row.rawValue, delegate: self)
cell.caption = L10n.Core.Service.Cells.MasksPrivateData.caption
cell.caption = L10n.Service.Cells.MasksPrivateData.caption
cell.isOn = TransientStore.masksPrivateData
return cell
@ -1058,12 +1058,12 @@ extension ServiceViewController: UITableViewDataSource, UITableViewDelegate, Tog
case .faq:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.leftText = L10n.Core.About.Cells.Faq.caption
cell.leftText = L10n.About.Cells.Faq.caption
return cell
case .reportIssue:
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
cell.leftText = L10n.Core.Service.Cells.ReportIssue.caption
cell.leftText = L10n.Service.Cells.ReportIssue.caption
return cell
}
}
@ -1238,31 +1238,31 @@ extension ServiceViewController: UITableViewDataSource, UITableViewDelegate, Tog
}
// headers
model.setHeader(L10n.Core.Service.Sections.Vpn.header, forSection: .vpn)
model.setHeader(L10n.Service.Sections.Vpn.header, forSection: .vpn)
if isProvider {
model.setHeader(L10n.Core.Service.Sections.Configuration.header, forSection: .authentication)
model.setHeader(L10n.Service.Sections.Configuration.header, forSection: .authentication)
} else {
model.setHeader(L10n.Core.Service.Sections.Configuration.header, forSection: .configuration)
model.setHeader(L10n.Service.Sections.Configuration.header, forSection: .configuration)
}
if isActiveProfile {
if isProvider {
model.setHeader("", forSection: .vpnResolvesHostname)
model.setHeader("", forSection: .vpnSurvivesSleep)
}
model.setHeader(L10n.Core.Service.Sections.Trusted.header, forSection: .trusted)
model.setHeader(L10n.Core.Service.Sections.Diagnostics.header, forSection: .diagnostics)
model.setHeader(L10n.Core.Organizer.Sections.Feedback.header, forSection: .feedback)
model.setHeader(L10n.Service.Sections.Trusted.header, forSection: .trusted)
model.setHeader(L10n.Service.Sections.Diagnostics.header, forSection: .diagnostics)
model.setHeader(L10n.Organizer.Sections.Feedback.header, forSection: .feedback)
}
// footers
if isActiveProfile {
model.setFooter(L10n.Core.Service.Sections.Vpn.footer, forSection: .vpn)
model.setFooter(L10n.Service.Sections.Vpn.footer, forSection: .vpn)
if isProvider {
model.setFooter(L10n.Core.Service.Sections.VpnResolvesHostname.footer, forSection: .vpnResolvesHostname)
model.setFooter(L10n.Service.Sections.VpnResolvesHostname.footer, forSection: .vpnResolvesHostname)
}
model.setFooter(L10n.Core.Service.Sections.VpnSurvivesSleep.footer, forSection: .vpnSurvivesSleep)
model.setFooter(L10n.Core.Service.Sections.Trusted.footer, forSection: .trustedPolicy)
model.setFooter(L10n.Core.Service.Sections.Diagnostics.footer, forSection: .diagnostics)
model.setFooter(L10n.Service.Sections.VpnSurvivesSleep.footer, forSection: .vpnSurvivesSleep)
model.setFooter(L10n.Service.Sections.Trusted.footer, forSection: .trustedPolicy)
model.setFooter(L10n.Service.Sections.Diagnostics.footer, forSection: .diagnostics)
}
// rows

View File

@ -42,9 +42,9 @@ class ShortcutsAddViewController: UITableViewController, StrongTableHost {
model.set([.connect, .enableVPN, .disableVPN], forSection: .vpn)
model.set([.trustCurrentWiFi, .untrustCurrentWiFi], forSection: .wifi)
model.set([.trustCellular, .untrustCellular], forSection: .cellular)
model.setHeader(L10n.Core.Shortcuts.Add.Sections.Vpn.header, forSection: .vpn)
model.setHeader(L10n.Core.Shortcuts.Add.Sections.Wifi.header, forSection: .wifi)
model.setHeader(L10n.Core.Shortcuts.Add.Sections.Cellular.header, forSection: .cellular)
model.setHeader(L10n.Shortcuts.Add.Sections.Vpn.header, forSection: .vpn)
model.setHeader(L10n.Shortcuts.Add.Sections.Wifi.header, forSection: .wifi)
model.setHeader(L10n.Shortcuts.Add.Sections.Cellular.header, forSection: .cellular)
return model
}()
@ -56,7 +56,7 @@ class ShortcutsAddViewController: UITableViewController, StrongTableHost {
override func viewDidLoad() {
super.viewDidLoad()
title = L10n.Core.Shortcuts.Add.title
title = L10n.Shortcuts.Add.title
}
// MARK: UITableViewController
@ -101,25 +101,25 @@ class ShortcutsAddViewController: UITableViewController, StrongTableHost {
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
switch model.row(at: indexPath) {
case .connect:
cell.leftText = L10n.Core.Shortcuts.Add.Cells.Connect.caption
cell.leftText = L10n.Shortcuts.Add.Cells.Connect.caption
case .enableVPN:
cell.leftText = L10n.Core.Shortcuts.Add.Cells.EnableVpn.caption
cell.leftText = L10n.Shortcuts.Add.Cells.EnableVpn.caption
case .disableVPN:
cell.leftText = L10n.Core.Shortcuts.Add.Cells.DisableVpn.caption
cell.leftText = L10n.Shortcuts.Add.Cells.DisableVpn.caption
case .trustCurrentWiFi:
cell.leftText = L10n.Core.Shortcuts.Add.Cells.TrustCurrentWifi.caption
cell.leftText = L10n.Shortcuts.Add.Cells.TrustCurrentWifi.caption
case .untrustCurrentWiFi:
cell.leftText = L10n.Core.Shortcuts.Add.Cells.UntrustCurrentWifi.caption
cell.leftText = L10n.Shortcuts.Add.Cells.UntrustCurrentWifi.caption
case .trustCellular:
cell.leftText = L10n.Core.Shortcuts.Add.Cells.TrustCellular.caption
cell.leftText = L10n.Shortcuts.Add.Cells.TrustCellular.caption
case .untrustCellular:
cell.leftText = L10n.Core.Shortcuts.Add.Cells.UntrustCellular.caption
cell.leftText = L10n.Shortcuts.Add.Cells.UntrustCellular.caption
}
return cell
}
@ -160,10 +160,10 @@ class ShortcutsAddViewController: UITableViewController, StrongTableHost {
private func addConnect() {
guard TransientStore.shared.service.hasProfiles() else {
let alert = UIAlertController.asAlert(
L10n.Core.Shortcuts.Add.Cells.Connect.caption,
L10n.Core.Shortcuts.Add.Alerts.NoProfiles.message
L10n.Shortcuts.Add.Cells.Connect.caption,
L10n.Shortcuts.Add.Alerts.NoProfiles.message
)
alert.addAction(L10n.Core.Global.ok) {
alert.addAction(L10n.Global.ok) {
if let ip = self.tableView.indexPathForSelectedRow {
self.tableView.deselectRow(at: ip, animated: true)
}

View File

@ -45,8 +45,8 @@ class ShortcutsConnectToViewController: UITableViewController, ProviderPoolViewC
let model: StrongTableModel<SectionType, RowType> = {
let model: StrongTableModel<SectionType, RowType> = StrongTableModel()
model.setHeader(L10n.Core.Organizer.Sections.Providers.header, forSection: .providers)
model.setHeader(L10n.Core.Organizer.Sections.Hosts.header, forSection: .hosts)
model.setHeader(L10n.Organizer.Sections.Providers.header, forSection: .providers)
model.setHeader(L10n.Organizer.Sections.Hosts.header, forSection: .hosts)
return model
}()
@ -69,7 +69,7 @@ class ShortcutsConnectToViewController: UITableViewController, ProviderPoolViewC
override func viewDidLoad() {
super.viewDidLoad()
title = L10n.Core.Shortcuts.Add.Cells.Connect.caption
title = L10n.Shortcuts.Add.Cells.Connect.caption
reloadModel()
}

View File

@ -76,7 +76,7 @@ class ShortcutsViewController: UITableViewController, INUIAddVoiceShortcutViewCo
let model: StrongTableModel<SectionType, RowType> = {
let model: StrongTableModel<SectionType, RowType> = StrongTableModel()
model.add(.all)
model.setHeader(L10n.Core.Shortcuts.Edit.Sections.All.header, forSection: .all)
model.setHeader(L10n.Shortcuts.Edit.Sections.All.header, forSection: .all)
model.set([], forSection: .all)
return model
}()
@ -92,7 +92,7 @@ class ShortcutsViewController: UITableViewController, INUIAddVoiceShortcutViewCo
override func viewDidLoad() {
super.viewDidLoad()
title = L10n.Core.Organizer.Cells.SiriShortcuts.caption
title = L10n.Organizer.Cells.SiriShortcuts.caption
INVoiceShortcutCenter.shared.getAllVoiceShortcuts { [weak self] (shortcuts, error) in
DispatchQueue.main.async {
@ -122,9 +122,9 @@ class ShortcutsViewController: UITableViewController, INUIAddVoiceShortcutViewCo
// TODO: really show it?
// let alert = UIAlertController.asAlert(
// title,
// L10n.Core.Shortcuts.Edit.message(error?.localizedDescription ?? "")
// L10n.Shortcuts.Edit.message(error?.localizedDescription ?? "")
// )
// alert.addCancelAction(L10n.Core.Global.ok) {
// alert.addCancelAction(L10n.Global.ok) {
// self.close()
// }
// present(alert, animated: true, completion: nil)
@ -192,7 +192,7 @@ class ShortcutsViewController: UITableViewController, INUIAddVoiceShortcutViewCo
case .addShortcut:
cell.applyAction(.current)
cell.leftText = L10n.Core.Shortcuts.Edit.Cells.AddShortcut.caption
cell.leftText = L10n.Shortcuts.Edit.Cells.AddShortcut.caption
cell.accessoryType = .none
cell.isTappable = true
}

View File

@ -1,65 +0,0 @@
//
// App.strings
// Passepartout
//
// Created by Davide De Rosa on 4/23/19.
// Copyright (c) 2021 Davide De Rosa. All rights reserved.
//
// https://github.com/passepartoutvpn
//
// This file is part of Passepartout.
//
// Passepartout is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Passepartout is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Passepartout. If not, see <http://www.gnu.org/licenses/>.
//
"organizer.cells.add_provider.caption" = "Neuen Anbieter hinzufügen";
"organizer.cells.add_host.caption" = "Aus Dateien hinzufügen";
"organizer.cells.import_host.caption" = "Vom Import hinzufügen";
"wizards.host.cells.title_input.caption" = "Titel";
"wizards.host.sections.existing.header" = "Bestehende Profile";
"imported_hosts.title" = "Importierte Hosts";
"service.sections.vpn.header" = "VPN";
"service.sections.status.header" = "Verbindung";
"service.sections.configuration.header" = "Konfiguration";
"service.cells.vpn_service.caption" = "Aktiviert";
"service.cells.provider.refresh.caption" = "Infrastruktur neu laden";
"service.cells.host.parameters.caption" = "Parameter";
"service.cells.trusted_add_wifi.caption" = "WLAN hinzufügen";
"service.alerts.location.message.denied" = "Sie müssen den Standortzugriff zulassen, um diesem Wi-Fi-Netzwerk vertrauen zu können. Gehen Sie zu den iOS-Einstellungen und überprüfen Sie Ihre Standortberechtigungen für Passepartout.";
"service.alerts.location.button.settings" = "Einstellungen";
"account.sections.credentials.header" = "Zugangsdaten";
"endpoint.sections.location_addresses.header" = "Adressen";
"endpoint.sections.location_protocols.header" = "Protokolle";
"provider.pool.actions.favorite" = "Favorit hinzuzufügen";
"provider.pool.actions.unfavorite" = "Favorit entfernen";
"provider.pool.sections.empty_favorites.footer" = "Wische nach Links um einen Standort zu den Favoriten hinzuzufügen oder zu entfernen.";
"provider.preset.cells.tech_details.caption" = "Technische Details";
"network_settings.cells.add_dns_server.caption" = "Adresse hinzufügen";
"network_settings.cells.add_dns_domain.caption" = "Domäne hinzufügen";
"network_settings.cells.proxy_bypass.caption" = "Domäne umgehen";
"network_settings.cells.add_proxy_bypass.caption" = "Zu umgehende Domäne hinzufügen";
"shortcuts.add.title" = "Füge Kurzbefehl hinzu";
"shortcuts.edit.title" = "Kurzbefehle bearbeiten";
"shortcuts.edit.cells.add_shortcut.caption" = "Kurzbefehl hinzufügen";

View File

@ -1,65 +0,0 @@
//
// App.strings
// Passepartout
//
// Created by Davide De Rosa on 6/13/18.
// Copyright (c) 2021 Davide De Rosa. All rights reserved.
//
// https://github.com/passepartoutvpn
//
// This file is part of Passepartout.
//
// Passepartout is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Passepartout is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Passepartout. If not, see <http://www.gnu.org/licenses/>.
//
"organizer.cells.add_provider.caption" = "Προσθήκη νέου παρόχου";
"organizer.cells.add_host.caption" = "Προσθήκη από αρχεία";
"organizer.cells.import_host.caption" = "Προσθήκη από εισαγωγή";
"wizards.host.cells.title_input.caption" = "Τίτλος";
"wizards.host.sections.existing.header" = "Υπάρχον Προφίλ";
"imported_hosts.title" = "Εισαγόμενοι διακομιστές";
"service.sections.vpn.header" = "VPN";
"service.sections.status.header" = "Σύνδεση";
"service.sections.configuration.header" = "Ρύθμιση";
"service.cells.vpn_service.caption" = "Ενεργοποιήθηκε";
"service.cells.provider.refresh.caption" = "Ανανέωση της υποδομής";
"service.cells.host.parameters.caption" = "Παράμετροι";
"service.cells.trusted_add_wifi.caption" = "Προσθέστε Wi-Fi";
"service.alerts.location.message.denied" = "Πρέπει να επιτρέψετε τη πρόσβαση τοποθεσίας για να εμπιστευτείτε το Wi-Fi δίκτυο. Μεταβείτε στις ρυθμίσεις του iOS και επιθεωρείστε τις ρυθμίσεις για το Passepartout.";
"service.alerts.location.button.settings" = "Ρυθμίσεις";
"account.sections.credentials.header" = "Διαπιστευτήρια";
"endpoint.sections.location_addresses.header" = "Διεθύνσεις";
"endpoint.sections.location_protocols.header" = "Πρωτόκολλα";
"provider.pool.actions.favorite" = "Αγαπημένο";
"provider.pool.actions.unfavorite" = "Δεν προτιμάται";
"provider.pool.sections.empty_favorites.footer" = "Σείρετε αριστερά για να προσθέσετε ή να αφαιρέσεται από τα αγαπημένα.";
"provider.preset.cells.tech_details.caption" = "Τεχνικές Λεπτομέρειες";
"network_settings.cells.add_dns_server.caption" = "Προσθήκη Διεύθυνσης";
"network_settings.cells.add_dns_domain.caption" = "Προσθήκη τομέα αναζήτησης";
"network_settings.cells.proxy_bypass.caption" = "Παράκαμψη Τομέα";
"network_settings.cells.add_proxy_bypass.caption" = "Προσθήκη τομέα παράκαμψης";
"shortcuts.add.title" = "Προσθήκη Συντόμευσης";
"shortcuts.edit.title" = "Διαχείριση συντομεύσεων";
"shortcuts.edit.cells.add_shortcut.caption" = "Προσθήκη Συντόμευσης";

View File

@ -1,24 +0,0 @@
//
// App.strings
// Passepartout
//
// Created by Davide De Rosa on 6/21/19.
// Copyright (c) 2021 Davide De Rosa. All rights reserved.
//
// https://github.com/passepartoutvpn
//
// This file is part of Passepartout.
//
// Passepartout is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Passepartout is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Passepartout. If not, see <http://www.gnu.org/licenses/>.
//

View File

@ -1,65 +0,0 @@
//
// App.strings
// Passepartout
//
// Created by Davide De Rosa on 6/13/18.
// Copyright (c) 2021 Davide De Rosa. All rights reserved.
//
// https://github.com/passepartoutvpn
//
// This file is part of Passepartout.
//
// Passepartout is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Passepartout is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Passepartout. If not, see <http://www.gnu.org/licenses/>.
//
"organizer.cells.add_provider.caption" = "Añadir proveedor";
"organizer.cells.add_host.caption" = "Añadir desde Ficheros";
"organizer.cells.import_host.caption" = "Añadir desde importados";
"wizards.host.cells.title_input.caption" = "Título";
"wizards.host.sections.existing.header" = "Perfiles existentes";
"imported_hosts.title" = "Hosts importados";
"service.sections.vpn.header" = "VPN";
"service.sections.status.header" = "Conexión";
"service.sections.configuration.header" = "Configuración";
"service.cells.vpn_service.caption" = "Habilitado";
"service.cells.provider.refresh.caption" = "Refrescar infraestructura";
"service.cells.host.parameters.caption" = "Parámetros";
"service.cells.trusted_add_wifi.caption" = "Añadir Wi-Fi";
"service.alerts.location.message.denied" = "Debes dar acceso a tu posición para añadir esta red Wi-Fi a las redes de confianza. Mira los ajustes iOS y revisa los permisos de posición para Passepartout.";
"service.alerts.location.button.settings" = "Ajustes";
"account.sections.credentials.header" = "Credenciales";
"endpoint.sections.location_addresses.header" = "Direcciones";
"endpoint.sections.location_protocols.header" = "Protocolos";
"provider.pool.actions.favorite" = "Favorita";
"provider.pool.actions.unfavorite" = "No favorita";
"provider.pool.sections.empty_favorites.footer" = "Desliza a la izquierda de una ubicación para agregarla o quitarla de los Favoritos.";
"provider.preset.cells.tech_details.caption" = "Detalles técnicos";
"network_settings.cells.add_dns_server.caption" = "Añadir dirección";
"network_settings.cells.add_dns_domain.caption" = "Añadir dominio";
"network_settings.cells.proxy_bypass.caption" = "Dominio ignorado";
"network_settings.cells.add_proxy_bypass.caption" = "Añadir dominio ignorado";
"shortcuts.add.title" = "Añadir atajo";
"shortcuts.edit.title" = "Gestionar atajos";
"shortcuts.edit.cells.add_shortcut.caption" = "Añadir atajo";

View File

@ -1,65 +0,0 @@
//
// App.strings
// Passepartout
//
// Created by Davide De Rosa on 6/13/18.
// Copyright (c) 2021 Davide De Rosa. All rights reserved.
//
// https://github.com/passepartoutvpn
//
// This file is part of Passepartout.
//
// Passepartout is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Passepartout is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Passepartout. If not, see <http://www.gnu.org/licenses/>.
//
"organizer.cells.add_provider.caption" = "Ajouter un nouveau fournisseur";
"organizer.cells.add_host.caption" = "Ajouter de Fichiers";
"organizer.cells.import_host.caption" = "Ajouter depuis importé";
"wizards.host.cells.title_input.caption" = "Titre";
"wizards.host.sections.existing.header" = "Profiles existants";
"imported_hosts.title" = "Hôtes importés";
"service.sections.vpn.header" = "VPN";
"service.sections.status.header" = "Connection";
"service.sections.configuration.header" = "Configuration";
"service.cells.vpn_service.caption" = "Activer";
"service.cells.provider.refresh.caption" = "Rafraîchir l'infrastructure";
"service.cells.host.parameters.caption" = "Paramètres";
"service.cells.trusted_add_wifi.caption" = "Ajouter Wi-Fi";
"service.alerts.location.message.denied" = "Vous devez autoriser la localisation pour faire confiance à ce réseau WiFi. Acceptez les permissions de localisation pour Passepartout dans les réglages.";
"service.alerts.location.button.settings" = "Réglages";
"account.sections.credentials.header" = "Indetifiants";
"endpoint.sections.location_addresses.header" = "Adresses";
"endpoint.sections.location_protocols.header" = "Protocols";
"provider.pool.actions.favorite" = "Favoris";
"provider.pool.actions.unfavorite" = "Retirer des Favoris";
"provider.pool.sections.empty_favorites.footer" = "Glissez vers la gauche d'un item pour l'ajouter ou le retirer des Favoris.";
"provider.preset.cells.tech_details.caption" = "Détails techniques";
"network_settings.cells.add_dns_server.caption" = "Ajouter une adresse";
"network_settings.cells.add_dns_domain.caption" = "Ajouter un domaine";
"network_settings.cells.proxy_bypass.caption" = "Outrepasser le domaine";
"network_settings.cells.add_proxy_bypass.caption" = "Ajouter outrepasser le domaine";
"shortcuts.add.title" = "Ajouter un raccourcis";
"shortcuts.edit.title" = "Gérer les raccourcis";
"shortcuts.edit.cells.add_shortcut.caption" = "Ajouter un raccourcis";

View File

@ -1,65 +0,0 @@
//
// App.strings
// Passepartout
//
// Created by Davide De Rosa on 6/13/18.
// Copyright (c) 2021 Davide De Rosa. All rights reserved.
//
// https://github.com/passepartoutvpn
//
// This file is part of Passepartout.
//
// Passepartout is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Passepartout is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Passepartout. If not, see <http://www.gnu.org/licenses/>.
//
"organizer.cells.add_provider.caption" = "Aggiungi provider";
"organizer.cells.add_host.caption" = "Aggiungi da Files";
"organizer.cells.import_host.caption" = "Aggiungi da importati";
"wizards.host.cells.title_input.caption" = "Titolo";
"wizards.host.sections.existing.header" = "Profili esistenti";
"imported_hosts.title" = "Host importati";
"service.sections.vpn.header" = "VPN";
"service.sections.status.header" = "Connessione";
"service.sections.configuration.header" = "Configurazione";
"service.cells.vpn_service.caption" = "Abilitato";
"service.cells.provider.refresh.caption" = "Aggiorna infrastruttura";
"service.cells.host.parameters.caption" = "Parametri";
"service.cells.trusted_add_wifi.caption" = "Aggiungi Wi-Fi";
"service.alerts.location.message.denied" = "Devi dare accesso alla tua posizione per aggiungere questa rete Wi-Fi alle reti sicure. Vai alle impostazioni iOS e verifica i permessi sulla posizione per Passepartout.";
"service.alerts.location.button.settings" = "Impostazioni";
"account.sections.credentials.header" = "Credenziali";
"endpoint.sections.location_addresses.header" = "Indirizzi";
"endpoint.sections.location_protocols.header" = "Protocolli";
"provider.pool.actions.favorite" = "Preferita";
"provider.pool.actions.unfavorite" = "Non preferita";
"provider.pool.sections.empty_favorites.footer" = "Scorri a sinistra su una regione per aggiungerla o rimuoverla dai Preferiti.";
"provider.preset.cells.tech_details.caption" = "Dettagli tecnici";
"network_settings.cells.add_dns_server.caption" = "Aggiungi indirizzo";
"network_settings.cells.add_dns_domain.caption" = "Aggiungi dominio";
"network_settings.cells.proxy_bypass.caption" = "Dominio ignorato";
"network_settings.cells.add_proxy_bypass.caption" = "Aggiungi dominio ignorato";
"shortcuts.add.title" = "Aggiungi comando rapido";
"shortcuts.edit.title" = "Gestisci comandi rapidi";
"shortcuts.edit.cells.add_shortcut.caption" = "Aggiungi comando rapido";

View File

@ -1,65 +0,0 @@
//
// App.strings
// Passepartout
//
// Created by Davide De Rosa on 6/13/18.
// Copyright (c) 2021 Davide De Rosa. All rights reserved.
//
// https://github.com/passepartoutvpn
//
// This file is part of Passepartout.
//
// Passepartout is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Passepartout is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Passepartout. If not, see <http://www.gnu.org/licenses/>.
//
"organizer.cells.add_provider.caption" = "Voeg nieuwe aanbieder toe";
"organizer.cells.add_host.caption" = "Toevoegen vanuit Bestanden";
"organizer.cells.import_host.caption" = "Toevoegen vanuit geïmporteerd";
"wizards.host.cells.title_input.caption" = "Titel";
"wizards.host.sections.existing.header" = "Bestaande profielen";
"imported_hosts.title" = "Geïmporteerde hosts";
"service.sections.vpn.header" = "VPN";
"service.sections.status.header" = "Verbinding";
"service.sections.configuration.header" = "Configuratie";
"service.cells.vpn_service.caption" = "Ingeschakeld";
"service.cells.provider.refresh.caption" = "Vernieuw de infrastructuur";
"service.cells.host.parameters.caption" = "Parameters";
"service.cells.trusted_add_wifi.caption" = "Wi-Fi toevoegen";
"service.alerts.location.message.denied" = "Om dit Wi-Fi netwerk te vertrouwen is toestemming tot locatie gegevens nodig. Ga naar Instellingen -> Privacy -> Locatievoorzieningen en check de locatie bevoegdheden voor Passepartout.";
"service.alerts.location.button.settings" = "Instellingen";
"account.sections.credentials.header" = "Inloggegevens";
"endpoint.sections.location_addresses.header" = "Adressen";
"endpoint.sections.location_protocols.header" = "Protocollen";
"provider.pool.actions.favorite" = "Favoriet";
"provider.pool.actions.unfavorite" = "Geen favoriet";
"provider.pool.sections.empty_favorites.footer" = "Veeg naar links op een locatie om deze toe te voegen of te verwijderen aan Favorieten.";
"provider.preset.cells.tech_details.caption" = "Technische details";
"network_settings.cells.add_dns_server.caption" = "Voeg adress toe";
"network_settings.cells.add_dns_domain.caption" = "Zoekdomein toevoegen";
"network_settings.cells.proxy_bypass.caption" = "Omzeil domein";
"network_settings.cells.add_proxy_bypass.caption" = "Voeg omzeil optie voor domein toe";
"shortcuts.add.title" = "Voeg snelkoppeling toe";
"shortcuts.edit.title" = "Beheer snelkoppelingen";
"shortcuts.edit.cells.add_shortcut.caption" = "Voeg snelkoppeling toe";

View File

@ -1,65 +0,0 @@
//
// App.strings
// Passepartout
//
// Created by Davide De Rosa on 6/21/19.
// Copyright (c) 2021 Davide De Rosa. All rights reserved.
//
// https://github.com/passepartoutvpn
//
// This file is part of Passepartout.
//
// Passepartout is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Passepartout is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Passepartout. If not, see <http://www.gnu.org/licenses/>.
//
"organizer.cells.add_provider.caption" = "Dodaj nowego usługodawcę";
"organizer.cells.add_host.caption" = "Dodaj z Plików";
"organizer.cells.import_host.caption" = "Dodaj z zaimportowanych";
"wizards.host.cells.title_input.caption" = "Tytuł";
"wizards.host.sections.existing.header" = "Istniejące profile";
"imported_hosts.title" = "Zaimportowane hosty";
"service.sections.vpn.header" = "VPN";
"service.sections.status.header" = "Połączenie";
"service.sections.configuration.header" = "Konfiguracja";
"service.cells.vpn_service.caption" = "Włączone";
"service.cells.provider.refresh.caption" = "Odśwież infrastrukturę";
"service.cells.host.parameters.caption" = "Parametry";
"service.cells.trusted_add_wifi.caption" = "Dodaj Wi-Fi";
"service.alerts.location.message.denied" = "Musisz pozwolić na dostęp do lokalizacji żeby zaufać tej sieci Wi-Fi. Przejdź do ustawień prywatności i pozwól Passepartout na wykorzystywanie usług lokalizacji.";
"service.alerts.location.button.settings" = "Ustawienia";
"account.sections.credentials.header" = "Dane logowania";
"endpoint.sections.location_addresses.header" = "Adresy";
"endpoint.sections.location_protocols.header" = "Protokoły";
"provider.pool.actions.favorite" = "Dodaj do ulubionych";
"provider.pool.actions.unfavorite" = "Usuń z ulubionych";
"provider.pool.sections.empty_favorites.footer" = "Aby usunąć zakładkę, przesuń w lewo.";
"provider.preset.cells.tech_details.caption" = "Dane techniczne";
"network_settings.cells.add_dns_server.caption" = "Dodaj adres";
"network_settings.cells.proxy_bypass.caption" = "Pomiń domenę";
"network_settings.cells.add_proxy_bypass.caption" = "Dodaj domenę";
"network_settings.cells.add_dns_domain.caption" = "Dodaj domenę wyszukiwania";
"shortcuts.add.title" = "Dodaj skrót";
"shortcuts.edit.title" = "Zarządzaj skrótami";
"shortcuts.edit.cells.add_shortcut.caption" = "Dodaj skrót";

View File

@ -1,65 +0,0 @@
//
// App.strings
// Passepartout
//
// Created by Davide De Rosa on 6/13/18.
// Copyright (c) 2021 Davide De Rosa. All rights reserved.
//
// https://github.com/passepartoutvpn
//
// This file is part of Passepartout.
//
// Passepartout is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Passepartout is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Passepartout. If not, see <http://www.gnu.org/licenses/>.
//
"organizer.cells.add_provider.caption" = "Adicionar novo perfil";
"organizer.cells.add_host.caption" = "Adicionar dos Arquivos";
"organizer.cells.import_host.caption" = "Adicionar dos importados";
"wizards.host.cells.title_input.caption" = "Título";
"wizards.host.sections.existing.header" = "Perfis existentes";
"imported_hosts.title" = "Hosts importados";
"service.sections.vpn.header" = "VPN";
"service.sections.status.header" = "Conexão";
"service.sections.configuration.header" = "Configuração";
"service.cells.vpn_service.caption" = "Ativado";
"service.cells.provider.refresh.caption" = "Atualizar infraestrutura";
"service.cells.host.parameters.caption" = "Parâmetros";
"service.cells.trusted_add_wifi.caption" = "Adicionar Wi-Fi";
"service.alerts.location.message.denied" = "Você precisa autorizar o compartilhamento de localização. Acesse ajustes do iOS e verifique permissões de localização do Passepartout.";
"service.alerts.location.button.settings" = "Ajustes";
"account.sections.credentials.header" = "Credenciais";
"endpoint.sections.location_addresses.header" = "Endereços";
"endpoint.sections.location_protocols.header" = "Protocolos";
"provider.pool.actions.favorite" = "Favorito";
"provider.pool.actions.unfavorite" = "Não favorito";
"provider.pool.sections.empty_favorites.footer" = "Deslize para a esquerda em um local para adicioná-lo ou removê-lo dos Favoritos.";
"provider.preset.cells.tech_details.caption" = "Detalhes técnicos";
"network_settings.cells.add_dns_server.caption" = "Adicionar endereço";
"network_settings.cells.add_dns_domain.caption" = "Adicionar domínio";
"network_settings.cells.proxy_bypass.caption" = "Domínio ignorado";
"network_settings.cells.add_proxy_bypass.caption" = "Adicionar domínio ignorado";
"shortcuts.add.title" = "Adicionar atalho";
"shortcuts.edit.title" = "Configuração de atalhos";
"shortcuts.edit.cells.add_shortcut.caption" = "Adicionar atalho";

View File

@ -1,65 +0,0 @@
//
// App.strings
// Passepartout
//
// Created by Davide De Rosa on 4/23/19.
// Copyright (c) 2021 Davide De Rosa. All rights reserved.
//
// https://github.com/passepartoutvpn
//
// This file is part of Passepartout.
//
// Passepartout is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Passepartout is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Passepartout. If not, see <http://www.gnu.org/licenses/>.
//
"organizer.cells.add_provider.caption" = "Добавить нового провайдера";
"organizer.cells.add_host.caption" = "Добавить из файлов";
"organizer.cells.import_host.caption" = "Добавить из импортированных";
"wizards.host.cells.title_input.caption" = "Название";
"wizards.host.sections.existing.header" = "Существующие профили";
"imported_hosts.title" = "Импортированные хост профили";
"service.sections.vpn.header" = "VPN";
"service.sections.status.header" = "Соединение";
"service.sections.configuration.header" = "Конфигурация";
"service.cells.vpn_service.caption" = "Включен";
"service.cells.provider.refresh.caption" = "Обновить инфраструктуру";
"service.cells.host.parameters.caption" = "Параметры";
"service.cells.trusted_add_wifi.caption" = "Добавить Wi-Fi";
"service.alerts.location.message.denied" = "Вам нужно разрешить использование геопозиции для добавления этой Wi-Fi сети в доверенные. Перейдите в настройки iOS, и измените разрешения геолокации для Passepartout.";
"service.alerts.location.button.settings" = "Настройки";
"account.sections.credentials.header" = "Данные для входа";
"endpoint.sections.location_addresses.header" = "Адреса";
"endpoint.sections.location_protocols.header" = "Протоколы";
"provider.pool.actions.favorite" = "Добавить в избранное";
"provider.pool.actions.unfavorite" = "Убрать из избранного";
"provider.pool.sections.empty_favorites.footer" = "Свайп в лево на локации, чтобы добавить или убрать из избранного.";
"provider.preset.cells.tech_details.caption" = "Техническая информация";
"network_settings.cells.add_dns_server.caption" = "Добавить адрес";
"network_settings.cells.add_dns_domain.caption" = "Добавить домен поиска";
"network_settings.cells.proxy_bypass.caption" = "Обход домена";
"network_settings.cells.add_proxy_bypass.caption" = "Добавить обходной домен";
"shortcuts.add.title" = "Создать команду";
"shortcuts.edit.title" = "Управлять командами";
"shortcuts.edit.cells.add_shortcut.caption" = "Создать команду";

View File

@ -1,65 +0,0 @@
//
// App.strings
// Passepartout
//
// Created by Davide De Rosa on 6/13/18.
// Copyright (c) 2021 Davide De Rosa. All rights reserved.
//
// https://github.com/passepartoutvpn
//
// This file is part of Passepartout.
//
// Passepartout is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Passepartout is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Passepartout. If not, see <http://www.gnu.org/licenses/>.
//
"organizer.cells.add_provider.caption" = "Lägg till ny leverantör";
"organizer.cells.add_host.caption" = "Lägg till från Filer";
"organizer.cells.import_host.caption" = "Lägg till från importerad";
"wizards.host.cells.title_input.caption" = "Namn";
"wizards.host.sections.existing.header" = "Befintliga profiler";
"imported_hosts.title" = "Importerade värdar";
"service.sections.vpn.header" = "VPN";
"service.sections.status.header" = "Koppling";
"service.sections.configuration.header" = "Konfiguration";
"service.cells.vpn_service.caption" = "Aktiverad";
"service.cells.provider.refresh.caption" = "Uppdatera infrastruktur";
"service.cells.host.parameters.caption" = "Parametrar";
"service.cells.trusted_add_wifi.caption" = "Lägg till Wi-Fi";
"service.alerts.location.message.denied" = "Du måste tillåta lägetillgång för att förlita detta nätverk. Öppna iOS inställningar och se över tillstånd för Passepartout.";
"service.alerts.location.button.settings" = "Inställningar";
"account.sections.credentials.header" = "Referenser";
"endpoint.sections.location_addresses.header" = "Adresser";
"endpoint.sections.location_protocols.header" = "Protokoll";
"provider.pool.actions.favorite" = "Favorit";
"provider.pool.actions.unfavorite" = "Inte favorit";
"provider.pool.sections.empty_favorites.footer" = "Dra åt vänster på en plats för att lägga till eller ta bort den från favoriter.";
"provider.preset.cells.tech_details.caption" = "Tekniska detaljer";
"network_settings.cells.add_dns_server.caption" = "Lägg till adress";
"network_settings.cells.add_dns_domain.caption" = "Lägg till domän";
"network_settings.cells.proxy_bypass.caption" = "Bypass-domän";
"network_settings.cells.add_proxy_bypass.caption" = "Add bypass domain";
"shortcuts.add.title" = "Lägg till genväg";
"shortcuts.edit.title" = "Hantera genvägar";
"shortcuts.edit.cells.add_shortcut.caption" = "Lägg till genväg";

View File

@ -1,7 +1,6 @@
strings:
inputs:
- ../../Core/Resources/en.lproj/Core.strings
- en.lproj/App.strings
outputs:
- templateName: structured-swift4
output: Global/SwiftGen+Strings.swift

View File

@ -1,65 +0,0 @@
//
// App.strings
// Passepartout
//
// Created by Davide De Rosa on 6/21/19.
// Copyright (c) 2021 Davide De Rosa. All rights reserved.
//
// https://github.com/passepartoutvpn
//
// This file is part of Passepartout.
//
// Passepartout is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Passepartout is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Passepartout. If not, see <http://www.gnu.org/licenses/>.
//
"organizer.cells.add_provider.caption" = "添加新的提供商配置";
"organizer.cells.add_host.caption" = "从文件添加";
"organizer.cells.import_host.caption" = "从导入中添加";
"wizards.host.cells.title_input.caption" = "名称";
"wizards.host.sections.existing.header" = "已存在的配置";
"imported_hosts.title" = "导入主机配置";
"service.sections.vpn.header" = "VPN";
"service.sections.status.header" = "连接";
"service.sections.configuration.header" = "配置";
"service.cells.vpn_service.caption" = "已启用";
"service.cells.provider.refresh.caption" = "刷新基础设置";
"service.cells.host.parameters.caption" = "参数";
"service.cells.trusted_add_wifi.caption" = "新增Wi-Fi";
"service.alerts.location.message.denied" = "你必须允许位置访问以信任此Wi-Fi。请至iOS设置对Passepartout的位置权限。";
"service.alerts.location.button.settings" = "设置";
"account.sections.credentials.header" = "认证方式";
"endpoint.sections.location_addresses.header" = "地址";
"endpoint.sections.location_protocols.header" = "协议";
"provider.pool.actions.favorite" = "最喜爱";
"provider.pool.actions.unfavorite" = "不喜爱";
"provider.pool.sections.empty_favorites.footer" = "向左轻扫以将其从最喜爱列表中移除或添加。";
"provider.preset.cells.tech_details.caption" = "技术细节";
"network_settings.cells.add_dns_server.caption" = "添加地址";
"network_settings.cells.add_dns_domain.caption" = "添加搜索域名";
"network_settings.cells.proxy_bypass.caption" = "旁路域名";
"network_settings.cells.add_proxy_bypass.caption" = "添加旁路域名";
"shortcuts.add.title" = "添加捷径";
"shortcuts.edit.title" = "管理捷径";
"shortcuts.edit.cells.add_shortcut.caption" = "添加捷径";

View File

@ -74,8 +74,8 @@ class AppDelegate: NSObject, NSApplicationDelegate {
}
if !TransientStore.didHandleSubreddit {
let alert = Macros.warning(L10n.Core.Reddit.title, L10n.Core.Reddit.message)
alert.present(in: nil, withOK: L10n.Core.Reddit.Buttons.subscribe, cancel: L10n.Core.Reddit.Buttons.never, dummy: L10n.Core.Reddit.Buttons.remind, handler: {
let alert = Macros.warning(L10n.Reddit.title, L10n.Reddit.message)
alert.present(in: nil, withOK: L10n.Reddit.Buttons.subscribe, cancel: L10n.Reddit.Buttons.never, dummy: L10n.Reddit.Buttons.remind, handler: {
TransientStore.didHandleSubreddit = true
self.subscribeSubreddit()
}, cancelHandler: {
@ -90,10 +90,10 @@ class AppDelegate: NSObject, NSApplicationDelegate {
return .terminateNow
}
let alert = Macros.warning(
L10n.Core.Menu.Quit.title(GroupConstants.App.name),
L10n.Core.Menu.Quit.Messages.confirm
L10n.Menu.Quit.title(GroupConstants.App.name),
L10n.Menu.Quit.Messages.confirm
)
switch alert.presentModallyEx(withOK: L10n.Core.Global.ok, other1: L10n.Core.Global.cancel, other2: L10n.Core.Reddit.Buttons.never) {
switch alert.presentModallyEx(withOK: L10n.Global.ok, other1: L10n.Global.cancel, other2: L10n.Reddit.Buttons.never) {
case .alertSecondButtonReturn:
return .terminateCancel

View File

@ -66,21 +66,21 @@ class HostImporter {
default:
let message = HostImporter.localizedMessage(forError: e)
let alert = Macros.warning(configurationURL.normalizedFilename, message)
_ = alert.presentModally(withOK: L10n.Core.Global.ok, cancel: nil)
_ = alert.presentModally(withOK: L10n.Global.ok, cancel: nil)
}
return
} catch let e {
let message = HostImporter.localizedMessage(forError: e)
let alert = Macros.warning(configurationURL.normalizedFilename, message)
_ = alert.presentModally(withOK: L10n.Core.Global.ok, cancel: nil)
_ = alert.presentModally(withOK: L10n.Global.ok, cancel: nil)
return
}
if let warning = result.warning {
let message = HostImporter.localizedDetailsMessage(forWarning: warning)
let alert = Macros.warning(configurationURL.normalizedFilename, L10n.Core.ParsedFile.Alerts.PotentiallyUnsupported.message(message))
let alert = Macros.warning(configurationURL.normalizedFilename, L10n.ParsedFile.Alerts.PotentiallyUnsupported.message(message))
if alert.presentModally(withOK: L10n.Core.Global.ok, cancel: L10n.Core.Global.cancel) {
if alert.presentModally(withOK: L10n.Global.ok, cancel: L10n.Global.cancel) {
enterProfileName(forHostWithResult: result)
}
@ -92,7 +92,7 @@ class HostImporter {
private func enterPassphraseForHost(at url: URL) {
let vc = StoryboardScene.Main.textInputViewController.instantiate()
vc.caption = L10n.Core.ParsedFile.Alerts.EncryptionPassphrase.message
vc.caption = L10n.ParsedFile.Alerts.EncryptionPassphrase.message
vc.isSecure = true
vc.object = url
vc.delegate = self
@ -105,12 +105,12 @@ class HostImporter {
}
let vc = StoryboardScene.Main.textInputViewController.instantiate()
vc.caption = L10n.Core.Service.Alerts.Rename.title.asCaption
vc.caption = L10n.Service.Alerts.Rename.title.asCaption
let profile = HostConnectionProfile(hostname: hostname)
let builder = OpenVPNTunnelProvider.ConfigurationBuilder(sessionConfiguration: result.configuration)
profile.parameters = builder.build()
vc.text = title
vc.placeholder = L10n.Core.Global.Host.TitleInput.placeholder
vc.placeholder = L10n.Global.Host.TitleInput.placeholder
vc.object = profile
vc.delegate = self
present(vc)
@ -139,22 +139,22 @@ class HostImporter {
switch appError {
case .malformed(let option):
log.error("Could not parse configuration URL: malformed option, \(option)")
return L10n.Core.ParsedFile.Alerts.Malformed.message(option)
return L10n.ParsedFile.Alerts.Malformed.message(option)
case .missingConfiguration(let option):
log.error("Could not parse configuration URL: missing configuration, \(option)")
return L10n.Core.ParsedFile.Alerts.Missing.message(option)
return L10n.ParsedFile.Alerts.Missing.message(option)
case .unsupportedConfiguration(let option):
log.error("Could not parse configuration URL: unsupported configuration, \(option)")
return L10n.Core.ParsedFile.Alerts.Unsupported.message(option)
return L10n.ParsedFile.Alerts.Unsupported.message(option)
default:
break
}
}
log.error("Could not parse configuration URL: \(error)")
return L10n.Core.ParsedFile.Alerts.Parsing.message(error.localizedDescription)
return L10n.ParsedFile.Alerts.Parsing.message(error.localizedDescription)
}
// XXX: copy/paste from iOS
@ -196,8 +196,8 @@ extension HostImporter: TextInputViewControllerDelegate {
if let existingHostId = service.existingHostId(withTitle: text) {
dismiss(textInputController)
let alert = Macros.warning(text, L10n.Core.Wizards.Host.Alerts.Existing.message)
if alert.presentModally(withOK: L10n.Core.Global.ok, cancel: L10n.Core.Global.cancel) {
let alert = Macros.warning(text, L10n.Wizards.Host.Alerts.Existing.message)
if alert.presentModally(withOK: L10n.Global.ok, cancel: L10n.Global.cancel) {
guard let existingProfile = service.profile(withContext: profile.context, id: existingHostId) else {
fatalError("ConnectionService.existingHostId() returned a non-existing host profile?")
}

View File

@ -36,8 +36,8 @@ class IssueReporter: NSObject {
func present(withIssue issue: Issue) {
if issue.debugLog {
let alert = Macros.warning(L10n.Core.IssueReporter.title, L10n.Core.IssueReporter.message)
alert.present(in: nil, withOK: L10n.Core.IssueReporter.Buttons.accept, cancel: L10n.Core.Global.cancel, handler: {
let alert = Macros.warning(L10n.IssueReporter.title, L10n.IssueReporter.message)
alert.present(in: nil, withOK: L10n.IssueReporter.Buttons.accept, cancel: L10n.Global.cancel, handler: {
VPN.shared.requestDebugLog(fallback: AppConstants.Log.debugSnapshot) {
self.composeEmail(withDebugLog: $0, issue: issue)
}

File diff suppressed because it is too large Load Diff

View File

@ -68,8 +68,8 @@ class TextInputViewController: NSViewController {
labelTextCaption.stringValue = caption
textField.stringValue = text
textField.placeholderString = placeholder
buttonOK.title = L10n.Core.Global.ok
buttonCancel.title = L10n.Core.Global.cancel
buttonOK.title = L10n.Global.ok
buttonCancel.title = L10n.Global.cancel
textPlain.isHidden = isSecure
textSecure.isHidden = !isSecure

View File

@ -30,31 +30,31 @@ import TunnelKit
extension NSTextField {
func applyVPN(_ theme: Theme, isActive: Bool, with vpnStatus: VPNStatus?, error: OpenVPNTunnelProvider.ProviderError?) {
guard isActive else {
stringValue = L10n.Core.Vpn.unused
stringValue = L10n.Vpn.unused
textColor = theme.palette.colorSecondaryText
return
}
guard let vpnStatus = vpnStatus else {
stringValue = L10n.Core.Vpn.disabled
stringValue = L10n.Vpn.disabled
textColor = theme.palette.colorSecondaryText
return
}
switch vpnStatus {
case .connecting:
stringValue = L10n.Core.Vpn.connecting
stringValue = L10n.Vpn.connecting
textColor = theme.palette.colorIndeterminate
case .connected:
stringValue = L10n.Core.Vpn.active
stringValue = L10n.Vpn.active
textColor = theme.palette.colorOn
case .disconnecting:
stringValue = disconnectionReason(for: error) ?? L10n.Core.Vpn.disconnecting
stringValue = disconnectionReason(for: error) ?? L10n.Vpn.disconnecting
textColor = theme.palette.colorIndeterminate
case .disconnected:
stringValue = disconnectionReason(for: error) ?? L10n.Core.Vpn.inactive
stringValue = disconnectionReason(for: error) ?? L10n.Vpn.inactive
textColor = theme.palette.colorOff
}
}
@ -63,7 +63,7 @@ extension NSTextField {
guard let error = error else {
return nil
}
let V = L10n.Core.Vpn.Errors.self
let V = L10n.Vpn.Errors.self
switch error {
case .socketActivity, .timeout:
return V.timeout

View File

@ -44,7 +44,7 @@ class WindowManager: NSObject {
@discardableResult func showPreferences() -> NSWindowController? {
preferences = presentWindowController(StoryboardScene.Preferences.preferencesWindowController, existing: preferences)
preferences?.window?.title = L10n.Core.Preferences.title
preferences?.window?.title = L10n.Preferences.title
return preferences
}

View File

@ -67,7 +67,7 @@ class StatusMenu: NSObject {
private let menuAllProfiles = NSMenu()
private lazy var itemSwitchProfile = NSMenuItem(title: L10n.Core.Menu.SwitchProfile.title, action: nil, keyEquivalent: "")
private lazy var itemSwitchProfile = NSMenuItem(title: L10n.Menu.SwitchProfile.title, action: nil, keyEquivalent: "")
private var itemsAllProfiles: [NSMenuItem] = []
@ -77,9 +77,9 @@ class StatusMenu: NSObject {
private lazy var itemPool = NSMenuItem(title: "", action: nil, keyEquivalent: "")
private lazy var itemToggleVPN = NSMenuItem(title: L10n.Core.Service.Cells.Vpn.TurnOn.caption, action: nil, keyEquivalent: "")
private lazy var itemToggleVPN = NSMenuItem(title: L10n.Service.Cells.Vpn.TurnOn.caption, action: nil, keyEquivalent: "")
private lazy var itemReconnectVPN = NSMenuItem(title: L10n.Core.Service.Cells.Reconnect.caption, action: #selector(reconnectVPN), keyEquivalent: "")
private lazy var itemReconnectVPN = NSMenuItem(title: L10n.Service.Cells.Reconnect.caption, action: #selector(reconnectVPN), keyEquivalent: "")
private override init() {
super.init()
@ -111,8 +111,8 @@ class StatusMenu: NSObject {
// main actions
let itemShow = NSMenuItem(title: L10n.Core.Menu.Show.title, action: #selector(showOrganizer), keyEquivalent: "")
let itemPreferences = NSMenuItem(title: L10n.Core.Menu.Preferences.title.asContinuation, action: #selector(showPreferences), keyEquivalent: ",")
let itemShow = NSMenuItem(title: L10n.Menu.Show.title, action: #selector(showOrganizer), keyEquivalent: "")
let itemPreferences = NSMenuItem(title: L10n.Menu.Preferences.title.asContinuation, action: #selector(showPreferences), keyEquivalent: ",")
itemShow.target = self
itemPreferences.target = self
menu.addItem(itemShow)
@ -130,11 +130,11 @@ class StatusMenu: NSObject {
// support
let menuSupport = NSMenu()
let itemCommunity = NSMenuItem(title: L10n.Core.Organizer.Cells.JoinCommunity.caption.asContinuation, action: #selector(joinCommunity), keyEquivalent: "")
// let itemDonate = NSMenuItem(title: L10n.Core.Organizer.Cells.Donate.caption.asContinuation, action: #selector(showDonations), keyEquivalent: "")
// let itemGitHubSponsors = NSMenuItem(title: L10n.Core.Organizer.Cells.GithubSponsors.caption.asContinuation, action: #selector(seeGitHubSponsors), keyEquivalent: "")
// let itemTranslate = NSMenuItem(title: L10n.Core.Organizer.Cells.Translate.caption.asContinuation, action: #selector(offerToTranslate), keyEquivalent: "")
let itemFAQ = NSMenuItem(title: L10n.Core.About.Cells.Faq.caption.asContinuation, action: #selector(visitFAQ), keyEquivalent: "")
let itemCommunity = NSMenuItem(title: L10n.Organizer.Cells.JoinCommunity.caption.asContinuation, action: #selector(joinCommunity), keyEquivalent: "")
// let itemDonate = NSMenuItem(title: L10n.Organizer.Cells.Donate.caption.asContinuation, action: #selector(showDonations), keyEquivalent: "")
// let itemGitHubSponsors = NSMenuItem(title: L10n.Organizer.Cells.GithubSponsors.caption.asContinuation, action: #selector(seeGitHubSponsors), keyEquivalent: "")
// let itemTranslate = NSMenuItem(title: L10n.Organizer.Cells.Translate.caption.asContinuation, action: #selector(offerToTranslate), keyEquivalent: "")
let itemFAQ = NSMenuItem(title: L10n.About.Cells.Faq.caption.asContinuation, action: #selector(visitFAQ), keyEquivalent: "")
itemCommunity.target = self
// itemDonate.target = self
// itemGitHubSponsors.target = self
@ -146,26 +146,26 @@ class StatusMenu: NSObject {
// menuSupport.addItem(itemGitHubSponsors)
// menuSupport.addItem(itemTranslate)
if ProductManager.shared.isEligibleForFeedback() {
let itemReview = NSMenuItem(title: L10n.Core.Organizer.Cells.WriteReview.caption.asContinuation, action: #selector(writeReview), keyEquivalent: "")
let itemReview = NSMenuItem(title: L10n.Organizer.Cells.WriteReview.caption.asContinuation, action: #selector(writeReview), keyEquivalent: "")
itemReview.target = self
menuSupport.addItem(itemReview)
}
menuSupport.addItem(.separator())
menuSupport.addItem(itemFAQ)
if ProductManager.shared.isEligibleForFeedback() {
let itemReport = NSMenuItem(title: L10n.Core.Service.Cells.ReportIssue.caption.asContinuation, action: #selector(reportConnectivityIssue), keyEquivalent: "")
let itemReport = NSMenuItem(title: L10n.Service.Cells.ReportIssue.caption.asContinuation, action: #selector(reportConnectivityIssue), keyEquivalent: "")
itemReport.target = self
menuSupport.addItem(itemReport)
}
let itemSupport = NSMenuItem(title: L10n.Core.Menu.Support.title, action: nil, keyEquivalent: "")
let itemSupport = NSMenuItem(title: L10n.Menu.Support.title, action: nil, keyEquivalent: "")
menu.setSubmenu(menuSupport, for: itemSupport)
menu.addItem(itemSupport)
// share
let menuShare = NSMenu()
let itemTweet = NSMenuItem(title: L10n.Core.About.Cells.ShareTwitter.caption, action: #selector(shareTwitter), keyEquivalent: "")
let itemInvite = NSMenuItem(title: L10n.Core.About.Cells.ShareGeneric.caption.asContinuation, action: #selector(shareGeneric), keyEquivalent: "")
let itemTweet = NSMenuItem(title: L10n.About.Cells.ShareTwitter.caption, action: #selector(shareTwitter), keyEquivalent: "")
let itemInvite = NSMenuItem(title: L10n.About.Cells.ShareGeneric.caption.asContinuation, action: #selector(shareGeneric), keyEquivalent: "")
let itemAlternativeTo = NSMenuItem(title: "AlternativeTo".asContinuation, action: #selector(visitAlternativeTo), keyEquivalent: "")
itemTweet.target = self
itemInvite.target = self
@ -173,15 +173,15 @@ class StatusMenu: NSObject {
menuShare.addItem(itemTweet)
menuShare.addItem(itemInvite)
menuShare.addItem(itemAlternativeTo)
let itemShare = NSMenuItem(title: L10n.Core.About.Sections.Share.header, action: nil, keyEquivalent: "")
let itemShare = NSMenuItem(title: L10n.About.Sections.Share.header, action: nil, keyEquivalent: "")
menu.setSubmenu(menuShare, for: itemShare)
menu.addItem(itemShare)
menu.addItem(.separator())
// secondary
let itemAbout = NSMenuItem(title: L10n.Core.Organizer.Cells.About.caption(GroupConstants.App.name), action: #selector(showAbout), keyEquivalent: "")
let itemQuit = NSMenuItem(title: L10n.Core.Menu.Quit.title(GroupConstants.App.name), action: #selector(quit), keyEquivalent: "q")
let itemAbout = NSMenuItem(title: L10n.Organizer.Cells.About.caption(GroupConstants.App.name), action: #selector(showAbout), keyEquivalent: "")
let itemQuit = NSMenuItem(title: L10n.Menu.Quit.title(GroupConstants.App.name), action: #selector(quit), keyEquivalent: "q")
itemAbout.target = self
itemQuit.target = self
menu.addItem(itemAbout)
@ -224,7 +224,7 @@ class StatusMenu: NSObject {
itemsProfile.removeAll()
guard let profile = profile else {
itemProfileName.title = L10n.Core.Menu.ActiveProfile.Title.none
itemProfileName.title = L10n.Menu.ActiveProfile.Title.none
// itemProfileName.image = nil
statusItem.button?.image = imageStatusInactive
statusItem.button?.toolTip = nil
@ -248,7 +248,7 @@ class StatusMenu: NSObject {
itemsProfile.append(itemToggleVPN)
itemsProfile.append(itemReconnectVPN)
} else {
let itemMissingCredentials = NSMenuItem(title: L10n.Core.Menu.ActiveProfile.Messages.missingCredentials, action: nil, keyEquivalent: "")
let itemMissingCredentials = NSMenuItem(title: L10n.Menu.ActiveProfile.Messages.missingCredentials, action: nil, keyEquivalent: "")
itemMissingCredentials.indentationLevel = 1
menu.insertItem(itemMissingCredentials, at: i)
i += 1
@ -260,12 +260,12 @@ class StatusMenu: NSObject {
if !needsCredentials, let providerProfile = profile as? ProviderConnectionProfile {
// endpoint (port only)
let itemEndpoint = NSMenuItem(title: L10n.Core.Endpoint.title, action: nil, keyEquivalent: "")
let itemEndpoint = NSMenuItem(title: L10n.Endpoint.title, action: nil, keyEquivalent: "")
itemEndpoint.indentationLevel = 1
let menuEndpoint = NSMenu()
// automatic
let itemEndpointAutomatic = NSMenuItem(title: L10n.Core.Endpoint.Cells.AnyProtocol.caption, action: #selector(connectToEndpoint(_:)), keyEquivalent: "")
let itemEndpointAutomatic = NSMenuItem(title: L10n.Endpoint.Cells.AnyProtocol.caption, action: #selector(connectToEndpoint(_:)), keyEquivalent: "")
itemEndpointAutomatic.target = self
if providerProfile.customProtocol == nil {
itemEndpointAutomatic.state = .on
@ -287,7 +287,7 @@ class StatusMenu: NSObject {
itemsProfile.append(itemEndpoint)
// account
let itemAccount = NSMenuItem(title: L10n.Core.Account.title.asContinuation, action: #selector(editAccountCredentials(_:)), keyEquivalent: "")
let itemAccount = NSMenuItem(title: L10n.Account.title.asContinuation, action: #selector(editAccountCredentials(_:)), keyEquivalent: "")
menu.insertItem(itemAccount, at: i)
i += 1
itemAccount.target = self
@ -295,7 +295,7 @@ class StatusMenu: NSObject {
itemsProfile.append(itemAccount)
// customize
let itemCustomize = NSMenuItem(title: L10n.Core.Menu.ActiveProfile.Items.Customize.title, action: #selector(customizeProfile(_:)), keyEquivalent: "")
let itemCustomize = NSMenuItem(title: L10n.Menu.ActiveProfile.Items.Customize.title, action: #selector(customizeProfile(_:)), keyEquivalent: "")
menu.insertItem(itemCustomize, at: i)
i += 1
itemCustomize.target = self
@ -317,7 +317,7 @@ class StatusMenu: NSObject {
let infrastructure = providerProfile.infrastructure
for category in infrastructure.categories {
let title = category.name.isEmpty ? L10n.Core.Global.Values.default : category.name.capitalized
let title = category.name.isEmpty ? L10n.Global.Values.default : category.name.capitalized
let submenu = NSMenu()
let itemCategory = NSMenuItem(title: title, action: nil, keyEquivalent: "")
itemCategory.indentationLevel = 1
@ -332,7 +332,7 @@ class StatusMenu: NSObject {
let submenuGroup = NSMenu()
for pool in group.pools {
let title = !pool.secondaryId.isEmpty ? pool.secondaryId : L10n.Core.Global.Values.default
let title = !pool.secondaryId.isEmpty ? pool.secondaryId : L10n.Global.Values.default
let item = NSMenuItem(title: title, action: #selector(connectToPool(_:)), keyEquivalent: "")
if let extraCountry = pool.extraCountries?.first {
item.image = extraCountry.image
@ -362,7 +362,7 @@ class StatusMenu: NSObject {
} else {
// account
let itemAccount = NSMenuItem(title: L10n.Core.Account.title.asContinuation, action: #selector(editAccountCredentials(_:)), keyEquivalent: "")
let itemAccount = NSMenuItem(title: L10n.Account.title.asContinuation, action: #selector(editAccountCredentials(_:)), keyEquivalent: "")
menu.insertItem(itemAccount, at: i)
i += 1
itemAccount.target = self
@ -370,7 +370,7 @@ class StatusMenu: NSObject {
itemsProfile.append(itemAccount)
// customize
let itemCustomize = NSMenuItem(title: L10n.Core.Menu.ActiveProfile.Items.Customize.title, action: #selector(customizeProfile(_:)), keyEquivalent: "")
let itemCustomize = NSMenuItem(title: L10n.Menu.ActiveProfile.Items.Customize.title, action: #selector(customizeProfile(_:)), keyEquivalent: "")
menu.insertItem(itemCustomize, at: i)
i += 1
itemCustomize.target = self
@ -542,14 +542,14 @@ class StatusMenu: NSObject {
}
@objc private func shareTwitter() {
NSWorkspace.shared.open(AppConstants.URLs.twitterIntent(withMessage: L10n.Core.Share.message))
NSWorkspace.shared.open(AppConstants.URLs.twitterIntent(withMessage: L10n.Share.message))
}
@objc private func shareGeneric() {
guard let source = statusItem.button else {
return
}
let message = "\(L10n.Core.Share.message) \(AppConstants.URLs.website)"
let message = "\(L10n.Share.message) \(AppConstants.URLs.website)"
let picker = NSSharingServicePicker(items: [message])
picker.show(relativeTo: source.bounds, of: source, preferredEdge: .minY)
}
@ -572,10 +572,10 @@ class StatusMenu: NSObject {
private func reloadVpnStatus() {
if vpn.isEnabled {
itemToggleVPN.title = L10n.Core.Service.Cells.Vpn.TurnOff.caption
itemToggleVPN.title = L10n.Service.Cells.Vpn.TurnOff.caption
itemToggleVPN.action = #selector(disableVPN)
} else {
itemToggleVPN.title = L10n.Core.Service.Cells.Vpn.TurnOn.caption
itemToggleVPN.title = L10n.Service.Cells.Vpn.TurnOn.caption
itemToggleVPN.action = #selector(enableVPN)
}
if let profile = service.activeProfile {

View File

@ -63,7 +63,7 @@ class OrganizerViewController: NSViewController {
tableProfiles.rightAnchor.constraint(equalTo: viewProfiles.rightAnchor),
])
buttonRemoveConfiguration.title = L10n.Core.Organizer.Cells.Uninstall.caption
buttonRemoveConfiguration.title = L10n.Organizer.Cells.Uninstall.caption
tableProfiles.selectionBlock = { [weak self] in
self?.serviceController?.setProfile($0)
@ -109,7 +109,7 @@ class OrganizerViewController: NSViewController {
}
private func alertMissingInfrastructure(forMetadata metadata: Infrastructure.Metadata, error: Error?) {
var message = L10n.Core.Wizards.Provider.Alerts.Unavailable.message
var message = L10n.Wizards.Provider.Alerts.Unavailable.message
if let error = error {
log.error("Unable to download missing \(metadata.description) infrastructure (network error): \(error.localizedDescription)")
message.append(" \(error.localizedDescription)")
@ -118,7 +118,7 @@ class OrganizerViewController: NSViewController {
}
let alert = Macros.warning(metadata.description, message)
_ = alert.presentModally(withOK: L10n.Core.Global.ok, cancel: nil)
_ = alert.presentModally(withOK: L10n.Global.ok, cancel: nil)
}
private func confirmAddProvider(withMetadata metadata: Infrastructure.Metadata) {
@ -128,7 +128,7 @@ class OrganizerViewController: NSViewController {
@objc private func addHost() {
let panel = NSOpenPanel()
panel.title = L10n.Core.Organizer.Alerts.OpenHostFile.title
panel.title = L10n.Organizer.Alerts.OpenHostFile.title
panel.allowsMultipleSelection = false
panel.canChooseDirectories = false
panel.canChooseFiles = true
@ -164,10 +164,10 @@ class OrganizerViewController: NSViewController {
// rename to existing title -> confirm overwrite existing
if let existingProfile = service.hostProfile(withTitle: newTitle) {
let alert = Macros.warning(
L10n.Core.Service.Alerts.Rename.title,
L10n.Core.Wizards.Host.Alerts.Existing.message
L10n.Service.Alerts.Rename.title,
L10n.Wizards.Host.Alerts.Existing.message
)
alert.present(in: view.window, withOK: L10n.Core.Global.ok, cancel: L10n.Core.Global.cancel, handler: {
alert.present(in: view.window, withOK: L10n.Global.ok, cancel: L10n.Global.cancel, handler: {
self.doReplaceProfile(profile, to: newTitle, existingProfile: existingProfile)
}, cancelHandler: nil)
return
@ -191,10 +191,10 @@ class OrganizerViewController: NSViewController {
@IBAction private func confirmVpnProfileDeletion(_ sender: Any?) {
let alert = Macros.warning(
L10n.Core.Organizer.Cells.Uninstall.caption,
L10n.Core.Organizer.Alerts.DeleteVpnProfile.message
L10n.Organizer.Cells.Uninstall.caption,
L10n.Organizer.Alerts.DeleteVpnProfile.message
)
alert.present(in: view.window, withOK: L10n.Core.Global.ok, cancel: L10n.Core.Global.cancel, handler: {
alert.present(in: view.window, withOK: L10n.Global.ok, cancel: L10n.Global.cancel, handler: {
VPN.shared.uninstall(completionHandler: nil)
}, cancelHandler: nil)
}
@ -219,9 +219,9 @@ class OrganizerViewController: NSViewController {
}
// rename host
vc.caption = L10n.Core.Service.Alerts.Rename.title.asCaption
vc.caption = L10n.Service.Alerts.Rename.title.asCaption
vc.text = service.screenTitle(forHostId: profile.id)
vc.placeholder = L10n.Core.Global.Host.TitleInput.placeholder
vc.placeholder = L10n.Global.Host.TitleInput.placeholder
vc.object = profile
vc.delegate = self
}
@ -312,7 +312,7 @@ extension OrganizerViewController: OrganizerProfileTableViewDelegate {
let menu = NSMenu()
let itemProvider = NSMenuItem(title: L10n.Core.Organizer.Menus.provider, action: nil, keyEquivalent: "")
let itemProvider = NSMenuItem(title: L10n.Organizer.Menus.provider, action: nil, keyEquivalent: "")
let menuProvider = NSMenu()
let availableMetadata = service.availableProviders()
if !availableMetadata.isEmpty {
@ -323,17 +323,17 @@ extension OrganizerViewController: OrganizerProfileTableViewDelegate {
menuProvider.addItem(item)
}
} else {
let item = NSMenuItem(title: L10n.Core.Organizer.Menus.Provider.unavailable, action: nil, keyEquivalent: "")
let item = NSMenuItem(title: L10n.Organizer.Menus.Provider.unavailable, action: nil, keyEquivalent: "")
item.isEnabled = false
menuProvider.addItem(item)
}
menuProvider.addItem(.separator())
let itemProviderUpdateList = NSMenuItem(title: L10n.Core.Wizards.Provider.Cells.UpdateList.caption, action: #selector(updateProvidersList), keyEquivalent: "")
let itemProviderUpdateList = NSMenuItem(title: L10n.Wizards.Provider.Cells.UpdateList.caption, action: #selector(updateProvidersList), keyEquivalent: "")
menuProvider.addItem(itemProviderUpdateList)
menu.setSubmenu(menuProvider, for: itemProvider)
menu.addItem(itemProvider)
let menuHost = NSMenuItem(title: L10n.Core.Organizer.Menus.host.asContinuation, action: #selector(addHost), keyEquivalent: "")
let menuHost = NSMenuItem(title: L10n.Organizer.Menus.host.asContinuation, action: #selector(addHost), keyEquivalent: "")
menu.addItem(menuHost)
NSMenu.popUpContextMenu(menu, with: event, for: sender)
@ -343,10 +343,10 @@ extension OrganizerViewController: OrganizerProfileTableViewDelegate {
profilePendingRemoval = profile
let alert = Macros.warning(
L10n.Core.Organizer.Alerts.RemoveProfile.title,
L10n.Core.Organizer.Alerts.RemoveProfile.message(service.screenTitle(ProfileKey(profile)))
L10n.Organizer.Alerts.RemoveProfile.title,
L10n.Organizer.Alerts.RemoveProfile.message(service.screenTitle(ProfileKey(profile)))
)
alert.present(in: view.window, withOK: L10n.Core.Global.ok, cancel: L10n.Core.Global.cancel, handler: {
alert.present(in: view.window, withOK: L10n.Global.ok, cancel: L10n.Global.cancel, handler: {
self.removePendingProfile()
}, cancelHandler: nil)
}

View File

@ -61,14 +61,14 @@ class DebugLogViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
title = L10n.Core.Service.Cells.DebugLog.caption
title = L10n.Service.Cells.DebugLog.caption
checkMasking.title = L10n.Core.Service.Cells.MasksPrivateData.caption
checkMasking.title = L10n.Service.Cells.MasksPrivateData.caption
checkMasking.state = (TransientStore.masksPrivateData ? .on : .off)
labelExchangedCaption.stringValue = L10n.Core.Service.Cells.DataCount.caption.asCaption
labelLog.stringValue = L10n.Core.Service.Cells.DebugLog.caption.asCaption
buttonCopy.title = L10n.Core.DebugLog.Buttons.copy
labelExchangedCaption.stringValue = L10n.Service.Cells.DataCount.caption.asCaption
labelLog.stringValue = L10n.Service.Cells.DebugLog.caption.asCaption
buttonCopy.title = L10n.DebugLog.Buttons.copy
buttonPrevious.image = NSImage(named: NSImage.touchBarRewindTemplateName)
buttonNext.image = NSImage(named: NSImage.touchBarFastForwardTemplateName)
buttonShare.image = NSImage(named: NSImage.shareTemplateName)
@ -93,10 +93,10 @@ class DebugLogViewController: NSViewController {
guard vpn.status == .disconnected else {
let alert = Macros.warning(
L10n.Core.Service.Cells.MasksPrivateData.caption,
L10n.Core.Service.Alerts.MasksPrivateData.Messages.mustReconnect
L10n.Service.Cells.MasksPrivateData.caption,
L10n.Service.Alerts.MasksPrivateData.Messages.mustReconnect
)
alert.present(in: view.window, withOK: L10n.Core.Service.Alerts.Buttons.reconnect, cancel: L10n.Core.Global.cancel, handler: {
alert.present(in: view.window, withOK: L10n.Service.Alerts.Buttons.reconnect, cancel: L10n.Global.cancel, handler: {
handler()
self.shouldDeleteLogOnDisconnection = true
@ -132,10 +132,10 @@ class DebugLogViewController: NSViewController {
let text = logLines.joined(separator: "\n")
guard !text.isEmpty else {
let alert = Macros.warning(
L10n.Core.Service.Cells.DebugLog.caption,
L10n.Core.DebugLog.Alerts.EmptyLog.message
L10n.Service.Cells.DebugLog.caption,
L10n.DebugLog.Alerts.EmptyLog.message
)
alert.present(in: view.window, withOK: L10n.Core.Global.ok, handler: nil)
alert.present(in: view.window, withOK: L10n.Global.ok, handler: nil)
return
}
let log = DebugLog(raw: text)
@ -249,7 +249,7 @@ class DebugLogViewController: NSViewController {
let up = count.1.dataUnitDescription
labelExchanged.stringValue = "\(down) / ↑\(up)"
} else {
labelExchanged.stringValue = L10n.Core.Service.Cells.DataCount.none
labelExchanged.stringValue = L10n.Service.Cells.DataCount.none
}
}
}

View File

@ -45,12 +45,12 @@ class PreferencesGeneralViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
checkLaunchOnLogin.title = L10n.Core.Preferences.Cells.LaunchesOnLogin.caption
labelLaunchOnLogin.stringValue = L10n.Core.Preferences.Cells.LaunchesOnLogin.footer
checkConfirmQuit.title = L10n.Core.Preferences.Cells.ConfirmQuit.caption
labelConfirmQuit.stringValue = L10n.Core.Preferences.Cells.ConfirmQuit.footer
checkResolveHostname.title = L10n.Core.Service.Cells.VpnResolvesHostname.caption
labelResolveHostname.stringValue = L10n.Core.Service.Sections.VpnResolvesHostname.footer
checkLaunchOnLogin.title = L10n.Preferences.Cells.LaunchesOnLogin.caption
labelLaunchOnLogin.stringValue = L10n.Preferences.Cells.LaunchesOnLogin.footer
checkConfirmQuit.title = L10n.Preferences.Cells.ConfirmQuit.caption
labelConfirmQuit.stringValue = L10n.Preferences.Cells.ConfirmQuit.footer
checkResolveHostname.title = L10n.Service.Cells.VpnResolvesHostname.caption
labelResolveHostname.stringValue = L10n.Service.Sections.VpnResolvesHostname.footer
checkLaunchOnLogin.state = (service.preferences.launchesOnLogin ?? true) ? .on : .off
checkConfirmQuit.state = (service.preferences.confirmsQuit ?? true) ? .on : .off

View File

@ -33,8 +33,8 @@ class PreferencesViewController: NSViewController {
super.viewDidLoad()
let labels = [
L10n.Core.Preferences.Sections.General.header,
L10n.Core.Service.Sections.Diagnostics.header
L10n.Preferences.Sections.General.header,
L10n.Service.Sections.Diagnostics.header
]
tabView.tabViewItems.enumerated().forEach {
$1.label = labels[$0]

View File

@ -100,11 +100,11 @@ class PurchaseViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
title = L10n.Core.Purchase.title
labelFooter.stringValue = L10n.Core.Purchase.Sections.Products.footer
labelRestore.stringValue = L10n.Core.Purchase.Cells.Restore.description
buttonPurchase.title = L10n.Core.Purchase.title
buttonRestore.title = L10n.Core.Purchase.Cells.Restore.title
title = L10n.Purchase.title
labelFooter.stringValue = L10n.Purchase.Sections.Products.footer
labelRestore.stringValue = L10n.Purchase.Cells.Restore.description
buttonPurchase.title = L10n.Purchase.title
buttonRestore.title = L10n.Purchase.Cells.Restore.title
tableView.usesAutomaticRowHeights = true
tableView.reloadData()
@ -202,7 +202,7 @@ class PurchaseViewController: NSViewController {
log.error("Unable to purchase \(product): \(error)")
let alert = Macros.warning(product.localizedTitle, error.localizedDescription)
_ = alert.presentModally(withOK: L10n.Core.Global.ok, cancel: nil)
_ = alert.presentModally(withOK: L10n.Global.ok, cancel: nil)
}
@objc private func close() {

View File

@ -63,17 +63,17 @@ class AccountViewController: NSViewController {
assert(profile != nil, "Profile not set")
labelUsernameCaption.stringValue = L10n.Core.Account.Cells.Username.caption.asCaption
labelUsernameCaption.stringValue = L10n.Account.Cells.Username.caption.asCaption
if let providerProfile = profile as? ProviderConnectionProfile {
textUsername.placeholderString = providerProfile.infrastructure.defaults.username
} else {
textUsername.placeholderString = L10n.Core.Account.Cells.Username.placeholder
textUsername.placeholderString = L10n.Account.Cells.Username.placeholder
}
labelPasswordCaption.stringValue = L10n.Core.Account.Cells.Password.caption.asCaption
textPassword.placeholderString = L10n.Core.Account.Cells.Password.placeholder
buttonGuidance.title = L10n.Core.Account.Cells.OpenGuide.caption
buttonOK.title = L10n.Core.Global.ok
buttonCancel.title = L10n.Core.Global.cancel
labelPasswordCaption.stringValue = L10n.Account.Cells.Password.caption.asCaption
textPassword.placeholderString = L10n.Account.Cells.Password.placeholder
buttonGuidance.title = L10n.Account.Cells.OpenGuide.caption
buttonOK.title = L10n.Global.ok
buttonCancel.title = L10n.Global.cancel
let credentials = service.credentials(for: profile)
textUsername.stringValue = credentials?.username ?? ""

View File

@ -94,14 +94,14 @@ class ConfigurationViewController: NSViewController, ProfileCustomization {
override func viewDidLoad() {
super.viewDidLoad()
labelPresetCaption.stringValue = L10n.Core.Service.Cells.Provider.Preset.caption.asCaption
labelPresetCaption.stringValue = L10n.Service.Cells.Provider.Preset.caption.asCaption
popupPreset.removeAllItems()
if !allPresets.isEmpty {
for preset in allPresets {
popupPreset.addItem(withTitle: preset.name)
}
} else {
popupPreset.addItem(withTitle: L10n.Core.Global.Values.default)
popupPreset.addItem(withTitle: L10n.Global.Values.default)
popupPreset.isEnabled = false
}
@ -194,7 +194,7 @@ extension ConfigurationViewController: NSTableViewDataSource, NSTableViewDelegat
}
func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? {
let V = L10n.Core.Configuration.Cells.self
let V = L10n.Configuration.Cells.self
let rowObject = rows[row]
switch tableColumn?.identifier {

View File

@ -65,9 +65,9 @@ class DNSViewController: NSViewController, ProfileCustomization {
override func viewDidLoad() {
super.viewDidLoad()
labelDNSProtocol.stringValue = L10n.Core.Global.Captions.protocol.asCaption
labelDNSProtocol.stringValue = L10n.Global.Captions.protocol.asCaption
tableDNSAddresses.title = L10n.Core.NetworkSettings.Dns.Cells.Addresses.title.asCaption
tableDNSAddresses.title = L10n.NetworkSettings.Dns.Cells.Addresses.title.asCaption
viewDNSAddresses.addSubview(tableDNSAddresses)
tableDNSAddresses.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
@ -77,7 +77,7 @@ class DNSViewController: NSViewController, ProfileCustomization {
tableDNSAddresses.rightAnchor.constraint(equalTo: viewDNSAddresses.rightAnchor),
])
tableDNSDomains.title = L10n.Core.NetworkSettings.Dns.Cells.Domains.title.asCaption
tableDNSDomains.title = L10n.NetworkSettings.Dns.Cells.Domains.title.asCaption
viewDNSDomains.addSubview(tableDNSDomains)
tableDNSDomains.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([

View File

@ -52,8 +52,8 @@ class EndpointViewController: NSViewController, ProfileCustomization {
override func viewDidLoad() {
super.viewDidLoad()
labelAddressCaption.stringValue = L10n.Core.Endpoint.Cells.address.asCaption
labelProtocolCaption.stringValue = L10n.Core.Global.Captions.protocol.asCaption
labelAddressCaption.stringValue = L10n.Endpoint.Cells.address.asCaption
labelProtocolCaption.stringValue = L10n.Global.Captions.protocol.asCaption
reloadEndpoints()
}
@ -75,8 +75,8 @@ class EndpointViewController: NSViewController, ProfileCustomization {
}
if dataSource.canCustomizeEndpoint {
popupAddress.insertItem(withTitle: L10n.Core.Endpoint.Cells.AnyAddress.caption, at: 0)
popupProtocol.insertItem(withTitle: L10n.Core.Endpoint.Cells.AnyProtocol.caption, at: 0)
popupAddress.insertItem(withTitle: L10n.Endpoint.Cells.AnyAddress.caption, at: 0)
popupProtocol.insertItem(withTitle: L10n.Endpoint.Cells.AnyProtocol.caption, at: 0)
if dataSource.customAddress == nil {
popupAddress.selectItem(at: 0)

View File

@ -64,10 +64,10 @@ class MTUViewController: NSViewController, ProfileCustomization {
popupChoice.selectItem(at: popupChoice.numberOfItems - 1)
}
}
labelMTUCaption.stringValue = L10n.Core.NetworkSettings.Mtu.Cells.Bytes.caption.asCaption
labelMTUCaption.stringValue = L10n.NetworkSettings.Mtu.Cells.Bytes.caption.asCaption
popupMTU.removeAllItems()
for opt in ProfileNetworkSettings.mtuOptions {
popupMTU.addItem(withTitle: (opt != 0) ? opt.description : L10n.Core.Global.Values.default)
popupMTU.addItem(withTitle: (opt != 0) ? opt.description : L10n.Global.Values.default)
}
loadSettings(from: currentChoice ?? ProfileNetworkChoices.defaultChoice)
}
@ -115,7 +115,7 @@ class MTUViewController: NSViewController, ProfileCustomization {
popupMTU.isEnabled = (currentChoice == .manual)
for (i, opt) in popupMTU.itemTitles.enumerated() {
if opt == L10n.Core.Global.Values.default {
if opt == L10n.Global.Values.default {
if bytes == nil {
popupMTU.selectItem(at: i)
break

View File

@ -89,8 +89,8 @@ class ProfileCustomizationContainerViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
buttonOK.title = L10n.Core.Global.ok
buttonCancel.title = L10n.Core.Global.cancel
buttonOK.title = L10n.Global.ok
buttonCancel.title = L10n.Global.cancel
pendingAddress = (profile as? ProviderConnectionProfile)?.customAddress
pendingProtocol = (profile as? ProviderConnectionProfile)?.customProtocol
@ -153,12 +153,12 @@ class ProfileCustomizationContainerViewController: NSViewController {
switch vpn.status {
case .connected, .connecting:
let alert = Macros.warning(
L10n.Core.Configuration.title,
L10n.Core.Configuration.Alerts.Commit.message
L10n.Configuration.title,
L10n.Configuration.Alerts.Commit.message
)
if alert.presentModally(
withOK: L10n.Core.Configuration.Alerts.Commit.Buttons.reconnect,
cancel: L10n.Core.Configuration.Alerts.Commit.Buttons.skip) {
withOK: L10n.Configuration.Alerts.Commit.Buttons.reconnect,
cancel: L10n.Configuration.Alerts.Commit.Buttons.skip) {
vpn.reconnect(completionHandler: nil)
} else {
@ -258,12 +258,12 @@ class ProfileCustomizationViewController: NSTabViewController {
let expectedTabs = 7
assert(tabViewItems.count == expectedTabs, "Customization tabs misconfigured (expected \(expectedTabs))")
tabViewItems[0].label = L10n.Core.Endpoint.title
tabViewItems[1].label = L10n.Core.Configuration.title
tabViewItems[2].label = L10n.Core.Service.Sections.Trusted.header
tabViewItems[3].label = L10n.Core.NetworkSettings.Gateway.title
tabViewItems[4].label = L10n.Core.NetworkSettings.Dns.title
tabViewItems[5].label = L10n.Core.NetworkSettings.Proxy.title
tabViewItems[6].label = L10n.Core.NetworkSettings.Mtu.title
tabViewItems[0].label = L10n.Endpoint.title
tabViewItems[1].label = L10n.Configuration.title
tabViewItems[2].label = L10n.Service.Sections.Trusted.header
tabViewItems[3].label = L10n.NetworkSettings.Gateway.title
tabViewItems[4].label = L10n.NetworkSettings.Dns.title
tabViewItems[5].label = L10n.NetworkSettings.Proxy.title
tabViewItems[6].label = L10n.NetworkSettings.Mtu.title
}
}

View File

@ -70,13 +70,13 @@ class ProxyViewController: NSViewController, ProfileCustomization {
override func viewDidLoad() {
super.viewDidLoad()
labelProxyCaption.stringValue = L10n.Core.Global.Captions.address.asCaption
textProxyAddress.placeholderString = L10n.Core.Global.Values.none
textProxyPort.placeholderString = L10n.Core.Global.Values.none
labelProxyCaption.stringValue = L10n.Global.Captions.address.asCaption
textProxyAddress.placeholderString = L10n.Global.Values.none
textProxyPort.placeholderString = L10n.Global.Values.none
labelPACCaption.stringValue = "PAC".asCaption
textPAC.placeholderString = L10n.Core.Global.Values.none
textPAC.placeholderString = L10n.Global.Values.none
tableProxyBypass.title = L10n.Core.NetworkSettings.Proxy.Cells.BypassDomains.title.asCaption
tableProxyBypass.title = L10n.NetworkSettings.Proxy.Cells.BypassDomains.title.asCaption
viewProxyBypass.addSubview(tableProxyBypass)
tableProxyBypass.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([

View File

@ -42,8 +42,8 @@ class TrustedNetworksAddViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
buttonOK.title = L10n.Core.Global.ok
buttonCancel.title = L10n.Core.Global.cancel
buttonOK.title = L10n.Global.ok
buttonCancel.title = L10n.Global.cancel
textSSID.stringValue = Utils.currentWifiNetworkName() ?? ""
}

View File

@ -64,13 +64,13 @@ class TrustedNetworksViewController: NSViewController, ProfileCustomization {
override func viewDidLoad() {
super.viewDidLoad()
labelTitle.stringValue = L10n.Core.Service.Sections.Trusted.header.asCaption
labelTitle.stringValue = L10n.Service.Sections.Trusted.header.asCaption
buttonAdd.image = NSImage(named: NSImage.addTemplateName)
buttonRemove.image = NSImage(named: NSImage.removeTemplateName)
checkTrustEthernet.title = L10n.Core.Trusted.Ethernet.title
labelTrustEthernetDescription.stringValue = L10n.Core.Trusted.Ethernet.description
checkDisableConnection.title = L10n.Core.Service.Cells.TrustedPolicy.caption
labelDisableConnectionDescription.stringValue = L10n.Core.Service.Sections.Trusted.footer
checkTrustEthernet.title = L10n.Trusted.Ethernet.title
labelTrustEthernetDescription.stringValue = L10n.Trusted.Ethernet.description
checkDisableConnection.title = L10n.Service.Cells.TrustedPolicy.caption
labelDisableConnectionDescription.stringValue = L10n.Service.Sections.Trusted.footer
checkTrustEthernet.state = trustedNetworks.includesEthernet ? .on : .off
checkDisableConnection.state = (trustedNetworks.policy == .disconnect) ? .on : .off
@ -86,7 +86,7 @@ class TrustedNetworksViewController: NSViewController, ProfileCustomization {
column.isEditable = false
case Columns.trust:
column.title = L10n.Core.Trusted.Columns.Trust.title
column.title = L10n.Trusted.Columns.Trust.title
default:
break
@ -218,10 +218,10 @@ extension TrustedNetworksViewController: TrustedNetworksUIDelegate {
func trustedNetworksShouldConfirmDisconnection(_: TrustedNetworksUI, triggeredAt rowIndex: Int, completionHandler: @escaping () -> Void) {
let alert = Macros.warning(
L10n.Core.Service.Sections.Trusted.header,
L10n.Core.Service.Alerts.Trusted.WillDisconnectTrusted.message
L10n.Service.Sections.Trusted.header,
L10n.Service.Alerts.Trusted.WillDisconnectTrusted.message
)
alert.present(in: view.window, withOK: L10n.Core.Global.ok, cancel: L10n.Core.Global.cancel, handler: completionHandler, cancelHandler: nil)
alert.present(in: view.window, withOK: L10n.Global.ok, cancel: L10n.Global.cancel, handler: completionHandler, cancelHandler: nil)
}
func trustedNetworks(_: TrustedNetworksUI, shouldInsertWifiAt rowIndex: Int) {

View File

@ -50,7 +50,7 @@ class HostServiceView: NSView {
override func viewWillMove(toSuperview newSuperview: NSView?) {
super.viewWillMove(toSuperview: newSuperview)
labelAddressesCaption.stringValue = L10n.Core.Service.Cells.Addresses.caption.asCaption
labelAddressesCaption.stringValue = L10n.Service.Cells.Addresses.caption.asCaption
}
func reloadData() {

View File

@ -95,9 +95,9 @@ class ProviderServiceView: NSView {
override func viewWillMove(toSuperview newSuperview: NSView?) {
super.viewWillMove(toSuperview: newSuperview)
labelCategoryCaption.stringValue = L10n.Core.Service.Cells.Category.caption.asCaption
labelLocationCaption.stringValue = L10n.Core.Service.Cells.Provider.Pool.caption.asCaption
checkOnlyShowsFavorites.title = L10n.Core.Service.Cells.OnlyShowsFavorites.caption
labelCategoryCaption.stringValue = L10n.Service.Cells.Category.caption.asCaption
labelLocationCaption.stringValue = L10n.Service.Cells.Provider.Pool.caption.asCaption
checkOnlyShowsFavorites.title = L10n.Service.Cells.OnlyShowsFavorites.caption
checkOnlyShowsFavorites.state = .off
buttonRefreshInfrastructure.image = NSImage(named: NSImage.refreshTemplateName)
buttonFavorite.image = NSImage(named: NSImage.bookmarksTemplateName)
@ -180,7 +180,7 @@ class ProviderServiceView: NSView {
let menu = NSMenu()
categories.forEach { category in
let item = NSMenuItem()
item.title = !category.name.isEmpty ? category.name.capitalized : L10n.Core.Global.Values.default
item.title = !category.name.isEmpty ? category.name.capitalized : L10n.Global.Values.default
item.representedObject = category
menu.addItem(item)
@ -202,7 +202,7 @@ class ProviderServiceView: NSView {
}
if let lastInfrastructureUpdate = InfrastructureFactory.shared.modificationDate(forName: profile.name) {
labelLastInfrastructureUpdate.stringValue = L10n.Core.Service.Sections.ProviderInfrastructure.footer(lastInfrastructureUpdate.timestamp)
labelLastInfrastructureUpdate.stringValue = L10n.Service.Sections.ProviderInfrastructure.footer(lastInfrastructureUpdate.timestamp)
}
checkOnlyShowsFavorites.isEnabled = !(profile.favoriteGroupIds?.isEmpty ?? true)
@ -257,7 +257,7 @@ class ProviderServiceView: NSView {
guard !$0.secondaryId.isEmpty || pools.count > 1 else {
return
}
let title = !$0.secondaryId.isEmpty ? $0.secondaryId : L10n.Core.Global.Values.default
let title = !$0.secondaryId.isEmpty ? $0.secondaryId : L10n.Global.Values.default
let item = NSMenuItem(title: title, action: nil, keyEquivalent: "")
if let extraCountry = $0.extraCountries?.first {
item.image = extraCountry.image

View File

@ -150,14 +150,14 @@ class ServiceViewController: NSViewController {
// enforce on macOS
service.preferences.disconnectsOnSleep = true
labelWelcome.stringValue = L10n.Core.Service.Welcome.message
labelStatusCaption.stringValue = L10n.Core.Service.Cells.ConnectionStatus.caption.asCaption
labelServiceDescription.stringValue = L10n.Core.Service.Sections.Vpn.footer
buttonUse.title = L10n.Core.Service.Cells.UseProfile.caption
buttonToggle.title = L10n.Core.Service.Cells.Vpn.TurnOn.caption
buttonReconnect.title = L10n.Core.Service.Cells.Reconnect.caption
labelWelcome.stringValue = L10n.Service.Welcome.message
labelStatusCaption.stringValue = L10n.Service.Cells.ConnectionStatus.caption.asCaption
labelServiceDescription.stringValue = L10n.Service.Sections.Vpn.footer
buttonUse.title = L10n.Service.Cells.UseProfile.caption
buttonToggle.title = L10n.Service.Cells.Vpn.TurnOn.caption
buttonReconnect.title = L10n.Service.Cells.Reconnect.caption
buttonCustomize.image = NSImage(named: NSImage.actionTemplateName)
buttonAccount.title = L10n.Core.Account.title.asContinuation
buttonAccount.title = L10n.Account.title.asContinuation
let nc = NotificationCenter.default
nc.addObserver(self, selector: #selector(vpnDidUpdate), name: VPN.didChangeStatus, object: nil)
@ -216,13 +216,13 @@ class ServiceViewController: NSViewController {
// }
//// guard vpn.status == .disconnected else {
//// let alert = Macros.alert(
//// L10n.Core.Service.Cells.ConnectionStatus.caption,
//// L10n.Core.Service.Alerts.ReconnectVpn.message
//// L10n.Service.Cells.ConnectionStatus.caption,
//// L10n.Service.Alerts.ReconnectVpn.message
//// )
//// alert.addDefaultAction(L10n.Core.Global.ok) {
//// alert.addDefaultAction(L10n.Global.ok) {
//// self.vpn.reconnect(configuration: self.currentVpnConfiguration(), completionHandler: nil)
//// }
//// alert.addCancelAction(L10n.Core.Global.cancel)
//// alert.addCancelAction(L10n.Global.cancel)
//// present(alert, animated: true, completion: nil)
//// return
//// }
@ -276,14 +276,14 @@ class ServiceViewController: NSViewController {
guard isActive && vpn.isEnabled else {
labelStatus.applyVPN(Theme.current, isActive: isActive, with: nil, error: nil)
activityVPN.stopAnimation(nil)
buttonToggle.title = L10n.Core.Service.Cells.Vpn.TurnOn.caption
buttonToggle.title = L10n.Service.Cells.Vpn.TurnOn.caption
buttonToggle.isEnabled = true
buttonReconnect.isEnabled = false
return
}
labelStatus.applyVPN(Theme.current, isActive: isActive, with: vpn.status, error: service.vpnLastError)
buttonToggle.title = vpn.isEnabled ? L10n.Core.Service.Cells.Vpn.TurnOff.caption : L10n.Core.Service.Cells.Vpn.TurnOn.caption
buttonToggle.title = vpn.isEnabled ? L10n.Service.Cells.Vpn.TurnOff.caption : L10n.Service.Cells.Vpn.TurnOn.caption
buttonReconnect.isEnabled = true
// append connected location for providers

View File

@ -1,77 +0,0 @@
//
// App.strings
// Passepartout
//
// Created by Davide De Rosa on 6/21/19.
// Copyright (c) 2021 Davide De Rosa. All rights reserved.
//
// https://github.com/passepartoutvpn
//
// This file is part of Passepartout.
//
// Passepartout is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Passepartout is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Passepartout. If not, see <http://www.gnu.org/licenses/>.
//
"vpn.unused" = "Aus";
"organizer.title" = "%@";
"organizer.menus.provider" = "Anbieter";
"organizer.menus.provider.unavailable" = "Keine Anbieter übrig";
"organizer.menus.host" = "Host";
"organizer.alerts.remove_profile.title" = "Profil entfernen";
"organizer.alerts.remove_profile.message" = "Bist du sicher, dass du das Profil %@ löschen möchtest?";
"organizer.alerts.open_host_file.title" = "Wähle eine .ovpn-Datei.";
"service.cells.vpn.turn_on.caption" = "Aktiviere VPN";
"service.cells.vpn.turn_off.caption" = "Deaktiviere VPN";
"service.cells.category.caption" = "Kategorie";
"service.cells.addresses.caption" = "Adressen";
"service.cells.only_shows_favorites.caption" = "Nur favorisierte Standorte anzeigen";
"endpoint.cells.address" = "Adresse";
"endpoint.cells.protocol" = "Protokoll";
"configuration.title" = "Konfiguration";
"configuration.alerts.commit.message" = "Neue Parameter werden erst nach einer manuellen Wiederherstellung der Verbindung wirksam. Änderungen in vertrauenswürdigen Netzwerken werden sofort wirksam.";
"configuration.alerts.commit.buttons.reconnect" = "Jetzt erneut verbinden";
"configuration.alerts.commit.buttons.skip" = "Überspringen";
"network_settings.dns.cells.addresses.title" = "Server";
"network_settings.dns.cells.domains.title" = "Domänen";
"network_settings.proxy.cells.bypass_domains.title" = "Domänen umgehen";
"preferences.title" = "Einstellungen";
"preferences.sections.general.header" = "Allgemein";
"preferences.cells.launches_on_login.caption" = "Bei Anmeldung starten";
"preferences.cells.launches_on_login.footer" = "Hier ein Häkchen setzen, um die App beim Systemstart oder der Anmeldung automatisch zu starten.";
"preferences.cells.confirm_quit.caption" = "Beenden bestätigen";
"preferences.cells.confirm_quit.footer" = "Hier ein Häkchen setzen, um einen Hinweis zur Bestätigung des Beendens anzuzeigen.";
"debug_log.buttons.copy" = "Kopieren";
"trusted.columns.trust.title" = "Vertrauen";
"trusted.ethernet.title" = "Kabelverbindungen vertrauen";
"trusted.ethernet.description" = "Hier ein Häkchen setzen, um jeder Kabelverbindung zu vertrauen.";
"menu.show.title" = "Anzeigen";
"menu.switch_profile.title" = "Aktives Profil";
"menu.active_profile.title.none" = "Keine aktiven Profile";
"menu.active_profile.items.customize.title" = "Anpassen...";
"menu.active_profile.messages.missing_credentials" = "Es wurde keine Konto konfiguriert";
"menu.organizer.title" = "Organizer";
"menu.preferences.title" = "Einstellungen";
"menu.support.title" = "Support";
"menu.quit.title" = "%@ beenden";
"menu.quit.messages.confirm" = "Wenn das VPN aktiviert wurde, läuft es weiter im Hintergrund. Möchtest du beenden?";

View File

@ -1,77 +0,0 @@
//
// App.strings
// Passepartout
//
// Created by Davide De Rosa on 6/21/19.
// Copyright (c) 2021 Davide De Rosa. All rights reserved.
//
// https://github.com/passepartoutvpn
//
// This file is part of Passepartout.
//
// Passepartout is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Passepartout is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Passepartout. If not, see <http://www.gnu.org/licenses/>.
//
"vpn.unused" = "Ανενεργό";
"organizer.title" = "%@";
"organizer.menus.provider" = "Πάροχος";
"organizer.menus.provider.unavailable" = "Δεν απομένουν πάροχοι";
"organizer.menus.host" = "Εξυπηρετητής";
"organizer.alerts.remove_profile.title" = "Κατάργηση προφίλ";
"organizer.alerts.remove_profile.message" = "Είστε βέβαιοι ότι θέλετε να διαγράψετε το προφίλ %@;";
"organizer.alerts.open_host_file.title" = "Επιλέξτε ένα αρχείο .ovpn";
"service.cells.vpn.turn_on.caption" = "Ενεργοποίηση VPN";
"service.cells.vpn.turn_off.caption" = "Απενεργοποίηση VPN";
"service.cells.category.caption" = "Κατηγορία";
"service.cells.addresses.caption" = "Διευθύνσεις";
"service.cells.only_shows_favorites.caption" = "Προβολή αγαπημένων τοποθεσιών μόνο";
"endpoint.cells.address" = "Διεύθυνση";
"endpoint.cells.protocol" = "Πρωτόκολλο";
"configuration.title" = "Ρύθμιση";
"configuration.alerts.commit.message" = "Οι νέες παράμετροι δεν θα είναι αποτελεσματικές έως ότου επανασυνδεθείτε χειροκίνητα. Οι αλλαγές στα αξιόπιστα δίκτυα θα εφαρμοστούν αμέσως.";
"configuration.alerts.commit.buttons.reconnect" = "Επανασυνδεθείτε τώρα";
"configuration.alerts.commit.buttons.skip" = "Παράλειψη";
"network_settings.dns.cells.addresses.title" = "Διακομιστές";
"network_settings.dns.cells.domains.title" = "Τομείς";
"network_settings.proxy.cells.bypass_domains.title" = "Παράκαμψη τομέων";
"preferences.title" = "Προτιμήσεις";
"preferences.sections.general.header" = "Γενικός";
"preferences.cells.launches_on_login.caption" = "Εκκίνηση κατά τη σύνδεση";
"preferences.cells.launches_on_login.footer" = "Επιλέξτε για αυτόματη εκκίνηση της εφαρμογής κατά την εκκίνηση ή τη σύνδεση.";
"preferences.cells.confirm_quit.caption" = "Επιβεβαίωση διακοπής";
"preferences.cells.confirm_quit.footer" = "Επιλέξτε για παρουσίαση ειδοποίησης ότι επιβεβαιώνεται η διακοπή.";
"debug_log.buttons.copy" = "Αντιγραφή";
"trusted.columns.trust.title" = "Εμπιστευθείτε";
"trusted.ethernet.title" = "Εμπιστευθείτε τις ενσύρματες συνδέσεις";
"trusted.ethernet.description" = "Επιλέξτε για να εμπιστευθείτε οποιαδήποτε ενσύρματη σύνδεση καλωδίου.";
"menu.show.title" = "Προβολή";
"menu.switch_profile.title" = "Ενεργό προφίλ";
"menu.active_profile.title.none" = "Δεν υπάρχει ενεργό προφίλ";
"menu.active_profile.items.customize.title" = "Προσαρμογή...";
"menu.active_profile.messages.missing_credentials" = "Δεν έχει διαμορφωθεί λογαριασμός";
"menu.organizer.title" = "Διοργανωτής";
"menu.preferences.title" = "Προτιμήσεις";
"menu.support.title" = "Υποστήριξη";
"menu.quit.title" = "Διακοπή %@";
"menu.quit.messages.confirm" = "Το VPN, αν είναι ενεργοποιημένο, θα εξακολουθεί να εκτελείται στο παρασκήνιο. Θέλετε να το διακόψετε;";

View File

@ -1,24 +0,0 @@
//
// App.strings
// Passepartout
//
// Created by Davide De Rosa on 6/21/19.
// Copyright (c) 2021 Davide De Rosa. All rights reserved.
//
// https://github.com/passepartoutvpn
//
// This file is part of Passepartout.
//
// Passepartout is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Passepartout is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Passepartout. If not, see <http://www.gnu.org/licenses/>.
//

View File

@ -1,77 +0,0 @@
//
// App.strings
// Passepartout
//
// Created by Davide De Rosa on 6/21/19.
// Copyright (c) 2021 Davide De Rosa. All rights reserved.
//
// https://github.com/passepartoutvpn
//
// This file is part of Passepartout.
//
// Passepartout is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Passepartout is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Passepartout. If not, see <http://www.gnu.org/licenses/>.
//
"vpn.unused" = "Desactivada";
"organizer.title" = "%@";
"organizer.menus.provider" = "Proveedor";
"organizer.menus.provider.unavailable" = "No quedan proveedores";
"organizer.menus.host" = "Host";
"organizer.alerts.remove_profile.title" = "Quitar perfil";
"organizer.alerts.remove_profile.message" = "¿Seguro que deseas eliminar el perfil %@?";
"organizer.alerts.open_host_file.title" = "Selecciona un archivo .ovpn";
"service.cells.vpn.turn_on.caption" = "Habilitar VPN";
"service.cells.vpn.turn_off.caption" = "Deshabilitar VPN";
"service.cells.category.caption" = "Categoría";
"service.cells.addresses.caption" = "Direcciones";
"service.cells.only_shows_favorites.caption" = "Mostrar solo ubicaciones favoritas";
"endpoint.cells.address" = "Dirección";
"endpoint.cells.protocol" = "Protocolo";
"configuration.title" = "Configuración";
"configuration.alerts.commit.message" = "Los nuevos parámetros no serán efectivos hasta que te reconectes manualmente. Los cambios en las redes de confianza se aplicarán de inmediato.";
"configuration.alerts.commit.buttons.reconnect" = "Reconectar ahora";
"configuration.alerts.commit.buttons.skip" = "Omitir";
"network_settings.dns.cells.addresses.title" = "Servidores";
"network_settings.dns.cells.domains.title" = "Dominios";
"network_settings.proxy.cells.bypass_domains.title" = "Dominios ignorados";
"preferences.title" = "Preferencias";
"preferences.sections.general.header" = "General";
"preferences.cells.launches_on_login.caption" = "Iniciar al iniciar sesión";
"preferences.cells.launches_on_login.footer" = "Activa esta opción para que la aplicación se inicie automáticamente al iniciar o al iniciar sesión.";
"preferences.cells.confirm_quit.caption" = "Confirmar salir";
"preferences.cells.confirm_quit.footer" = "Activa esta opción para que se muestre una alerta de confirmación al salir.";
"debug_log.buttons.copy" = "Copiar";
"trusted.columns.trust.title" = "Confianza";
"trusted.ethernet.title" = "Confiar en conexiones cableadas";
"trusted.ethernet.description" = "Activa esta opción para confiar en cualquier conexión cableada.";
"menu.show.title" = "Mostrar";
"menu.switch_profile.title" = "Perfil activo";
"menu.active_profile.title.none" = "Ningún perfil activo";
"menu.active_profile.items.customize.title" = "Personalizar...";
"menu.active_profile.messages.missing_credentials" = "Ninguna cuenta configurada";
"menu.organizer.title" = "Organizador";
"menu.preferences.title" = "Preferencias";
"menu.support.title" = "Soporte";
"menu.quit.title" = "Salir de %@";
"menu.quit.messages.confirm" = "Si la VPN está habilitada, seguirá funcionando en segundo plano. ¿Deseas salir?";

View File

@ -1,77 +0,0 @@
//
// App.strings
// Passepartout
//
// Created by Davide De Rosa on 6/21/19.
// Copyright (c) 2021 Davide De Rosa. All rights reserved.
//
// https://github.com/passepartoutvpn
//
// This file is part of Passepartout.
//
// Passepartout is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Passepartout is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Passepartout. If not, see <http://www.gnu.org/licenses/>.
//
"vpn.unused" = "Désactivé";
"organizer.title" = "%@";
"organizer.menus.provider" = "Fournisseur";
"organizer.menus.provider.unavailable" = "Aucun fournisseur restant";
"organizer.menus.host" = "Hôte";
"organizer.alerts.remove_profile.title" = "Supprimer le profil";
"organizer.alerts.remove_profile.message" = "Voulez-vous vraiment supprimer le profil %@ ?";
"organizer.alerts.open_host_file.title" = "Sélectionnez un fichier .ovpn";
"service.cells.vpn.turn_on.caption" = "Activer VPN";
"service.cells.vpn.turn_off.caption" = "Désactiver VPN";
"service.cells.category.caption" = "Catégorie";
"service.cells.addresses.caption" = "Adresses";
"service.cells.only_shows_favorites.caption" = "Afficher uniquement les emplacements favoris";
"endpoint.cells.address" = "Adresse";
"endpoint.cells.protocol" = "Protocole";
"configuration.title" = "Configuration";
"configuration.alerts.commit.message" = "Vous devez vous reconnecter manuellement pour confirmer les nouveaux paramètres. Les modifications apportées sur les réseaux de confiance seront immédiatement mises en place.";
"configuration.alerts.commit.buttons.reconnect" = "Se reconnecter";
"configuration.alerts.commit.buttons.skip" = "Passer";
"network_settings.dns.cells.addresses.title" = "Serveurs";
"network_settings.dns.cells.domains.title" = "Domaines";
"network_settings.proxy.cells.bypass_domains.title" = "Outrepasser le domaine";
"preferences.title" = "Préférences";
"preferences.sections.general.header" = "Général";
"preferences.cells.launches_on_login.caption" = "Lancer au démarrage";
"preferences.cells.launches_on_login.footer" = "Cochez pour lancer automatiquement l'application à la connexion ou au démarrage.";
"preferences.cells.confirm_quit.caption" = "Notification de sortie";
"preferences.cells.confirm_quit.footer" = "Cochez pour recevoir une demande de confirmation lorsque vous quittez.";
"debug_log.buttons.copy" = "Copier";
"trusted.columns.trust.title" = "Fiables";
"trusted.ethernet.title" = "Faire confiance aux connexions filaires";
"trusted.ethernet.description" = "Cochez pour faire confiance à toutes les connexions filaires.";
"menu.show.title" = "Afficher";
"menu.switch_profile.title" = "Profil actif";
"menu.active_profile.title.none" = "Pas de profil actif";
"menu.active_profile.items.customize.title" = "Personnaliser...";
"menu.active_profile.messages.missing_credentials" = "Pas de compte configuré";
"menu.organizer.title" = "Organisateur";
"menu.preferences.title" = "Préférences";
"menu.support.title" = "Assistance";
"menu.quit.title" = "Quitter %@";
"menu.quit.messages.confirm" = "S'il est activé, le VPN fonctionnera en tâche de fond. Voulez-vous quitter ?";

View File

@ -1,77 +0,0 @@
//
// App.strings
// Passepartout
//
// Created by Davide De Rosa on 6/21/19.
// Copyright (c) 2021 Davide De Rosa. All rights reserved.
//
// https://github.com/passepartoutvpn
//
// This file is part of Passepartout.
//
// Passepartout is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Passepartout is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Passepartout. If not, see <http://www.gnu.org/licenses/>.
//
"vpn.unused" = "Spento";
"organizer.title" = "%@";
"organizer.menus.provider" = "Provider";
"organizer.menus.provider.unavailable" = "Nessun altro provider disponibile";
"organizer.menus.host" = "Host";
"organizer.alerts.remove_profile.title" = "Cancella profilo";
"organizer.alerts.remove_profile.message" = "Sei sicuro di voler cancellare il profilo %@?";
"organizer.alerts.open_host_file.title" = "Seleziona un file .ovpn";
"service.cells.vpn.turn_on.caption" = "Abilita VPN";
"service.cells.vpn.turn_off.caption" = "Disabilita VPN";
"service.cells.category.caption" = "Categoria";
"service.cells.addresses.caption" = "Indirizzi";
"service.cells.only_shows_favorites.caption" = "Mostra solo le posizioni preferite";
"endpoint.cells.address" = "Indirizzo";
"endpoint.cells.protocol" = "Protocollo";
"configuration.title" = "Configurazione";
"configuration.alerts.commit.message" = "I nuovi parametri non saranno effettivi finché non ti riconnetti manualmente. I cambi nelle reti sicure saranno applicati immediatamente.";
"configuration.alerts.commit.buttons.reconnect" = "Riconnetti adesso";
"configuration.alerts.commit.buttons.skip" = "Ignora";
"network_settings.dns.cells.addresses.title" = "Server";
"network_settings.dns.cells.domains.title" = "Dominii";
"network_settings.proxy.cells.bypass_domains.title" = "Dominii ignorati";
"preferences.title" = "Preferenze";
"preferences.sections.general.header" = "Generale";
"preferences.cells.launches_on_login.caption" = "Apri al login";
"preferences.cells.launches_on_login.footer" = "Seleziona per aprire automaticamente l'app all'avvio o al login.";
"preferences.cells.confirm_quit.caption" = "Conferma uscita";
"preferences.cells.confirm_quit.footer" = "Seleziona per confermare l'uscita dall'applicazione.";
"debug_log.buttons.copy" = "Copia";
"trusted.columns.trust.title" = "Sicura";
"trusted.ethernet.title" = "Connessioni cablate sicure";
"trusted.ethernet.description" = "Seleziona per considerare sicura qualsiasi rete cablata.";
"menu.show.title" = "Mostra";
"menu.switch_profile.title" = "Profilo attivo";
"menu.active_profile.title.none" = "Nessun profilo attivo";
"menu.active_profile.items.customize.title" = "Personalizza...";
"menu.active_profile.messages.missing_credentials" = "Nessun account configurato";
"menu.organizer.title" = "Organizer";
"menu.preferences.title" = "Preferenze";
"menu.support.title" = "Supporto";
"menu.quit.title" = "Esci da %@";
"menu.quit.messages.confirm" = "La VPN, se abilitata, continuerà ad essere attiva in background. Vuoi comunque uscire?";

View File

@ -1,77 +0,0 @@
//
// App.strings
// Passepartout
//
// Created by Davide De Rosa on 6/21/19.
// Copyright (c) 2021 Davide De Rosa. All rights reserved.
//
// https://github.com/passepartoutvpn
//
// This file is part of Passepartout.
//
// Passepartout is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Passepartout is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Passepartout. If not, see <http://www.gnu.org/licenses/>.
//
"vpn.unused" = "Uit";
"organizer.title" = "%@";
"organizer.menus.provider" = "Aanbieder";
"organizer.menus.provider.unavailable" = "Geen aanbieders meer";
"organizer.menus.host" = "Host";
"organizer.alerts.remove_profile.title" = "Profiel verwijderen";
"organizer.alerts.remove_profile.message" = "Weet u zeker dat u profiel %@ wilt verwijderen?";
"organizer.alerts.open_host_file.title" = "Selecteer een .ovpn-bestand";
"service.cells.vpn.turn_on.caption" = "VPN activeren";
"service.cells.vpn.turn_off.caption" = "VPN deactiveren";
"service.cells.category.caption" = "Categorie";
"service.cells.addresses.caption" = "Adressen";
"service.cells.only_shows_favorites.caption" = "Alleen favoriete locaties weergeven";
"endpoint.cells.address" = "Adres";
"endpoint.cells.protocol" = "Protocol";
"configuration.title" = "Configuratie";
"configuration.alerts.commit.message" = "Nieuwe parameters worden pas van kracht als u handmatig opnieuw verbinding maakt. Wijzigingen in vertrouwde netwerken zijn direct van toepassing.";
"configuration.alerts.commit.buttons.reconnect" = "Opnieuw verbinden";
"configuration.alerts.commit.buttons.skip" = "Overslaan";
"network_settings.dns.cells.addresses.title" = "Servers";
"network_settings.dns.cells.domains.title" = "Domeinen";
"network_settings.proxy.cells.bypass_domains.title" = "Domeinen omzeilen";
"preferences.title" = "Voorkeuren";
"preferences.sections.general.header" = "Algemeen";
"preferences.cells.launches_on_login.caption" = "Lanceren bij aanmelden";
"preferences.cells.launches_on_login.footer" = "Vink aan als u wilt dat de app automatisch wordt gelanceerd bij opstarten of aanmelden.";
"preferences.cells.confirm_quit.caption" = "Sluiten bevestigen";
"preferences.cells.confirm_quit.footer" = "Vink aan om een bevestigingsmelding te sluiten.";
"debug_log.buttons.copy" = "Kopiëren";
"trusted.columns.trust.title" = "Vertrouwen";
"trusted.ethernet.title" = "Bekabelde verbindingen vertrouwen";
"trusted.ethernet.description" = "Vink aan om alle bekabelde verbindingen te vertrouwen.";
"menu.show.title" = "Weergeven";
"menu.switch_profile.title" = "Actief profiel";
"menu.active_profile.title.none" = "Geen actief profiel";
"menu.active_profile.items.customize.title" = "Aanpassen...";
"menu.active_profile.messages.missing_credentials" = "Geen account geconfigureerd";
"menu.organizer.title" = "Organisator";
"menu.preferences.title" = "Voorkeuren";
"menu.support.title" = "Ondersteuning";
"menu.quit.title" = "%@ afsluiten";
"menu.quit.messages.confirm" = "De VPN zal, indien geactiveerd, op de achtergrond blijven draaien. Wilt u sluiten?";

View File

@ -1,77 +0,0 @@
//
// App.strings
// Passepartout
//
// Created by Davide De Rosa on 6/21/19.
// Copyright (c) 2021 Davide De Rosa. All rights reserved.
//
// https://github.com/passepartoutvpn
//
// This file is part of Passepartout.
//
// Passepartout is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Passepartout is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Passepartout. If not, see <http://www.gnu.org/licenses/>.
//
"vpn.unused" = "Wył";
"organizer.title" = "%@";
"organizer.menus.provider" = "Dostawca";
"organizer.menus.provider.unavailable" = "Brak dostawców";
"organizer.menus.host" = "Host";
"organizer.alerts.remove_profile.title" = "Usuń profil";
"organizer.alerts.remove_profile.message" = "Na pewno chcesz usunąć profil %@?";
"organizer.alerts.open_host_file.title" = "Wybierz plik .ovpn";
"service.cells.vpn.turn_on.caption" = "Włącz VPN";
"service.cells.vpn.turn_off.caption" = "Wyłącz VPN";
"service.cells.category.caption" = "Kategoria";
"service.cells.addresses.caption" = "Adresy";
"service.cells.only_shows_favorites.caption" = "Pokazuj tylko ulubione lokalizacje";
"endpoint.cells.address" = "Adres";
"endpoint.cells.protocol" = "Protokół";
"configuration.title" = "Konfiguracja";
"configuration.alerts.commit.message" = "Nowe parametry zaczną obowiązywać dopiero po ponownym ręcznym połączeniu. Zmiany w sieciach zaufanych zostaną zastosowane natychmiast.";
"configuration.alerts.commit.buttons.reconnect" = "Połącz ponownie teraz";
"configuration.alerts.commit.buttons.skip" = "Pomiń";
"network_settings.dns.cells.addresses.title" = "Serwery";
"network_settings.dns.cells.domains.title" = "Domeny";
"network_settings.proxy.cells.bypass_domains.title" = "Pomiń domeny";
"preferences.title" = "Preferencje";
"preferences.sections.general.header" = "Ogólne";
"preferences.cells.launches_on_login.caption" = "Uruchom po zalogowaniu";
"preferences.cells.launches_on_login.footer" = "Zaznacz, aby automatycznie uruchamiać aplikację przy restarcie systemu lub logowaniu.";
"preferences.cells.confirm_quit.caption" = "Potwierdź zakończenie pracy";
"preferences.cells.confirm_quit.footer" = "Zaznacz, aby wyświetlić monit o potwierdzeniu zakończenia.";
"debug_log.buttons.copy" = "Kopiuj";
"trusted.columns.trust.title" = "Ufaj";
"trusted.ethernet.title" = "Ufaj połączeniom przewodowym";
"trusted.ethernet.description" = "Zaznacz, aby traktować każde przewodowe połączenie kablowe jako zaufane.";
"menu.show.title" = "Pokaż";
"menu.switch_profile.title" = "Aktywny profil";
"menu.active_profile.title.none" = "Brak aktywnych profili";
"menu.active_profile.items.customize.title" = "Personalizuj";
"menu.active_profile.messages.missing_credentials" = "Brak skonfigurowanych kont";
"menu.organizer.title" = "Organzator";
"menu.preferences.title" = "Preferencje";
"menu.support.title" = "Obsługa techniczna";
"menu.quit.title" = "Zakończ %@";
"menu.quit.messages.confirm" = "Jeśli sieć VPN, jest włączona, będzie nadal działać w tle. Chcesz zakończyć?";

View File

@ -1,77 +0,0 @@
//
// App.strings
// Passepartout
//
// Created by Davide De Rosa on 6/21/19.
// Copyright (c) 2021 Davide De Rosa. All rights reserved.
//
// https://github.com/passepartoutvpn
//
// This file is part of Passepartout.
//
// Passepartout is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Passepartout is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Passepartout. If not, see <http://www.gnu.org/licenses/>.
//
"vpn.unused" = "Desativado";
"organizer.title" = "%@";
"organizer.menus.provider" = "Fornecedor";
"organizer.menus.provider.unavailable" = "Não restam fornecedores";
"organizer.menus.host" = "Anfitreão";
"organizer.alerts.remove_profile.title" = "Remover perfil";
"organizer.alerts.remove_profile.message" = "Tem a certeza de que pretende eliminar o perfil %@?";
"organizer.alerts.open_host_file.title" = "Selecionar um ficheiro .ovpn";
"service.cells.vpn.turn_on.caption" = "Ativar VPN";
"service.cells.vpn.turn_off.caption" = "Desativar VPN";
"service.cells.category.caption" = "Categoria";
"service.cells.addresses.caption" = "Endereços";
"service.cells.only_shows_favorites.caption" = "Mostrar apenas os locais preferidos";
"endpoint.cells.address" = "Endereço";
"endpoint.cells.protocol" = "Protocolo";
"configuration.title" = "Configuração";
"configuration.alerts.commit.message" = "Os novos parâmetros não serão efetivos até que se volte a ligar manualmente. As alterações às redes de confiança serão aplicadas de imediato.";
"configuration.alerts.commit.buttons.reconnect" = "Voltar a ligar agora";
"configuration.alerts.commit.buttons.skip" = "Ignorar";
"network_settings.dns.cells.addresses.title" = "Servidores";
"network_settings.dns.cells.domains.title" = "Domínios";
"network_settings.proxy.cells.bypass_domains.title" = "Fazer um bypass aos domínios";
"preferences.title" = "Preferências";
"preferences.sections.general.header" = "Geral";
"preferences.cells.launches_on_login.caption" = "Iniciar ao iniciar a sessão";
"preferences.cells.launches_on_login.footer" = "Assinale para executar automaticamente a aplicação ao arrancar ou com o início de sessão.";
"preferences.cells.confirm_quit.caption" = "Confirmar a saída";
"preferences.cells.confirm_quit.footer" = "Assinale para apresentar um alerta de confirmação da saída.";
"debug_log.buttons.copy" = "Copiar";
"trusted.columns.trust.title" = "Confiar";
"trusted.ethernet.title" = "Confiar em ligações com fios";
"trusted.ethernet.description" = "Assinale para confiar em qualquer ligação com cabo.";
"menu.show.title" = "Mostrar";
"menu.switch_profile.title" = "Perfil ativo";
"menu.active_profile.title.none" = "Sem perfil ativo";
"menu.active_profile.items.customize.title" = "Personalizar...";
"menu.active_profile.messages.missing_credentials" = "Não há uma conta configurada";
"menu.organizer.title" = "Organizador";
"menu.preferences.title" = "Preferências";
"menu.support.title" = "Apoio";
"menu.quit.title" = "Sair %@";
"menu.quit.messages.confirm" = "A VPN, se ativa, ainda vai ser executada em segundo plano. Quer sair?";

View File

@ -1,77 +0,0 @@
//
// App.strings
// Passepartout
//
// Created by Davide De Rosa on 6/21/19.
// Copyright (c) 2021 Davide De Rosa. All rights reserved.
//
// https://github.com/passepartoutvpn
//
// This file is part of Passepartout.
//
// Passepartout is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Passepartout is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Passepartout. If not, see <http://www.gnu.org/licenses/>.
//
"vpn.unused" = "Выкл";
"organizer.title" = "%@";
"organizer.menus.provider" = "Провайдер";
"organizer.menus.provider.unavailable" = "Не осталось провайдеров";
"organizer.menus.host" = "Хост";
"organizer.alerts.remove_profile.title" = "Удалить профиль";
"organizer.alerts.remove_profile.message" = "Вы точно хотите удалить профиль %@?";
"organizer.alerts.open_host_file.title" = "Выберите файл .ovpn";
"service.cells.vpn.turn_on.caption" = "Включить VPN";
"service.cells.vpn.turn_off.caption" = "Отключить VPN";
"service.cells.category.caption" = "Категория";
"service.cells.addresses.caption" = "Адреса";
"service.cells.only_shows_favorites.caption" = "Показывать только места из избранного";
"endpoint.cells.address" = "Адрес";
"endpoint.cells.protocol" = "Протокол";
"configuration.title" = "Конфигурация";
"configuration.alerts.commit.message" = "Новые параметры не вступят в силу до ручного переподключения. Изменения в доверенных сетях вступят в силу сразу.";
"configuration.alerts.commit.buttons.reconnect" = "Переподключиться";
"configuration.alerts.commit.buttons.skip" = "Пропустить";
"network_settings.dns.cells.addresses.title" = "Серверы";
"network_settings.dns.cells.domains.title" = "Домены";
"network_settings.proxy.cells.bypass_domains.title" = "Обходные домены";
"preferences.title" = "Настройки";
"preferences.sections.general.header" = "Общие";
"preferences.cells.launches_on_login.caption" = "Запускать при входе";
"preferences.cells.launches_on_login.footer" = "Включите, чтобы приложение автоматически запускалось при загрузке или входе.";
"preferences.cells.confirm_quit.caption" = "Подтверждать выход";
"preferences.cells.confirm_quit.footer" = "Включите, чтобы выход надо было подтверждать.";
"debug_log.buttons.copy" = "Копировать";
"trusted.columns.trust.title" = "Доверенные";
"trusted.ethernet.title" = "Доверенные проводные подключения";
"trusted.ethernet.description" = "Включите, чтобы добавить в доверенные проводное подключение.";
"menu.show.title" = "Показать";
"menu.switch_profile.title" = "Активный профиль";
"menu.active_profile.title.none" = "Нет активных профилей";
"menu.active_profile.items.customize.title" = "Настроить...";
"menu.active_profile.messages.missing_credentials" = "Нет настроенных аккаунтов";
"menu.organizer.title" = "Организатор";
"menu.preferences.title" = "Настройки";
"menu.support.title" = "Поддержка";
"menu.quit.title" = "Выйти из %@";
"menu.quit.messages.confirm" = "Если включить VPN, он всё равно будет работать в фоновом режиме. Вы точно хотите выйти?";

View File

@ -1,77 +0,0 @@
//
// App.strings
// Passepartout
//
// Created by Davide De Rosa on 6/21/19.
// Copyright (c) 2021 Davide De Rosa. All rights reserved.
//
// https://github.com/passepartoutvpn
//
// This file is part of Passepartout.
//
// Passepartout is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Passepartout is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Passepartout. If not, see <http://www.gnu.org/licenses/>.
//
"vpn.unused" = "Av";
"organizer.title" = "%@";
"organizer.menus.provider" = "Leverantör";
"organizer.menus.provider.unavailable" = "Inga leverantörer kvar";
"organizer.menus.host" = "Värd";
"organizer.alerts.remove_profile.title" = "Ta bort profil";
"organizer.alerts.remove_profile.message" = "Är det säkert att du vill ta bort profilen %@?";
"organizer.alerts.open_host_file.title" = "Välj en .ovpn-fil";
"service.cells.vpn.turn_on.caption" = "Aktivera VPN";
"service.cells.vpn.turn_off.caption" = "Inaktivera VPN";
"service.cells.category.caption" = "Kategori";
"service.cells.addresses.caption" = "Adresser";
"service.cells.only_shows_favorites.caption" = "Visa endast favoritplatser";
"endpoint.cells.address" = "Adress";
"endpoint.cells.protocol" = "Protokoll";
"configuration.title" = "Konfiguration";
"configuration.alerts.commit.message" = "Nya parametrar kommer inte att införas förrän du återansluter manuellt. Ändringar i betrodda nätverk kommer att införas omedelbart.";
"configuration.alerts.commit.buttons.reconnect" = "Återanslut nu";
"configuration.alerts.commit.buttons.skip" = "Hoppa över";
"network_settings.dns.cells.addresses.title" = "Servrar";
"network_settings.dns.cells.domains.title" = "Domäner";
"network_settings.proxy.cells.bypass_domains.title" = "Kringgå domäner";
"preferences.title" = "Inställningar";
"preferences.sections.general.header" = "Allmänt";
"preferences.cells.launches_on_login.caption" = "Öppna vid inloggning";
"preferences.cells.launches_on_login.footer" = "Markera för att starta appen automatiskt efter omstart eller vid inloggning.";
"preferences.cells.confirm_quit.caption" = "Bekräfta lämna";
"preferences.cells.confirm_quit.footer" = "Markera för att visa en uppmaning att bekräfta att man vill lämna appen.";
"debug_log.buttons.copy" = "Kopiera";
"trusted.columns.trust.title" = "Betrodda";
"trusted.ethernet.title" = "Lita på kabelanslutna uppkopplingar";
"trusted.ethernet.description" = "Markera för att lita på alla kabelanslutna uppkopplingar.";
"menu.show.title" = "Visa";
"menu.switch_profile.title" = "Aktiv profil";
"menu.active_profile.title.none" = "Ingen aktiv profil";
"menu.active_profile.items.customize.title" = "Anpassa";
"menu.active_profile.messages.missing_credentials" = "Inget konto har konfigurerats";
"menu.organizer.title" = "Organisatör";
"menu.preferences.title" = "Inställningar";
"menu.support.title" = "Support";
"menu.quit.title" = "Lämna %@";
"menu.quit.messages.confirm" = "Om ett VPN är aktiverat kommer detta fortfarande att köra i bakgrunden. Vill du lämna?";

View File

@ -1,7 +1,6 @@
strings:
inputs:
- ../../Core/Resources/en.lproj/Core.strings
- en.lproj/App.strings
outputs:
- templateName: structured-swift4
output: Global/SwiftGen+Strings.swift

View File

@ -1,77 +0,0 @@
//
// App.strings
// Passepartout
//
// Created by Davide De Rosa on 6/21/19.
// Copyright (c) 2021 Davide De Rosa. All rights reserved.
//
// https://github.com/passepartoutvpn
//
// This file is part of Passepartout.
//
// Passepartout is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Passepartout is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Passepartout. If not, see <http://www.gnu.org/licenses/>.
//
"vpn.unused" = "关";
"organizer.title" = "%@";
"organizer.menus.provider" = "提供商";
"organizer.menus.provider.unavailable" = "没有提供商了";
"organizer.menus.host" = "主机";
"organizer.alerts.remove_profile.title" = "删除配置";
"organizer.alerts.remove_profile.message" = "确定要删除配置%@吗?";
"organizer.alerts.open_host_file.title" = "选择.ovpn文件";
"service.cells.vpn.turn_on.caption" = "启用VPN";
"service.cells.vpn.turn_off.caption" = "禁用VPN";
"service.cells.category.caption" = "类别";
"service.cells.addresses.caption" = "地址";
"service.cells.only_shows_favorites.caption" = "仅显示收藏的地点";
"endpoint.cells.address" = "地址";
"endpoint.cells.protocol" = "协议";
"configuration.title" = "配置";
"configuration.alerts.commit.message" = "除非手动重新连接,否则新参数将无效。受信任的网络中的更改将立即生效。";
"configuration.alerts.commit.buttons.reconnect" = "立即重新连接";
"configuration.alerts.commit.buttons.skip" = "跳过";
"network_settings.dns.cells.addresses.title" = "服务器";
"network_settings.dns.cells.domains.title" = "域";
"network_settings.proxy.cells.bypass_domains.title" = "旁路域";
"preferences.title" = "偏好设置";
"preferences.sections.general.header" = "一般";
"preferences.cells.launches_on_login.caption" = "登录时启动";
"preferences.cells.launches_on_login.footer" = "选中以在启动或登录时自动启动应用。";
"preferences.cells.confirm_quit.caption" = "确认退出";
"preferences.cells.confirm_quit.footer" = "选中以显示退出确认提醒。";
"debug_log.buttons.copy" = "复制";
"trusted.columns.trust.title" = "信任";
"trusted.ethernet.title" = "信任有线连接";
"trusted.ethernet.description" = "选中以信任所有有线连接。";
"menu.show.title" = "显示";
"menu.switch_profile.title" = "有效配置";
"menu.active_profile.title.none" = "无有效配置";
"menu.active_profile.items.customize.title" = "自定义......";
"menu.active_profile.messages.missing_credentials" = "未配置账户";
"menu.organizer.title" = "分类页面";
"menu.preferences.title" = "偏好设置";
"menu.support.title" = "支持";
"menu.quit.title" = "退出%@";
"menu.quit.messages.confirm" = "VPN如果启用仍将在后台运行。您要退出吗";