Compare commits

...

19 Commits

Author SHA1 Message Date
Jason A. Donenfeld c4f79beb8d App: version bump
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2020-12-23 15:05:56 +01:00
Jason A. Donenfeld a613fec2ff project: sync translations and improve id generation again
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2020-12-23 14:55:29 +01:00
Andrej Mihajlov e54a5d9a13 UI: macOS: Group more than 10 tunnels into submenu
Signed-off-by: Andrej Mihajlov <and@mullvad.net>
2020-12-23 14:40:54 +01:00
Andrej Mihajlov 6d57c8b6f9 UI: Avoid force unwrap when checking for errors
Signed-off-by: Andrej Mihajlov <and@mullvad.net>
2020-12-23 14:17:59 +01:00
Jason A. Donenfeld b67acaccff Kit: do not crash on [abcd::] with missing port
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2020-12-23 14:06:26 +01:00
Jason A. Donenfeld d8568b0e31 Kit: Go: bump module and simplify API
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2020-12-23 13:40:24 +01:00
Andrej Mihajlov 373bb2ae99 UI: pause VPN configurations observer while adding or removing multiple tunnels
Signed-off-by: Andrej Mihajlov <and@mullvad.net>
2020-12-22 12:47:02 +01:00
Andrej Mihajlov 631286e2d1 UI: use NotificationToken to properly clean up observers
When the variable goes out of scope, the observer isn't removed unless
an explicit call is made to the token.

Signed-off-by: Andrej Mihajlov <and@mullvad.net>
2020-12-22 12:46:30 +01:00
Andrej Mihajlov 74cd7041dc Keychain: prevent call to stat() when determining appex path
Signed-off-by: Andrej Mihajlov <and@mullvad.net>
2020-12-22 12:46:14 +01:00
Jason A. Donenfeld 21d920c8b0 Kit: Go: use Windows-style retry sleep loop on bind updates
Something odd happens in the network extension that we still don't
understand. Attempt to poke it in this terrible way.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2020-12-18 23:53:39 +01:00
Jason A. Donenfeld 44c4df1cd5 UI: Model: remove 0.0.0.0/8 from non-private IPs
macOS freaks out if you try to explicitly route to 0.0.0.0/8 in its
includedRoutes parameter. Even though 0.0.0.0/8 isn't RFC1918, it is
marked in RFC6890 as "this host on this network", so removing it from
the Internet routes makes sense semantically too.

This commit changes 0.0.0.0/5 into:
- 1.0.0.0/8
- 2.0.0.0/8
- 3.0.0.0/8
- 4.0.0.0/6

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2020-12-18 23:53:39 +01:00
Jason A. Donenfeld a4fc0f64b8 UI: iOS: remove donation link
Apple forbids us from having a simple link to wireguard.com/donations/
in the version info window, citing the existence of this link as a form
of payment outside of their in-app purchase framework that requires 30%.
The link had been there for around two years. After rejecting an app
update for a critical networking regression unrelated to this, they
wrote:

    Dec 17, 2020 at 8:35 PM
    From Apple

    3.1.1 - Business - Payments - In-App Purchase

    We noticed that your app allows users to contribute donations to the
    development of your app with a mechanism other than the in-app
    purchase API, which is not appropriate for the App Store.

    Next Steps

    To resolve this issue, please revise your app to use the in-app
    purchase API to pay for this type of transaction. Please note that
    even though tipping another individual is optional, the tip is
    connected to or associated with the receipt of digital content or
    services in your app and must be purchased through in-app purchase
    in accordance with guideline 3.1.1 of the App Store Review
    Guidelines.

    Please see attached screenshot for details.

Trying to appeal this or reason with Apple is not going to be a fruitful
endeavor, so instead we simply cut our losses and remove the donation
link entirely. The goal, anyway, is to get a timely critical update into
the hands of users, and encouraging Apple to block that further would be
a disservice.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2020-12-17 22:44:30 +01:00
Andrej Mihajlov 9269c7c1c1 UI: macOS: Fix UTF-8 and UTF-16 conversions in highlighter code
NSString uses UTF-16 internally, while String uses UTF-8 in Swift 5.

Signed-off-by: Andrej Mihajlov <and@mullvad.net>
2020-12-17 17:36:46 +01:00
Jason A. Donenfeld 403ee63615 project: generate more stable locale IDs
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2020-12-17 12:41:23 +01:00
Andrej Mihajlov b622fde291 build: disable hardened runtime on iOS but keep it enabled on macOS
Signed-off-by: Andrej Mihajlov <and@mullvad.net>
2020-12-17 11:58:50 +01:00
Jason A. Donenfeld 386fe4eb12 Version bump
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2020-12-17 00:43:38 +01:00
Jason A. Donenfeld 49b7d083f1 UI: add missing translations to incomplete locales
This is the wrong way to fix the problem. The correct way will involve
moving away from the whacky tr() macro and using translations functions
properly. But migrating to that will require some heavy scripting work.
So for now, use a hammer.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2020-12-17 00:40:42 +01:00
Jason A. Donenfeld db4e2915f3 Kit: Adapter: do not treat NE settings timeouts as fatal
The general Network Extension framework is incredibly buggy, and a
timeout when setting the network settings does not necessarily imply
that the whole operation failed. Simply log the condition and move on.
This restores the app's old behavior.

Reported-by: Filipe Mendonça <cfilipem@gmail.com>
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2020-12-17 00:26:00 +01:00
Jason A. Donenfeld 20bdf46792 Kit: PacketTunnelSettingsGenerator: do not require DNS queries if no DNS
Prior, we would set matchDomains=[""] even if the user didn't provide
any DNS servers. This was kind of incoherent, but I guess we had in mind
some kind of non-sensical leakproof scheme that never really worked
anyway. NetworkExtension didn't like this, so setTunnelNetworkSettings
would, rather than return an error, simply timeout and never call its
callback function. But everything worked fine, so we had code in the UI
to check to make sure everything was okay after 5 seconds or so of no
callback. Recent changes made the timeout fatal on the network extension
side, so rather than succeed, configs with no DNS server started
erroring out, causing user reports.

This commit attempts to handle the root cause of the timeout issue by
not twiddling with DNS settings if no DNS server was specified. For now,
however, it leaves the hard-timeout semantics in place.

