Drop unused app strings and redo SwiftGen
Prefix is now just L10n without strings filename.
This commit is contained in:
parent
c985ed4256
commit
0ebddc6a68
|
@ -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 = (
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
|
@ -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:
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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";
|
|
@ -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" = "Προσθήκη Συντόμευσης";
|
|
@ -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/>.
|
||||
//
|
|
@ -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";
|
|
@ -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";
|
|
@ -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";
|
|
@ -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";
|
|
@ -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";
|
|
@ -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";
|
|
@ -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" = "Создать команду";
|
|
@ -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";
|
|
@ -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
|
||||
|
|
|
@ -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" = "添加捷径";
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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?")
|
||||
}
|
||||
|
|
|
@ -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
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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 ?? ""
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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([
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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([
|
||||
|
|
|
@ -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() ?? ""
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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?";
|
||||
|
|
@ -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, αν είναι ενεργοποιημένο, θα εξακολουθεί να εκτελείται στο παρασκήνιο. Θέλετε να το διακόψετε;";
|
||||
|
|
@ -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/>.
|
||||
//
|
|
@ -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?";
|
||||
|
|
@ -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 ?";
|
||||
|
|
@ -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?";
|
||||
|
|
@ -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?";
|
||||
|
|
@ -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ć?";
|
||||
|
|
@ -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?";
|
||||
|
|
@ -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, он всё равно будет работать в фоновом режиме. Вы точно хотите выйти?";
|
||||
|
|
@ -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?";
|
||||
|
|
@ -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
|
||||
|
|
|
@ -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(如果启用)仍将在后台运行。您要退出吗?";
|
||||
|
Loading…
Reference in New Issue