Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c4f79beb8d | |||
| a613fec2ff | |||
| e54a5d9a13 | |||
| 6d57c8b6f9 | |||
| b67acaccff | |||
| d8568b0e31 | |||
| 373bb2ae99 | |||
| 631286e2d1 | |||
| 74cd7041dc | |||
| 21d920c8b0 | |||
| 44c4df1cd5 |
@@ -44,7 +44,7 @@ class Keychain {
|
||||
items[kSecAttrSynchronizable] = false
|
||||
items[kSecAttrAccessible] = kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly
|
||||
|
||||
guard let extensionPath = Bundle.main.builtInPlugInsURL?.appendingPathComponent("WireGuardNetworkExtension.appex").path else {
|
||||
guard let extensionPath = Bundle.main.builtInPlugInsURL?.appendingPathComponent("WireGuardNetworkExtension.appex", isDirectory: true).path else {
|
||||
wg_log(.error, staticMessage: "Unable to determine app extension path")
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
// Copyright © 2018-2020 WireGuard LLC. All Rights Reserved.
|
||||
|
||||
import Foundation
|
||||
|
||||
/// This source file contains bits of code from:
|
||||
/// https://oleb.net/blog/2018/01/notificationcenter-removeobserver/
|
||||
|
||||
/// Wraps the observer token received from
|
||||
/// `NotificationCenter.addObserver(forName:object:queue:using:)`
|
||||
/// and unregisters it in deinit.
|
||||
final class NotificationToken {
|
||||
let notificationCenter: NotificationCenter
|
||||
let token: Any
|
||||
|
||||
init(notificationCenter: NotificationCenter = .default, token: Any) {
|
||||
self.notificationCenter = notificationCenter
|
||||
self.token = token
|
||||
}
|
||||
|
||||
deinit {
|
||||
notificationCenter.removeObserver(token)
|
||||
}
|
||||
}
|
||||
|
||||
extension NotificationCenter {
|
||||
/// Convenience wrapper for addObserver(forName:object:queue:using:)
|
||||
/// that returns our custom `NotificationToken`.
|
||||
func observe(name: NSNotification.Name?, object obj: Any?, queue: OperationQueue?, using block: @escaping (Notification) -> Void) -> NotificationToken {
|
||||
let token = addObserver(forName: name, object: obj, queue: queue, using: block)
|
||||
return NotificationToken(notificationCenter: self, token: token)
|
||||
}
|
||||
}
|
||||
@@ -297,6 +297,7 @@
|
||||
"macMenuNetworksNone" = "Networks: None";
|
||||
|
||||
"macMenuTitle" = "WireGuard";
|
||||
"macTunnelsMenuTitle" = "Tunnels";
|
||||
"macMenuManageTunnels" = "Manage Tunnels";
|
||||
"macMenuImportTunnels" = "Import Tunnel(s) from File…";
|
||||
"macMenuAddEmptyTunnel" = "Add Empty Tunnel…";
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
VERSION_NAME = 1.0.11
|
||||
VERSION_ID = 21
|
||||
VERSION_NAME = 1.0.12
|
||||
VERSION_ID = 22
|
||||
|
||||
@@ -23,9 +23,9 @@ class TunnelsManager {
|
||||
private var tunnels: [TunnelContainer]
|
||||
weak var tunnelsListDelegate: TunnelsManagerListDelegate?
|
||||
weak var activationDelegate: TunnelsManagerActivationDelegate?
|
||||
private var statusObservationToken: AnyObject?
|
||||
private var waiteeObservationToken: AnyObject?
|
||||
private var configurationsObservationToken: AnyObject?
|
||||
private var statusObservationToken: NotificationToken?
|
||||
private var waiteeObservationToken: NSKeyValueObservation?
|
||||
private var configurationsObservationToken: NotificationToken?
|
||||
|
||||
init(tunnelProviders: [NETunnelProviderManager]) {
|
||||
tunnels = tunnelProviders.map { TunnelContainer(tunnel: $0) }.sorted { TunnelsManager.tunnelNameIsLessThan($0.name, $1.name) }
|
||||
@@ -138,10 +138,10 @@ class TunnelsManager {
|
||||
let activeTunnel = tunnels.first { $0.status == .active || $0.status == .activating }
|
||||
|
||||
tunnelProviderManager.saveToPreferences { [weak self] error in
|
||||
guard error == nil else {
|
||||
wg_log(.error, message: "Add: Saving configuration failed: \(error!)")
|
||||
if let error = error {
|
||||
wg_log(.error, message: "Add: Saving configuration failed: \(error)")
|
||||
(tunnelProviderManager.protocolConfiguration as? NETunnelProviderProtocol)?.destroyConfigurationReference()
|
||||
completionHandler(.failure(TunnelsManagerError.systemErrorOnAddTunnel(systemError: error!)))
|
||||
completionHandler(.failure(TunnelsManagerError.systemErrorOnAddTunnel(systemError: error)))
|
||||
return
|
||||
}
|
||||
|
||||
@@ -169,7 +169,20 @@ class TunnelsManager {
|
||||
}
|
||||
|
||||
func addMultiple(tunnelConfigurations: [TunnelConfiguration], completionHandler: @escaping (UInt, TunnelsManagerError?) -> Void) {
|
||||
addMultiple(tunnelConfigurations: ArraySlice(tunnelConfigurations), numberSuccessful: 0, lastError: nil, completionHandler: completionHandler)
|
||||
// Temporarily pause observation of changes to VPN configurations to prevent the feedback
|
||||
// loop that causes `reload()` to be called on each newly added tunnel, which significantly
|
||||
// impacts performance.
|
||||
configurationsObservationToken = nil
|
||||
|
||||
self.addMultiple(tunnelConfigurations: ArraySlice(tunnelConfigurations), numberSuccessful: 0, lastError: nil) { [weak self] numSucceeded, error in
|
||||
completionHandler(numSucceeded, error)
|
||||
|
||||
// Restart observation of changes to VPN configrations.
|
||||
self?.startObservingTunnelConfigurations()
|
||||
|
||||
// Force reload all configurations to make sure that all tunnels are up to date.
|
||||
self?.reload()
|
||||
}
|
||||
}
|
||||
|
||||
private func addMultiple(tunnelConfigurations: ArraySlice<TunnelConfiguration>, numberSuccessful: UInt, lastError: TunnelsManagerError?, completionHandler: @escaping (UInt, TunnelsManagerError?) -> Void) {
|
||||
@@ -222,10 +235,10 @@ class TunnelsManager {
|
||||
onDemandOption.apply(on: tunnelProviderManager)
|
||||
|
||||
tunnelProviderManager.saveToPreferences { [weak self] error in
|
||||
guard error == nil else {
|
||||
if let error = error {
|
||||
//TODO: the passwordReference for the old one has already been removed at this point and we can't easily roll back!
|
||||
wg_log(.error, message: "Modify: Saving configuration failed: \(error!)")
|
||||
completionHandler(TunnelsManagerError.systemErrorOnModifyTunnel(systemError: error!))
|
||||
wg_log(.error, message: "Modify: Saving configuration failed: \(error)")
|
||||
completionHandler(TunnelsManagerError.systemErrorOnModifyTunnel(systemError: error))
|
||||
return
|
||||
}
|
||||
guard let self = self else { return }
|
||||
@@ -253,12 +266,12 @@ class TunnelsManager {
|
||||
// Without this, the tunnel stopes getting updates on the tunnel status from iOS.
|
||||
tunnelProviderManager.loadFromPreferences { error in
|
||||
tunnel.isActivateOnDemandEnabled = tunnelProviderManager.isOnDemandEnabled
|
||||
guard error == nil else {
|
||||
wg_log(.error, message: "Modify: Re-loading after saving configuration failed: \(error!)")
|
||||
completionHandler(TunnelsManagerError.systemErrorOnModifyTunnel(systemError: error!))
|
||||
return
|
||||
if let error = error {
|
||||
wg_log(.error, message: "Modify: Re-loading after saving configuration failed: \(error)")
|
||||
completionHandler(TunnelsManagerError.systemErrorOnModifyTunnel(systemError: error))
|
||||
} else {
|
||||
completionHandler(nil)
|
||||
}
|
||||
completionHandler(nil)
|
||||
}
|
||||
} else {
|
||||
completionHandler(nil)
|
||||
@@ -278,9 +291,9 @@ class TunnelsManager {
|
||||
#error("Unimplemented")
|
||||
#endif
|
||||
tunnelProviderManager.removeFromPreferences { [weak self] error in
|
||||
guard error == nil else {
|
||||
wg_log(.error, message: "Remove: Saving configuration failed: \(error!)")
|
||||
completionHandler(TunnelsManagerError.systemErrorOnRemoveTunnel(systemError: error!))
|
||||
if let error = error {
|
||||
wg_log(.error, message: "Remove: Saving configuration failed: \(error)")
|
||||
completionHandler(TunnelsManagerError.systemErrorOnRemoveTunnel(systemError: error))
|
||||
return
|
||||
}
|
||||
if let self = self, let index = self.tunnels.firstIndex(of: tunnel) {
|
||||
@@ -296,7 +309,20 @@ class TunnelsManager {
|
||||
}
|
||||
|
||||
func removeMultiple(tunnels: [TunnelContainer], completionHandler: @escaping (TunnelsManagerError?) -> Void) {
|
||||
removeMultiple(tunnels: ArraySlice(tunnels), completionHandler: completionHandler)
|
||||
// Temporarily pause observation of changes to VPN configurations to prevent the feedback
|
||||
// loop that causes `reload()` to be called for each removed tunnel, which significantly
|
||||
// impacts performance.
|
||||
configurationsObservationToken = nil
|
||||
|
||||
removeMultiple(tunnels: ArraySlice(tunnels)) { [weak self] error in
|
||||
completionHandler(error)
|
||||
|
||||
// Restart observation of changes to VPN configrations.
|
||||
self?.startObservingTunnelConfigurations()
|
||||
|
||||
// Force reload all configurations to make sure that all tunnels are up to date.
|
||||
self?.reload()
|
||||
}
|
||||
}
|
||||
|
||||
private func removeMultiple(tunnels: ArraySlice<TunnelContainer>, completionHandler: @escaping (TunnelsManagerError?) -> Void) {
|
||||
@@ -406,7 +432,7 @@ class TunnelsManager {
|
||||
}
|
||||
|
||||
private func startObservingTunnelStatuses() {
|
||||
statusObservationToken = NotificationCenter.default.addObserver(forName: .NEVPNStatusDidChange, object: nil, queue: OperationQueue.main) { [weak self] statusChangeNotification in
|
||||
statusObservationToken = NotificationCenter.default.observe(name: .NEVPNStatusDidChange, object: nil, queue: OperationQueue.main) { [weak self] statusChangeNotification in
|
||||
guard let self = self,
|
||||
let session = statusChangeNotification.object as? NETunnelProviderSession,
|
||||
let tunnelProvider = session.manager as? NETunnelProviderManager,
|
||||
@@ -438,7 +464,7 @@ class TunnelsManager {
|
||||
}
|
||||
|
||||
func startObservingTunnelConfigurations() {
|
||||
configurationsObservationToken = NotificationCenter.default.addObserver(forName: .NEVPNConfigurationChange, object: nil, queue: OperationQueue.main) { [weak self] _ in
|
||||
configurationsObservationToken = NotificationCenter.default.observe(name: .NEVPNConfigurationChange, object: nil, queue: OperationQueue.main) { [weak self] _ in
|
||||
DispatchQueue.main.async { [weak self] in
|
||||
// We schedule reload() in a subsequent runloop to ensure that the completion handler of loadAllFromPreferences
|
||||
// (reload() calls loadAllFromPreferences) is called after the completion handler of the saveToPreferences or
|
||||
|
||||
@@ -398,12 +398,13 @@ class TunnelViewModel {
|
||||
|
||||
static let ipv4DefaultRouteString = "0.0.0.0/0"
|
||||
static let ipv4DefaultRouteModRFC1918String = [ // Set of all non-private IPv4 IPs
|
||||
"0.0.0.0/5", "8.0.0.0/7", "11.0.0.0/8", "12.0.0.0/6", "16.0.0.0/4", "32.0.0.0/3",
|
||||
"64.0.0.0/2", "128.0.0.0/3", "160.0.0.0/5", "168.0.0.0/6", "172.0.0.0/12",
|
||||
"172.32.0.0/11", "172.64.0.0/10", "172.128.0.0/9", "173.0.0.0/8", "174.0.0.0/7",
|
||||
"176.0.0.0/4", "192.0.0.0/9", "192.128.0.0/11", "192.160.0.0/13", "192.169.0.0/16",
|
||||
"192.170.0.0/15", "192.172.0.0/14", "192.176.0.0/12", "192.192.0.0/10",
|
||||
"193.0.0.0/8", "194.0.0.0/7", "196.0.0.0/6", "200.0.0.0/5", "208.0.0.0/4"
|
||||
"1.0.0.0/8", "2.0.0.0/8", "3.0.0.0/8", "4.0.0.0/6", "8.0.0.0/7", "11.0.0.0/8",
|
||||
"12.0.0.0/6", "16.0.0.0/4", "32.0.0.0/3", "64.0.0.0/2", "128.0.0.0/3",
|
||||
"160.0.0.0/5", "168.0.0.0/6", "172.0.0.0/12", "172.32.0.0/11", "172.64.0.0/10",
|
||||
"172.128.0.0/9", "173.0.0.0/8", "174.0.0.0/7", "176.0.0.0/4", "192.0.0.0/9",
|
||||
"192.128.0.0/11", "192.160.0.0/13", "192.169.0.0/16", "192.170.0.0/15",
|
||||
"192.172.0.0/14", "192.176.0.0/12", "192.192.0.0/10", "193.0.0.0/8",
|
||||
"194.0.0.0/7", "196.0.0.0/6", "200.0.0.0/5", "208.0.0.0/4"
|
||||
]
|
||||
|
||||
static func excludePrivateIPsFieldStates(isSinglePeer: Bool, allowedIPs: Set<String>) -> (shouldAllowExcludePrivateIPsControl: Bool, excludePrivateIPsValue: Bool) {
|
||||
|
||||
@@ -14,8 +14,14 @@ class StatusMenu: NSMenu {
|
||||
var statusMenuItem: NSMenuItem?
|
||||
var networksMenuItem: NSMenuItem?
|
||||
var deactivateMenuItem: NSMenuItem?
|
||||
var firstTunnelMenuItemIndex = 0
|
||||
var numberOfTunnelMenuItems = 0
|
||||
|
||||
private let tunnelsBreakdownMenu = NSMenu()
|
||||
private let tunnelsMenuItem = NSMenuItem(title: tr("macTunnelsMenuTitle"), action: nil, keyEquivalent: "")
|
||||
private let tunnelsMenuSeparatorItem = NSMenuItem.separator()
|
||||
|
||||
private var firstTunnelMenuItemIndex = 0
|
||||
private var numberOfTunnelMenuItems = 0
|
||||
private var tunnelsPresentationStyle = StatusMenuTunnelsPresentationStyle.inline
|
||||
|
||||
var currentTunnel: TunnelContainer? {
|
||||
didSet {
|
||||
@@ -26,16 +32,20 @@ class StatusMenu: NSMenu {
|
||||
|
||||
init(tunnelsManager: TunnelsManager) {
|
||||
self.tunnelsManager = tunnelsManager
|
||||
|
||||
super.init(title: tr("macMenuTitle"))
|
||||
|
||||
addStatusMenuItems()
|
||||
addItem(NSMenuItem.separator())
|
||||
|
||||
tunnelsMenuItem.submenu = tunnelsBreakdownMenu
|
||||
addItem(tunnelsMenuItem)
|
||||
|
||||
firstTunnelMenuItemIndex = numberOfItems
|
||||
let isAdded = addTunnelMenuItems()
|
||||
if isAdded {
|
||||
addItem(NSMenuItem.separator())
|
||||
}
|
||||
populateInitialTunnelMenuItems()
|
||||
|
||||
addItem(tunnelsMenuSeparatorItem)
|
||||
|
||||
addTunnelManagementItems()
|
||||
addItem(NSMenuItem.separator())
|
||||
addApplicationItems()
|
||||
@@ -108,15 +118,6 @@ class StatusMenu: NSMenu {
|
||||
deactivateMenuItem.isHidden = tunnel.status != .active
|
||||
}
|
||||
|
||||
func addTunnelMenuItems() -> Bool {
|
||||
let numberOfTunnels = tunnelsManager.numberOfTunnels()
|
||||
for index in 0 ..< tunnelsManager.numberOfTunnels() {
|
||||
let tunnel = tunnelsManager.tunnel(at: index)
|
||||
insertTunnelMenuItem(for: tunnel, at: numberOfTunnelMenuItems)
|
||||
}
|
||||
return numberOfTunnels > 0
|
||||
}
|
||||
|
||||
func addTunnelManagementItems() {
|
||||
let manageItem = NSMenuItem(title: tr("macMenuManageTunnels"), action: #selector(manageTunnelsClicked), keyEquivalent: "")
|
||||
manageItem.target = self
|
||||
@@ -166,34 +167,121 @@ class StatusMenu: NSMenu {
|
||||
|
||||
extension StatusMenu {
|
||||
func insertTunnelMenuItem(for tunnel: TunnelContainer, at tunnelIndex: Int) {
|
||||
let menuItem = TunnelMenuItem(tunnel: tunnel, action: #selector(tunnelClicked(sender:)))
|
||||
menuItem.target = self
|
||||
menuItem.isHidden = !tunnel.isTunnelAvailableToUser
|
||||
insertItem(menuItem, at: firstTunnelMenuItemIndex + tunnelIndex)
|
||||
if numberOfTunnelMenuItems == 0 {
|
||||
insertItem(NSMenuItem.separator(), at: firstTunnelMenuItemIndex + tunnelIndex + 1)
|
||||
let nextNumberOfTunnels = numberOfTunnelMenuItems + 1
|
||||
|
||||
guard !reparentTunnelMenuItems(nextNumberOfTunnels: nextNumberOfTunnels) else {
|
||||
return
|
||||
}
|
||||
numberOfTunnelMenuItems += 1
|
||||
|
||||
let menuItem = makeTunnelItem(tunnel: tunnel)
|
||||
switch tunnelsPresentationStyle {
|
||||
case .submenu:
|
||||
tunnelsBreakdownMenu.insertItem(menuItem, at: tunnelIndex)
|
||||
case .inline:
|
||||
insertItem(menuItem, at: firstTunnelMenuItemIndex + tunnelIndex)
|
||||
}
|
||||
|
||||
numberOfTunnelMenuItems = nextNumberOfTunnels
|
||||
updateTunnelsMenuItemVisibility()
|
||||
}
|
||||
|
||||
func removeTunnelMenuItem(at tunnelIndex: Int) {
|
||||
removeItem(at: firstTunnelMenuItemIndex + tunnelIndex)
|
||||
numberOfTunnelMenuItems -= 1
|
||||
if numberOfTunnelMenuItems == 0 {
|
||||
if let firstItem = item(at: firstTunnelMenuItemIndex), firstItem.isSeparatorItem {
|
||||
removeItem(at: firstTunnelMenuItemIndex)
|
||||
}
|
||||
let nextNumberOfTunnels = numberOfTunnelMenuItems - 1
|
||||
|
||||
guard !reparentTunnelMenuItems(nextNumberOfTunnels: nextNumberOfTunnels) else {
|
||||
return
|
||||
}
|
||||
|
||||
switch tunnelsPresentationStyle {
|
||||
case .submenu:
|
||||
tunnelsBreakdownMenu.removeItem(at: tunnelIndex)
|
||||
case .inline:
|
||||
removeItem(at: firstTunnelMenuItemIndex + tunnelIndex)
|
||||
}
|
||||
|
||||
numberOfTunnelMenuItems = nextNumberOfTunnels
|
||||
updateTunnelsMenuItemVisibility()
|
||||
}
|
||||
|
||||
func moveTunnelMenuItem(from oldTunnelIndex: Int, to newTunnelIndex: Int) {
|
||||
guard let oldMenuItem = item(at: firstTunnelMenuItemIndex + oldTunnelIndex) as? TunnelMenuItem else { return }
|
||||
let oldMenuItemTunnel = oldMenuItem.tunnel
|
||||
removeItem(at: firstTunnelMenuItemIndex + oldTunnelIndex)
|
||||
let menuItem = TunnelMenuItem(tunnel: oldMenuItemTunnel, action: #selector(tunnelClicked(sender:)))
|
||||
menuItem.target = self
|
||||
insertItem(menuItem, at: firstTunnelMenuItemIndex + newTunnelIndex)
|
||||
let tunnel = tunnelsManager.tunnel(at: newTunnelIndex)
|
||||
let menuItem = makeTunnelItem(tunnel: tunnel)
|
||||
|
||||
switch tunnelsPresentationStyle {
|
||||
case .submenu:
|
||||
tunnelsBreakdownMenu.removeItem(at: oldTunnelIndex)
|
||||
tunnelsBreakdownMenu.insertItem(menuItem, at: newTunnelIndex)
|
||||
case .inline:
|
||||
removeItem(at: firstTunnelMenuItemIndex + oldTunnelIndex)
|
||||
insertItem(menuItem, at: firstTunnelMenuItemIndex + newTunnelIndex)
|
||||
}
|
||||
}
|
||||
|
||||
private func makeTunnelItem(tunnel: TunnelContainer) -> TunnelMenuItem {
|
||||
let menuItem = TunnelMenuItem(tunnel: tunnel, action: #selector(tunnelClicked(sender:)))
|
||||
menuItem.target = self
|
||||
menuItem.isHidden = !tunnel.isTunnelAvailableToUser
|
||||
return menuItem
|
||||
}
|
||||
|
||||
private func populateInitialTunnelMenuItems() {
|
||||
let numberOfTunnels = tunnelsManager.numberOfTunnels()
|
||||
let initialStyle = tunnelsPresentationStyle.preferredPresentationStyle(numberOfTunnels: numberOfTunnels)
|
||||
|
||||
tunnelsPresentationStyle = initialStyle
|
||||
switch initialStyle {
|
||||
case .inline:
|
||||
numberOfTunnelMenuItems = addTunnelMenuItems(into: self, at: firstTunnelMenuItemIndex)
|
||||
case .submenu:
|
||||
numberOfTunnelMenuItems = addTunnelMenuItems(into: tunnelsBreakdownMenu, at: 0)
|
||||
}
|
||||
|
||||
updateTunnelsMenuItemVisibility()
|
||||
}
|
||||
|
||||
private func reparentTunnelMenuItems(nextNumberOfTunnels: Int) -> Bool {
|
||||
let nextStyle = tunnelsPresentationStyle.preferredPresentationStyle(numberOfTunnels: nextNumberOfTunnels)
|
||||
|
||||
switch (tunnelsPresentationStyle, nextStyle) {
|
||||
case (.inline, .submenu):
|
||||
tunnelsPresentationStyle = nextStyle
|
||||
for index in (0..<numberOfTunnelMenuItems).reversed() {
|
||||
removeItem(at: firstTunnelMenuItemIndex + index)
|
||||
}
|
||||
numberOfTunnelMenuItems = addTunnelMenuItems(into: tunnelsBreakdownMenu, at: 0)
|
||||
updateTunnelsMenuItemVisibility()
|
||||
return true
|
||||
|
||||
case (.submenu, .inline):
|
||||
tunnelsPresentationStyle = nextStyle
|
||||
tunnelsBreakdownMenu.removeAllItems()
|
||||
numberOfTunnelMenuItems = addTunnelMenuItems(into: self, at: firstTunnelMenuItemIndex)
|
||||
updateTunnelsMenuItemVisibility()
|
||||
return true
|
||||
|
||||
case (.submenu, .submenu), (.inline, .inline):
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
private func addTunnelMenuItems(into menu: NSMenu, at startIndex: Int) -> Int {
|
||||
let numberOfTunnels = tunnelsManager.numberOfTunnels()
|
||||
for tunnelIndex in 0..<numberOfTunnels {
|
||||
let tunnel = tunnelsManager.tunnel(at: tunnelIndex)
|
||||
let menuItem = makeTunnelItem(tunnel: tunnel)
|
||||
menu.insertItem(menuItem, at: startIndex + tunnelIndex)
|
||||
}
|
||||
return numberOfTunnels
|
||||
}
|
||||
|
||||
private func updateTunnelsMenuItemVisibility() {
|
||||
switch tunnelsPresentationStyle {
|
||||
case .inline:
|
||||
tunnelsMenuItem.isHidden = true
|
||||
case .submenu:
|
||||
tunnelsMenuItem.isHidden = false
|
||||
}
|
||||
tunnelsMenuSeparatorItem.isHidden = numberOfTunnelMenuItems == 0
|
||||
}
|
||||
}
|
||||
|
||||
@@ -232,3 +320,20 @@ class TunnelMenuItem: NSMenuItem {
|
||||
state = shouldShowCheckmark ? .on : .off
|
||||
}
|
||||
}
|
||||
|
||||
private enum StatusMenuTunnelsPresentationStyle {
|
||||
case inline
|
||||
case submenu
|
||||
|
||||
func preferredPresentationStyle(numberOfTunnels: Int) -> StatusMenuTunnelsPresentationStyle {
|
||||
let maxInlineTunnels = 10
|
||||
|
||||
if case .inline = self, numberOfTunnels > maxInlineTunnels {
|
||||
return .submenu
|
||||
} else if case .submenu = self, numberOfTunnels <= maxInlineTunnels {
|
||||
return .inline
|
||||
} else {
|
||||
return self
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,6 +18,9 @@ class LogViewController: NSViewController {
|
||||
}
|
||||
}
|
||||
|
||||
private var boundsChangedNotificationToken: NotificationToken?
|
||||
private var frameChangedNotificationToken: NotificationToken?
|
||||
|
||||
let scrollView: NSScrollView = {
|
||||
let scrollView = NSScrollView()
|
||||
scrollView.hasVerticalScroller = true
|
||||
@@ -104,13 +107,13 @@ class LogViewController: NSViewController {
|
||||
clipView.documentView = tableView
|
||||
scrollView.contentView = clipView
|
||||
|
||||
_ = NotificationCenter.default.addObserver(forName: NSView.boundsDidChangeNotification, object: clipView, queue: OperationQueue.main) { [weak self] _ in
|
||||
boundsChangedNotificationToken = NotificationCenter.default.observe(name: NSView.boundsDidChangeNotification, object: clipView, queue: OperationQueue.main) { [weak self] _ in
|
||||
guard let self = self else { return }
|
||||
let lastVisibleRowIndex = self.tableView.row(at: NSPoint(x: 0, y: self.scrollView.contentView.documentVisibleRect.maxY - 1))
|
||||
self.isInScrolledToEndMode = lastVisibleRowIndex < 0 || lastVisibleRowIndex == self.logEntries.count - 1
|
||||
}
|
||||
|
||||
_ = NotificationCenter.default.addObserver(forName: NSView.frameDidChangeNotification, object: tableView, queue: OperationQueue.main) { [weak self] _ in
|
||||
frameChangedNotificationToken = NotificationCenter.default.observe(name: NSView.frameDidChangeNotification, object: tableView, queue: OperationQueue.main) { [weak self] _ in
|
||||
guard let self = self else { return }
|
||||
if self.isInScrolledToEndMode {
|
||||
DispatchQueue.main.async {
|
||||
|
||||
@@ -235,6 +235,7 @@
|
||||
"macMenuFile" = "File";
|
||||
"tunnelStatusActivating" = "Activating";
|
||||
"macToolTipToggleStatus" = "Toggle status (⌘T)";
|
||||
"macTunnelsMenuTitle" = "Tunnels";
|
||||
"alertTunnelActivationSystemErrorTitle" = "Activation failure";
|
||||
"alertInvalidInterfaceMessagePrivateKeyRequired" = "Interface’s private key is required";
|
||||
"alertNoTunnelsToExportTitle" = "Nothing to export";
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
// Copyright © 2018-2019 WireGuard LLC. All Rights Reserved.
|
||||
// Copyright © 2018-2020 WireGuard LLC. All Rights Reserved.
|
||||
// Generic alert action names
|
||||
|
||||
|
||||
@@ -443,3 +443,4 @@
|
||||
// Donation
|
||||
|
||||
"donateLink" = "♥ Spende an das WireGuard Projekt";
|
||||
"macTunnelsMenuTitle" = "Tunnels";
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
// Copyright © 2018-2019 WireGuard LLC. All Rights Reserved.
|
||||
// Copyright © 2018-2020 WireGuard LLC. All Rights Reserved.
|
||||
// Generic alert action names
|
||||
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
"tunnelPeerPublicKey" = "Clave pública";
|
||||
"tunnelPeerPreSharedKey" = "Clave precompartida";
|
||||
"tunnelPeerEndpoint" = "Punto final";
|
||||
"tunnelPeerPersistentKeepalive" = "Mantenimiento persistente";
|
||||
"tunnelPeerPersistentKeepalive" = "Keepalive persistente";
|
||||
"tunnelPeerAllowedIPs" = "IPs permitidas";
|
||||
"tunnelPeerRxBytes" = "Datos recibidos";
|
||||
"tunnelPeerTxBytes" = "Datos enviados";
|
||||
@@ -177,142 +177,219 @@
|
||||
"alertInvalidPeerMessagePreSharedKeyInvalid" = "La clave precompartida del par debe ser de 32 bytes en codificación base64";
|
||||
"alertInvalidPeerMessageAllowedIPsInvalid" = "Las IPs permitidas del par deben ser una lista de direcciones IP separadas por comas, opcionalmente en notación CIDR";
|
||||
"alertInvalidPeerMessageEndpointInvalid" = "El punto final del par debe ser de la forma ‘host:port’ o ‘[host]:port’";
|
||||
"alertInvalidPeerMessagePersistentKeepaliveInvalid" = "El keepalive persistente del par debe estar entre 0 y 65535, o no especificado";
|
||||
"alertInvalidPeerMessagePersistentKeepaliveInvalid" = "El keepalive persistente del peer debe estar entre 0 y 65535, o no especificado";
|
||||
"alertInvalidPeerMessagePublicKeyDuplicated" = "Dos o mas pares no pueden tener la misma llave pùblica";
|
||||
|
||||
// Scanning QR code UI
|
||||
|
||||
"scanQRCodeViewTitle" = "Escanear código QR";
|
||||
"scanQRCodeTipText" = "Consejo: generar con `qrencode -t ansiutf8 tunnel.conf`";
|
||||
|
||||
// Scanning QR code alerts
|
||||
|
||||
"alertScanQRCodeCameraUnsupportedTitle" = "Cámara no soportada";
|
||||
"alertScanQRCodeCameraUnsupportedMessage" = "Este dispositivo no es capaz de escanear códigos QR";
|
||||
|
||||
"alertScanQRCodeInvalidQRCodeTitle" = "Código QR inválido";
|
||||
"alertScanQRCodeInvalidQRCodeMessage" = "El código QR escaneado no es una configuración válida de WireGuard";
|
||||
|
||||
"alertScanQRCodeUnreadableQRCodeTitle" = "Código inválido";
|
||||
"alertScanQRCodeUnreadableQRCodeMessage" = "El código escaneado no pudo ser leído";
|
||||
|
||||
"alertScanQRCodeNamePromptTitle" = "Por favor, nombra el túnel escaneado";
|
||||
|
||||
// Settings UI
|
||||
|
||||
"settingsViewTitle" = "Configuración";
|
||||
|
||||
"settingsSectionTitleAbout" = "Acerca de";
|
||||
"settingsVersionKeyWireGuardForIOS" = "WireGuard para iOS";
|
||||
|
||||
"settingsSectionTitleExportConfigurations" = "Exportar configuraciones";
|
||||
"settingsExportZipButtonTitle" = "Exportar archivo zip";
|
||||
|
||||
"settingsSectionTitleTunnelLog" = "Registro";
|
||||
"settingsViewLogButtonTitle" = "Ver registro";
|
||||
|
||||
// Log view
|
||||
|
||||
"logViewTitle" = "Registro";
|
||||
|
||||
// Log alerts
|
||||
|
||||
"alertUnableToRemovePreviousLogTitle" = "Exportación de registros fallida";
|
||||
"alertUnableToRemovePreviousLogMessage" = "El registro preexistente no ha podido ser borrado";
|
||||
|
||||
"alertUnableToWriteLogTitle" = "Exportación de registros fallida";
|
||||
"alertUnableToWriteLogMessage" = "No se pudo escribir en el archivo de registros";
|
||||
|
||||
// Zip import / export error alerts
|
||||
|
||||
"alertCantOpenInputZipFileTitle" = "No se pudo leer el archivo zip";
|
||||
"alertCantOpenInputZipFileMessage" = "El archivo zip no pudo ser leído.";
|
||||
|
||||
"alertCantOpenOutputZipFileForWritingTitle" = "No se pudo crear el archivo zip";
|
||||
"alertCantOpenOutputZipFileForWritingMessage" = "No se pudo abrir el archivo zip para escribir.";
|
||||
|
||||
"alertBadArchiveTitle" = "No se pudo leer el archivo zip";
|
||||
"alertBadArchiveMessage" = "Archivo zip erróneo o corrupto.";
|
||||
|
||||
"alertNoTunnelsToExportTitle" = "Nada para exportar";
|
||||
"settingsSectionTitleAbout" = "About";
|
||||
"macMenuDeleteSelected" = "Delete Selected";
|
||||
"alertSystemErrorMessageTunnelConfigurationInvalid" = "The configuration is invalid.";
|
||||
"alertNoTunnelsToExportMessage" = "No hay túneles para exportar";
|
||||
|
||||
"alertNoTunnelsInImportedZipArchiveTitle" = "No hay túneles en el archivo zip";
|
||||
|
||||
// Tunnel management error alerts
|
||||
|
||||
"alertTunnelActivationFailureTitle" = "Fallo en la activación";
|
||||
"alertTunnelActivationFailureMessage" = "El túnel no pudo ser activado. Por favor, asegúrese de estar conectado a Internet.";
|
||||
"alertTunnelActivationSavedConfigFailureMessage" = "No se ha podido recuperar la información del túnel de la configuración guardada.";
|
||||
|
||||
"alertTunnelDNSFailureTitle" = "Fallo en resolución DNS";
|
||||
"alertSystemErrorOnAddTunnelTitle" = "No se pudo crear el túnel";
|
||||
"alertSystemErrorOnModifyTunnelTitle" = "No se pudo modificar el túnel";
|
||||
"alertSystemErrorOnRemoveTunnelTitle" = "No se pudo eliminar el túnel";
|
||||
|
||||
/* The alert message for this alert shall include
|
||||
one of the alertSystemErrorMessage* listed further down */
|
||||
"alertTunnelActivationSystemErrorTitle" = "Fallo en la activación";
|
||||
"alertTunnelActivationSystemErrorMessage (%@)" = "No se pudo activar el túnel. %@";
|
||||
|
||||
/* alertSystemErrorMessage* messages */
|
||||
"alertSystemErrorMessageTunnelConfigurationInvalid" = "La configuración es inválida.";
|
||||
"alertSystemErrorMessageTunnelConfigurationDisabled" = "La configuración está desactivada.";
|
||||
"alertSystemErrorMessageTunnelConnectionFailed" = "La conexión ha fallado.";
|
||||
"alertSystemErrorMessageTunnelConfigurationUnknown" = "Error desconocido de sistema.";
|
||||
|
||||
"macMenuTitle" = "WireGuard";
|
||||
"macMenuManageTunnels" = "Gestionar túneles";
|
||||
"macMenuImportTunnels" = "Importar túnel(es) desde archivo";
|
||||
"macMenuViewLog" = "Ver registro";
|
||||
"macMenuAbout" = "Acerca de WireGuard";
|
||||
"macMenuQuit" = "Salir de WireGuard";
|
||||
|
||||
"macMenuHideApp" = "Ocultar WireGuard";
|
||||
"macMenuShowAllApps" = "Mostrar todo";
|
||||
|
||||
"macMenuFile" = "Archivo";
|
||||
"macMenuCloseWindow" = "Cerrar Ventana";
|
||||
|
||||
"macMenuEdit" = "Editar";
|
||||
"macMenuCut" = "Cortar";
|
||||
"macMenuCopy" = "Copiar";
|
||||
"macMenuPaste" = "Pegar";
|
||||
"macMenuSelectAll" = "Seleccionar todo";
|
||||
|
||||
"macMenuTunnel" = "Túnel";
|
||||
"macMenuToggleStatus" = "Cambiar estado";
|
||||
"macMenuEditTunnel" = "Editar…";
|
||||
"macMenuDeleteSelected" = "Eliminar elementos seleccionados";
|
||||
|
||||
"macMenuWindow" = "Ventana";
|
||||
"macMenuMinimize" = "Minimizar";
|
||||
|
||||
// Mac manage tunnels window
|
||||
|
||||
"macWindowTitleManageTunnels" = "Gestionar Túneles WireGuard";
|
||||
|
||||
"macDeleteTunnelConfirmationAlertMessage (%@)" = "¿Estás seguro que deseas eliminar \"%@\"?";
|
||||
"macDeleteMultipleTunnelsConfirmationAlertMessage (%d)" = "¿Está seguro que desea eliminar %d túneles?";
|
||||
"macDeleteTunnelConfirmationAlertInfo" = "No puedes deshacer esta acción.";
|
||||
"macDeleteTunnelConfirmationAlertButtonTitleDelete" = "Eliminar";
|
||||
"macDeleteTunnelConfirmationAlertButtonTitleCancel" = "Cancelar";
|
||||
"macDeleteTunnelConfirmationAlertButtonTitleDeleting" = "Eliminando…";
|
||||
|
||||
"macButtonImportTunnels" = "Importar túnel(es) desde archivo";
|
||||
"macSheetButtonImport" = "Importar";
|
||||
|
||||
"macNameFieldExportLog" = "Guardar registro en:";
|
||||
"macSheetButtonExportLog" = "Guardar";
|
||||
|
||||
"macNameFieldExportZip" = "Exportar túneles a:";
|
||||
"macSheetButtonExportZip" = "Guardar";
|
||||
|
||||
"macButtonDeleteTunnels (%d)" = "Eliminar %d túneles";
|
||||
|
||||
"macButtonEdit" = "Editar";
|
||||
"macFieldOnDemand" = "Bajo demanda:";
|
||||
"macFieldOnDemandSSIDs" = "SSIDs:";
|
||||
|
||||
// Mac status display
|
||||
|
||||
"macStatus (%@)" = "Estado: %@";
|
||||
|
||||
// Mac editing config
|
||||
|
||||
"macEditDiscard" = "Descartar";
|
||||
"macEditSave" = "Guardar";
|
||||
"macAlertDNSInvalid (%@)" = "El DNS ‘%@’ no es válido.";
|
||||
|
||||
"macAlertPublicKeyInvalid" = "La Clave pública no es válida";
|
||||
"macAlertPreSharedKeyInvalid" = "La clave compartida no es válida";
|
||||
"macAlertEndpointInvalid (%@)" = "Endpoint ‘%@’ no es válido";
|
||||
"macAlertPersistentKeepliveInvalid (%@)" = "El valor keepalive persistente '%@' no es válido";
|
||||
"macAlertInfoUnrecognizedPeerKey" = "Las claves válidas son: ‘PublicKey’, ‘PresharedKey’, ‘AllowedIPs’, ‘Endpoint’ y ‘PersistentKeepalive’";
|
||||
"macConfirmAndQuitAlertQuitWireGuard" = "Salir de WireGuard";
|
||||
"macConfirmAndQuitAlertCloseWindow" = "Cerrar Gestor de túneles";
|
||||
|
||||
// Mac tooltip
|
||||
|
||||
"macToolTipEditTunnel" = "Editar túnel (⌘E)";
|
||||
"macToolTipToggleStatus" = "Cambiar estado (⌘T)";
|
||||
|
||||
// Mac log view
|
||||
|
||||
"macLogColumnTitleTime" = "Tiempo";
|
||||
"macLogColumnTitleLogMessage" = "Mensaje de registro";
|
||||
"macLogButtonTitleClose" = "Cerrar";
|
||||
"macLogButtonTitleSave" = "Guardar…";
|
||||
|
||||
// Mac unusable tunnel view
|
||||
|
||||
"macUnusableTunnelMessage" = "La configuración de este túnel no se encuentra en el llavero.";
|
||||
"macUnusableTunnelButtonTitleDeleteTunnel" = "Eliminar túnel";
|
||||
|
||||
// Mac App Store updating alert
|
||||
|
||||
"macAppStoreUpdatingAlertMessage" = "App Store desea actualizar WireGuard";
|
||||
|
||||
// Donation
|
||||
|
||||
"donateLink" = "♥ Donar al Proyecto WireGuard";
|
||||
"macAlertNoInterface" = "Configuration must have an ‘Interface’ section.";
|
||||
"macNameFieldExportZip" = "Export tunnels to:";
|
||||
"alertSystemErrorMessageTunnelConfigurationUnknown" = "Unknown system error.";
|
||||
"macMenuCut" = "Cut";
|
||||
"macEditDiscard" = "Discard";
|
||||
"alertScanQRCodeCameraUnsupportedMessage" = "This device is not able to scan QR codes";
|
||||
"macSheetButtonExportZip" = "Save";
|
||||
"macWindowTitleManageTunnels" = "Manage WireGuard Tunnels";
|
||||
"macConfirmAndQuitAlertInfo" = "If you close the tunnels manager, WireGuard will continue to be available from the menu bar icon.";
|
||||
"macUnusableTunnelInfo" = "In case this tunnel was created by another user, only that user can view, edit, or activate this tunnel.";
|
||||
"alertTunnelActivationErrorTunnelIsNotInactiveMessage" = "The tunnel is already active or in the process of being activated";
|
||||
"alertTunnelActivationSetNetworkSettingsMessage" = "Unable to apply network settings to tunnel object.";
|
||||
"macMenuExportTunnels" = "Export Tunnels to Zip…";
|
||||
"macMenuShowAllApps" = "Show All";
|
||||
"alertCantOpenInputConfFileTitle" = "Unable to import from file";
|
||||
"alertScanQRCodeInvalidQRCodeMessage" = "The scanned QR code is not a valid WireGuard configuration";
|
||||
"macMenuHideApp" = "Hide WireGuard";
|
||||
"settingsViewTitle" = "Settings";
|
||||
"macDeleteTunnelConfirmationAlertInfo" = "You cannot undo this action.";
|
||||
"macDeleteTunnelConfirmationAlertButtonTitleDeleting" = "Deleting…";
|
||||
"settingsViewLogButtonTitle" = "View log";
|
||||
"alertSystemErrorMessageTunnelConnectionFailed" = "The connection failed.";
|
||||
"macButtonEdit" = "Edit";
|
||||
"macAlertPublicKeyInvalid" = "Public key is invalid";
|
||||
"macNameFieldExportLog" = "Save log to:";
|
||||
"alertSystemErrorOnAddTunnelTitle" = "Unable to create tunnel";
|
||||
"macConfirmAndQuitAlertMessage" = "Do you want to close the tunnels manager or quit WireGuard entirely?";
|
||||
"alertTunnelActivationSavedConfigFailureMessage" = "Unable to retrieve tunnel information from the saved configuration.";
|
||||
"macAlertInfoUnrecognizedInterfaceKey" = "Valid keys are: ‘PrivateKey’, ‘ListenPort’, ‘Address’, ‘DNS’ and ‘MTU’.";
|
||||
"macLogColumnTitleTime" = "Time";
|
||||
"alertTunnelNameEmptyMessage" = "Cannot create tunnel with an empty name";
|
||||
"alertTunnelNameEmptyTitle" = "No name provided";
|
||||
"alertUnableToWriteLogMessage" = "Unable to write logs to file";
|
||||
"macMenuQuit" = "Quit WireGuard";
|
||||
"macMenuAddEmptyTunnel" = "Add Empty Tunnel…";
|
||||
"macDeleteTunnelConfirmationAlertButtonTitleDelete" = "Delete";
|
||||
"alertTunnelActivationFailureOnDemandAddendum" = " This tunnel has Activate On Demand enabled, so this tunnel might be re-activated automatically by the OS. You may turn off Activate On Demand in this app by editing the tunnel configuration.";
|
||||
"alertTunnelActivationFailureTitle" = "Activation failure";
|
||||
"macLogButtonTitleClose" = "Close";
|
||||
"settingsExportZipButtonTitle" = "Export zip archive";
|
||||
"macViewPrivateData" = "view tunnel private keys";
|
||||
"alertTunnelActivationErrorTunnelIsNotInactiveTitle" = "Activation in progress";
|
||||
"macAppExitingWithActiveTunnelInfo" = "The tunnel will remain active after exiting. You may disable it by reopening this application or through the Network panel in System Preferences.";
|
||||
"macMenuEdit" = "Edit";
|
||||
"donateLink" = "♥ Donate to the WireGuard Project";
|
||||
"alertScanQRCodeCameraUnsupportedTitle" = "Camera Unsupported";
|
||||
"macMenuWindow" = "Window";
|
||||
"alertTunnelActivationFailureMessage" = "The tunnel could not be activated. Please ensure that you are connected to the Internet.";
|
||||
"macMenuHideOtherApps" = "Hide Others";
|
||||
"alertCantOpenInputZipFileMessage" = "The zip archive could not be read.";
|
||||
"macAlertPrivateKeyInvalid" = "Private key is invalid.";
|
||||
"macDeleteTunnelConfirmationAlertButtonTitleCancel" = "Cancel";
|
||||
"alertSystemErrorMessageTunnelConfigurationDisabled" = "The configuration is disabled.";
|
||||
"alertUnableToWriteLogTitle" = "Log export failed";
|
||||
"macMenuNetworksNone" = "Networks: None";
|
||||
"alertCantOpenOutputZipFileForWritingMessage" = "Could not open zip file for writing.";
|
||||
"macMenuSelectAll" = "Select All";
|
||||
"logViewTitle" = "Log";
|
||||
"macConfirmAndQuitAlertQuitWireGuard" = "Quit WireGuard";
|
||||
"alertSystemErrorOnRemoveTunnelTitle" = "Unable to remove tunnel";
|
||||
"macFieldOnDemand" = "On-Demand:";
|
||||
"macMenuCloseWindow" = "Close Window";
|
||||
"macSheetButtonExportLog" = "Save";
|
||||
"alertSystemErrorOnModifyTunnelTitle" = "Unable to modify tunnel";
|
||||
"alertSystemErrorMessageTunnelConfigurationReadWriteFailed" = "Reading or writing the configuration failed.";
|
||||
"macMenuEditTunnel" = "Edit…";
|
||||
"settingsSectionTitleTunnelLog" = "Log";
|
||||
"macMenuManageTunnels" = "Manage Tunnels";
|
||||
"macButtonImportTunnels" = "Import tunnel(s) from file";
|
||||
"macAppExitingWithActiveTunnelMessage" = "WireGuard is exiting with an active tunnel";
|
||||
"alertSystemErrorMessageTunnelConfigurationStale" = "The configuration is stale.";
|
||||
"alertTunnelDNSFailureMessage" = "One or more endpoint domains could not be resolved.";
|
||||
"alertNoTunnelsInImportedZipArchiveTitle" = "No tunnels in zip archive";
|
||||
"alertTunnelDNSFailureTitle" = "DNS resolution failure";
|
||||
"macLogButtonTitleSave" = "Save…";
|
||||
"macMenuToggleStatus" = "Toggle Status";
|
||||
"macMenuMinimize" = "Minimize";
|
||||
"alertCantOpenInputZipFileTitle" = "Unable to read zip archive";
|
||||
"alertScanQRCodeUnreadableQRCodeMessage" = "The scanned code could not be read";
|
||||
"alertScanQRCodeUnreadableQRCodeTitle" = "Invalid Code";
|
||||
"alertSystemErrorOnListingTunnelsTitle" = "Unable to list tunnels";
|
||||
"settingsVersionKeyWireGuardForIOS" = "WireGuard for iOS";
|
||||
"macMenuPaste" = "Paste";
|
||||
"macAlertMultipleInterfaces" = "Configuration must have only one ‘Interface’ section.";
|
||||
"macAppStoreUpdatingAlertMessage" = "App Store would like to update WireGuard";
|
||||
"macUnusableTunnelMessage" = "The configuration for this tunnel cannot be found in the keychain.";
|
||||
"macToolTipEditTunnel" = "Edit tunnel (⌘E)";
|
||||
"macMenuZoom" = "Zoom";
|
||||
"alertBadArchiveTitle" = "Unable to read zip archive";
|
||||
"macExportPrivateData" = "export tunnel private keys";
|
||||
"alertTunnelAlreadyExistsWithThatNameTitle" = "Name already exists";
|
||||
"iosViewPrivateData" = "Authenticate to view tunnel private keys.";
|
||||
"macAlertPreSharedKeyInvalid" = "Preshared key is invalid";
|
||||
"macEditSave" = "Save";
|
||||
"macConfirmAndQuitAlertCloseWindow" = "Close Tunnels Manager";
|
||||
"macMenuFile" = "File";
|
||||
"macToolTipToggleStatus" = "Toggle status (⌘T)";
|
||||
"alertTunnelActivationSystemErrorTitle" = "Activation failure";
|
||||
"scanQRCodeTipText" = "Tip: Generate with `qrencode -t ansiutf8 < tunnel.conf`";
|
||||
"alertNoTunnelsToExportMessage" = "There are no tunnels to export";
|
||||
"macMenuImportTunnels" = "Import Tunnel(s) from File…";
|
||||
"alertScanQRCodeInvalidQRCodeTitle" = "Invalid QR Code";
|
||||
"macMenuViewLog" = "View Log";
|
||||
"macAlertInfoUnrecognizedPeerKey" = "Valid keys are: ‘PublicKey’, ‘PresharedKey’, ‘AllowedIPs’, ‘Endpoint’ and ‘PersistentKeepalive’";
|
||||
"macUnusableTunnelButtonTitleDeleteTunnel" = "Delete tunnel";
|
||||
"macMenuTunnel" = "Tunnel";
|
||||
"macMenuCopy" = "Copy";
|
||||
"macTunnelsMenuTitle" = "Tunnels";
|
||||
"alertTunnelAlreadyExistsWithThatNameMessage" = "A tunnel with that name already exists";
|
||||
"macLogColumnTitleLogMessage" = "Log message";
|
||||
"iosExportPrivateData" = "Authenticate to export tunnel private keys.";
|
||||
"macMenuAbout" = "About WireGuard";
|
||||
"macSheetButtonImport" = "Import";
|
||||
"alertScanQRCodeNamePromptTitle" = "Please name the scanned tunnel";
|
||||
"alertUnableToRemovePreviousLogMessage" = "The pre-existing log could not be cleared";
|
||||
"alertTunnelActivationBackendFailureMessage" = "Unable to turn on Go backend library.";
|
||||
"settingsSectionTitleExportConfigurations" = "Export configurations";
|
||||
"alertBadArchiveMessage" = "Bad or corrupt zip archive.";
|
||||
"settingsVersionKeyWireGuardGoBackend" = "WireGuard Go Backend";
|
||||
"macFieldOnDemandSSIDs" = "SSIDs:";
|
||||
"alertCantOpenOutputZipFileForWritingTitle" = "Unable to create zip archive";
|
||||
"alertNoTunnelsInImportedZipArchiveMessage" = "No .conf tunnel files were found inside the zip archive.";
|
||||
"alertTunnelActivationFileDescriptorFailureMessage" = "Unable to determine TUN device file descriptor.";
|
||||
"macAlertNameIsEmpty" = "Name is required";
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
// Copyright © 2018-2019 WireGuard LLC. All Rights Reserved.
|
||||
// Copyright © 2018-2020 WireGuard LLC. All Rights Reserved.
|
||||
// Generic alert action names
|
||||
|
||||
|
||||
@@ -389,6 +389,7 @@
|
||||
"macUnusableTunnelMessage" = "The configuration for this tunnel cannot be found in the keychain.";
|
||||
"iosViewPrivateData" = "Authenticate to view tunnel private keys.";
|
||||
"macToolTipToggleStatus" = "Toggle status (⌘T)";
|
||||
"macTunnelsMenuTitle" = "Tunnels";
|
||||
"scanQRCodeTipText" = "Tip: Generate with `qrencode -t ansiutf8 < tunnel.conf`";
|
||||
"macAlertInfoUnrecognizedPeerKey" = "Valid keys are: ‘PublicKey’, ‘PresharedKey’, ‘AllowedIPs’, ‘Endpoint’ and ‘PersistentKeepalive’";
|
||||
"alertInvalidPeerMessageAllowedIPsInvalid" = "Peer’s allowed IPs must be a list of comma-separated IP addresses, optionally in CIDR notation";
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
// Copyright © 2018-2019 WireGuard LLC. All Rights Reserved.
|
||||
// Copyright © 2018-2020 WireGuard LLC. All Rights Reserved.
|
||||
// Generic alert action names
|
||||
|
||||
|
||||
@@ -12,20 +12,103 @@
|
||||
"tunnelsListTitle" = "WireGuard";
|
||||
"tunnelsListSettingsButtonTitle" = "Asetukset";
|
||||
"tunnelsListCenteredAddTunnelButtonTitle" = "Lisää tunneli";
|
||||
"tunnelsListSwipeDeleteButtonTitle" = "Poista";
|
||||
"tunnelsListSelectButtonTitle" = "Valitse";
|
||||
"tunnelsListSelectAllButtonTitle" = "Valitse kaikki";
|
||||
"tunnelsListDeleteButtonTitle" = "Poista";
|
||||
"tunnelsListSelectedTitle (%d)" = "%d poistettu";
|
||||
|
||||
// Tunnels list menu
|
||||
|
||||
"addTunnelMenuHeader" = "Lisää uusi WireGuard tunneli";
|
||||
"addTunnelMenuImportFile" = "Luo tiedostosta tai arkistosta";
|
||||
"addTunnelMenuQRCode" = "Luo QR-koodista";
|
||||
"addTunnelMenuFromScratch" = "Luo alusta";
|
||||
|
||||
// Tunnels list alerts
|
||||
|
||||
"alertImportedFromMultipleFilesTitle (%d)" = "Luotu %d tunnelia";
|
||||
"alertImportedFromMultipleFilesMessage (%1$d of %2$d)" = "Luotu %1$d / %2$d tunnelia tuoduista tiedostoista";
|
||||
|
||||
"alertImportedFromZipTitle (%d)" = "Luotu %d tunnelia";
|
||||
"alertImportedFromZipMessage (%1$d of %2$d)" = "Luotu %1$d / %2$d tunnelia zip-arkistosta";
|
||||
|
||||
"alertBadConfigImportTitle" = "Tunnelia ei voitu tuoda";
|
||||
"alertBadConfigImportMessage (%@)" = "Tiedosto ”%@” ei sisällä kelvollista WireGuard konfiguraatiota";
|
||||
|
||||
"deleteTunnelsConfirmationAlertButtonTitle" = "Poista";
|
||||
"deleteTunnelConfirmationAlertButtonMessage (%d)" = "Poista %d tunneli?";
|
||||
"deleteTunnelsConfirmationAlertButtonMessage (%d)" = "Poista %d tunnelit?";
|
||||
|
||||
// Tunnel detail and edit UI
|
||||
|
||||
"newTunnelViewTitle" = "Uusi konfiguraatio";
|
||||
"editTunnelViewTitle" = "Muokkaa konfiguraatiota";
|
||||
|
||||
"tunnelSectionTitleStatus" = "Tila";
|
||||
|
||||
"tunnelStatusInactive" = "Ei aktiivinen";
|
||||
"tunnelStatusActivating" = "Aktivoidaan";
|
||||
"tunnelStatusActive" = "Aktiivinen";
|
||||
"tunnelStatusDeactivating" = "Deaktivoidaan";
|
||||
"tunnelStatusReasserting" = "Aktivoidaan uudelleen";
|
||||
"tunnelStatusRestarting" = "Käynnistetään uudelleen";
|
||||
"tunnelStatusWaiting" = "Odotetaan";
|
||||
|
||||
"macToggleStatusButtonActivate" = "Aktivoi";
|
||||
"macToggleStatusButtonActivating" = "Aktivoidaan…";
|
||||
"macToggleStatusButtonDeactivate" = "Deaktivoi";
|
||||
"macToggleStatusButtonDeactivating" = "Deaktivoidaan…";
|
||||
"macToggleStatusButtonReasserting" = "Aktivoidaan uudelleen…";
|
||||
"macToggleStatusButtonRestarting" = "Käynnistetään uudelleen…";
|
||||
"macToggleStatusButtonWaiting" = "Odotetaan…";
|
||||
|
||||
"tunnelSectionTitleInterface" = "Liittymä";
|
||||
|
||||
"tunnelInterfaceName" = "Nimi";
|
||||
"tunnelInterfacePrivateKey" = "Yksityinen avain";
|
||||
"tunnelInterfacePublicKey" = "Julkinen avain";
|
||||
"tunnelInterfaceGenerateKeypair" = "Luo avainpari";
|
||||
"tunnelInterfaceAddresses" = "Osoitteet";
|
||||
"tunnelInterfaceListenPort" = "Kuuntele porttia";
|
||||
"tunnelInterfaceMTU" = "MTU";
|
||||
"tunnelInterfaceDNS" = "DNS palvelimet";
|
||||
"tunnelInterfaceStatus" = "Tila";
|
||||
|
||||
"tunnelSectionTitlePeer" = "Osapuoli";
|
||||
|
||||
"tunnelPeerPublicKey" = "Julkinen avain";
|
||||
"tunnelPeerPreSharedKey" = "Jaettu avain";
|
||||
"tunnelPeerEndpoint" = "Päätepiste";
|
||||
"tunnelPeerPersistentKeepalive" = "Jatkuva keepalive";
|
||||
"tunnelPeerAllowedIPs" = "Sallitut IP-osoitteet";
|
||||
"tunnelPeerRxBytes" = "Data vastaanotettu";
|
||||
"tunnelPeerTxBytes" = "Data lähetetty";
|
||||
"tunnelPeerLastHandshakeTime" = "Viimeisin kättely";
|
||||
"tunnelPeerExcludePrivateIPs" = "Jätä pois yksityiset IP-osoitteet";
|
||||
|
||||
"tunnelSectionTitleOnDemand" = "Automaattinen käyttöönotto";
|
||||
|
||||
"tunnelOnDemandCellular" = "Matkapuhelinverkko";
|
||||
"tunnelOnDemandEthernet" = "Ethernet";
|
||||
"tunnelOnDemandWiFi" = "Wi-Fi";
|
||||
"tunnelOnDemandSSIDsKey" = "SSID:t";
|
||||
|
||||
"tunnelOnDemandAnySSID" = "Mikä tahansa SSID";
|
||||
"tunnelOnDemandOnlyTheseSSIDs" = "Vain nämä SSID:t";
|
||||
"tunnelOnDemandExceptTheseSSIDs" = "Poislukien SSID:t";
|
||||
"tunnelOnDemandOnlySSID (%d)" = "Vain %d SSID";
|
||||
"tunnelOnDemandOnlySSIDs (%d)" = "Vain %d SSID:t";
|
||||
"tunnelOnDemandExceptSSID (%d)" = "Kaikki paitsi %d SSID";
|
||||
"tunnelOnDemandExceptSSIDs (%d)" = "Kaikki paitsi %d SSID:t";
|
||||
"tunnelOnDemandSSIDOptionDescriptionMac (%1$@: %2$@)" = "%1$@: %2$@";
|
||||
|
||||
"tunnelOnDemandSSIDViewTitle" = "SSID:t";
|
||||
"tunnelOnDemandSectionTitleSelectedSSIDs" = "SSID:t";
|
||||
"tunnelOnDemandNoSSIDs" = "Ei SSID-tietoja";
|
||||
"tunnelOnDemandSectionTitleAddSSIDs" = "Lisää SSID-tietoja";
|
||||
"tunnelOnDemandAddMessageAddConnectedSSID (%@)" = "Lisää yhdistetty: %@";
|
||||
"tunnelOnDemandAddMessageAddNewSSID" = "Lisää uusi";
|
||||
|
||||
"tunnelOnDemandKey" = "Tarvittaessa";
|
||||
"tunnelOnDemandOptionOff" = "Pois päältä";
|
||||
@@ -35,6 +118,12 @@
|
||||
"tunnelOnDemandOptionWiFiOrEthernet" = "Wi-Fi tai Ethernet";
|
||||
"tunnelOnDemandOptionEthernetOnly" = "Vain Ethernet";
|
||||
|
||||
"addPeerButtonTitle" = "Lisää toinen osapuoli";
|
||||
|
||||
"deletePeerButtonTitle" = "Poista osapuoli";
|
||||
"deletePeerConfirmationAlertButtonTitle" = "Poista";
|
||||
"deletePeerConfirmationAlertMessage" = "Poistetaanko tämä osapuoli?";
|
||||
|
||||
"deleteTunnelButtonTitle" = "Poista tunneli";
|
||||
"deleteTunnelConfirmationAlertButtonTitle" = "Poista";
|
||||
"deleteTunnelConfirmationAlertMessage" = "Poistetaanko tämä tunneli?";
|
||||
@@ -42,207 +131,273 @@
|
||||
"tunnelEditPlaceholderTextRequired" = "Pakollinen";
|
||||
"tunnelEditPlaceholderTextOptional" = "Valinnainen";
|
||||
"tunnelEditPlaceholderTextAutomatic" = "Automaattinen";
|
||||
"tunnelEditPlaceholderTextStronglyRecommended" = "Erittäin suositeltavaa";
|
||||
"tunnelEditPlaceholderTextOff" = "Pois päältä";
|
||||
|
||||
"tunnelPeerPersistentKeepaliveValue (%@)" = "joka %@ sekuntin välein";
|
||||
"tunnelHandshakeTimestampNow" = "Nyt";
|
||||
"settingsSectionTitleAbout" = "About";
|
||||
"newTunnelViewTitle" = "New configuration";
|
||||
"macMenuDeleteSelected" = "Delete Selected";
|
||||
"alertSystemErrorMessageTunnelConfigurationInvalid" = "The configuration is invalid.";
|
||||
"tunnelInterfaceDNS" = "DNS servers";
|
||||
"tunnelPeerEndpoint" = "Endpoint";
|
||||
"tunnelInterfaceMTU" = "MTU";
|
||||
"alertInvalidInterfaceMessageListenPortInvalid" = "Interface’s listen port must be between 0 and 65535, or unspecified";
|
||||
"addPeerButtonTitle" = "Add peer";
|
||||
"tunnelHandshakeTimestampSystemClockBackward" = "(System clock wound backwards)";
|
||||
"tunnelsListSwipeDeleteButtonTitle" = "Delete";
|
||||
"tunnelHandshakeTimestampSystemClockBackward" = "(Järjestelmän kello jättää)";
|
||||
"tunnelHandshakeTimestampAgo (%@)" = "%@ sitten";
|
||||
"tunnelHandshakeTimestampYear (%d)" = "%d vuosi";
|
||||
"tunnelHandshakeTimestampYears (%d)" = "%d vuotta";
|
||||
"tunnelHandshakeTimestampDay (%d)" = "%d päivä";
|
||||
"tunnelHandshakeTimestampDays (%d)" = "%d päivää";
|
||||
"tunnelHandshakeTimestampHour (%d)" = "%d tunti";
|
||||
"tunnelHandshakeTimestampHours (%d)" = "%d tuntia";
|
||||
"tunnelHandshakeTimestampMinute (%d)" = "%d minuutti";
|
||||
"tunnelHandshakeTimestampMinutes (%d)" = "%d minuuttia";
|
||||
"tunnelHandshakeTimestampSecond (%d)" = "%d sekunti";
|
||||
"tunnelHandshakeTimestampSeconds (%d)" = "%d sekuntia";
|
||||
|
||||
"tunnelHandshakeTimestampHours hh:mm:ss (%@)" = "%@ tuntia";
|
||||
"tunnelHandshakeTimestampMinutes mm:ss (%@)" = "%@ minuuttia";
|
||||
|
||||
"tunnelPeerPresharedKeyEnabled" = "käytössä";
|
||||
|
||||
// Error alerts while creating / editing a tunnel configuration
|
||||
/* Alert title for error in the interface data */
|
||||
|
||||
"alertInvalidInterfaceTitle" = "Virheellinen liittymä";
|
||||
|
||||
/* Any one of the following alert messages can go with the above title */
|
||||
"alertInvalidInterfaceMessageNameRequired" = "Sovittimen nimi vaadittu";
|
||||
"alertInvalidInterfaceMessagePrivateKeyRequired" = "Sovittimen yksityinen avain on vaadittu";
|
||||
"alertInvalidInterfaceMessagePrivateKeyInvalid" = "Sovittimen yksityinen avain on oltava 32-tavuinen avain base64 enkoodauksella";
|
||||
"alertInvalidInterfaceMessageAddressInvalid" = "Sovittimen osoitteet on oltava pilkulla erotettujen IP-osoitteiden luettelo, valinnaisesti CIDR-notaatiossa";
|
||||
"alertInvalidInterfaceMessageListenPortInvalid" = "Sovittimen kuunteluportin on tulee olla väliltä 0 - 65535, tai sen on oltava määrittelemätön";
|
||||
"alertInvalidInterfaceMessageMTUInvalid" = "Sovittimen MTU on oltava väliltä 576 - 65535, tai sen on oltava määrittelemätön";
|
||||
"alertInvalidInterfaceMessageDNSInvalid" = "Sovittimen DNS-palvelimien on oltava lista pilkulla erotettu IP-osoitteita";
|
||||
|
||||
/* Alert title for error in the peer data */
|
||||
"alertInvalidPeerTitle" = "Virheellinen osapuoli";
|
||||
|
||||
/* Any one of the following alert messages can go with the above title */
|
||||
"alertInvalidPeerMessagePublicKeyRequired" = "Osapuolen julkinen avain on vaadittu";
|
||||
"alertInvalidPeerMessagePublicKeyInvalid" = "Osapuolen julkinen avain on oltava 32-tavuinen avain base64 -enkoodauksella";
|
||||
"alertInvalidPeerMessagePreSharedKeyInvalid" = "Osapuolen jaettu avain on oltava 32-tavuinen avain base64 -enkoodauksella";
|
||||
"alertInvalidPeerMessageAllowedIPsInvalid" = "Toisen osapuolen sallittujen IP-osoitteiden on oltava pilkulla erotettujen IP-osoitteiden luettelo, valinnaisesti CIDR-notaatiossa";
|
||||
"alertInvalidPeerMessageEndpointInvalid" = "Käyttäjän päätepisteen on oltava muotoa ”host:port” tai ”[host]:port”";
|
||||
"alertInvalidPeerMessagePersistentKeepaliveInvalid" = "Käyttäjän pysyvän keepalivin on oltava välillä 0–65535 tai määrittelemätön";
|
||||
"alertInvalidPeerMessagePublicKeyDuplicated" = "Kahdella tai useammalla osapuolella ei voi olla samaa julkista avainta";
|
||||
|
||||
// Scanning QR code UI
|
||||
|
||||
"scanQRCodeViewTitle" = "Skannaa QR-koodi";
|
||||
"scanQRCodeTipText" = "Vihje: Luo käyttämällä `qrencode -t ansiutf8 < tunnel.conf`";
|
||||
|
||||
// Scanning QR code alerts
|
||||
|
||||
"alertScanQRCodeCameraUnsupportedTitle" = "Kameraa ei tuettu";
|
||||
"alertScanQRCodeCameraUnsupportedMessage" = "Tämä laite ei pysty skannaamaan QR-koodeja";
|
||||
|
||||
"alertScanQRCodeInvalidQRCodeTitle" = "Virheellinen QR-koodi";
|
||||
|
||||
"alertScanQRCodeUnreadableQRCodeTitle" = "Virheellinen koodi";
|
||||
|
||||
// Settings UI
|
||||
|
||||
"settingsViewTitle" = "Asetukset";
|
||||
|
||||
"settingsSectionTitleAbout" = "Tietoa";
|
||||
"settingsVersionKeyWireGuardForIOS" = "WireGuard iOS:lle";
|
||||
"settingsVersionKeyWireGuardGoBackend" = "WireGuard Go -moottori";
|
||||
|
||||
"settingsSectionTitleTunnelLog" = "Loki";
|
||||
"settingsViewLogButtonTitle" = "Näytä loki";
|
||||
|
||||
// Log view
|
||||
|
||||
"logViewTitle" = "Loki";
|
||||
"alertBadArchiveMessage" = "Huono tai korruptoitunut zip arkisto.";
|
||||
|
||||
"alertNoTunnelsToExportTitle" = "Ei mitään vietävää";
|
||||
"alertNoTunnelsToExportMessage" = "Vietäviä tunneleita ei ole";
|
||||
|
||||
"alertNoTunnelsInImportedZipArchiveTitle" = "Zip arkistossa ei ole tunneleita";
|
||||
|
||||
// Tunnel management error alerts
|
||||
|
||||
"alertTunnelActivationFailureTitle" = "Aktivointi epäonnistui";
|
||||
|
||||
"alertTunnelNameEmptyTitle" = "Nimeä ei annettu lainkaan";
|
||||
|
||||
"alertTunnelAlreadyExistsWithThatNameTitle" = "Nimi on jo käytössä";
|
||||
|
||||
"alertTunnelActivationErrorTunnelIsNotInactiveTitle" = "Aktivointi käynnissä";
|
||||
|
||||
// Tunnel management error alerts on system error
|
||||
/* The alert message that goes with the following titles would be
|
||||
one of the alertSystemErrorMessage* listed further down */
|
||||
|
||||
"alertSystemErrorOnListingTunnelsTitle" = "Tunneleita ei voitu listata";
|
||||
"alertSystemErrorOnAddTunnelTitle" = "Tunnelia ei voitu luoda";
|
||||
|
||||
/* The alert message for this alert shall include
|
||||
one of the alertSystemErrorMessage* listed further down */
|
||||
"alertTunnelActivationSystemErrorTitle" = "Aktivointi epäonnistui";
|
||||
|
||||
/* alertSystemErrorMessage* messages */
|
||||
"alertSystemErrorMessageTunnelConfigurationInvalid" = "Konfiguraatio ei kelpaa.";
|
||||
"alertSystemErrorMessageTunnelConnectionFailed" = "Yhteys epäonnistui.";
|
||||
"alertSystemErrorMessageTunnelConfigurationReadWriteFailed" = "Konfiguraation lukeminen tai kirjoittaminen epäonnistui.";
|
||||
"alertSystemErrorMessageTunnelConfigurationUnknown" = "Tuntematon järjestelmävirhe.";
|
||||
|
||||
// Mac status bar menu / pulldown menu / main menu
|
||||
|
||||
"macMenuNetworks (%@)" = "Verkot: %@";
|
||||
"macMenuNetworksNone" = "Verkot: Ei mitään";
|
||||
|
||||
"macMenuTitle" = "WireGuard";
|
||||
"macMenuManageTunnels" = "Hallitse tunneleita";
|
||||
"macMenuImportTunnels" = "Tuo tunneli(t) tiedostosta…";
|
||||
"macMenuAddEmptyTunnel" = "Lisää tyhjä tunneli…";
|
||||
"macMenuViewLog" = "Näytä loki";
|
||||
"macMenuExportTunnels" = "Vie tunnelit Zippinä…";
|
||||
"macMenuAbout" = "Tietoa WireGuardista";
|
||||
"macMenuQuit" = "Sulje WireGuard";
|
||||
|
||||
"macMenuHideApp" = "Piilota WireGuard";
|
||||
"macMenuHideOtherApps" = "Piilota muut";
|
||||
"macMenuShowAllApps" = "Näytä kaikki";
|
||||
|
||||
"macMenuFile" = "Tiedosto";
|
||||
"macMenuCloseWindow" = "Sulje ikkuna";
|
||||
|
||||
"macMenuEdit" = "Muokkaa";
|
||||
"macMenuCut" = "Leikkaa";
|
||||
"macMenuCopy" = "Kopioi";
|
||||
"macMenuPaste" = "Liitä";
|
||||
"macMenuSelectAll" = "Valitse kaikki";
|
||||
|
||||
"macMenuTunnel" = "Tunneli";
|
||||
"macMenuToggleStatus" = "Vaihda tilaa";
|
||||
"macMenuEditTunnel" = "Muokkaa…";
|
||||
"macMenuDeleteSelected" = "Poista valitut";
|
||||
|
||||
"macMenuWindow" = "Ikkuna";
|
||||
"macMenuMinimize" = "Pienennä";
|
||||
"macMenuZoom" = "Lähennä/Loitonna";
|
||||
|
||||
// Mac manage tunnels window
|
||||
|
||||
"macWindowTitleManageTunnels" = "Hallitse WireGuard tunneleita";
|
||||
|
||||
"macDeleteTunnelConfirmationAlertMessage (%@)" = "Oletko varma, että haluat poistaa \"%@\"?";
|
||||
"macDeleteMultipleTunnelsConfirmationAlertMessage (%d)" = "Haluatko varmasti poistaa %d kohdetta?";
|
||||
"macDeleteTunnelConfirmationAlertInfo" = "Tätä toimintoa ei voi peruuttaa.";
|
||||
"macDeleteTunnelConfirmationAlertButtonTitleDelete" = "Poista";
|
||||
"macDeleteTunnelConfirmationAlertButtonTitleCancel" = "Peruuta";
|
||||
"macDeleteTunnelConfirmationAlertButtonTitleDeleting" = "Poistetaan…";
|
||||
|
||||
"macButtonImportTunnels" = "Tuo tunneli(t) tiedostosta";
|
||||
"macSheetButtonImport" = "Tuo";
|
||||
|
||||
"macNameFieldExportLog" = "Tallenna loki kohteeseen:";
|
||||
"macSheetButtonExportLog" = "Tallenna";
|
||||
|
||||
"macNameFieldExportZip" = "Vie tunnelit kohteeseen:";
|
||||
"macSheetButtonExportZip" = "Tallenna";
|
||||
|
||||
"macButtonDeleteTunnels (%d)" = "Poista %d tunnelia";
|
||||
|
||||
"macButtonEdit" = "Muokkaa";
|
||||
"macFieldOnDemand" = "Tarvittaessa:";
|
||||
"macFieldOnDemandSSIDs" = "SSIDt:";
|
||||
|
||||
// Mac status display
|
||||
|
||||
"macStatus (%@)" = "Tila: %@";
|
||||
|
||||
// Mac editing config
|
||||
|
||||
"macEditDiscard" = "Hylkää";
|
||||
"macEditSave" = "Tallenna";
|
||||
|
||||
"macAlertNameIsEmpty" = "Nimi on pakollinen";
|
||||
"macAlertPrivateKeyInvalid" = "Yksityinen avain ei kelpaa.";
|
||||
"macAlertListenPortInvalid (%@)" = "Portti \"%@\" ei kelpaa.";
|
||||
"macAlertAddressInvalid (%@)" = "Osoite \"%@\" ei kelpaa.";
|
||||
"macAlertDNSInvalid (%@)" = "DNS ‘%@’ ei kelpaa.";
|
||||
"macAlertMTUInvalid (%@)" = "MTU ‘%@’ ei kelpaa.";
|
||||
|
||||
"macAlertPublicKeyInvalid" = "Julkinen avain ei kelpaa";
|
||||
"macAlertPreSharedKeyInvalid" = "Jaettu avain ei kelpaa";
|
||||
"macAlertAllowedIPInvalid (%@)" = "Sallitut IP-osoitteet %@\" eivät kelpaa";
|
||||
"macAlertEndpointInvalid (%@)" = "Päätepiste \"%@\" ei kelpaa";
|
||||
"macAlertPersistentKeepliveInvalid (%@)" = "Pysyvä keepalive arvo ‘%@’ ei kelpaa";
|
||||
|
||||
"macAlertUnrecognizedPeerKey (%@)" = "Osapuoli sisältää tunnistamattoman avaimen ”%@”";
|
||||
"macAlertInfoUnrecognizedPeerKey" = "Voimassa olevat avaimet ovat: ”PublicKey”, ”PresharedKey”, ”AllowedIPs”, ”Endpoint” ja ”PersistentKeepalive”";
|
||||
|
||||
// Mac about dialog
|
||||
|
||||
"macAppVersion (%@)" = "Sovelluksen versio: %@";
|
||||
"macGoBackendVersion (%@)" = "Go -moottorin versio: %@";
|
||||
"iosViewPrivateData" = "Todenna nähdäksesi tunnelin yksityiset avaimet.";
|
||||
"macConfirmAndQuitAlertQuitWireGuard" = "Sulje WireGuard";
|
||||
"macConfirmAndQuitAlertCloseWindow" = "Sulje tunneleiden hallinta";
|
||||
|
||||
// Mac tooltip
|
||||
|
||||
"macToolTipEditTunnel" = "Muokkaa tunnelia (⌘E)";
|
||||
|
||||
// Mac log view
|
||||
|
||||
"macLogColumnTitleTime" = "Aika";
|
||||
"macLogColumnTitleLogMessage" = "Lokiviesti";
|
||||
"macLogButtonTitleClose" = "Sulje";
|
||||
"macLogButtonTitleSave" = "Tallenna…";
|
||||
"macUnusableTunnelButtonTitleDeleteTunnel" = "Poista tunneli";
|
||||
|
||||
// Mac App Store updating alert
|
||||
|
||||
"macAppStoreUpdatingAlertMessage" = "App Store haluaa päivittää WireGuardin";
|
||||
|
||||
// Donation
|
||||
|
||||
"donateLink" = "♥ Lahjoita WireGuard projektille";
|
||||
"macAlertNoInterface" = "Configuration must have an ‘Interface’ section.";
|
||||
"macNameFieldExportZip" = "Export tunnels to:";
|
||||
"editTunnelViewTitle" = "Edit configuration";
|
||||
"alertSystemErrorMessageTunnelConfigurationUnknown" = "Unknown system error.";
|
||||
"macMenuCut" = "Cut";
|
||||
"macEditDiscard" = "Discard";
|
||||
"tunnelPeerPresharedKeyEnabled" = "enabled";
|
||||
"alertScanQRCodeCameraUnsupportedMessage" = "This device is not able to scan QR codes";
|
||||
"macSheetButtonExportZip" = "Save";
|
||||
"macWindowTitleManageTunnels" = "Manage WireGuard Tunnels";
|
||||
"macConfirmAndQuitAlertInfo" = "If you close the tunnels manager, WireGuard will continue to be available from the menu bar icon.";
|
||||
"macUnusableTunnelInfo" = "In case this tunnel was created by another user, only that user can view, edit, or activate this tunnel.";
|
||||
"alertTunnelActivationErrorTunnelIsNotInactiveMessage" = "The tunnel is already active or in the process of being activated";
|
||||
"macToggleStatusButtonReasserting" = "Reactivating…";
|
||||
"alertTunnelActivationSetNetworkSettingsMessage" = "Unable to apply network settings to tunnel object.";
|
||||
"macMenuExportTunnels" = "Export Tunnels to Zip…";
|
||||
"macMenuShowAllApps" = "Show All";
|
||||
"alertCantOpenInputConfFileTitle" = "Unable to import from file";
|
||||
"alertScanQRCodeInvalidQRCodeMessage" = "The scanned QR code is not a valid WireGuard configuration";
|
||||
"macMenuHideApp" = "Hide WireGuard";
|
||||
"settingsViewTitle" = "Settings";
|
||||
"tunnelsListSelectAllButtonTitle" = "Select All";
|
||||
"macDeleteTunnelConfirmationAlertInfo" = "You cannot undo this action.";
|
||||
"macDeleteTunnelConfirmationAlertButtonTitleDeleting" = "Deleting…";
|
||||
"tunnelPeerPersistentKeepalive" = "Persistent keepalive";
|
||||
"settingsViewLogButtonTitle" = "View log";
|
||||
"alertSystemErrorMessageTunnelConnectionFailed" = "The connection failed.";
|
||||
"macButtonEdit" = "Edit";
|
||||
"macAlertPublicKeyInvalid" = "Public key is invalid";
|
||||
"macNameFieldExportLog" = "Save log to:";
|
||||
"alertSystemErrorOnAddTunnelTitle" = "Unable to create tunnel";
|
||||
"macConfirmAndQuitAlertMessage" = "Do you want to close the tunnels manager or quit WireGuard entirely?";
|
||||
"alertTunnelActivationSavedConfigFailureMessage" = "Unable to retrieve tunnel information from the saved configuration.";
|
||||
"tunnelOnDemandSectionTitleSelectedSSIDs" = "SSIDs";
|
||||
"macAlertInfoUnrecognizedInterfaceKey" = "Valid keys are: ‘PrivateKey’, ‘ListenPort’, ‘Address’, ‘DNS’ and ‘MTU’.";
|
||||
"macLogColumnTitleTime" = "Time";
|
||||
"alertTunnelNameEmptyMessage" = "Cannot create tunnel with an empty name";
|
||||
"alertInvalidInterfaceMessageMTUInvalid" = "Interface’s MTU must be between 576 and 65535, or unspecified";
|
||||
"alertTunnelNameEmptyTitle" = "No name provided";
|
||||
"macToggleStatusButtonRestarting" = "Restarting…";
|
||||
"alertUnableToWriteLogMessage" = "Unable to write logs to file";
|
||||
"macToggleStatusButtonActivating" = "Activating…";
|
||||
"macMenuQuit" = "Quit WireGuard";
|
||||
"macMenuAddEmptyTunnel" = "Add Empty Tunnel…";
|
||||
"tunnelStatusDeactivating" = "Deactivating";
|
||||
"alertInvalidInterfaceTitle" = "Invalid interface";
|
||||
"tunnelSectionTitleStatus" = "Status";
|
||||
"macDeleteTunnelConfirmationAlertButtonTitleDelete" = "Delete";
|
||||
"alertTunnelActivationFailureOnDemandAddendum" = " This tunnel has Activate On Demand enabled, so this tunnel might be re-activated automatically by the OS. You may turn off Activate On Demand in this app by editing the tunnel configuration.";
|
||||
"alertTunnelActivationFailureTitle" = "Activation failure";
|
||||
"tunnelPeerTxBytes" = "Data sent";
|
||||
"macLogButtonTitleClose" = "Close";
|
||||
"tunnelOnDemandSSIDViewTitle" = "SSIDs";
|
||||
"settingsExportZipButtonTitle" = "Export zip archive";
|
||||
"tunnelSectionTitleOnDemand" = "On-Demand Activation";
|
||||
"deleteTunnelsConfirmationAlertButtonTitle" = "Delete";
|
||||
"alertInvalidInterfaceMessageNameRequired" = "Interface name is required";
|
||||
"macViewPrivateData" = "view tunnel private keys";
|
||||
"alertInvalidPeerTitle" = "Invalid peer";
|
||||
"alertInvalidPeerMessageEndpointInvalid" = "Peer’s endpoint must be of the form ‘host:port’ or ‘[host]:port’";
|
||||
"alertTunnelActivationErrorTunnelIsNotInactiveTitle" = "Activation in progress";
|
||||
"tunnelPeerAllowedIPs" = "Allowed IPs";
|
||||
"alertInvalidPeerMessagePublicKeyDuplicated" = "Two or more peers cannot have the same public key";
|
||||
"macToggleStatusButtonDeactivate" = "Deactivate";
|
||||
"addTunnelMenuImportFile" = "Create from file or archive";
|
||||
"deletePeerConfirmationAlertButtonTitle" = "Delete";
|
||||
"addTunnelMenuQRCode" = "Create from QR code";
|
||||
"alertInvalidPeerMessagePreSharedKeyInvalid" = "Peer’s preshared key must be a 32-byte key in base64 encoding";
|
||||
"macAppExitingWithActiveTunnelInfo" = "The tunnel will remain active after exiting. You may disable it by reopening this application or through the Network panel in System Preferences.";
|
||||
"macMenuEdit" = "Edit";
|
||||
"donateLink" = "♥ Donate to the WireGuard Project";
|
||||
"alertScanQRCodeCameraUnsupportedTitle" = "Camera Unsupported";
|
||||
"macMenuWindow" = "Window";
|
||||
"tunnelStatusRestarting" = "Restarting";
|
||||
"alertUnableToRemovePreviousLogTitle" = "Log export failed";
|
||||
"alertTunnelActivationFailureMessage" = "The tunnel could not be activated. Please ensure that you are connected to the Internet.";
|
||||
"tunnelInterfaceListenPort" = "Listen port";
|
||||
"macToggleStatusButtonWaiting" = "Waiting…";
|
||||
"tunnelInterfaceStatus" = "Status";
|
||||
"macMenuHideOtherApps" = "Hide Others";
|
||||
"alertCantOpenInputZipFileMessage" = "The zip archive could not be read.";
|
||||
"alertInvalidInterfaceMessagePrivateKeyInvalid" = "Interface’s private key must be a 32-byte key in base64 encoding";
|
||||
"tunnelSectionTitleInterface" = "Interface";
|
||||
"alertInvalidInterfaceMessageDNSInvalid" = "Interface’s DNS servers must be a list of comma-separated IP addresses";
|
||||
"tunnelStatusInactive" = "Inactive";
|
||||
"macAlertPrivateKeyInvalid" = "Private key is invalid.";
|
||||
"macDeleteTunnelConfirmationAlertButtonTitleCancel" = "Cancel";
|
||||
"alertSystemErrorMessageTunnelConfigurationDisabled" = "The configuration is disabled.";
|
||||
"alertInvalidPeerMessagePersistentKeepaliveInvalid" = "Peer’s persistent keepalive must be between 0 to 65535, or unspecified";
|
||||
"alertUnableToWriteLogTitle" = "Log export failed";
|
||||
"alertInvalidPeerMessagePublicKeyRequired" = "Peer’s public key is required";
|
||||
"macMenuNetworksNone" = "Networks: None";
|
||||
"alertCantOpenOutputZipFileForWritingMessage" = "Could not open zip file for writing.";
|
||||
"macMenuSelectAll" = "Select All";
|
||||
"logViewTitle" = "Log";
|
||||
"alertInvalidPeerMessagePublicKeyInvalid" = "Peer’s public key must be a 32-byte key in base64 encoding";
|
||||
"tunnelOnDemandCellular" = "Cellular";
|
||||
"macConfirmAndQuitAlertQuitWireGuard" = "Quit WireGuard";
|
||||
"alertSystemErrorOnRemoveTunnelTitle" = "Unable to remove tunnel";
|
||||
"macFieldOnDemand" = "On-Demand:";
|
||||
"macMenuCloseWindow" = "Close Window";
|
||||
"macSheetButtonExportLog" = "Save";
|
||||
"alertSystemErrorOnModifyTunnelTitle" = "Unable to modify tunnel";
|
||||
"alertSystemErrorMessageTunnelConfigurationReadWriteFailed" = "Reading or writing the configuration failed.";
|
||||
"macMenuEditTunnel" = "Edit…";
|
||||
"settingsSectionTitleTunnelLog" = "Log";
|
||||
"macMenuManageTunnels" = "Manage Tunnels";
|
||||
"macButtonImportTunnels" = "Import tunnel(s) from file";
|
||||
"macAppExitingWithActiveTunnelMessage" = "WireGuard is exiting with an active tunnel";
|
||||
"tunnelSectionTitlePeer" = "Peer";
|
||||
"tunnelsListSelectButtonTitle" = "Select";
|
||||
"alertSystemErrorMessageTunnelConfigurationStale" = "The configuration is stale.";
|
||||
"tunnelPeerPreSharedKey" = "Preshared key";
|
||||
"alertTunnelDNSFailureMessage" = "One or more endpoint domains could not be resolved.";
|
||||
"tunnelOnDemandAddMessageAddNewSSID" = "Add new";
|
||||
"alertInvalidInterfaceMessageAddressInvalid" = "Interface addresses must be a list of comma-separated IP addresses, optionally in CIDR notation";
|
||||
"tunnelOnDemandSectionTitleAddSSIDs" = "Add SSIDs";
|
||||
"alertNoTunnelsInImportedZipArchiveTitle" = "No tunnels in zip archive";
|
||||
"alertTunnelDNSFailureTitle" = "DNS resolution failure";
|
||||
"tunnelOnDemandEthernet" = "Ethernet";
|
||||
"macLogButtonTitleSave" = "Save…";
|
||||
"macMenuToggleStatus" = "Toggle Status";
|
||||
"macMenuMinimize" = "Minimize";
|
||||
"deletePeerButtonTitle" = "Delete peer";
|
||||
"tunnelPeerRxBytes" = "Data received";
|
||||
"alertCantOpenInputZipFileTitle" = "Unable to read zip archive";
|
||||
"alertScanQRCodeUnreadableQRCodeMessage" = "The scanned code could not be read";
|
||||
"alertScanQRCodeUnreadableQRCodeTitle" = "Invalid Code";
|
||||
"alertSystemErrorOnListingTunnelsTitle" = "Unable to list tunnels";
|
||||
"tunnelPeerExcludePrivateIPs" = "Exclude private IPs";
|
||||
"settingsVersionKeyWireGuardForIOS" = "WireGuard for iOS";
|
||||
"macMenuPaste" = "Paste";
|
||||
"macAlertMultipleInterfaces" = "Configuration must have only one ‘Interface’ section.";
|
||||
"scanQRCodeViewTitle" = "Scan QR code";
|
||||
"macAppStoreUpdatingAlertMessage" = "App Store would like to update WireGuard";
|
||||
"macUnusableTunnelMessage" = "The configuration for this tunnel cannot be found in the keychain.";
|
||||
"macToolTipEditTunnel" = "Edit tunnel (⌘E)";
|
||||
"tunnelEditPlaceholderTextStronglyRecommended" = "Strongly recommended";
|
||||
"macMenuZoom" = "Zoom";
|
||||
"alertBadArchiveTitle" = "Unable to read zip archive";
|
||||
"macExportPrivateData" = "export tunnel private keys";
|
||||
"alertTunnelAlreadyExistsWithThatNameTitle" = "Name already exists";
|
||||
"macToggleStatusButtonDeactivating" = "Deactivating…";
|
||||
"iosViewPrivateData" = "Authenticate to view tunnel private keys.";
|
||||
"tunnelPeerLastHandshakeTime" = "Latest handshake";
|
||||
"macAlertPreSharedKeyInvalid" = "Preshared key is invalid";
|
||||
"alertBadConfigImportTitle" = "Unable to import tunnel";
|
||||
"macEditSave" = "Save";
|
||||
"macConfirmAndQuitAlertCloseWindow" = "Close Tunnels Manager";
|
||||
"macMenuFile" = "File";
|
||||
"tunnelStatusActivating" = "Activating";
|
||||
"macToolTipToggleStatus" = "Toggle status (⌘T)";
|
||||
"alertTunnelActivationSystemErrorTitle" = "Activation failure";
|
||||
"alertInvalidInterfaceMessagePrivateKeyRequired" = "Interface’s private key is required";
|
||||
"alertNoTunnelsToExportTitle" = "Nothing to export";
|
||||
"scanQRCodeTipText" = "Tip: Generate with `qrencode -t ansiutf8 < tunnel.conf`";
|
||||
"alertNoTunnelsToExportMessage" = "There are no tunnels to export";
|
||||
"macMenuImportTunnels" = "Import Tunnel(s) from File…";
|
||||
"alertScanQRCodeInvalidQRCodeTitle" = "Invalid QR Code";
|
||||
"macMenuViewLog" = "View Log";
|
||||
"macAlertInfoUnrecognizedPeerKey" = "Valid keys are: ‘PublicKey’, ‘PresharedKey’, ‘AllowedIPs’, ‘Endpoint’ and ‘PersistentKeepalive’";
|
||||
"tunnelOnDemandNoSSIDs" = "No SSIDs";
|
||||
"addTunnelMenuHeader" = "Add a new WireGuard tunnel";
|
||||
"macUnusableTunnelButtonTitleDeleteTunnel" = "Delete tunnel";
|
||||
"tunnelStatusReasserting" = "Reactivating";
|
||||
"alertInvalidPeerMessageAllowedIPsInvalid" = "Peer’s allowed IPs must be a list of comma-separated IP addresses, optionally in CIDR notation";
|
||||
"macMenuTunnel" = "Tunnel";
|
||||
"macMenuCopy" = "Copy";
|
||||
"macTunnelsMenuTitle" = "Tunnels";
|
||||
"alertTunnelAlreadyExistsWithThatNameMessage" = "A tunnel with that name already exists";
|
||||
"macLogColumnTitleLogMessage" = "Log message";
|
||||
"iosExportPrivateData" = "Authenticate to export tunnel private keys.";
|
||||
"macMenuAbout" = "About WireGuard";
|
||||
"macSheetButtonImport" = "Import";
|
||||
"alertScanQRCodeNamePromptTitle" = "Please name the scanned tunnel";
|
||||
"alertUnableToRemovePreviousLogMessage" = "The pre-existing log could not be cleared";
|
||||
"alertTunnelActivationBackendFailureMessage" = "Unable to turn on Go backend library.";
|
||||
"settingsSectionTitleExportConfigurations" = "Export configurations";
|
||||
"alertBadArchiveMessage" = "Bad or corrupt zip archive.";
|
||||
"settingsVersionKeyWireGuardGoBackend" = "WireGuard Go Backend";
|
||||
"macFieldOnDemandSSIDs" = "SSIDs:";
|
||||
"deletePeerConfirmationAlertMessage" = "Delete this peer?";
|
||||
"alertCantOpenOutputZipFileForWritingTitle" = "Unable to create zip archive";
|
||||
"tunnelStatusActive" = "Active";
|
||||
"tunnelStatusWaiting" = "Waiting";
|
||||
"alertNoTunnelsInImportedZipArchiveMessage" = "No .conf tunnel files were found inside the zip archive.";
|
||||
"alertTunnelActivationFileDescriptorFailureMessage" = "Unable to determine TUN device file descriptor.";
|
||||
"addTunnelMenuFromScratch" = "Create from scratch";
|
||||
"macToggleStatusButtonActivate" = "Activate";
|
||||
"macAlertNameIsEmpty" = "Name is required";
|
||||
"tunnelsListDeleteButtonTitle" = "Delete";
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
// Copyright © 2018-2019 WireGuard LLC. All Rights Reserved.
|
||||
// Copyright © 2018-2020 WireGuard LLC. All Rights Reserved.
|
||||
// Generic alert action names
|
||||
|
||||
|
||||
@@ -443,3 +443,4 @@
|
||||
// Donation
|
||||
|
||||
"donateLink" = "♥ Faire un don au projet WireGuard";
|
||||
"macTunnelsMenuTitle" = "Tunnels";
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
// Copyright © 2018-2019 WireGuard LLC. All Rights Reserved.
|
||||
// Copyright © 2018-2020 WireGuard LLC. All Rights Reserved.
|
||||
// Generic alert action names
|
||||
|
||||
|
||||
@@ -233,6 +233,7 @@
|
||||
"macConfirmAndQuitAlertCloseWindow" = "Close Tunnels Manager";
|
||||
"macMenuFile" = "File";
|
||||
"macToolTipToggleStatus" = "Toggle status (⌘T)";
|
||||
"macTunnelsMenuTitle" = "Tunnels";
|
||||
"alertTunnelActivationSystemErrorTitle" = "Activation failure";
|
||||
"alertInvalidInterfaceMessagePrivateKeyRequired" = "Interface’s private key is required";
|
||||
"tunnelOnDemandAnySSID" = "Any SSID";
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
// Copyright © 2018-2019 WireGuard LLC. All Rights Reserved.
|
||||
// Copyright © 2018-2020 WireGuard LLC. All Rights Reserved.
|
||||
// Generic alert action names
|
||||
|
||||
|
||||
@@ -443,3 +443,4 @@
|
||||
// Donation
|
||||
|
||||
"donateLink" = "♥ Fai una donazione al progetto WireGuard";
|
||||
"macTunnelsMenuTitle" = "Tunnels";
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
// Copyright © 2018-2019 WireGuard LLC. All Rights Reserved.
|
||||
// Copyright © 2018-2020 WireGuard LLC. All Rights Reserved.
|
||||
// Generic alert action names
|
||||
|
||||
|
||||
@@ -443,3 +443,4 @@
|
||||
// Donation
|
||||
|
||||
"donateLink" = "♥ WireGuard プロジェクトに寄付する";
|
||||
"macTunnelsMenuTitle" = "Tunnels";
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
// Copyright © 2018-2019 WireGuard LLC. All Rights Reserved.
|
||||
// Copyright © 2018-2020 WireGuard LLC. All Rights Reserved.
|
||||
// Generic alert action names
|
||||
|
||||
|
||||
@@ -209,6 +209,7 @@
|
||||
"macMenuFile" = "File";
|
||||
"tunnelStatusActivating" = "Activating";
|
||||
"macToolTipToggleStatus" = "Toggle status (⌘T)";
|
||||
"macTunnelsMenuTitle" = "Tunnels";
|
||||
"alertTunnelActivationSystemErrorTitle" = "Activation failure";
|
||||
"alertInvalidInterfaceMessagePrivateKeyRequired" = "Interface’s private key is required";
|
||||
"tunnelOnDemandAnySSID" = "Any SSID";
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
// Copyright © 2018-2019 WireGuard LLC. All Rights Reserved.
|
||||
// Copyright © 2018-2020 WireGuard LLC. All Rights Reserved.
|
||||
// Generic alert action names
|
||||
|
||||
|
||||
@@ -443,3 +443,4 @@
|
||||
// Donation
|
||||
|
||||
"donateLink" = "♥ ਵਾਇਰਗਾਰਡ ਪਰੋਜੈਕਟ ਨੂੰ ਦਾਨ ਦਿਓ";
|
||||
"macTunnelsMenuTitle" = "Tunnels";
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
// Copyright © 2018-2019 WireGuard LLC. All Rights Reserved.
|
||||
// Copyright © 2018-2020 WireGuard LLC. All Rights Reserved.
|
||||
// Generic alert action names
|
||||
|
||||
|
||||
@@ -24,6 +24,19 @@
|
||||
"addTunnelMenuImportFile" = "Utwórz z pliku lub archiwum";
|
||||
"addTunnelMenuQRCode" = "Utwórz za pomocą kodu QR";
|
||||
"addTunnelMenuFromScratch" = "Utwórz od podstaw";
|
||||
|
||||
// Tunnels list alerts
|
||||
|
||||
"alertImportedFromMultipleFilesTitle (%d)" = "Utworzono %d tuneli";
|
||||
"alertImportedFromMultipleFilesMessage (%1$d of %2$d)" = "Utworzono %1$d z %2$d tuneli z zaimportowanych plików";
|
||||
|
||||
"alertImportedFromZipTitle (%d)" = "Utworzono %d tuneli";
|
||||
"alertImportedFromZipMessage (%1$d of %2$d)" = "Utworzono %1$d z %2$d tuneli z archiwum zip";
|
||||
|
||||
"alertBadConfigImportTitle" = "Nie można zaimportować tunelu";
|
||||
"alertBadConfigImportMessage (%@)" = "Plik „%@” nie zawiera prawidłowej konfiguracji WireGuard";
|
||||
|
||||
"deleteTunnelsConfirmationAlertButtonTitle" = "Usuń";
|
||||
"deleteTunnelConfirmationAlertButtonMessage (%d)" = "Usunąć %d tunel?";
|
||||
"deleteTunnelsConfirmationAlertButtonMessage (%d)" = "Usunąć %d tunele(i)?";
|
||||
|
||||
@@ -34,34 +47,96 @@
|
||||
|
||||
"tunnelSectionTitleStatus" = "Status";
|
||||
|
||||
"tunnelStatusInactive" = "Nieaktywny";
|
||||
"tunnelStatusActivating" = "Aktywowanie";
|
||||
"tunnelStatusActive" = "Aktywny";
|
||||
"tunnelStatusDeactivating" = "Dezaktywowanie";
|
||||
"tunnelStatusReasserting" = "Reaktywowanie";
|
||||
"tunnelStatusRestarting" = "Restartowanie";
|
||||
"tunnelStatusWaiting" = "Trwa oczekiwanie";
|
||||
|
||||
"macToggleStatusButtonActivate" = "Aktywuj";
|
||||
"macToggleStatusButtonActivating" = "Aktywowanie…";
|
||||
"macToggleStatusButtonDeactivate" = "Dezaktywuj";
|
||||
"macToggleStatusButtonDeactivating" = "Dezaktywowanie…";
|
||||
"macToggleStatusButtonReasserting" = "Reaktywowanie…";
|
||||
"macToggleStatusButtonRestarting" = "Restartowanie…";
|
||||
"macToggleStatusButtonWaiting" = "Oczekiwanie…";
|
||||
|
||||
"tunnelSectionTitleInterface" = "Interfejs";
|
||||
|
||||
"tunnelInterfaceName" = "Nazwa";
|
||||
"tunnelInterfacePrivateKey" = "Klucz prywatny";
|
||||
"tunnelInterfacePublicKey" = "Klucz publiczny";
|
||||
"tunnelInterfaceGenerateKeypair" = "Generowanie pary kluczy";
|
||||
"tunnelInterfaceAddresses" = "Adresy";
|
||||
"tunnelInterfaceListenPort" = "Port nasłuchu";
|
||||
"tunnelInterfaceMTU" = "MTU";
|
||||
"tunnelInterfaceDNS" = "Serwery DNS";
|
||||
"tunnelInterfaceStatus" = "Status";
|
||||
|
||||
"tunnelSectionTitlePeer" = "Peer";
|
||||
|
||||
"tunnelPeerPublicKey" = "Klucz publiczny";
|
||||
"tunnelPeerPreSharedKey" = "PSK";
|
||||
"tunnelPeerEndpoint" = "Adres";
|
||||
"tunnelPeerPersistentKeepalive" = "Utrzymanie połączenia";
|
||||
"tunnelPeerAllowedIPs" = "Dozwolone adresy IP";
|
||||
"tunnelPeerRxBytes" = "Otrzymane dane";
|
||||
"tunnelPeerTxBytes" = "Dane wysłane";
|
||||
"tunnelPeerLastHandshakeTime" = "Ostatni uścisk dłoni (handshake)";
|
||||
"tunnelPeerExcludePrivateIPs" = "Wyklucz prywatne adresy IP";
|
||||
|
||||
"tunnelSectionTitleOnDemand" = "Aktywacja na żądanie";
|
||||
|
||||
"tunnelOnDemandCellular" = "Dane komórkowe";
|
||||
"tunnelOnDemandEthernet" = "Ethernet";
|
||||
"tunnelOnDemandWiFi" = "Wi-Fi";
|
||||
"tunnelOnDemandSSIDsKey" = "Identyfikatory SSID";
|
||||
|
||||
"tunnelOnDemandAnySSID" = "Dowolny SSID";
|
||||
"tunnelOnDemandOnlyTheseSSIDs" = "Tylko te SSID";
|
||||
"tunnelOnDemandExceptTheseSSIDs" = "Z wyjątkiem tych SSID";
|
||||
"tunnelOnDemandOnlySSID (%d)" = "Tylko %d SSID";
|
||||
"tunnelOnDemandOnlySSIDs (%d)" = "Tylko te %d SSID";
|
||||
"tunnelOnDemandExceptSSID (%d)" = "Z wyjątkiem %d SSID";
|
||||
"tunnelOnDemandExceptSSIDs (%d)" = "Z wyjątkiem tych %d SSID";
|
||||
"tunnelOnDemandSSIDOptionDescriptionMac (%1$@: %2$@)" = "%1$@: %2$@";
|
||||
|
||||
"tunnelOnDemandSSIDViewTitle" = "Identyfikatory SSID";
|
||||
"tunnelOnDemandSectionTitleSelectedSSIDs" = "Identyfikatory SSID";
|
||||
"tunnelOnDemandNoSSIDs" = "Brak SSID";
|
||||
"tunnelOnDemandSectionTitleAddSSIDs" = "Dodaj SSID";
|
||||
"tunnelOnDemandAddMessageAddConnectedSSID (%@)" = "Dodaj połączony: %@";
|
||||
"tunnelOnDemandAddMessageAddNewSSID" = "Dodaj nowy";
|
||||
|
||||
"tunnelOnDemandKey" = "Na żądanie";
|
||||
"tunnelOnDemandOptionOff" = "Wył.";
|
||||
"tunnelOnDemandOptionWiFiOnly" = "Tylko Wi-Fi";
|
||||
"tunnelOnDemandOptionWiFiOrCellular" = "Wi-Fi i dane sieci komórkowej";
|
||||
"tunnelOnDemandOptionCellularOnly" = "Tylko dane sieci komórkowej";
|
||||
"tunnelOnDemandOptionWiFiOrEthernet" = "Wi-Fi lub sieć ethernet";
|
||||
"tunnelOnDemandOptionEthernetOnly" = "Tylko sieć ethernet";
|
||||
|
||||
"addPeerButtonTitle" = "Dodaj Peer'a";
|
||||
|
||||
"deletePeerButtonTitle" = "Usuń peer'a";
|
||||
"deletePeerConfirmationAlertButtonTitle" = "Usuń";
|
||||
"deletePeerConfirmationAlertMessage" = "Usunąć tego peer'a?";
|
||||
|
||||
"deleteTunnelButtonTitle" = "Usuń tunel";
|
||||
"deleteTunnelConfirmationAlertButtonTitle" = "Usuń";
|
||||
"deleteTunnelConfirmationAlertMessage" = "Usunąć ten tunel?";
|
||||
|
||||
"tunnelEditPlaceholderTextRequired" = "Wymagane";
|
||||
"tunnelEditPlaceholderTextOptional" = "Opcjonalne";
|
||||
"tunnelEditPlaceholderTextAutomatic" = "Automatycznie wybrany";
|
||||
"tunnelEditPlaceholderTextStronglyRecommended" = "Zalecane";
|
||||
"tunnelEditPlaceholderTextOff" = "Wył.";
|
||||
|
||||
"tunnelPeerPersistentKeepaliveValue (%@)" = "co %@ sekund";
|
||||
"tunnelHandshakeTimestampNow" = "Teraz";
|
||||
"tunnelHandshakeTimestampSystemClockBackward" = "(Zegar systemowy został cofnięty)";
|
||||
"tunnelHandshakeTimestampAgo (%@)" = "%@ temu";
|
||||
"tunnelHandshakeTimestampYear (%d)" = "%d rok";
|
||||
"tunnelHandshakeTimestampYears (%d)" = "%d lat/lata";
|
||||
@@ -79,14 +154,49 @@
|
||||
|
||||
"tunnelPeerPresharedKeyEnabled" = "włączony";
|
||||
|
||||
// Error alerts while creating / editing a tunnel configuration
|
||||
/* Alert title for error in the interface data */
|
||||
|
||||
"alertInvalidInterfaceTitle" = "Niewłaściwy interfejs";
|
||||
|
||||
/* Any one of the following alert messages can go with the above title */
|
||||
"alertInvalidInterfaceMessageNameRequired" = "Nazwa interfejsu jest wymagana";
|
||||
"alertInvalidInterfaceMessagePrivateKeyRequired" = "Klucz prywatny interfejsu jest wymagany";
|
||||
"alertInvalidInterfaceMessagePrivateKeyInvalid" = "Klucz prywatny interfejsu musi być 32-bajtowym kluczem zakodowanym w base64";
|
||||
"alertInvalidInterfaceMessageAddressInvalid" = "Adresy interfejsu muszą być listą adresów IP rozdzielone przecinkami, opcjonalnie w notacji CIDR";
|
||||
"alertInvalidInterfaceMessageListenPortInvalid" = "Port nasłuchiwania interfejsu musi wynosić pomiędzy 0 a 65535 lub nieokreślony";
|
||||
"alertInvalidInterfaceMessageMTUInvalid" = "Wartość MTU musi wynosić pomiędzy 576 a 65535 lub nieokreślona";
|
||||
"alertInvalidInterfaceMessageDNSInvalid" = "Serwery DNS interfejsu muszą być listą adresów IP rozdzielonych przecinkami";
|
||||
|
||||
/* Alert title for error in the peer data */
|
||||
"alertInvalidPeerTitle" = "Nieprawidłowy peer";
|
||||
|
||||
/* Any one of the following alert messages can go with the above title */
|
||||
"alertInvalidPeerMessagePublicKeyRequired" = "Klucz publiczny peer'a jest wymagany";
|
||||
"alertInvalidPeerMessagePublicKeyInvalid" = "Klucz prywatny peer'a musi być 32-bajtowym kluczem zakodowanym w base64";
|
||||
"alertInvalidPeerMessagePreSharedKeyInvalid" = "Klucz publiczny peer'a musi być 32-bajtowym kluczem zakodowanym w base64";
|
||||
"alertInvalidPeerMessageAllowedIPsInvalid" = "Dozwolone adresy peer'a muszą być listą adresów IP rozdzielone przecinkami, opcjonalnie w notacji CIDR";
|
||||
"alertInvalidPeerMessageEndpointInvalid" = "Adres peer'a musi być w postaci „adres:port” or „[host]:port”";
|
||||
"alertInvalidPeerMessagePersistentKeepaliveInvalid" = "Interwał podtrzymywania połączenia musi wynosić pomiędzy 0 a 65535 lub nieokreślony";
|
||||
"alertInvalidPeerMessagePublicKeyDuplicated" = "Dwa lub więcej peer'ów nie może współdzielić tego samego klucza publicznego";
|
||||
|
||||
// Scanning QR code UI
|
||||
|
||||
"scanQRCodeViewTitle" = "Skanuj kod QR";
|
||||
"scanQRCodeTipText" = "Wskazówka: wygeneruj za pomocą `qrencode -t ansiutf8 < tunnel.conf`";
|
||||
|
||||
// Scanning QR code alerts
|
||||
|
||||
"alertScanQRCodeCameraUnsupportedTitle" = "Kamera nie jest obsługiwana";
|
||||
"alertScanQRCodeCameraUnsupportedMessage" = "To urządzenie nie jest w stanie zeskanować kodów QR";
|
||||
|
||||
"alertScanQRCodeInvalidQRCodeTitle" = "Nieprawidłowy kod QR";
|
||||
"alertScanQRCodeInvalidQRCodeMessage" = "Zeskanowany kod QR nie jest poprawną konfiguracją WireGuard";
|
||||
|
||||
"alertScanQRCodeUnreadableQRCodeTitle" = "Nieprawidłowy kod";
|
||||
"alertScanQRCodeUnreadableQRCodeMessage" = "Zeskanowany kod nie mógł zostać odczytany";
|
||||
|
||||
"alertScanQRCodeNamePromptTitle" = "Nazwij zeskanowany tunel";
|
||||
|
||||
// Settings UI
|
||||
|
||||
@@ -94,6 +204,10 @@
|
||||
|
||||
"settingsSectionTitleAbout" = "O programie";
|
||||
"settingsVersionKeyWireGuardForIOS" = "WireGuard dla iOS";
|
||||
"settingsVersionKeyWireGuardGoBackend" = "WireGuard Go Backend";
|
||||
|
||||
"settingsSectionTitleExportConfigurations" = "Eksportuj konfiguracje";
|
||||
"settingsExportZipButtonTitle" = "Eksportuj do archiwum zip";
|
||||
|
||||
"settingsSectionTitleTunnelLog" = "Log";
|
||||
"settingsViewLogButtonTitle" = "Wyświetl log";
|
||||
@@ -102,6 +216,19 @@
|
||||
|
||||
"logViewTitle" = "Log";
|
||||
|
||||
// Log alerts
|
||||
|
||||
"alertUnableToRemovePreviousLogTitle" = "Export logów nie powiódł się";
|
||||
"alertUnableToRemovePreviousLogMessage" = "Nie można usunąć już istniejących logów";
|
||||
|
||||
"alertUnableToWriteLogTitle" = "Eksport logów nie powiódł się";
|
||||
"alertUnableToWriteLogMessage" = "Nie można zapisać logów do pliku";
|
||||
|
||||
// Zip import / export error alerts
|
||||
|
||||
"alertCantOpenInputZipFileTitle" = "Nie można odczytać archiwum zip";
|
||||
"alertCantOpenInputZipFileMessage" = "Nie można odczytać archiwum zip.";
|
||||
|
||||
"alertCantOpenOutputZipFileForWritingTitle" = "Nie można utworzyć archiwum ZIP";
|
||||
"alertCantOpenOutputZipFileForWritingMessage" = "Nie udało się otworzyć pliku ZIP do zapisu.";
|
||||
|
||||
@@ -112,14 +239,65 @@
|
||||
"alertNoTunnelsToExportMessage" = "Nie ma żadnych tuneli do wyeksportowania";
|
||||
|
||||
"alertNoTunnelsInImportedZipArchiveTitle" = "Brak tuneli w archiwum ZIP";
|
||||
"alertNoTunnelsInImportedZipArchiveMessage" = "Nie znaleziono plików konfiguracyjnych tunelu .conf w archiwum zip.";
|
||||
|
||||
// Conf import error alerts
|
||||
|
||||
"alertCantOpenInputConfFileTitle" = "Nie można zaimportować z pliku";
|
||||
"alertCantOpenInputConfFileMessage (%@)" = "Nie można odczytać pliku „%@”.";
|
||||
|
||||
// Tunnel management error alerts
|
||||
|
||||
"alertTunnelActivationFailureTitle" = "Błąd aktywacji tunelu";
|
||||
"alertTunnelActivationFailureMessage" = "Tunel nie mógł zostać aktywowany. Upewnij się, że jesteś podłączony do Internetu.";
|
||||
"alertTunnelActivationSavedConfigFailureMessage" = "Nie można odczytać informacji o tunelu z zapisanej konfiguracji.";
|
||||
"alertTunnelActivationBackendFailureMessage" = "Nie udało się włącz tunelu bazując na bibliotece Go.";
|
||||
"alertTunnelActivationFileDescriptorFailureMessage" = "Nie można określić opisu urządzenia TUN.";
|
||||
"alertTunnelActivationSetNetworkSettingsMessage" = "Nie można zastosować ustawień sieci do tunelu.";
|
||||
|
||||
"alertTunnelActivationFailureOnDemandAddendum" = "Ten tunel ma włączoną aktywację na żądanie, więc ten tunel może być ponownie aktywowany automatycznie przez system operacyjny. Możesz wyłączyć aktywację na żądanie poprzez edycję konfiguracji tunelu.";
|
||||
|
||||
"alertTunnelDNSFailureTitle" = "Nieudane rozpoznanie DNS";
|
||||
"alertTunnelDNSFailureMessage" = "Jedna lub więcej domen nie może zostać odnalezionych.";
|
||||
|
||||
"alertTunnelNameEmptyTitle" = "Nie podano nazwy";
|
||||
"alertTunnelNameEmptyMessage" = "Nie można utworzyć tunelu z pustą nazwą";
|
||||
|
||||
"alertTunnelAlreadyExistsWithThatNameTitle" = "Nazwa już istnieje";
|
||||
"alertTunnelAlreadyExistsWithThatNameMessage" = "Tunel o tej nazwie już istnieje";
|
||||
|
||||
"alertTunnelActivationErrorTunnelIsNotInactiveTitle" = "Aktywacja w toku";
|
||||
"alertTunnelActivationErrorTunnelIsNotInactiveMessage" = "Tunel jest już aktywny lub jest już w trakcie aktywowania";
|
||||
|
||||
// Tunnel management error alerts on system error
|
||||
/* The alert message that goes with the following titles would be
|
||||
one of the alertSystemErrorMessage* listed further down */
|
||||
|
||||
"alertSystemErrorOnListingTunnelsTitle" = "Nie można wyświetlić tuneli";
|
||||
"alertSystemErrorOnAddTunnelTitle" = "Nie można utworzyć tunelu";
|
||||
"alertSystemErrorOnModifyTunnelTitle" = "Nie można zmodyfikować tunelu";
|
||||
"alertSystemErrorOnRemoveTunnelTitle" = "Nie można usunąć tunelu";
|
||||
|
||||
/* The alert message for this alert shall include
|
||||
one of the alertSystemErrorMessage* listed further down */
|
||||
"alertTunnelActivationSystemErrorTitle" = "Błąd aktywacji tunelu";
|
||||
"alertTunnelActivationSystemErrorMessage (%@)" = "Błąd aktywacji tunelu. %@";
|
||||
|
||||
/* alertSystemErrorMessage* messages */
|
||||
"alertSystemErrorMessageTunnelConfigurationInvalid" = "Ta konfiguracja jest nieprawidłowa.";
|
||||
"alertSystemErrorMessageTunnelConfigurationDisabled" = "Konfiguracja jest wyłączona.";
|
||||
"alertSystemErrorMessageTunnelConnectionFailed" = "Połączenie nie powiodło się.";
|
||||
"alertSystemErrorMessageTunnelConfigurationStale" = "Konfiguracja jest przestarzała.";
|
||||
"alertSystemErrorMessageTunnelConfigurationReadWriteFailed" = "Czytanie lub zapisywanie konfiguracji nie powiodło się.";
|
||||
"alertSystemErrorMessageTunnelConfigurationUnknown" = "Nieznany błąd systemowy.";
|
||||
|
||||
// Mac status bar menu / pulldown menu / main menu
|
||||
|
||||
"macMenuNetworks (%@)" = "Sieci: %@";
|
||||
"macMenuNetworksNone" = "Sieci: brak";
|
||||
|
||||
"macMenuTitle" = "WireGuard";
|
||||
"macMenuManageTunnels" = "Zarządzaj tunelami";
|
||||
"macMenuImportTunnels" = "Importuj tunel(e) z pliku…";
|
||||
"macMenuAddEmptyTunnel" = "Dodaj pusty tunel…";
|
||||
"macMenuViewLog" = "Wyświetl log";
|
||||
@@ -128,6 +306,8 @@
|
||||
"macMenuQuit" = "Wyjdź z programu WireGuard";
|
||||
|
||||
"macMenuHideApp" = "Ukryj program WireGuard";
|
||||
"macMenuHideOtherApps" = "Ukryj pozostałe";
|
||||
"macMenuShowAllApps" = "Pokaż wszystkie";
|
||||
|
||||
"macMenuFile" = "Plik";
|
||||
"macMenuCloseWindow" = "Zamknij okno";
|
||||
@@ -139,9 +319,14 @@
|
||||
"macMenuSelectAll" = "Wybierz wszystko";
|
||||
|
||||
"macMenuTunnel" = "Tunel";
|
||||
"macMenuToggleStatus" = "Przełącz status";
|
||||
"macMenuEditTunnel" = "Edytuj…";
|
||||
"macMenuDeleteSelected" = "Usuń wybrane";
|
||||
|
||||
"macMenuWindow" = "Okno";
|
||||
"macMenuMinimize" = "Minimalizuj";
|
||||
"macMenuZoom" = "Powiększenie";
|
||||
|
||||
// Mac manage tunnels window
|
||||
|
||||
"macWindowTitleManageTunnels" = "Zarządzaj tunelami WireGuard";
|
||||
@@ -154,6 +339,7 @@
|
||||
"macDeleteTunnelConfirmationAlertButtonTitleDeleting" = "Usuwanie…";
|
||||
|
||||
"macButtonImportTunnels" = "Importuj tunel(e) z pliku";
|
||||
"macSheetButtonImport" = "Importuj";
|
||||
|
||||
"macNameFieldExportLog" = "Zapisz log do:";
|
||||
"macSheetButtonExportLog" = "Zapisz";
|
||||
@@ -161,163 +347,100 @@
|
||||
"macNameFieldExportZip" = "Wyeksportuj tunele do:";
|
||||
"macSheetButtonExportZip" = "Zapisz";
|
||||
|
||||
"macButtonDeleteTunnels (%d)" = "Usuń %d tunele(i)";
|
||||
|
||||
"macButtonEdit" = "Edytuj";
|
||||
|
||||
// Mac detail/edit view fields
|
||||
|
||||
"macFieldKey (%@)" = "%@:";
|
||||
"macFieldOnDemand" = "Na żądanie:";
|
||||
"macFieldOnDemandSSIDs" = "Identyfikatory SSID:";
|
||||
|
||||
// Mac status display
|
||||
|
||||
"macStatus (%@)" = "Status: %@";
|
||||
|
||||
// Mac editing config
|
||||
|
||||
"macEditDiscard" = "Odrzuć";
|
||||
"macEditSave" = "Zapisz";
|
||||
|
||||
"macAlertNameIsEmpty" = "Nazwa jest wymagana";
|
||||
"macAlertDuplicateName (%@)" = "Inny tunel o nazwie „%@” już istnieje.";
|
||||
|
||||
"macAlertInvalidLine (%@)" = "Nieprawidłowy wiersz: „%@”.";
|
||||
|
||||
"macAlertNoInterface" = "Konfiguracja musi mieć sekcję „Interface”.";
|
||||
"macAlertMultipleInterfaces" = "Konfiguracja musi posiadać tylko jedną sekcję „Interface”.";
|
||||
"macAlertPrivateKeyInvalid" = "Klucz prywatny jest nieprawidłowy.";
|
||||
"macAlertListenPortInvalid (%@)" = "Port nasłuchu „%@” jest nieprawidłowy.";
|
||||
"macAlertAddressInvalid (%@)" = "Adres \"%@\" jest nieprawidłowy.";
|
||||
"macAlertDNSInvalid (%@)" = "DNS „%@” jest nieprawidłowy.";
|
||||
"macAlertMTUInvalid (%@)" = "Wartość MTU ‘%@’ jest nieprawidłowa.";
|
||||
|
||||
"macAlertUnrecognizedInterfaceKey (%@)" = "Interfejs zawiera nierozpoznawalny klucz „%@”";
|
||||
"macAlertInfoUnrecognizedInterfaceKey" = "Prawidłowe klucze to: „PrivateKey”, „ListenPort”, „Adres”, „DNS” i „MTU”.";
|
||||
|
||||
"macAlertPublicKeyInvalid" = "Klucz publiczny jest nieprawidłowy";
|
||||
"macAlertPreSharedKeyInvalid" = "Klucz wstępnie współdzielony jest niepoprawny";
|
||||
"macAlertAllowedIPInvalid (%@)" = "Dozwolony adres IP „%@” jest nieprawidłowy";
|
||||
"macAlertEndpointInvalid (%@)" = "Adres końcowy „%@” jest nieprawidłowy";
|
||||
"macAlertPersistentKeepliveInvalid (%@)" = "Obecna wartość keepalive „%@” jest nieprawidłowa";
|
||||
|
||||
"macAlertUnrecognizedPeerKey (%@)" = "Peer zawiera nierozpoznawalny klucz „%@”";
|
||||
"macAlertInfoUnrecognizedPeerKey" = "Prawidłowe klucze to: „PublicKey”, „PresharedKey”, „AllowedIPs”, „Endpoint” i „PersistentKeepalive”";
|
||||
|
||||
"macAlertMultipleEntriesForKey (%@)" = "Dla klucza „%@” powinien być tylko jeden wpis w sekcji";
|
||||
|
||||
// Mac about dialog
|
||||
|
||||
"macAppVersion (%@)" = "Wersja aplikacji: %@";
|
||||
"macGoBackendVersion (%@)" = "Wersja backend'u Go: %@";
|
||||
|
||||
// Privacy
|
||||
|
||||
"macExportPrivateData" = "eksportuj klucze prywatne tunelu";
|
||||
"macViewPrivateData" = "wyświetl klucze prywatne tunelu";
|
||||
"iosExportPrivateData" = "Uwierzytelnij, aby wyeksportować klucze prywatne tuneli.";
|
||||
"iosViewPrivateData" = "Uwierzytelnij, aby zobaczyć klucze prywatne.";
|
||||
|
||||
// Mac alert
|
||||
|
||||
"macConfirmAndQuitAlertMessage" = "Czy chcesz zamknąć menedżera tuneli czy wyłączyć całkowicie WireGuard?";
|
||||
"macConfirmAndQuitAlertInfo" = "Jeśli zamkniesz menedżera tuneli, WireGuard będzie nadal dostępny z ikony w pasku menu.";
|
||||
"macConfirmAndQuitInfoWithActiveTunnel (%@)" = "Jeśli zamkniesz menedżera tuneli, WireGuard będzie nadal dostępny z ikony w pasku menu.\n\nZauważ, że jeśli opuścisz WireGuard całkowicie aktywny tunel („%@”) pozostanie aktywny, dopóki nie wyłączysz go z tej aplikacji lub przez panel sieci w ustawieniach systemowych.";
|
||||
"macConfirmAndQuitAlertQuitWireGuard" = "Wyjdź z programu WireGuard";
|
||||
"macConfirmAndQuitAlertCloseWindow" = "Zamknij menedżera tuneli";
|
||||
|
||||
"macAppExitingWithActiveTunnelMessage" = "WireGuard jest wyłączany wraz z aktywnym tunelem";
|
||||
"macAppExitingWithActiveTunnelInfo" = "Tunel pozostanie aktywny po wyjściu. Możesz go wyłączyć, ponownie otwierając tę aplikację lub przez panel sieci w ustawieniach systemowych.";
|
||||
|
||||
// Mac tooltip
|
||||
|
||||
"macToolTipEditTunnel" = "Edytuj tunel (⌘E)";
|
||||
"macToolTipToggleStatus" = "Przełącz stan (⌘T)";
|
||||
|
||||
// Mac log view
|
||||
|
||||
"macLogColumnTitleTime" = "Czas";
|
||||
"macLogColumnTitleLogMessage" = "Dziennik wiadomości";
|
||||
"macLogButtonTitleClose" = "Zamknij";
|
||||
"macLogButtonTitleSave" = "Zapisz…";
|
||||
|
||||
// Mac unusable tunnel view
|
||||
|
||||
"macUnusableTunnelMessage" = "Konfiguracja dla tego tunelu nie może zostać znaleziona w pęku kluczy.";
|
||||
"macUnusableTunnelInfo" = "W przypadku, gdy ten tunel został utworzony przez innego użytkownika, tylko ten użytkownik może przeglądać, edytować lub aktywować ten tunel.";
|
||||
"macUnusableTunnelButtonTitleDeleteTunnel" = "Usuń tunel";
|
||||
"alertSystemErrorMessageTunnelConfigurationInvalid" = "The configuration is invalid.";
|
||||
"tunnelPeerEndpoint" = "Endpoint";
|
||||
"alertInvalidInterfaceMessageListenPortInvalid" = "Interface’s listen port must be between 0 and 65535, or unspecified";
|
||||
"addPeerButtonTitle" = "Add peer";
|
||||
"tunnelHandshakeTimestampSystemClockBackward" = "(System clock wound backwards)";
|
||||
"macAlertNoInterface" = "Configuration must have an ‘Interface’ section.";
|
||||
"alertSystemErrorMessageTunnelConfigurationUnknown" = "Unknown system error.";
|
||||
"macEditDiscard" = "Discard";
|
||||
"alertScanQRCodeCameraUnsupportedMessage" = "This device is not able to scan QR codes";
|
||||
"macConfirmAndQuitAlertInfo" = "If you close the tunnels manager, WireGuard will continue to be available from the menu bar icon.";
|
||||
"macUnusableTunnelInfo" = "In case this tunnel was created by another user, only that user can view, edit, or activate this tunnel.";
|
||||
"alertTunnelActivationErrorTunnelIsNotInactiveMessage" = "The tunnel is already active or in the process of being activated";
|
||||
"macToggleStatusButtonReasserting" = "Reactivating…";
|
||||
"alertTunnelActivationSetNetworkSettingsMessage" = "Unable to apply network settings to tunnel object.";
|
||||
"macMenuShowAllApps" = "Show All";
|
||||
"alertCantOpenInputConfFileTitle" = "Unable to import from file";
|
||||
"alertScanQRCodeInvalidQRCodeMessage" = "The scanned QR code is not a valid WireGuard configuration";
|
||||
"tunnelPeerPersistentKeepalive" = "Persistent keepalive";
|
||||
"alertSystemErrorMessageTunnelConnectionFailed" = "The connection failed.";
|
||||
"macConfirmAndQuitAlertMessage" = "Do you want to close the tunnels manager or quit WireGuard entirely?";
|
||||
"alertTunnelActivationSavedConfigFailureMessage" = "Unable to retrieve tunnel information from the saved configuration.";
|
||||
"tunnelOnDemandOptionOff" = "Off";
|
||||
"tunnelOnDemandSectionTitleSelectedSSIDs" = "SSIDs";
|
||||
"macAlertInfoUnrecognizedInterfaceKey" = "Valid keys are: ‘PrivateKey’, ‘ListenPort’, ‘Address’, ‘DNS’ and ‘MTU’.";
|
||||
"macLogColumnTitleTime" = "Time";
|
||||
"alertTunnelNameEmptyMessage" = "Cannot create tunnel with an empty name";
|
||||
"alertInvalidInterfaceMessageMTUInvalid" = "Interface’s MTU must be between 576 and 65535, or unspecified";
|
||||
"alertTunnelNameEmptyTitle" = "No name provided";
|
||||
"tunnelOnDemandOnlyTheseSSIDs" = "Only these SSIDs";
|
||||
"macToggleStatusButtonRestarting" = "Restarting…";
|
||||
"tunnelOnDemandExceptTheseSSIDs" = "Except these SSIDs";
|
||||
"alertUnableToWriteLogMessage" = "Unable to write logs to file";
|
||||
"macToggleStatusButtonActivating" = "Activating…";
|
||||
"tunnelStatusDeactivating" = "Deactivating";
|
||||
"alertInvalidInterfaceTitle" = "Invalid interface";
|
||||
"alertTunnelActivationFailureOnDemandAddendum" = " This tunnel has Activate On Demand enabled, so this tunnel might be re-activated automatically by the OS. You may turn off Activate On Demand in this app by editing the tunnel configuration.";
|
||||
"alertTunnelActivationFailureTitle" = "Activation failure";
|
||||
"tunnelPeerTxBytes" = "Data sent";
|
||||
"tunnelOnDemandSSIDViewTitle" = "SSIDs";
|
||||
"tunnelEditPlaceholderTextOptional" = "Optional";
|
||||
"settingsExportZipButtonTitle" = "Export zip archive";
|
||||
"tunnelSectionTitleOnDemand" = "On-Demand Activation";
|
||||
"tunnelInterfaceGenerateKeypair" = "Generate keypair";
|
||||
"deleteTunnelsConfirmationAlertButtonTitle" = "Delete";
|
||||
"alertInvalidInterfaceMessageNameRequired" = "Interface name is required";
|
||||
"tunnelEditPlaceholderTextAutomatic" = "Automatic";
|
||||
"macViewPrivateData" = "view tunnel private keys";
|
||||
"alertInvalidPeerTitle" = "Invalid peer";
|
||||
"alertInvalidPeerMessageEndpointInvalid" = "Peer’s endpoint must be of the form ‘host:port’ or ‘[host]:port’";
|
||||
"alertTunnelActivationErrorTunnelIsNotInactiveTitle" = "Activation in progress";
|
||||
"alertInvalidPeerMessagePublicKeyDuplicated" = "Two or more peers cannot have the same public key";
|
||||
"macToggleStatusButtonDeactivate" = "Deactivate";
|
||||
"alertInvalidPeerMessagePreSharedKeyInvalid" = "Peer’s preshared key must be a 32-byte key in base64 encoding";
|
||||
"macAppExitingWithActiveTunnelInfo" = "The tunnel will remain active after exiting. You may disable it by reopening this application or through the Network panel in System Preferences.";
|
||||
"donateLink" = "♥ Donate to the WireGuard Project";
|
||||
"alertScanQRCodeCameraUnsupportedTitle" = "Camera Unsupported";
|
||||
"macMenuWindow" = "Window";
|
||||
"tunnelStatusRestarting" = "Restarting";
|
||||
"alertUnableToRemovePreviousLogTitle" = "Log export failed";
|
||||
"tunnelHandshakeTimestampNow" = "Now";
|
||||
"alertTunnelActivationFailureMessage" = "The tunnel could not be activated. Please ensure that you are connected to the Internet.";
|
||||
"macToggleStatusButtonWaiting" = "Waiting…";
|
||||
"macMenuHideOtherApps" = "Hide Others";
|
||||
"alertCantOpenInputZipFileMessage" = "The zip archive could not be read.";
|
||||
"alertInvalidInterfaceMessagePrivateKeyInvalid" = "Interface’s private key must be a 32-byte key in base64 encoding";
|
||||
"tunnelSectionTitleInterface" = "Interface";
|
||||
"alertInvalidInterfaceMessageDNSInvalid" = "Interface’s DNS servers must be a list of comma-separated IP addresses";
|
||||
"tunnelStatusInactive" = "Inactive";
|
||||
"alertSystemErrorMessageTunnelConfigurationDisabled" = "The configuration is disabled.";
|
||||
"alertInvalidPeerMessagePersistentKeepaliveInvalid" = "Peer’s persistent keepalive must be between 0 to 65535, or unspecified";
|
||||
"alertUnableToWriteLogTitle" = "Log export failed";
|
||||
"alertInvalidPeerMessagePublicKeyRequired" = "Peer’s public key is required";
|
||||
"macMenuNetworksNone" = "Networks: None";
|
||||
"tunnelOnDemandSSIDsKey" = "SSIDs";
|
||||
"alertInvalidPeerMessagePublicKeyInvalid" = "Peer’s public key must be a 32-byte key in base64 encoding";
|
||||
"tunnelOnDemandCellular" = "Cellular";
|
||||
"macFieldOnDemand" = "On-Demand:";
|
||||
"alertSystemErrorMessageTunnelConfigurationReadWriteFailed" = "Reading or writing the configuration failed.";
|
||||
"macMenuManageTunnels" = "Manage Tunnels";
|
||||
"macAppExitingWithActiveTunnelMessage" = "WireGuard is exiting with an active tunnel";
|
||||
"tunnelSectionTitlePeer" = "Peer";
|
||||
"alertSystemErrorMessageTunnelConfigurationStale" = "The configuration is stale.";
|
||||
"tunnelPeerPreSharedKey" = "Preshared key";
|
||||
"alertTunnelDNSFailureMessage" = "One or more endpoint domains could not be resolved.";
|
||||
"tunnelOnDemandAddMessageAddNewSSID" = "Add new";
|
||||
"alertInvalidInterfaceMessageAddressInvalid" = "Interface addresses must be a list of comma-separated IP addresses, optionally in CIDR notation";
|
||||
"tunnelOnDemandSectionTitleAddSSIDs" = "Add SSIDs";
|
||||
"alertTunnelDNSFailureTitle" = "DNS resolution failure";
|
||||
"macMenuToggleStatus" = "Toggle Status";
|
||||
"macMenuMinimize" = "Minimize";
|
||||
"deletePeerButtonTitle" = "Delete peer";
|
||||
"tunnelPeerRxBytes" = "Data received";
|
||||
"alertCantOpenInputZipFileTitle" = "Unable to read zip archive";
|
||||
"alertScanQRCodeUnreadableQRCodeMessage" = "The scanned code could not be read";
|
||||
"alertSystemErrorOnListingTunnelsTitle" = "Unable to list tunnels";
|
||||
"tunnelPeerExcludePrivateIPs" = "Exclude private IPs";
|
||||
"macAlertMultipleInterfaces" = "Configuration must have only one ‘Interface’ section.";
|
||||
"macAppStoreUpdatingAlertMessage" = "App Store would like to update WireGuard";
|
||||
"macUnusableTunnelMessage" = "The configuration for this tunnel cannot be found in the keychain.";
|
||||
"tunnelEditPlaceholderTextStronglyRecommended" = "Strongly recommended";
|
||||
"macMenuZoom" = "Zoom";
|
||||
"macExportPrivateData" = "export tunnel private keys";
|
||||
"macToggleStatusButtonDeactivating" = "Deactivating…";
|
||||
"iosViewPrivateData" = "Authenticate to view tunnel private keys.";
|
||||
"tunnelPeerLastHandshakeTime" = "Latest handshake";
|
||||
"macAlertPreSharedKeyInvalid" = "Preshared key is invalid";
|
||||
"alertBadConfigImportTitle" = "Unable to import tunnel";
|
||||
"macConfirmAndQuitAlertCloseWindow" = "Close Tunnels Manager";
|
||||
"tunnelStatusActivating" = "Activating";
|
||||
"alertTunnelActivationSystemErrorTitle" = "Activation failure";
|
||||
"alertInvalidInterfaceMessagePrivateKeyRequired" = "Interface’s private key is required";
|
||||
"tunnelOnDemandAnySSID" = "Any SSID";
|
||||
"macAlertInfoUnrecognizedPeerKey" = "Valid keys are: ‘PublicKey’, ‘PresharedKey’, ‘AllowedIPs’, ‘Endpoint’ and ‘PersistentKeepalive’";
|
||||
"tunnelOnDemandNoSSIDs" = "No SSIDs";
|
||||
"tunnelEditPlaceholderTextOff" = "Off";
|
||||
"tunnelEditPlaceholderTextRequired" = "Required";
|
||||
"tunnelStatusReasserting" = "Reactivating";
|
||||
"alertInvalidPeerMessageAllowedIPsInvalid" = "Peer’s allowed IPs must be a list of comma-separated IP addresses, optionally in CIDR notation";
|
||||
"macLogColumnTitleLogMessage" = "Log message";
|
||||
"iosExportPrivateData" = "Authenticate to export tunnel private keys.";
|
||||
"macSheetButtonImport" = "Import";
|
||||
"alertScanQRCodeNamePromptTitle" = "Please name the scanned tunnel";
|
||||
"alertUnableToRemovePreviousLogMessage" = "The pre-existing log could not be cleared";
|
||||
"alertTunnelActivationBackendFailureMessage" = "Unable to turn on Go backend library.";
|
||||
"settingsSectionTitleExportConfigurations" = "Export configurations";
|
||||
"settingsVersionKeyWireGuardGoBackend" = "WireGuard Go Backend";
|
||||
"macFieldOnDemandSSIDs" = "SSIDs:";
|
||||
"deletePeerConfirmationAlertMessage" = "Delete this peer?";
|
||||
"tunnelStatusActive" = "Active";
|
||||
"tunnelStatusWaiting" = "Waiting";
|
||||
"alertNoTunnelsInImportedZipArchiveMessage" = "No .conf tunnel files were found inside the zip archive.";
|
||||
"alertTunnelActivationFileDescriptorFailureMessage" = "Unable to determine TUN device file descriptor.";
|
||||
"macToggleStatusButtonActivate" = "Activate";
|
||||
|
||||
// Mac App Store updating alert
|
||||
|
||||
"macAppStoreUpdatingAlertMessage" = "App Store chce zaktualizować WireGuard";
|
||||
"macAppStoreUpdatingAlertInfoWithOnDemand (%@)" = "Proszę najpierw wyłączyć aktywację na żądanie tunelu „%@”, dezaktywować go, a dopiero następnie kontynuować aktualizację w App Store.";
|
||||
"macAppStoreUpdatingAlertInfoWithoutOnDemand (%@)" = "Proszę dezaktywować tunel „%@”, a następnie kontynuować aktualizację w App Store.";
|
||||
|
||||
// Donation
|
||||
|
||||
"donateLink" = "♥ Dotacja dla projektu WireGuard";
|
||||
"macTunnelsMenuTitle" = "Tunnels";
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
// Copyright © 2018-2019 WireGuard LLC. All Rights Reserved.
|
||||
// Copyright © 2018-2020 WireGuard LLC. All Rights Reserved.
|
||||
// Generic alert action names
|
||||
|
||||
|
||||
@@ -443,3 +443,4 @@
|
||||
// Donation
|
||||
|
||||
"donateLink" = "♥ Donează pentru proiectul WireGuard";
|
||||
"macTunnelsMenuTitle" = "Tunnels";
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
// Copyright © 2018-2019 WireGuard LLC. All Rights Reserved.
|
||||
// Copyright © 2018-2020 WireGuard LLC. All Rights Reserved.
|
||||
// Generic alert action names
|
||||
|
||||
|
||||
@@ -443,3 +443,4 @@
|
||||
// Donation
|
||||
|
||||
"donateLink" = "♥ Пожертвовать проекту WireGuard";
|
||||
"macTunnelsMenuTitle" = "Tunnels";
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
// Copyright © 2018-2019 WireGuard LLC. All Rights Reserved.
|
||||
// Copyright © 2018-2020 WireGuard LLC. All Rights Reserved.
|
||||
// Generic alert action names
|
||||
|
||||
|
||||
@@ -443,3 +443,4 @@
|
||||
// Donation
|
||||
|
||||
"donateLink" = "♥ Donirajte projektu WireGuard";
|
||||
"macTunnelsMenuTitle" = "Tunnels";
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
// Copyright © 2018-2019 WireGuard LLC. All Rights Reserved.
|
||||
// Copyright © 2018-2020 WireGuard LLC. All Rights Reserved.
|
||||
// Generic alert action names
|
||||
|
||||
|
||||
@@ -443,3 +443,4 @@
|
||||
// Donation
|
||||
|
||||
"donateLink" = "♥ WireGuard Projesine Bağış Yapın";
|
||||
"macTunnelsMenuTitle" = "Tunnels";
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
// Copyright © 2018-2019 WireGuard LLC. All Rights Reserved.
|
||||
// Copyright © 2018-2020 WireGuard LLC. All Rights Reserved.
|
||||
// Generic alert action names
|
||||
|
||||
|
||||
@@ -443,3 +443,4 @@
|
||||
// Donation
|
||||
|
||||
"donateLink" = "♥ 为 WireGuard 捐赠";
|
||||
"macTunnelsMenuTitle" = "Tunnels";
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
// Copyright © 2018-2019 WireGuard LLC. All Rights Reserved.
|
||||
// Copyright © 2018-2020 WireGuard LLC. All Rights Reserved.
|
||||
// Generic alert action names
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
"newTunnelViewTitle" = "新增設定";
|
||||
"editTunnelViewTitle" = "修改設定";
|
||||
|
||||
"tunnelSectionTitleStatus" = "ㄓ望太";
|
||||
"tunnelSectionTitleStatus" = "狀態";
|
||||
|
||||
"tunnelStatusInactive" = "未啟用";
|
||||
"tunnelStatusActivating" = "啟用中";
|
||||
@@ -69,6 +69,7 @@
|
||||
"tunnelInterfaceListenPort" = "監聽埠";
|
||||
"tunnelInterfaceMTU" = "MTU";
|
||||
"tunnelInterfaceDNS" = "DNS 伺服器";
|
||||
"tunnelInterfaceStatus" = "狀態";
|
||||
"tunnelEditPlaceholderTextAutomatic" = "自動";
|
||||
"tunnelHandshakeTimestampNow" = "現在";
|
||||
|
||||
@@ -85,6 +86,7 @@
|
||||
"macMenuCopy" = "複製";
|
||||
"macMenuPaste" = "貼上";
|
||||
"macMenuSelectAll" = "全選";
|
||||
"macMenuToggleStatus" = "切換狀態";
|
||||
"macMenuMinimize" = "最小化";
|
||||
"macMenuDeleteSelected" = "Delete Selected";
|
||||
"alertSystemErrorMessageTunnelConfigurationInvalid" = "The configuration is invalid.";
|
||||
@@ -162,7 +164,6 @@
|
||||
"alertUnableToRemovePreviousLogTitle" = "Log export failed";
|
||||
"alertTunnelActivationFailureMessage" = "The tunnel could not be activated. Please ensure that you are connected to the Internet.";
|
||||
"tunnelOnDemandOptionEthernetOnly" = "Ethernet only";
|
||||
"tunnelInterfaceStatus" = "Status";
|
||||
"macMenuHideOtherApps" = "Hide Others";
|
||||
"alertCantOpenInputZipFileMessage" = "The zip archive could not be read.";
|
||||
"alertInvalidInterfaceMessagePrivateKeyInvalid" = "Interface’s private key must be a 32-byte key in base64 encoding";
|
||||
@@ -206,7 +207,6 @@
|
||||
"alertTunnelDNSFailureTitle" = "DNS resolution failure";
|
||||
"tunnelOnDemandEthernet" = "Ethernet";
|
||||
"macLogButtonTitleSave" = "Save…";
|
||||
"macMenuToggleStatus" = "Toggle Status";
|
||||
"deletePeerButtonTitle" = "Delete peer";
|
||||
"tunnelPeerRxBytes" = "Data received";
|
||||
"alertCantOpenInputZipFileTitle" = "Unable to read zip archive";
|
||||
@@ -233,6 +233,7 @@
|
||||
"macConfirmAndQuitAlertCloseWindow" = "Close Tunnels Manager";
|
||||
"macMenuFile" = "File";
|
||||
"macToolTipToggleStatus" = "Toggle status (⌘T)";
|
||||
"macTunnelsMenuTitle" = "Tunnels";
|
||||
"alertTunnelActivationSystemErrorTitle" = "Activation failure";
|
||||
"alertInvalidInterfaceMessagePrivateKeyRequired" = "Interface’s private key is required";
|
||||
"tunnelOnDemandAnySSID" = "Any SSID";
|
||||
|
||||
@@ -52,6 +52,7 @@ extension Endpoint {
|
||||
let startOfHost = string.index(after: string.startIndex)
|
||||
guard let endOfHost = string.dropFirst().firstIndex(of: "]") else { return nil }
|
||||
let afterEndOfHost = string.index(after: endOfHost)
|
||||
if afterEndOfHost == string.endIndex { return nil }
|
||||
guard string[afterEndOfHost] == ":" else { return nil }
|
||||
startOfPort = string.index(after: afterEndOfHost)
|
||||
hostString = String(string[startOfHost ..< endOfHost])
|
||||
|
||||
@@ -14,19 +14,18 @@ package main
|
||||
import "C"
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"errors"
|
||||
"golang.org/x/sys/unix"
|
||||
"golang.zx2c4.com/wireguard/device"
|
||||
"golang.zx2c4.com/wireguard/tun"
|
||||
"log"
|
||||
"math"
|
||||
"os"
|
||||
"os/signal"
|
||||
"runtime"
|
||||
"strings"
|
||||
"time"
|
||||
"unsafe"
|
||||
|
||||
"golang.org/x/sys/unix"
|
||||
"golang.zx2c4.com/wireguard/device"
|
||||
"golang.zx2c4.com/wireguard/tun"
|
||||
)
|
||||
|
||||
var loggerFunc unsafe.Pointer
|
||||
@@ -105,16 +104,16 @@ func wgTurnOn(settings *C.char, tunFd int32) int32 {
|
||||
return -1
|
||||
}
|
||||
logger.Info.Println("Attaching to interface")
|
||||
device := device.NewDevice(tun, logger)
|
||||
dev := device.NewDevice(tun, logger)
|
||||
|
||||
setError := device.IpcSetOperation(bufio.NewReader(strings.NewReader(C.GoString(settings))))
|
||||
if setError != nil {
|
||||
logger.Error.Println(setError)
|
||||
err = dev.IpcSet(C.GoString(settings))
|
||||
if err != nil {
|
||||
logger.Error.Println(err)
|
||||
unix.Close(dupTunFd)
|
||||
return -1
|
||||
}
|
||||
|
||||
device.Up()
|
||||
dev.Up()
|
||||
logger.Info.Println("Device started")
|
||||
|
||||
var i int32
|
||||
@@ -127,18 +126,18 @@ func wgTurnOn(settings *C.char, tunFd int32) int32 {
|
||||
unix.Close(dupTunFd)
|
||||
return -1
|
||||
}
|
||||
tunnelHandles[i] = tunnelHandle{device, logger}
|
||||
tunnelHandles[i] = tunnelHandle{dev, logger}
|
||||
return i
|
||||
}
|
||||
|
||||
//export wgTurnOff
|
||||
func wgTurnOff(tunnelHandle int32) {
|
||||
device, ok := tunnelHandles[tunnelHandle]
|
||||
dev, ok := tunnelHandles[tunnelHandle]
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
delete(tunnelHandles, tunnelHandle)
|
||||
device.Close()
|
||||
dev.Close()
|
||||
}
|
||||
|
||||
//export wgSetConfig
|
||||
@@ -147,7 +146,7 @@ func wgSetConfig(tunnelHandle int32, settings *C.char) int64 {
|
||||
if !ok {
|
||||
return 0
|
||||
}
|
||||
err := dev.IpcSetOperation(bufio.NewReader(strings.NewReader(C.GoString(settings))))
|
||||
err := dev.IpcSet(C.GoString(settings))
|
||||
if err != nil {
|
||||
dev.Error.Println(err)
|
||||
if ipcErr, ok := err.(*device.IPCError); ok {
|
||||
@@ -164,33 +163,40 @@ func wgGetConfig(tunnelHandle int32) *C.char {
|
||||
if !ok {
|
||||
return nil
|
||||
}
|
||||
settings := new(bytes.Buffer)
|
||||
writer := bufio.NewWriter(settings)
|
||||
err := device.IpcGetOperation(writer)
|
||||
settings, err := device.IpcGet()
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
writer.Flush()
|
||||
return C.CString(settings.String())
|
||||
return C.CString(settings)
|
||||
}
|
||||
|
||||
//export wgBumpSockets
|
||||
func wgBumpSockets(tunnelHandle int32) {
|
||||
device, ok := tunnelHandles[tunnelHandle]
|
||||
dev, ok := tunnelHandles[tunnelHandle]
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
device.BindUpdate()
|
||||
device.SendKeepalivesToPeersWithCurrentKeypair()
|
||||
go func() {
|
||||
for i := 0; i < 10; i++ {
|
||||
err := dev.BindUpdate()
|
||||
if err == nil {
|
||||
dev.SendKeepalivesToPeersWithCurrentKeypair()
|
||||
return
|
||||
}
|
||||
dev.Error.Printf("Unable to update bind, try %d: %v", i+1, err)
|
||||
time.Sleep(time.Second / 2)
|
||||
}
|
||||
dev.Error.Println("Gave up trying to update bind; tunnel is likely dysfunctional")
|
||||
}()
|
||||
}
|
||||
|
||||
//export wgDisableSomeRoamingForBrokenMobileSemantics
|
||||
func wgDisableSomeRoamingForBrokenMobileSemantics(tunnelHandle int32) {
|
||||
device, ok := tunnelHandles[tunnelHandle]
|
||||
dev, ok := tunnelHandles[tunnelHandle]
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
device.DisableSomeRoamingForBrokenMobileSemantics()
|
||||
dev.DisableSomeRoamingForBrokenMobileSemantics()
|
||||
}
|
||||
|
||||
//export wgVersion
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
module golang.zx2c4.com/wireguard/ios
|
||||
|
||||
go 1.13
|
||||
go 1.15
|
||||
|
||||
require (
|
||||
golang.org/x/crypto v0.0.0-20201208171446-5f87f3452ae9 // indirect
|
||||
golang.org/x/net v0.0.0-20201209123823-ac852fbbde11 // indirect
|
||||
golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e
|
||||
golang.zx2c4.com/wireguard v0.0.20201118
|
||||
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad // indirect
|
||||
golang.org/x/net v0.0.0-20201216054612-986b41b23924 // indirect
|
||||
golang.org/x/sys v0.0.0-20201223074533-0d417f636930
|
||||
golang.zx2c4.com/wireguard v0.0.20201119-0.20201223104851-e467e07bbf51
|
||||
)
|
||||
|
||||
@@ -1,24 +1,24 @@
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
||||
golang.org/x/crypto v0.0.0-20201208171446-5f87f3452ae9 h1:sYNJzB4J8toYPQTM6pAkcmBRgw9SnQKP9oXCHfgy604=
|
||||
golang.org/x/crypto v0.0.0-20201208171446-5f87f3452ae9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
||||
golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
||||
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad h1:DN0cp81fZ3njFcrLCytUHRSUkqBjfTo4Tx9RJTWs0EY=
|
||||
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
golang.org/x/net v0.0.0-20201209123823-ac852fbbde11 h1:lwlPPsmjDKK0J6eG6xDWd5XPehI0R024zxjDnw3esPA=
|
||||
golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/net v0.0.0-20201216054612-986b41b23924 h1:QsnDpLLOKwHBBDa8nDws4DYNc/ryVW2vCpxCs09d4PY=
|
||||
golang.org/x/net v0.0.0-20201216054612-986b41b23924/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201117222635-ba5294a509c7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e h1:AyodaIpKjppX+cBfTASF2E1US3H2JFBj920Ot3rtDjs=
|
||||
golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201223074533-0d417f636930 h1:vRgIt+nup/B/BwIS0g2oC0haq0iqbV3ZA+u6+0TlNCo=
|
||||
golang.org/x/sys v0.0.0-20201223074533-0d417f636930/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.zx2c4.com/wireguard v0.0.20201118 h1:QL8y2C7uO8T6z1GY+UX/hSeWiYEBurQkXjOTRFtCvXU=
|
||||
golang.zx2c4.com/wireguard v0.0.20201118/go.mod h1:Dz+cq5bnrai9EpgYj4GDof/+qaGzbRWbeaAOs1bUYa0=
|
||||
golang.zx2c4.com/wireguard v0.0.20201119-0.20201223104851-e467e07bbf51 h1:F62E0jQdNkXUnELQw+NaOnMxdEnnGScuywq0NdB4YTQ=
|
||||
golang.zx2c4.com/wireguard v0.0.20201119-0.20201223104851-e467e07bbf51/go.mod h1:ITsWNpkFv78VPB7f8MiyuxeEMcHR4jfxHGCJLPP3GHs=
|
||||
|
||||
@@ -7,6 +7,8 @@
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
58233BCF2591F842002060A8 /* NotificationToken.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58233BCE2591F842002060A8 /* NotificationToken.swift */; };
|
||||
58233BD02591F842002060A8 /* NotificationToken.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58233BCE2591F842002060A8 /* NotificationToken.swift */; };
|
||||
585B105A2577E293004F691E /* InterfaceConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 585B10462577E293004F691E /* InterfaceConfiguration.swift */; };
|
||||
585B105B2577E293004F691E /* InterfaceConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 585B10462577E293004F691E /* InterfaceConfiguration.swift */; };
|
||||
585B105C2577E293004F691E /* InterfaceConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 585B10462577E293004F691E /* InterfaceConfiguration.swift */; };
|
||||
@@ -280,6 +282,7 @@
|
||||
/* End PBXCopyFilesBuildPhase section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
58233BCE2591F842002060A8 /* NotificationToken.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationToken.swift; sourceTree = "<group>"; };
|
||||
585B10462577E293004F691E /* InterfaceConfiguration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InterfaceConfiguration.swift; sourceTree = "<group>"; };
|
||||
585B10472577E293004F691E /* PeerConfiguration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PeerConfiguration.swift; sourceTree = "<group>"; };
|
||||
585B10482577E293004F691E /* DNSServer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DNSServer.swift; sourceTree = "<group>"; };
|
||||
@@ -344,6 +347,8 @@
|
||||
6F6483E6229293300075BA15 /* LaunchedAtLoginDetector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchedAtLoginDetector.swift; sourceTree = "<group>"; };
|
||||
6F689999218043390012E523 /* WireGuard-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "WireGuard-Bridging-Header.h"; sourceTree = "<group>"; };
|
||||
6F70E20D221058DF008BDFB4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Sources/WireGuardApp/Base.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
6F70E20D221058DF008BDFBA /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "Sources/WireGuardApp/zh-Hans.lproj/Localizable.strings"; sourceTree = "<group>"; };
|
||||
6F70E20D221058DF008BDFC6 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "Sources/WireGuardApp/zh-Hant.lproj/Localizable.strings"; sourceTree = "<group>"; };
|
||||
6F70E22922106A2D008BDFB4 /* WireGuardLoginItemHelper.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WireGuardLoginItemHelper.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
6F70E23222106A31008BDFB4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
6F70E23922109BEF008BDFB4 /* LoginItemHelper.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = LoginItemHelper.entitlements; sourceTree = "<group>"; };
|
||||
@@ -399,24 +404,24 @@
|
||||
6FDEF801218646B900D8FBF6 /* ZipArchive.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZipArchive.swift; sourceTree = "<group>"; };
|
||||
6FDEF805218725D200D8FBF6 /* SettingsTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsTableViewController.swift; sourceTree = "<group>"; };
|
||||
6FE1765521C90BBE002690EA /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Sources/WireGuardApp/Base.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
6F70E20D221058DF008BDFC6 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = zh-Hant; path = Sources/WireGuardApp/zh-Hant.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
6F70E20D221058DF008BDFBA /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = zh-Hans; path = Sources/WireGuardApp/zh-Hans.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
6F70E20D221058DF008BDFC5 /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = id; path = Sources/WireGuardApp/id.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
6F70E20D221058DF008BDFBC /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = Sources/WireGuardApp/it.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
6F70E20D221058DF008BDFC3 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = Sources/WireGuardApp/de.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
6F70E20D221058DF008BDFB5 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = Sources/WireGuardApp/fr.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
6F70E20D221058DF008BDFBF /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = Sources/WireGuardApp/fi.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
6F70E20D221058DF008BDFBE /* fa */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fa; path = Sources/WireGuardApp/fa.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
6F70E20D221058DF008BDFC4 /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = Sources/WireGuardApp/sl.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
6F70E20D221058DF008BDFB6 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = Sources/WireGuardApp/pl.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
6F70E20D221058DF008BDFB9 /* pa */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pa; path = Sources/WireGuardApp/pa.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
6F70E20D221058DF008BDFC1 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = Sources/WireGuardApp/ko.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
6F70E20D221058DF008BDFB8 /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = Sources/WireGuardApp/ca.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
6F70E20D221058DF008BDFC0 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = Sources/WireGuardApp/ru.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
6F70E20D221058DF008BDFBD /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = Sources/WireGuardApp/ro.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
6F70E20D221058DF008BDFC2 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = Sources/WireGuardApp/tr.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
6F70E20D221058DF008BDFBB /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = Sources/WireGuardApp/ja.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
6F70E20D221058DF008BDFB7 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = Sources/WireGuardApp/es.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
6FE1765521C90BBE002690FC /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = zh-Hant; path = Sources/WireGuardApp/zh-Hant.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
6FE1765521C90BBE002690F0 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = zh-Hans; path = Sources/WireGuardApp/zh-Hans.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
6FE1765521C90BBE002690FB /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = id; path = Sources/WireGuardApp/id.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
6FE1765521C90BBE002690F2 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = Sources/WireGuardApp/it.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
6FE1765521C90BBE002690F9 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = Sources/WireGuardApp/de.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
6FE1765521C90BBE002690EB /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = Sources/WireGuardApp/fr.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
6FE1765521C90BBE002690F5 /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = Sources/WireGuardApp/fi.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
6FE1765521C90BBE002690F4 /* fa */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fa; path = Sources/WireGuardApp/fa.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
6FE1765521C90BBE002690FA /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = Sources/WireGuardApp/sl.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
6FE1765521C90BBE002690EC /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = Sources/WireGuardApp/pl.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
6FE1765521C90BBE002690EF /* pa */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pa; path = Sources/WireGuardApp/pa.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
6FE1765521C90BBE002690F7 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = Sources/WireGuardApp/ko.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
6FE1765521C90BBE002690EE /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = Sources/WireGuardApp/ca.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
6FE1765521C90BBE002690F6 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = Sources/WireGuardApp/ru.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
6FE1765521C90BBE002690F3 /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = Sources/WireGuardApp/ro.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
6FE1765521C90BBE002690F8 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = Sources/WireGuardApp/tr.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
6FE1765521C90BBE002690F1 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = Sources/WireGuardApp/ja.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
6FE1765521C90BBE002690ED /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = Sources/WireGuardApp/es.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
6FE1765921C90E87002690EA /* LocalizationHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalizationHelper.swift; sourceTree = "<group>"; };
|
||||
6FE254FA219C10800028284D /* ZipImporter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ZipImporter.swift; sourceTree = "<group>"; };
|
||||
6FE254FE219C60290028284D /* ZipExporter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ZipExporter.swift; sourceTree = "<group>"; };
|
||||
@@ -580,6 +585,7 @@
|
||||
6F7774E6217201E0006A79B3 /* Model */,
|
||||
6F5A2B4421AFDE020081EDD8 /* FileManager+Extension.swift */,
|
||||
6B5C5E26220A48D30024272E /* Keychain.swift */,
|
||||
58233BCE2591F842002060A8 /* NotificationToken.swift */,
|
||||
);
|
||||
name = Shared;
|
||||
path = Sources/Shared;
|
||||
@@ -1289,6 +1295,7 @@
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
58233BD02591F842002060A8 /* NotificationToken.swift in Sources */,
|
||||
6FBA101521D613F90051C35F /* Application.swift in Sources */,
|
||||
6FB1BDCC21D50F5300A991BF /* TunnelsManager.swift in Sources */,
|
||||
6F8F0D7222258153000E8335 /* ActivateOnDemandViewModel.swift in Sources */,
|
||||
@@ -1442,6 +1449,7 @@
|
||||
6F61F1EB21B937EF00483816 /* WireGuardResult.swift in Sources */,
|
||||
6F7774F321774263006A79B3 /* TunnelEditTableViewController.swift in Sources */,
|
||||
6FBA103B21D6B4290051C35F /* ErrorPresenterProtocol.swift in Sources */,
|
||||
58233BCF2591F842002060A8 /* NotificationToken.swift in Sources */,
|
||||
585B10862577E294004F691E /* IPAddressRange.swift in Sources */,
|
||||
6FDEF802218646BA00D8FBF6 /* ZipArchive.swift in Sources */,
|
||||
585B10922577E294004F691E /* key.c in Sources */,
|
||||
@@ -1501,24 +1509,24 @@
|
||||
6FE1765421C90BBE002690EA /* Localizable.strings */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
6F70E20D221058DF008BDFC6 /* zh-Hant */,
|
||||
6F70E20D221058DF008BDFBA /* zh-Hans */,
|
||||
6F70E20D221058DF008BDFC5 /* id */,
|
||||
6F70E20D221058DF008BDFBC /* it */,
|
||||
6F70E20D221058DF008BDFC3 /* de */,
|
||||
6F70E20D221058DF008BDFB5 /* fr */,
|
||||
6F70E20D221058DF008BDFBF /* fi */,
|
||||
6F70E20D221058DF008BDFBE /* fa */,
|
||||
6F70E20D221058DF008BDFC4 /* sl */,
|
||||
6F70E20D221058DF008BDFB6 /* pl */,
|
||||
6F70E20D221058DF008BDFB9 /* pa */,
|
||||
6F70E20D221058DF008BDFC1 /* ko */,
|
||||
6F70E20D221058DF008BDFB8 /* ca */,
|
||||
6F70E20D221058DF008BDFC0 /* ru */,
|
||||
6F70E20D221058DF008BDFBD /* ro */,
|
||||
6F70E20D221058DF008BDFC2 /* tr */,
|
||||
6F70E20D221058DF008BDFBB /* ja */,
|
||||
6F70E20D221058DF008BDFB7 /* es */,
|
||||
6FE1765521C90BBE002690FC /* zh-Hant */,
|
||||
6FE1765521C90BBE002690F0 /* zh-Hans */,
|
||||
6FE1765521C90BBE002690FB /* id */,
|
||||
6FE1765521C90BBE002690F2 /* it */,
|
||||
6FE1765521C90BBE002690F9 /* de */,
|
||||
6FE1765521C90BBE002690EB /* fr */,
|
||||
6FE1765521C90BBE002690F5 /* fi */,
|
||||
6FE1765521C90BBE002690F4 /* fa */,
|
||||
6FE1765521C90BBE002690FA /* sl */,
|
||||
6FE1765521C90BBE002690EC /* pl */,
|
||||
6FE1765521C90BBE002690EF /* pa */,
|
||||
6FE1765521C90BBE002690F7 /* ko */,
|
||||
6FE1765521C90BBE002690EE /* ca */,
|
||||
6FE1765521C90BBE002690F6 /* ru */,
|
||||
6FE1765521C90BBE002690F3 /* ro */,
|
||||
6FE1765521C90BBE002690F8 /* tr */,
|
||||
6FE1765521C90BBE002690F1 /* ja */,
|
||||
6FE1765521C90BBE002690ED /* es */,
|
||||
6FE1765521C90BBE002690EA /* Base */,
|
||||
);
|
||||
name = Localizable.strings;
|
||||
|
||||
@@ -23,7 +23,7 @@ done < Sources/WireGuardApp/Base.lproj/Localizable.strings
|
||||
git add Sources/WireGuardApp/*.lproj
|
||||
|
||||
declare -A LOCALE_MAP
|
||||
[[ $(< WireGuard.xcodeproj/project.pbxproj) =~ [[:space:]]([0-9A-F]{24})\ /\*\ Base\ \*/, ]]
|
||||
[[ $(< WireGuard.xcodeproj/project.pbxproj) =~ [[:space:]]([0-9A-F]{24})\ /\*\ Base\ \*/\ =\ [^$'\n']*Base\.lproj/Localizable\.strings ]]
|
||||
base_id="${BASH_REMATCH[1]:0:16}"
|
||||
idx=$(( "0x${BASH_REMATCH[1]:16}" ))
|
||||
while read -r filename; do
|
||||
|
||||
Reference in New Issue
Block a user