Reported-by: Filipe Mendonça <cfilipem@gmail.com>
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2020-12-17 00:10:28 +01:00
38 changed files with 2048 additions and 203 deletions
+1 -1
View File
@@ -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
}
+33
View File
@@ -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…";
+2 -2
View File
@@ -1,2 +1,2 @@
VERSION_NAME = 1.0.10
VERSION_ID = 19
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) {
@@ -11,7 +11,6 @@ class SettingsTableViewController: UITableViewController {
case goBackendVersion
case exportZipArchive
case viewLog
case donateLink
var localizedUIString: String {
switch self {
@@ -19,13 +18,12 @@ class SettingsTableViewController: UITableViewController {
case .goBackendVersion: return tr("settingsVersionKeyWireGuardGoBackend")
case .exportZipArchive: return tr("settingsExportZipButtonTitle")
case .viewLog: return tr("settingsViewLogButtonTitle")
case .donateLink: return tr("donateLink")
}
}
}
let settingsFieldsBySection: [[SettingsFields]] = [
[.iosAppVersion, .goBackendVersion, .donateLink],
[.iosAppVersion, .goBackendVersion],
[.exportZipArchive],
[.viewLog]
]
@@ -169,15 +167,6 @@ extension SettingsTableViewController {
self?.presentLogView()
}
return cell
} else if field == .donateLink {
let cell: ButtonCell = tableView.dequeueReusableCell(for: indexPath)
cell.buttonText = field.localizedUIString
cell.onTapped = {
if let url = URL(string: "https://www.wireguard.com/donations/"), UIApplication.shared.canOpenURL(url) {
UIApplication.shared.open(url, options: [:])
}
}
return cell
}
fatalError()
}
+139 -34
View File
@@ -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
}
}
}
@@ -67,7 +67,7 @@ class ConfTextStorage: NSTextStorage {
override func replaceCharacters(in range: NSRange, with str: String) {
beginEditing()
backingStore.replaceCharacters(in: range, with: str)
edited(.editedCharacters, range: range, changeInLength: str.count - range.length)
edited(.editedCharacters, range: range, changeInLength: str.utf16.count - range.length)
endEditing()
}
@@ -94,6 +94,7 @@ class ConfTextStorage: NSTextStorage {
func evaluateExcludePrivateIPs(highlightSpans: UnsafePointer<highlight_span>) {
var spans = highlightSpans
let string = backingStore.string
enum FieldType: String {
case dns
case allowedips
@@ -102,7 +103,7 @@ class ConfTextStorage: NSTextStorage {
resetLastPeer()
while spans.pointee.type != HighlightEnd {
let span = spans.pointee
var substring = backingStore.attributedSubstring(from: NSRange(location: span.start, length: span.len)).string.lowercased()
var substring = String(string.substring(higlightSpan: span)).lowercased()
if span.type == HighlightError {
resetLastPeer()
@@ -123,8 +124,9 @@ class ConfTextStorage: NSTextStorage {
let next = spans.successor()
let nextnext = next.successor()
if next.pointee.type == HighlightDelimiter && nextnext.pointee.type == HighlightCidr {
substring += backingStore.attributedSubstring(from: NSRange(location: next.pointee.start, length: next.pointee.len)).string +
backingStore.attributedSubstring(from: NSRange(location: nextnext.pointee.start, length: nextnext.pointee.len)).string
let delimiter = string.substring(higlightSpan: next.pointee)
let cidr = string.substring(higlightSpan: nextnext.pointee)
substring += delimiter + cidr
}
lastOnePeerAllowedIPs.append(substring)
} else if span.type == HighlightPublicKey {
@@ -139,7 +141,8 @@ class ConfTextStorage: NSTextStorage {
hasError = false
privateKeyString = nil
let fullTextRange = NSRange(location: 0, length: (backingStore.string as NSString).length)
let string = backingStore.string
let fullTextRange = NSRange(..<string.endIndex, in: string)
backingStore.beginEditing()
let defaultAttributes: [NSAttributedString.Key: Any] = [
@@ -147,15 +150,19 @@ class ConfTextStorage: NSTextStorage {
.font: defaultFont
]
backingStore.setAttributes(defaultAttributes, range: fullTextRange)
var spans = highlight_config(backingStore.string)!
var spans = highlight_config(string)!
evaluateExcludePrivateIPs(highlightSpans: spans)
let spansStart = spans
while spans.pointee.type != HighlightEnd {
let span = spans.pointee
let range = NSRange(location: span.start, length: span.len)
let startIndex = string.utf8.index(string.startIndex, offsetBy: span.start)
let endIndex = string.utf8.index(startIndex, offsetBy: span.len)
let range = NSRange(startIndex..<endIndex, in: string)
backingStore.setAttributes(nonColorAttributes(for: span.type), range: range)
let color = textColorTheme.colorMap[span.type.rawValue, default: textColorTheme.defaultColor]
backingStore.addAttribute(.foregroundColor, value: color, range: range)
@@ -164,7 +171,7 @@ class ConfTextStorage: NSTextStorage {
}
if span.type == HighlightPrivateKey {
privateKeyString = backingStore.attributedSubstring(from: NSRange(location: span.start, length: span.len)).string
privateKeyString = String(string.substring(higlightSpan: span))
}
spans = spans.successor()
@@ -178,3 +185,12 @@ class ConfTextStorage: NSTextStorage {
}
}
private extension String {
func substring(higlightSpan span: highlight_span) -> Substring {
let startIndex = self.utf8.index(self.utf8.startIndex, offsetBy: span.start)
let endIndex = self.utf8.index(startIndex, offsetBy: span.len)
return self[startIndex..<endIndex]
}
}
@@ -70,7 +70,7 @@ class ConfTextView: NSTextView {
}
func setConfText(_ text: String) {
let fullTextRange = NSRange(location: 0, length: (string as NSString).length)
let fullTextRange = NSRange(..<string.endIndex, in: string)
if shouldChangeText(in: fullTextRange, replacementString: text) {
replaceCharacters(in: fullTextRange, with: text)
didChangeText()
@@ -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 {
@@ -95,3 +95,182 @@
"macMenuManageTunnels" = "Gestiona túnels";
"macMenuCut" = "Talla";
"macMenuCopy" = "Copia";
"newTunnelViewTitle" = "New configuration";
"macMenuDeleteSelected" = "Delete Selected";
"alertSystemErrorMessageTunnelConfigurationInvalid" = "The configuration is invalid.";
"tunnelPeerEndpoint" = "Endpoint";
"tunnelInterfaceMTU" = "MTU";
"alertInvalidInterfaceMessageListenPortInvalid" = "Interfaces listen port must be between 0 and 65535, or unspecified";
"addPeerButtonTitle" = "Add peer";
"tunnelHandshakeTimestampSystemClockBackward" = "(System clock wound backwards)";
"macMenuTitle" = "WireGuard";
"macAlertNoInterface" = "Configuration must have an Interface section.";
"macNameFieldExportZip" = "Export tunnels to:";
"editTunnelViewTitle" = "Edit configuration";
"alertSystemErrorMessageTunnelConfigurationUnknown" = "Unknown system error.";
"macEditDiscard" = "Discard";
"macSheetButtonExportZip" = "Save";
"macWindowTitleManageTunnels" = "Manage WireGuard Tunnels";
"tunnelsListTitle" = "WireGuard";
"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";
"macMenuHideApp" = "Hide WireGuard";
"macDeleteTunnelConfirmationAlertInfo" = "You cannot undo this action.";
"macDeleteTunnelConfirmationAlertButtonTitleDeleting" = "Deleting…";
"tunnelPeerPersistentKeepalive" = "Persistent keepalive";
"alertSystemErrorMessageTunnelConnectionFailed" = "The connection failed.";
"macButtonEdit" = "Edit";
"macAlertPublicKeyInvalid" = "Public key is invalid";
"tunnelOnDemandOptionWiFiOnly" = "Wi-Fi only";
"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.";
"tunnelOnDemandOptionOff" = "Off";
"tunnelOnDemandSectionTitleSelectedSSIDs" = "SSIDs";
"macAlertInfoUnrecognizedInterfaceKey" = "Valid keys are: PrivateKey, ListenPort, Address, DNS and MTU.";
"macLogColumnTitleTime" = "Time";
"actionOK" = "OK";
"alertTunnelNameEmptyMessage" = "Cannot create tunnel with an empty name";
"alertInvalidInterfaceMessageMTUInvalid" = "Interfaces MTU must be between 576 and 65535, or unspecified";
"tunnelOnDemandWiFi" = "Wi-Fi";
"alertTunnelNameEmptyTitle" = "No name provided";
"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";
"macLogButtonTitleClose" = "Close";
"tunnelOnDemandSSIDViewTitle" = "SSIDs";
"tunnelOnDemandOptionCellularOnly" = "Cellular only";
"tunnelEditPlaceholderTextOptional" = "Optional";
"settingsExportZipButtonTitle" = "Export zip archive";
"tunnelSectionTitleOnDemand" = "On-Demand Activation";
"deleteTunnelsConfirmationAlertButtonTitle" = "Delete";
"alertInvalidInterfaceMessageNameRequired" = "Interface name is required";
"tunnelEditPlaceholderTextAutomatic" = "Automatic";
"macViewPrivateData" = "view tunnel private keys";
"alertInvalidPeerMessageEndpointInvalid" = "Peers endpoint must be of the form host:port or [host]:port";
"alertTunnelActivationErrorTunnelIsNotInactiveTitle" = "Activation in progress";
"addTunnelMenuImportFile" = "Create from file or archive";
"deletePeerConfirmationAlertButtonTitle" = "Delete";
"addTunnelMenuQRCode" = "Create from QR code";
"alertInvalidPeerMessagePreSharedKeyInvalid" = "Peers 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";
"macMenuWindow" = "Window";
"tunnelStatusRestarting" = "Restarting";
"tunnelHandshakeTimestampNow" = "Now";
"alertTunnelActivationFailureMessage" = "The tunnel could not be activated. Please ensure that you are connected to the Internet.";
"tunnelInterfaceListenPort" = "Listen port";
"tunnelOnDemandOptionEthernetOnly" = "Ethernet only";
"macMenuHideOtherApps" = "Hide Others";
"alertCantOpenInputZipFileMessage" = "The zip archive could not be read.";
"alertInvalidInterfaceMessagePrivateKeyInvalid" = "Interfaces private key must be a 32-byte key in base64 encoding";
"deleteTunnelButtonTitle" = "Delete tunnel";
"alertInvalidInterfaceMessageDNSInvalid" = "Interfaces DNS servers must be a list of comma-separated IP addresses";
"tunnelStatusInactive" = "Inactive";
"macAlertPrivateKeyInvalid" = "Private key is invalid.";
"deleteTunnelConfirmationAlertMessage" = "Delete this tunnel?";
"macDeleteTunnelConfirmationAlertButtonTitleCancel" = "Cancel";
"alertSystemErrorMessageTunnelConfigurationDisabled" = "The configuration is disabled.";
"alertInvalidPeerMessagePersistentKeepaliveInvalid" = "Peers persistent keepalive must be between 0 to 65535, or unspecified";
"macMenuNetworksNone" = "Networks: None";
"tunnelOnDemandSSIDsKey" = "SSIDs";
"alertCantOpenOutputZipFileForWritingMessage" = "Could not open zip file for writing.";
"macMenuSelectAll" = "Select All";
"alertInvalidPeerMessagePublicKeyInvalid" = "Peers 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";
"tunnelOnDemandOptionWiFiOrCellular" = "Wi-Fi or cellular";
"alertSystemErrorOnModifyTunnelTitle" = "Unable to modify tunnel";
"alertSystemErrorMessageTunnelConfigurationReadWriteFailed" = "Reading or writing the configuration failed.";
"macMenuEditTunnel" = "Edit…";
"macButtonImportTunnels" = "Import tunnel(s) from file";
"macAppExitingWithActiveTunnelMessage" = "WireGuard is exiting with an active tunnel";
"alertSystemErrorMessageTunnelConfigurationStale" = "The configuration is stale.";
"tunnelPeerPreSharedKey" = "Preshared key";
"alertTunnelDNSFailureMessage" = "One or more endpoint domains could not be resolved.";
"alertInvalidInterfaceMessageAddressInvalid" = "Interface addresses must be a list of comma-separated IP addresses, optionally in CIDR notation";
"alertNoTunnelsInImportedZipArchiveTitle" = "No tunnels in zip archive";
"alertTunnelDNSFailureTitle" = "DNS resolution failure";
"macLogButtonTitleSave" = "Save…";
"macMenuToggleStatus" = "Toggle Status";
"macMenuMinimize" = "Minimize";
"deletePeerButtonTitle" = "Delete peer";
"alertCantOpenInputZipFileTitle" = "Unable to read zip archive";
"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)";
"tunnelEditPlaceholderTextStronglyRecommended" = "Strongly recommended";
"macMenuZoom" = "Zoom";
"alertBadArchiveTitle" = "Unable to read zip archive";
"macExportPrivateData" = "export tunnel private keys";
"alertTunnelAlreadyExistsWithThatNameTitle" = "Name already exists";
"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)";
"macTunnelsMenuTitle" = "Tunnels";
"alertTunnelActivationSystemErrorTitle" = "Activation failure";
"alertInvalidInterfaceMessagePrivateKeyRequired" = "Interfaces 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…";
"macMenuViewLog" = "View Log";
"macAlertInfoUnrecognizedPeerKey" = "Valid keys are: PublicKey, PresharedKey, AllowedIPs, Endpoint and PersistentKeepalive";
"tunnelOnDemandNoSSIDs" = "No SSIDs";
"deleteTunnelConfirmationAlertButtonTitle" = "Delete";
"tunnelEditPlaceholderTextOff" = "Off";
"addTunnelMenuHeader" = "Add a new WireGuard tunnel";
"macUnusableTunnelButtonTitleDeleteTunnel" = "Delete tunnel";
"tunnelEditPlaceholderTextRequired" = "Required";
"tunnelStatusReasserting" = "Reactivating";
"macMenuTunnel" = "Tunnel";
"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";
"tunnelOnDemandOptionWiFiOrEthernet" = "Wi-Fi or ethernet";
"macToggleStatusButtonActivate" = "Activate";
"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
@@ -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,15 +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";
"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.";
"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…";
"alertCantOpenInputConfFileTitle" = "Unable to import from file";
"macConfirmAndQuitAlertMessage" = "Do you want to close the tunnels manager or quit WireGuard entirely?";
"macAlertInfoUnrecognizedInterfaceKey" = "Valid keys are: PrivateKey, ListenPort, Address, DNS and MTU.";
"alertTunnelNameEmptyMessage" = "Cannot create tunnel with an empty name";
"alertTunnelNameEmptyTitle" = "No name provided";
"macMenuAddEmptyTunnel" = "Add Empty Tunnel…";
"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.";
"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.";
"macMenuHideOtherApps" = "Hide Others";
"macAlertPrivateKeyInvalid" = "Private key is invalid.";
"macMenuNetworksNone" = "Networks: None";
"alertSystemErrorMessageTunnelConfigurationReadWriteFailed" = "Reading or writing the configuration failed.";
"macAppExitingWithActiveTunnelMessage" = "WireGuard is exiting with an active tunnel";
"alertSystemErrorMessageTunnelConfigurationStale" = "The configuration is stale.";
"alertTunnelDNSFailureMessage" = "One or more endpoint domains could not be resolved.";
"alertSystemErrorOnListingTunnelsTitle" = "Unable to list tunnels";
"macAlertMultipleInterfaces" = "Configuration must have only one Interface section.";
"macMenuZoom" = "Zoom";
"macExportPrivateData" = "export tunnel private keys";
"alertTunnelAlreadyExistsWithThatNameTitle" = "Name already exists";
"iosViewPrivateData" = "Authenticate to view tunnel private keys.";
"macTunnelsMenuTitle" = "Tunnels";
"alertTunnelAlreadyExistsWithThatNameMessage" = "A tunnel with that name already exists";
"iosExportPrivateData" = "Authenticate to export tunnel private keys.";
"alertTunnelActivationBackendFailureMessage" = "Unable to turn on Go backend library.";
"settingsVersionKeyWireGuardGoBackend" = "WireGuard Go Backend";
"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
@@ -347,3 +347,59 @@
// Donation
"donateLink" = "♥ کمک مالی به پروژه WireGuard";
"alertInvalidInterfaceMessageListenPortInvalid" = "Interfaces listen port must be between 0 and 65535, or unspecified";
"tunnelHandshakeTimestampSystemClockBackward" = "(System clock wound backwards)";
"macAlertNoInterface" = "Configuration must have an Interface section.";
"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";
"alertTunnelActivationSetNetworkSettingsMessage" = "Unable to apply network settings to tunnel object.";
"alertCantOpenInputConfFileTitle" = "Unable to import from file";
"alertScanQRCodeInvalidQRCodeMessage" = "The scanned QR code is not a valid WireGuard configuration";
"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.";
"alertTunnelNameEmptyMessage" = "Cannot create tunnel with an empty name";
"alertInvalidInterfaceMessageMTUInvalid" = "Interfaces MTU must be between 576 and 65535, or unspecified";
"alertUnableToWriteLogMessage" = "Unable to write logs to file";
"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.";
"alertInvalidPeerMessageEndpointInvalid" = "Peers endpoint must be of the form host:port or [host]:port";
"alertInvalidPeerMessagePublicKeyDuplicated" = "Two or more peers cannot have the same public key";
"alertInvalidPeerMessagePreSharedKeyInvalid" = "Peers 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.";
"alertTunnelActivationFailureMessage" = "The tunnel could not be activated. Please ensure that you are connected to the Internet.";
"alertCantOpenInputZipFileMessage" = "The zip archive could not be read.";
"alertInvalidInterfaceMessagePrivateKeyInvalid" = "Interfaces private key must be a 32-byte key in base64 encoding";
"alertInvalidInterfaceMessageDNSInvalid" = "Interfaces DNS servers must be a list of comma-separated IP addresses";
"alertInvalidPeerMessagePersistentKeepaliveInvalid" = "Peers persistent keepalive must be between 0 to 65535, or unspecified";
"alertInvalidPeerMessagePublicKeyRequired" = "Peers public key is required";
"alertCantOpenOutputZipFileForWritingMessage" = "Could not open zip file for writing.";
"alertInvalidPeerMessagePublicKeyInvalid" = "Peers public key must be a 32-byte key in base64 encoding";
"alertSystemErrorMessageTunnelConfigurationReadWriteFailed" = "Reading or writing the configuration failed.";
"macAppExitingWithActiveTunnelMessage" = "WireGuard is exiting with an active tunnel";
"alertTunnelDNSFailureMessage" = "One or more endpoint domains could not be resolved.";
"alertInvalidInterfaceMessageAddressInvalid" = "Interface addresses must be a list of comma-separated IP addresses, optionally in CIDR notation";
"alertTunnelDNSFailureTitle" = "DNS resolution failure";
"macMenuToggleStatus" = "Toggle Status";
"alertCantOpenInputZipFileTitle" = "Unable to read zip archive";
"alertScanQRCodeUnreadableQRCodeMessage" = "The scanned code could not be read";
"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.";
"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" = "Peers allowed IPs must be a list of comma-separated IP addresses, optionally in CIDR notation";
"alertTunnelAlreadyExistsWithThatNameMessage" = "A tunnel with that name already exists";
"iosExportPrivateData" = "Authenticate to export tunnel private keys.";
"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";
"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.";
@@ -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,5 +131,273 @@
"tunnelEditPlaceholderTextRequired" = "Pakollinen";
"tunnelEditPlaceholderTextOptional" = "Valinnainen";
"tunnelEditPlaceholderTextAutomatic" = "Automaattinen";
"tunnelEditPlaceholderTextStronglyRecommended" = "Erittäin suositeltavaa";
"tunnelEditPlaceholderTextOff" = "Pois päältä";
"tunnelPeerPersistentKeepaliveValue (%@)" = "joka %@ sekuntin välein";
"tunnelHandshakeTimestampNow" = "Nyt";
"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ä 065535 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.";
"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.";
"alertCantOpenInputConfFileTitle" = "Unable to import from file";
"alertScanQRCodeInvalidQRCodeMessage" = "The scanned QR code is not a valid WireGuard configuration";
"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.";
"alertTunnelNameEmptyMessage" = "Cannot create tunnel with an empty name";
"alertUnableToWriteLogMessage" = "Unable to write logs to file";
"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.";
"settingsExportZipButtonTitle" = "Export zip archive";
"macViewPrivateData" = "view tunnel private keys";
"macAppExitingWithActiveTunnelInfo" = "The tunnel will remain active after exiting. You may disable it by reopening this application or through the Network panel in System Preferences.";
"alertUnableToRemovePreviousLogTitle" = "Log export failed";
"alertTunnelActivationFailureMessage" = "The tunnel could not be activated. Please ensure that you are connected to the Internet.";
"alertCantOpenInputZipFileMessage" = "The zip archive could not be read.";
"alertSystemErrorMessageTunnelConfigurationDisabled" = "The configuration is disabled.";
"alertUnableToWriteLogTitle" = "Log export failed";
"alertCantOpenOutputZipFileForWritingMessage" = "Could not open zip file for writing.";
"alertSystemErrorOnRemoveTunnelTitle" = "Unable to remove tunnel";
"alertSystemErrorOnModifyTunnelTitle" = "Unable to modify tunnel";
"macAppExitingWithActiveTunnelMessage" = "WireGuard is exiting with an active tunnel";
"alertSystemErrorMessageTunnelConfigurationStale" = "The configuration is stale.";
"alertTunnelDNSFailureMessage" = "One or more endpoint domains could not be resolved.";
"alertTunnelDNSFailureTitle" = "DNS resolution failure";
"alertCantOpenInputZipFileTitle" = "Unable to read zip archive";
"alertScanQRCodeUnreadableQRCodeMessage" = "The scanned code could not be read";
"macAlertMultipleInterfaces" = "Configuration must have only one Interface section.";
"macUnusableTunnelMessage" = "The configuration for this tunnel cannot be found in the keychain.";
"alertBadArchiveTitle" = "Unable to read zip archive";
"macExportPrivateData" = "export tunnel private keys";
"macToolTipToggleStatus" = "Toggle status (⌘T)";
"macTunnelsMenuTitle" = "Tunnels";
"alertTunnelAlreadyExistsWithThatNameMessage" = "A tunnel with that name already exists";
"iosExportPrivateData" = "Authenticate to export tunnel private keys.";
"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";
"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.";
@@ -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
@@ -92,3 +92,181 @@
"tunnelOnDemandCellular" = "Cellular";
"tunnelOnDemandEthernet" = "Ethernet";
"tunnelOnDemandWiFi" = "Wi-Fi";
"settingsSectionTitleAbout" = "About";
"macMenuDeleteSelected" = "Delete Selected";
"alertSystemErrorMessageTunnelConfigurationInvalid" = "The configuration is invalid.";
"alertInvalidInterfaceMessageListenPortInvalid" = "Interfaces listen port must be between 0 and 65535, or unspecified";
"addPeerButtonTitle" = "Add peer";
"tunnelHandshakeTimestampSystemClockBackward" = "(System clock wound backwards)";
"macMenuTitle" = "WireGuard";
"macAlertNoInterface" = "Configuration must have an Interface section.";
"macNameFieldExportZip" = "Export tunnels to:";
"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";
"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";
"tunnelOnDemandOptionWiFiOnly" = "Wi-Fi only";
"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.";
"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" = "Interfaces MTU must be between 576 and 65535, or unspecified";
"alertTunnelNameEmptyTitle" = "No name provided";
"tunnelOnDemandOnlyTheseSSIDs" = "Only these SSIDs";
"tunnelOnDemandExceptTheseSSIDs" = "Except these SSIDs";
"alertUnableToWriteLogMessage" = "Unable to write logs to file";
"macMenuQuit" = "Quit WireGuard";
"macMenuAddEmptyTunnel" = "Add Empty Tunnel…";
"alertInvalidInterfaceTitle" = "Invalid interface";
"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";
"tunnelOnDemandSSIDViewTitle" = "SSIDs";
"tunnelOnDemandOptionCellularOnly" = "Cellular only";
"tunnelEditPlaceholderTextOptional" = "Optional";
"settingsExportZipButtonTitle" = "Export zip archive";
"alertInvalidInterfaceMessageNameRequired" = "Interface name is required";
"tunnelEditPlaceholderTextAutomatic" = "Automatic";
"macViewPrivateData" = "view tunnel private keys";
"alertInvalidPeerTitle" = "Invalid peer";
"alertInvalidPeerMessageEndpointInvalid" = "Peers 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";
"deletePeerConfirmationAlertButtonTitle" = "Delete";
"alertInvalidPeerMessagePreSharedKeyInvalid" = "Peers 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";
"alertUnableToRemovePreviousLogTitle" = "Log export failed";
"tunnelHandshakeTimestampNow" = "Now";
"alertTunnelActivationFailureMessage" = "The tunnel could not be activated. Please ensure that you are connected to the Internet.";
"tunnelOnDemandOptionEthernetOnly" = "Ethernet only";
"macMenuHideOtherApps" = "Hide Others";
"alertCantOpenInputZipFileMessage" = "The zip archive could not be read.";
"alertInvalidInterfaceMessagePrivateKeyInvalid" = "Interfaces private key must be a 32-byte key in base64 encoding";
"deleteTunnelButtonTitle" = "Delete tunnel";
"alertInvalidInterfaceMessageDNSInvalid" = "Interfaces DNS servers must be a list of comma-separated IP addresses";
"macAlertPrivateKeyInvalid" = "Private key is invalid.";
"deleteTunnelConfirmationAlertMessage" = "Delete this tunnel?";
"macDeleteTunnelConfirmationAlertButtonTitleCancel" = "Cancel";
"alertSystemErrorMessageTunnelConfigurationDisabled" = "The configuration is disabled.";
"alertInvalidPeerMessagePersistentKeepaliveInvalid" = "Peers persistent keepalive must be between 0 to 65535, or unspecified";
"alertUnableToWriteLogTitle" = "Log export failed";
"alertInvalidPeerMessagePublicKeyRequired" = "Peers public key is required";
"macMenuNetworksNone" = "Networks: None";
"tunnelOnDemandSSIDsKey" = "SSIDs";
"alertCantOpenOutputZipFileForWritingMessage" = "Could not open zip file for writing.";
"macMenuSelectAll" = "Select All";
"logViewTitle" = "Log";
"alertInvalidPeerMessagePublicKeyInvalid" = "Peers public key must be a 32-byte key in base64 encoding";
"tunnelOnDemandKey" = "On demand";
"macConfirmAndQuitAlertQuitWireGuard" = "Quit WireGuard";
"alertSystemErrorOnRemoveTunnelTitle" = "Unable to remove tunnel";
"macFieldOnDemand" = "On-Demand:";
"macMenuCloseWindow" = "Close Window";
"macSheetButtonExportLog" = "Save";
"tunnelOnDemandOptionWiFiOrCellular" = "Wi-Fi or cellular";
"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.";
"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";
"macLogButtonTitleSave" = "Save…";
"macMenuToggleStatus" = "Toggle Status";
"macMenuMinimize" = "Minimize";
"deletePeerButtonTitle" = "Delete peer";
"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.";
"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";
"iosViewPrivateData" = "Authenticate to view tunnel private keys.";
"macAlertPreSharedKeyInvalid" = "Preshared key is invalid";
"macEditSave" = "Save";
"macConfirmAndQuitAlertCloseWindow" = "Close Tunnels Manager";
"macMenuFile" = "File";
"macToolTipToggleStatus" = "Toggle status (⌘T)";
"macTunnelsMenuTitle" = "Tunnels";
"alertTunnelActivationSystemErrorTitle" = "Activation failure";
"alertInvalidInterfaceMessagePrivateKeyRequired" = "Interfaces private key is required";
"tunnelOnDemandAnySSID" = "Any SSID";
"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";
"deleteTunnelConfirmationAlertButtonTitle" = "Delete";
"tunnelEditPlaceholderTextOff" = "Off";
"macUnusableTunnelButtonTitleDeleteTunnel" = "Delete tunnel";
"tunnelEditPlaceholderTextRequired" = "Required";
"alertInvalidPeerMessageAllowedIPsInvalid" = "Peers allowed IPs must be a list of comma-separated IP addresses, optionally in CIDR notation";
"macMenuTunnel" = "Tunnel";
"macMenuCopy" = "Copy";
"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";
"alertNoTunnelsInImportedZipArchiveMessage" = "No .conf tunnel files were found inside the zip archive.";
"alertTunnelActivationFileDescriptorFailureMessage" = "Unable to determine TUN device file descriptor.";
"tunnelOnDemandOptionWiFiOrEthernet" = "Wi-Fi or ethernet";
"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
@@ -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
@@ -36,3 +36,218 @@
// Settings UI
"settingsViewTitle" = "설정";
"settingsSectionTitleAbout" = "About";
"newTunnelViewTitle" = "New configuration";
"macMenuDeleteSelected" = "Delete Selected";
"alertSystemErrorMessageTunnelConfigurationInvalid" = "The configuration is invalid.";
"tunnelPeerPublicKey" = "Public key";
"tunnelPeerEndpoint" = "Endpoint";
"tunnelInterfaceMTU" = "MTU";
"alertInvalidInterfaceMessageListenPortInvalid" = "Interfaces listen port must be between 0 and 65535, or unspecified";
"addPeerButtonTitle" = "Add peer";
"tunnelHandshakeTimestampSystemClockBackward" = "(System clock wound backwards)";
"macMenuTitle" = "WireGuard";
"macAlertNoInterface" = "Configuration must have an Interface section.";
"macNameFieldExportZip" = "Export tunnels to:";
"editTunnelViewTitle" = "Edit configuration";
"alertSystemErrorMessageTunnelConfigurationUnknown" = "Unknown system error.";
"macMenuCut" = "Cut";
"macEditDiscard" = "Discard";
"tunnelPeerPresharedKeyEnabled" = "enabled";
"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";
"macMenuHideApp" = "Hide WireGuard";
"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";
"tunnelOnDemandOptionWiFiOnly" = "Wi-Fi only";
"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.";
"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" = "Interfaces 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…";
"macMenuQuit" = "Quit WireGuard";
"macMenuAddEmptyTunnel" = "Add Empty Tunnel…";
"tunnelStatusDeactivating" = "Deactivating";
"alertInvalidInterfaceTitle" = "Invalid interface";
"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";
"tunnelOnDemandOptionCellularOnly" = "Cellular only";
"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" = "Peers 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" = "Peers 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";
"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.";
"tunnelInterfaceListenPort" = "Listen port";
"tunnelOnDemandOptionEthernetOnly" = "Ethernet only";
"tunnelInterfaceName" = "Name";
"macToggleStatusButtonWaiting" = "Waiting…";
"tunnelInterfaceStatus" = "Status";
"macMenuHideOtherApps" = "Hide Others";
"alertCantOpenInputZipFileMessage" = "The zip archive could not be read.";
"alertInvalidInterfaceMessagePrivateKeyInvalid" = "Interfaces private key must be a 32-byte key in base64 encoding";
"deleteTunnelButtonTitle" = "Delete tunnel";
"tunnelSectionTitleInterface" = "Interface";
"alertInvalidInterfaceMessageDNSInvalid" = "Interfaces DNS servers must be a list of comma-separated IP addresses";
"tunnelStatusInactive" = "Inactive";
"macAlertPrivateKeyInvalid" = "Private key is invalid.";
"tunnelsListCenteredAddTunnelButtonTitle" = "Add a tunnel";
"deleteTunnelConfirmationAlertMessage" = "Delete this tunnel?";
"macDeleteTunnelConfirmationAlertButtonTitleCancel" = "Cancel";
"alertSystemErrorMessageTunnelConfigurationDisabled" = "The configuration is disabled.";
"alertInvalidPeerMessagePersistentKeepaliveInvalid" = "Peers persistent keepalive must be between 0 to 65535, or unspecified";
"alertUnableToWriteLogTitle" = "Log export failed";
"alertInvalidPeerMessagePublicKeyRequired" = "Peers public key is required";
"macMenuNetworksNone" = "Networks: None";
"tunnelOnDemandSSIDsKey" = "SSIDs";
"alertCantOpenOutputZipFileForWritingMessage" = "Could not open zip file for writing.";
"macMenuSelectAll" = "Select All";
"logViewTitle" = "Log";
"alertInvalidPeerMessagePublicKeyInvalid" = "Peers public key must be a 32-byte key in base64 encoding";
"tunnelOnDemandCellular" = "Cellular";
"tunnelOnDemandKey" = "On demand";
"macConfirmAndQuitAlertQuitWireGuard" = "Quit WireGuard";
"alertSystemErrorOnRemoveTunnelTitle" = "Unable to remove tunnel";
"macFieldOnDemand" = "On-Demand:";
"macMenuCloseWindow" = "Close Window";
"macSheetButtonExportLog" = "Save";
"tunnelOnDemandOptionWiFiOrCellular" = "Wi-Fi or cellular";
"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";
"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";
"alertSystemErrorOnListingTunnelsTitle" = "Unable to list tunnels";
"tunnelPeerExcludePrivateIPs" = "Exclude private IPs";
"settingsVersionKeyWireGuardForIOS" = "WireGuard for iOS";
"macMenuPaste" = "Paste";
"tunnelInterfaceAddresses" = "Addresses";
"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)";
"macTunnelsMenuTitle" = "Tunnels";
"alertTunnelActivationSystemErrorTitle" = "Activation failure";
"alertInvalidInterfaceMessagePrivateKeyRequired" = "Interfaces private key is required";
"tunnelOnDemandAnySSID" = "Any SSID";
"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…";
"macMenuViewLog" = "View Log";
"macAlertInfoUnrecognizedPeerKey" = "Valid keys are: PublicKey, PresharedKey, AllowedIPs, Endpoint and PersistentKeepalive";
"tunnelOnDemandNoSSIDs" = "No SSIDs";
"deleteTunnelConfirmationAlertButtonTitle" = "Delete";
"tunnelEditPlaceholderTextOff" = "Off";
"addTunnelMenuHeader" = "Add a new WireGuard tunnel";
"macUnusableTunnelButtonTitleDeleteTunnel" = "Delete tunnel";
"tunnelEditPlaceholderTextRequired" = "Required";
"tunnelStatusReasserting" = "Reactivating";
"alertInvalidPeerMessageAllowedIPsInvalid" = "Peers allowed IPs must be a list of comma-separated IP addresses, optionally in CIDR notation";
"macMenuTunnel" = "Tunnel";
"macMenuCopy" = "Copy";
"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";
"tunnelOnDemandOptionWiFiOrEthernet" = "Wi-Fi or ethernet";
"macToggleStatusButtonActivate" = "Activate";
"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
@@ -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,30 +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";
// 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,4 +86,185 @@
"macMenuCopy" = "複製";
"macMenuPaste" = "貼上";
"macMenuSelectAll" = "全選";
"macMenuToggleStatus" = "切換狀態";
"macMenuMinimize" = "最小化";
"macMenuDeleteSelected" = "Delete Selected";
"alertSystemErrorMessageTunnelConfigurationInvalid" = "The configuration is invalid.";
"tunnelPeerPublicKey" = "Public key";
"tunnelPeerEndpoint" = "Endpoint";
"alertInvalidInterfaceMessageListenPortInvalid" = "Interfaces listen port must be between 0 and 65535, or unspecified";
"addPeerButtonTitle" = "Add peer";
"tunnelHandshakeTimestampSystemClockBackward" = "(System clock wound backwards)";
"macMenuTitle" = "WireGuard";
"macAlertNoInterface" = "Configuration must have an Interface section.";
"macNameFieldExportZip" = "Export tunnels to:";
"alertSystemErrorMessageTunnelConfigurationUnknown" = "Unknown system error.";
"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";
"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";
"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";
"tunnelOnDemandOptionWiFiOnly" = "Wi-Fi only";
"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.";
"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" = "Interfaces MTU must be between 576 and 65535, or unspecified";
"tunnelOnDemandWiFi" = "Wi-Fi";
"alertTunnelNameEmptyTitle" = "No name provided";
"tunnelOnDemandOnlyTheseSSIDs" = "Only these SSIDs";
"tunnelOnDemandExceptTheseSSIDs" = "Except these SSIDs";
"alertUnableToWriteLogMessage" = "Unable to write logs to file";
"macMenuAddEmptyTunnel" = "Add Empty Tunnel…";
"alertInvalidInterfaceTitle" = "Invalid interface";
"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";
"tunnelOnDemandOptionCellularOnly" = "Cellular only";
"tunnelEditPlaceholderTextOptional" = "Optional";
"settingsExportZipButtonTitle" = "Export zip archive";
"tunnelSectionTitleOnDemand" = "On-Demand Activation";
"alertInvalidInterfaceMessageNameRequired" = "Interface name is required";
"macViewPrivateData" = "view tunnel private keys";
"alertInvalidPeerTitle" = "Invalid peer";
"alertInvalidPeerMessageEndpointInvalid" = "Peers 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";
"deletePeerConfirmationAlertButtonTitle" = "Delete";
"alertInvalidPeerMessagePreSharedKeyInvalid" = "Peers 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";
"alertUnableToRemovePreviousLogTitle" = "Log export failed";
"alertTunnelActivationFailureMessage" = "The tunnel could not be activated. Please ensure that you are connected to the Internet.";
"tunnelOnDemandOptionEthernetOnly" = "Ethernet only";
"macMenuHideOtherApps" = "Hide Others";
"alertCantOpenInputZipFileMessage" = "The zip archive could not be read.";
"alertInvalidInterfaceMessagePrivateKeyInvalid" = "Interfaces private key must be a 32-byte key in base64 encoding";
"deleteTunnelButtonTitle" = "Delete tunnel";
"alertInvalidInterfaceMessageDNSInvalid" = "Interfaces DNS servers must be a list of comma-separated IP addresses";
"macAlertPrivateKeyInvalid" = "Private key is invalid.";
"deleteTunnelConfirmationAlertMessage" = "Delete this tunnel?";
"macDeleteTunnelConfirmationAlertButtonTitleCancel" = "Cancel";
"alertSystemErrorMessageTunnelConfigurationDisabled" = "The configuration is disabled.";
"alertInvalidPeerMessagePersistentKeepaliveInvalid" = "Peers persistent keepalive must be between 0 to 65535, or unspecified";
"alertUnableToWriteLogTitle" = "Log export failed";
"alertInvalidPeerMessagePublicKeyRequired" = "Peers public key is required";
"macMenuNetworksNone" = "Networks: None";
"tunnelOnDemandSSIDsKey" = "SSIDs";
"alertCantOpenOutputZipFileForWritingMessage" = "Could not open zip file for writing.";
"logViewTitle" = "Log";
"alertInvalidPeerMessagePublicKeyInvalid" = "Peers public key must be a 32-byte key in base64 encoding";
"tunnelOnDemandCellular" = "Cellular";
"tunnelOnDemandKey" = "On demand";
"macConfirmAndQuitAlertQuitWireGuard" = "Quit WireGuard";
"alertSystemErrorOnRemoveTunnelTitle" = "Unable to remove tunnel";
"macFieldOnDemand" = "On-Demand:";
"macMenuCloseWindow" = "Close Window";
"macSheetButtonExportLog" = "Save";
"tunnelOnDemandOptionWiFiOrCellular" = "Wi-Fi or cellular";
"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";
"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…";
"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";
"tunnelInterfaceAddresses" = "Addresses";
"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";
"iosViewPrivateData" = "Authenticate to view tunnel private keys.";
"tunnelPeerLastHandshakeTime" = "Latest handshake";
"macAlertPreSharedKeyInvalid" = "Preshared key is invalid";
"macEditSave" = "Save";
"macConfirmAndQuitAlertCloseWindow" = "Close Tunnels Manager";
"macMenuFile" = "File";
"macToolTipToggleStatus" = "Toggle status (⌘T)";
"macTunnelsMenuTitle" = "Tunnels";
"alertTunnelActivationSystemErrorTitle" = "Activation failure";
"alertInvalidInterfaceMessagePrivateKeyRequired" = "Interfaces private key is required";
"tunnelOnDemandAnySSID" = "Any SSID";
"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";
"deleteTunnelConfirmationAlertButtonTitle" = "Delete";
"tunnelEditPlaceholderTextOff" = "Off";
"macUnusableTunnelButtonTitleDeleteTunnel" = "Delete tunnel";
"tunnelEditPlaceholderTextRequired" = "Required";
"alertInvalidPeerMessageAllowedIPsInvalid" = "Peers allowed IPs must be a list of comma-separated IP addresses, optionally in CIDR notation";
"macMenuTunnel" = "Tunnel";
"alertTunnelAlreadyExistsWithThatNameMessage" = "A tunnel with that name already exists";
"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";
"alertBadArchiveMessage" = "Bad or corrupt zip archive.";
"settingsVersionKeyWireGuardGoBackend" = "WireGuard Go Backend";
"macFieldOnDemandSSIDs" = "SSIDs:";
"deletePeerConfirmationAlertMessage" = "Delete this peer?";
"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.";
"tunnelOnDemandOptionWiFiOrEthernet" = "Wi-Fi or ethernet";
"macAlertNameIsEmpty" = "Name is required";
+1
View File
@@ -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])
@@ -83,11 +83,15 @@ class PacketTunnelSettingsGenerator {
*/
let networkSettings = NEPacketTunnelNetworkSettings(tunnelRemoteAddress: "127.0.0.1")
let dnsServerStrings = tunnelConfiguration.interface.dns.map { $0.stringRepresentation }
let dnsSettings = NEDNSSettings(servers: dnsServerStrings)
dnsSettings.searchDomains = tunnelConfiguration.interface.dnsSearch
dnsSettings.matchDomains = [""] // All DNS queries must first go through the tunnel's DNS
networkSettings.dnsSettings = dnsSettings
if !tunnelConfiguration.interface.dnsSearch.isEmpty || !tunnelConfiguration.interface.dns.isEmpty {
let dnsServerStrings = tunnelConfiguration.interface.dns.map { $0.stringRepresentation }
let dnsSettings = NEDNSSettings(servers: dnsServerStrings)
dnsSettings.searchDomains = tunnelConfiguration.interface.dnsSearch
if !tunnelConfiguration.interface.dns.isEmpty {
dnsSettings.matchDomains = [""] // All DNS queries must first go through the tunnel's DNS
}
networkSettings.dnsSettings = dnsSettings
}
let mtu = tunnelConfiguration.interface.mtu ?? 0
+1 -4
View File
@@ -21,9 +21,6 @@ public enum WireGuardAdapterError: Error {
/// Failure to set network settings.
case setNetworkSettings(Error)
/// Timeout when calling to set network settings.
case setNetworkSettingsTimeout
/// Failure to start WireGuard backend.
case startWireGuardBackend(Int32)
}
@@ -304,7 +301,7 @@ public class WireGuardAdapter {
throw WireGuardAdapterError.setNetworkSettings(systemError)
}
} else {
throw WireGuardAdapterError.setNetworkSettingsTimeout
self.logHandler(.error, "setTunnelNetworkSettings timed out after 5 seconds; proceeding anyway")
}
}
+31 -25
View File
@@ -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
+5 -5
View File
@@ -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
)
+10 -10
View File
@@ -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=
@@ -57,11 +57,6 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
errorNotifier.notify(PacketTunnelProviderError.couldNotSetNetworkSettings)
completionHandler(PacketTunnelProviderError.couldNotSetNetworkSettings)
case .setNetworkSettingsTimeout:
wg_log(.error, message: "Starting tunnel failed with setTunnelNetworkSettings timing out")
errorNotifier.notify(PacketTunnelProviderError.couldNotSetNetworkSettings)
completionHandler(PacketTunnelProviderError.couldNotSetNetworkSettings)
case .startWireGuardBackend(let errorCode):
wg_log(.error, message: "Starting tunnel failed with wgTurnOn returning \(errorCode)")
errorNotifier.notify(PacketTunnelProviderError.couldNotStartBackend)
+50 -40
View File
@@ -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>"; };
A8FAC495E119A787EE15828E /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = zh-Hant; path = Sources/WireGuardApp/zh-Hant.lproj/Localizable.strings; sourceTree = "<group>"; };
30E6E11BE16FC85D1D0D01A4 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = zh-Hans; path = Sources/WireGuardApp/zh-Hans.lproj/Localizable.strings; sourceTree = "<group>"; };
F061DB3DF45406C134EB447E /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = id; path = Sources/WireGuardApp/id.lproj/Localizable.strings; sourceTree = "<group>"; };
798AA59731469050BB67A452 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = Sources/WireGuardApp/it.lproj/Localizable.strings; sourceTree = "<group>"; };
2B3036C208ACF4E06D7DA53F /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = Sources/WireGuardApp/de.lproj/Localizable.strings; sourceTree = "<group>"; };
43D66D9909C915207158175F /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = Sources/WireGuardApp/fr.lproj/Localizable.strings; sourceTree = "<group>"; };
7644A930B7CB3B8882BC52FD /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = Sources/WireGuardApp/fi.lproj/Localizable.strings; sourceTree = "<group>"; };
937E473CD10EEFE3BC376098 /* fa */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fa; path = Sources/WireGuardApp/fa.lproj/Localizable.strings; sourceTree = "<group>"; };
E4EE4FEC7423A6BEBDE429BC /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = Sources/WireGuardApp/sl.lproj/Localizable.strings; sourceTree = "<group>"; };
854D4F78352DD4455C410962 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = Sources/WireGuardApp/pl.lproj/Localizable.strings; sourceTree = "<group>"; };
8215B3EF8B68F0A53E6D8122 /* pa */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pa; path = Sources/WireGuardApp/pa.lproj/Localizable.strings; sourceTree = "<group>"; };
795E9FCC698E54371188E366 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = Sources/WireGuardApp/ko.lproj/Localizable.strings; sourceTree = "<group>"; };
E60BA3A8E202323CDD363B2B /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = Sources/WireGuardApp/ca.lproj/Localizable.strings; sourceTree = "<group>"; };
1D38E2B7D24EC0ACEF2C5734 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = Sources/WireGuardApp/ru.lproj/Localizable.strings; sourceTree = "<group>"; };
EE7D06A3CCB7DAEF13330651 /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = Sources/WireGuardApp/ro.lproj/Localizable.strings; sourceTree = "<group>"; };
6F24475E40CC51CC6CC27993 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = Sources/WireGuardApp/tr.lproj/Localizable.strings; sourceTree = "<group>"; };
31C0BC9131C140B617CA6713 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = Sources/WireGuardApp/ja.lproj/Localizable.strings; sourceTree = "<group>"; };
2F19992DF3CB32BB376853A0 /* 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;
@@ -1021,8 +1027,8 @@
knownRegions = (
Base,
en,
zh-Hant,
zh-Hans,
"zh-Hant",
"zh-Hans",
id,
it,
de,
@@ -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 = (
A8FAC495E119A787EE15828E /* zh-Hant */,
30E6E11BE16FC85D1D0D01A4 /* zh-Hans */,
F061DB3DF45406C134EB447E /* id */,
798AA59731469050BB67A452 /* it */,
2B3036C208ACF4E06D7DA53F /* de */,
43D66D9909C915207158175F /* fr */,
7644A930B7CB3B8882BC52FD /* fi */,
937E473CD10EEFE3BC376098 /* fa */,
E4EE4FEC7423A6BEBDE429BC /* sl */,
854D4F78352DD4455C410962 /* pl */,
8215B3EF8B68F0A53E6D8122 /* pa */,
795E9FCC698E54371188E366 /* ko */,
E60BA3A8E202323CDD363B2B /* ca */,
1D38E2B7D24EC0ACEF2C5734 /* ru */,
EE7D06A3CCB7DAEF13330651 /* ro */,
6F24475E40CC51CC6CC27993 /* tr */,
31C0BC9131C140B617CA6713 /* ja */,
2F19992DF3CB32BB376853A0 /* 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;
@@ -1612,6 +1620,7 @@
CODE_SIGN_ENTITLEMENTS = Sources/WireGuardApp/UI/macOS/WireGuard.entitlements;
CODE_SIGN_IDENTITY = "Mac Developer";
COMBINE_HIDPI_IMAGES = YES;
ENABLE_HARDENED_RUNTIME = YES;
INFOPLIST_FILE = Sources/WireGuardApp/UI/macOS/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
@@ -1632,6 +1641,7 @@
CODE_SIGN_ENTITLEMENTS = Sources/WireGuardApp/UI/macOS/WireGuard.entitlements;
CODE_SIGN_IDENTITY = "Mac Developer";
COMBINE_HIDPI_IMAGES = YES;
ENABLE_HARDENED_RUNTIME = YES;
INFOPLIST_FILE = Sources/WireGuardApp/UI/macOS/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
@@ -1651,6 +1661,7 @@
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
CODE_SIGN_ENTITLEMENTS = Sources/WireGuardNetworkExtension/WireGuardNetworkExtension_macOS.entitlements;
CODE_SIGN_IDENTITY = "Mac Developer";
ENABLE_HARDENED_RUNTIME = YES;
INFOPLIST_FILE = Sources/WireGuardNetworkExtension/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
@@ -1673,6 +1684,7 @@
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
CODE_SIGN_ENTITLEMENTS = Sources/WireGuardNetworkExtension/WireGuardNetworkExtension_macOS.entitlements;
CODE_SIGN_IDENTITY = "Mac Developer";
ENABLE_HARDENED_RUNTIME = YES;
INFOPLIST_FILE = Sources/WireGuardNetworkExtension/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
@@ -1759,7 +1771,6 @@
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_HARDENED_RUNTIME = YES;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
@@ -1827,7 +1838,6 @@
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_HARDENED_RUNTIME = YES;
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
+23 -2
View File
@@ -3,14 +3,34 @@ set -e
curl -Lo - https://crowdin.com/backend/download/project/wireguard.zip | bsdtar -C Sources/WireGuardApp -x -f - --strip-components 3 wireguard-apple
find Sources/WireGuardApp/*.lproj -type f -empty -delete
find Sources/WireGuardApp/*.lproj -type d -empty -delete
declare -A ALL_BASE
while read -r key eq rest; do
[[ $key == \"* && $key == *\" && $eq == = ]] || continue
ALL_BASE["$key"]="$rest"
done < Sources/WireGuardApp/Base.lproj/Localizable.strings
for f in Sources/WireGuardApp/*.lproj/Localizable.strings; do
unset FOUND
declare -A FOUND
while read -r key eq _; do
[[ $key == \"* && $key == *\" && $eq == = ]] || continue
FOUND["$key"]=1
done < "$f"
for key in "${!ALL_BASE[@]}"; do
[[ ${FOUND["$key"]} -eq 1 ]] && continue
echo "$key = ${ALL_BASE["$key"]}"
done >> "$f"
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\ \*/\ =\ [^$'\n']*Base\.lproj/Localizable\.strings ]]
base_id="${BASH_REMATCH[1]:0:16}"
idx=$(( "0x${BASH_REMATCH[1]:16}" ))
while read -r filename; do
l="$(basename "$(dirname "$filename")" .lproj)"
[[ $l == Base ]] && continue
read -r -n 24 hex < <(LC_ALL=C tr -dc "A-F0-9" < /dev/urandom)
LOCALE_MAP["$l"]="$hex"
((++idx))
LOCALE_MAP["$l"]="$(printf '%s%08X' "$base_id" $idx)"
done < <(find Sources/WireGuardApp -name Localizable.strings -type f)
inkr=0 inls=0 inlsc=0
@@ -26,6 +46,7 @@ while IFS= read -r line; do
echo "$line"
printf '\t\t\t\tBase,\n\t\t\t\ten,\n'
for l in "${!LOCALE_MAP[@]}"; do
[[ $l == *-* ]] && l="\"$l\""
printf '\t\t\t\t%s,\n' "$l"
done
inkr=1