From cda9bdcc3f3d85fb5ba2928c83acdd1baa260ead Mon Sep 17 00:00:00 2001 From: Davide De Rosa Date: Sat, 7 Aug 2021 12:18:01 +0200 Subject: [PATCH 1/5] Merge iOS strings into Core --- .../App/iOS/Global/SwiftGen+Strings.swift | 298 ++++++++---------- .../iOS/Scenes/AccountViewController.swift | 2 +- .../iOS/Scenes/EndpointViewController.swift | 4 +- .../NetworkSettingsViewController.swift | 8 +- .../ImportedHostsViewController.swift | 2 +- .../Organizer/OrganizerViewController.swift | 8 +- .../Organizer/WizardHostViewController.swift | 4 +- .../Scenes/ProviderPoolViewController.swift | 6 +- .../Scenes/ProviderPresetViewController.swift | 2 +- .../Scenes/ServerNetworkViewController.swift | 2 +- .../iOS/Scenes/ServiceViewController.swift | 26 +- .../ShortcutsAddViewController.swift | 2 +- .../Shortcuts/ShortcutsViewController.swift | 2 +- Passepartout/App/iOS/en.lproj/App.strings | 41 --- .../App/macOS/Global/SwiftGen+Strings.swift | 14 + .../Core/Resources/en.lproj/Core.strings | 32 ++ 16 files changed, 212 insertions(+), 241 deletions(-) diff --git a/Passepartout/App/iOS/Global/SwiftGen+Strings.swift b/Passepartout/App/iOS/Global/SwiftGen+Strings.swift index d7713229..ea10f6d2 100644 --- a/Passepartout/App/iOS/Global/SwiftGen+Strings.swift +++ b/Passepartout/App/iOS/Global/SwiftGen+Strings.swift @@ -11,172 +11,6 @@ import Foundation // swiftlint:disable nesting type_body_length type_name vertical_whitespace_opening_braces internal enum L10n { internal enum App { - internal enum Account { - internal enum Sections { - internal enum Credentials { - /// Credentials - internal static let header = L10n.tr("App", "account.sections.credentials.header") - } - } - } - internal enum Endpoint { - internal enum Sections { - internal enum LocationAddresses { - /// Addresses - internal static let header = L10n.tr("App", "endpoint.sections.location_addresses.header") - } - internal enum LocationProtocols { - /// Protocols - internal static let header = L10n.tr("App", "endpoint.sections.location_protocols.header") - } - } - } - internal enum ImportedHosts { - /// Imported hosts - internal static let title = L10n.tr("App", "imported_hosts.title") - } - internal enum NetworkSettings { - internal enum Cells { - internal enum AddDnsDomain { - /// Add search domain - internal static let caption = L10n.tr("App", "network_settings.cells.add_dns_domain.caption") - } - internal enum AddDnsServer { - /// Add address - internal static let caption = L10n.tr("App", "network_settings.cells.add_dns_server.caption") - } - internal enum AddProxyBypass { - /// Add bypass domain - internal static let caption = L10n.tr("App", "network_settings.cells.add_proxy_bypass.caption") - } - internal enum ProxyBypass { - /// Bypass domain - internal static let caption = L10n.tr("App", "network_settings.cells.proxy_bypass.caption") - } - } - } - internal enum Organizer { - internal enum Cells { - internal enum AddHost { - /// Add from Files - internal static let caption = L10n.tr("App", "organizer.cells.add_host.caption") - } - internal enum AddProvider { - /// Add new provider - internal static let caption = L10n.tr("App", "organizer.cells.add_provider.caption") - } - internal enum ImportHost { - /// Add from imported - internal static let caption = L10n.tr("App", "organizer.cells.import_host.caption") - } - } - } - internal enum Provider { - internal enum Pool { - internal enum Actions { - /// Favorite - internal static let favorite = L10n.tr("App", "provider.pool.actions.favorite") - /// Unfavorite - internal static let unfavorite = L10n.tr("App", "provider.pool.actions.unfavorite") - } - internal enum Sections { - internal enum EmptyFavorites { - /// Swipe left on a location to add or remove it from Favorites. - internal static let footer = L10n.tr("App", "provider.pool.sections.empty_favorites.footer") - } - } - } - internal enum Preset { - internal enum Cells { - internal enum TechDetails { - /// Technical details - internal static let caption = L10n.tr("App", "provider.preset.cells.tech_details.caption") - } - } - } - } - internal enum Service { - internal enum Alerts { - internal enum Location { - internal enum Button { - /// Settings - internal static let settings = L10n.tr("App", "service.alerts.location.button.settings") - } - internal enum Message { - /// You must allow location access to trust this Wi-Fi network. Go to iOS settings and review your location permissions for Passepartout. - internal static let denied = L10n.tr("App", "service.alerts.location.message.denied") - } - } - } - internal enum Cells { - internal enum Host { - internal enum Parameters { - /// Parameters - internal static let caption = L10n.tr("App", "service.cells.host.parameters.caption") - } - } - internal enum Provider { - internal enum Refresh { - /// Refresh infrastructure - internal static let caption = L10n.tr("App", "service.cells.provider.refresh.caption") - } - } - internal enum TrustedAddWifi { - /// Add Wi-Fi - internal static let caption = L10n.tr("App", "service.cells.trusted_add_wifi.caption") - } - internal enum VpnService { - /// Enabled - internal static let caption = L10n.tr("App", "service.cells.vpn_service.caption") - } - } - internal enum Sections { - internal enum Configuration { - /// Configuration - internal static let header = L10n.tr("App", "service.sections.configuration.header") - } - internal enum Status { - /// Connection - internal static let header = L10n.tr("App", "service.sections.status.header") - } - internal enum Vpn { - /// VPN - internal static let header = L10n.tr("App", "service.sections.vpn.header") - } - } - } - internal enum Shortcuts { - internal enum Add { - /// Add shortcut - internal static let title = L10n.tr("App", "shortcuts.add.title") - } - internal enum Edit { - /// Manage shortcuts - internal static let title = L10n.tr("App", "shortcuts.edit.title") - internal enum Cells { - internal enum AddShortcut { - /// Add shortcut - internal static let caption = L10n.tr("App", "shortcuts.edit.cells.add_shortcut.caption") - } - } - } - } - internal enum Wizards { - internal enum Host { - internal enum Cells { - internal enum TitleInput { - /// Title - internal static let caption = L10n.tr("App", "wizards.host.cells.title_input.caption") - } - } - internal enum Sections { - internal enum Existing { - /// Existing profiles - internal static let header = L10n.tr("App", "wizards.host.sections.existing.header") - } - } - } - } } internal enum Core { internal enum About { @@ -251,6 +85,10 @@ internal enum L10n { } } internal enum Sections { + internal enum Credentials { + /// Credentials + internal static let header = L10n.tr("Core", "account.sections.credentials.header") + } internal enum Guidance { internal enum Footer { internal enum Infrastructure { @@ -500,6 +338,16 @@ internal enum L10n { internal static let caption = L10n.tr("Core", "endpoint.cells.any_protocol.caption") } } + internal enum Sections { + internal enum LocationAddresses { + /// Addresses + internal static let header = L10n.tr("Core", "endpoint.sections.location_addresses.header") + } + internal enum LocationProtocols { + /// Protocols + internal static let header = L10n.tr("Core", "endpoint.sections.location_protocols.header") + } + } } internal enum Global { /// Cancel @@ -543,6 +391,10 @@ internal enum L10n { internal static let `none` = L10n.tr("Core", "global.values.none") } } + internal enum ImportedHosts { + /// Imported hosts + internal static let title = L10n.tr("Core", "imported_hosts.title") + } internal enum IssueReporter { /// The debug log of your latest connections is crucial to resolve your connectivity issues and is completely anonymous.\n\nThe .ovpn configuration file, if any, is attached stripped of any sensitive data.\n\nPlease double check the e-mail attachments if unsure. internal static let message = L10n.tr("Core", "issue_reporter.message") @@ -568,6 +420,24 @@ internal enum L10n { internal enum NetworkSettings { /// Network settings internal static let title = L10n.tr("Core", "network_settings.title") + internal enum Cells { + internal enum AddDnsDomain { + /// Add search domain + internal static let caption = L10n.tr("Core", "network_settings.cells.add_dns_domain.caption") + } + internal enum AddDnsServer { + /// Add address + internal static let caption = L10n.tr("Core", "network_settings.cells.add_dns_server.caption") + } + internal enum AddProxyBypass { + /// Add bypass domain + internal static let caption = L10n.tr("Core", "network_settings.cells.add_proxy_bypass.caption") + } + internal enum ProxyBypass { + /// Bypass domain + internal static let caption = L10n.tr("Core", "network_settings.cells.proxy_bypass.caption") + } + } internal enum Dns { /// DNS internal static let title = L10n.tr("Core", "network_settings.dns.title") @@ -623,6 +493,14 @@ internal enum L10n { return L10n.tr("Core", "organizer.cells.about.caption", String(describing: p1)) } } + internal enum AddHost { + /// Add from Files + internal static let caption = L10n.tr("Core", "organizer.cells.add_host.caption") + } + internal enum AddProvider { + /// Add new provider + internal static let caption = L10n.tr("Core", "organizer.cells.add_provider.caption") + } internal enum Donate { /// Make a donation internal static let caption = L10n.tr("Core", "organizer.cells.donate.caption") @@ -635,6 +513,10 @@ internal enum L10n { /// Support me on GitHub internal static let caption = L10n.tr("Core", "organizer.cells.github_sponsors.caption") } + internal enum ImportHost { + /// Add from imported + internal static let caption = L10n.tr("Core", "organizer.cells.import_host.caption") + } internal enum JoinCommunity { /// Join community internal static let caption = L10n.tr("Core", "organizer.cells.join_community.caption") @@ -743,6 +625,30 @@ internal enum L10n { } } } + internal enum Provider { + internal enum Pool { + internal enum Actions { + /// Favorite + internal static let favorite = L10n.tr("Core", "provider.pool.actions.favorite") + /// Unfavorite + internal static let unfavorite = L10n.tr("Core", "provider.pool.actions.unfavorite") + } + internal enum Sections { + internal enum EmptyFavorites { + /// Swipe left on a location to add or remove it from Favorites. + internal static let footer = L10n.tr("Core", "provider.pool.sections.empty_favorites.footer") + } + } + } + internal enum Preset { + internal enum Cells { + internal enum TechDetails { + /// Technical details + internal static let caption = L10n.tr("Core", "provider.preset.cells.tech_details.caption") + } + } + } + } internal enum Purchase { /// Purchase internal static let title = L10n.tr("Core", "purchase.title") @@ -819,6 +725,16 @@ internal enum L10n { internal static let extracting = L10n.tr("Core", "service.alerts.download.hud.extracting") } } + internal enum Location { + internal enum Button { + /// Settings + internal static let settings = L10n.tr("Core", "service.alerts.location.button.settings") + } + internal enum Message { + /// You must allow location access to trust this Wi-Fi network. Go to iOS settings and review your location permissions for Passepartout. + internal static let denied = L10n.tr("Core", "service.alerts.location.message.denied") + } + } internal enum MasksPrivateData { internal enum Messages { /// In order to safely reset the current debug log and apply the new masking preference, you must reconnect to the VPN now. @@ -873,6 +789,12 @@ internal enum L10n { /// Debug log internal static let caption = L10n.tr("Core", "service.cells.debug_log.caption") } + internal enum Host { + internal enum Parameters { + /// Parameters + internal static let caption = L10n.tr("Core", "service.cells.host.parameters.caption") + } + } internal enum MasksPrivateData { /// Mask network data internal static let caption = L10n.tr("Core", "service.cells.masks_private_data.caption") @@ -886,6 +808,10 @@ internal enum L10n { /// Preset internal static let caption = L10n.tr("Core", "service.cells.provider.preset.caption") } + internal enum Refresh { + /// Refresh infrastructure + internal static let caption = L10n.tr("Core", "service.cells.provider.refresh.caption") + } } internal enum Reconnect { /// Reconnect @@ -907,6 +833,10 @@ internal enum L10n { /// Test connectivity internal static let caption = L10n.tr("Core", "service.cells.test_connectivity.caption") } + internal enum TrustedAddWifi { + /// Add Wi-Fi + internal static let caption = L10n.tr("Core", "service.cells.trusted_add_wifi.caption") + } internal enum TrustedMobile { /// Cellular network internal static let caption = L10n.tr("Core", "service.cells.trusted_mobile.caption") @@ -923,12 +853,20 @@ internal enum L10n { /// Resolve provider hostname internal static let caption = L10n.tr("Core", "service.cells.vpn_resolves_hostname.caption") } + internal enum VpnService { + /// Enabled + internal static let caption = L10n.tr("Core", "service.cells.vpn_service.caption") + } internal enum VpnSurvivesSleep { /// Keep alive on sleep internal static let caption = L10n.tr("Core", "service.cells.vpn_survives_sleep.caption") } } internal enum Sections { + internal enum Configuration { + /// Configuration + internal static let header = L10n.tr("Core", "service.sections.configuration.header") + } internal enum Diagnostics { /// Masking status will be effective after reconnecting. Network data are hostnames, IP addresses, routing, SSID. Credentials and private keys are not logged regardless. internal static let footer = L10n.tr("Core", "service.sections.diagnostics.footer") @@ -941,6 +879,10 @@ internal enum L10n { return L10n.tr("Core", "service.sections.provider_infrastructure.footer", String(describing: p1)) } } + internal enum Status { + /// Connection + internal static let header = L10n.tr("Core", "service.sections.status.header") + } internal enum Trusted { /// When entering a trusted network, the VPN is normally shut down and kept disconnected. Disable this option to not enforce such behavior. internal static let footer = L10n.tr("Core", "service.sections.trusted.footer") @@ -950,6 +892,8 @@ internal enum L10n { internal enum Vpn { /// The connection will be established whenever necessary. internal static let footer = L10n.tr("Core", "service.sections.vpn.footer") + /// VPN + internal static let header = L10n.tr("Core", "service.sections.vpn.header") } internal enum VpnResolvesHostname { /// Preferred in most networks and required in some IPv6 networks. Disable where DNS is blocked, or to speed up negotiation when DNS is slow to respond. @@ -971,6 +915,8 @@ internal enum L10n { } internal enum Shortcuts { internal enum Add { + /// Add shortcut + internal static let title = L10n.tr("Core", "shortcuts.add.title") internal enum Alerts { internal enum NoProfiles { /// There is no profile to connect to. @@ -1023,6 +969,14 @@ internal enum L10n { } } internal enum Edit { + /// Manage shortcuts + internal static let title = L10n.tr("Core", "shortcuts.edit.title") + internal enum Cells { + internal enum AddShortcut { + /// Add shortcut + internal static let caption = L10n.tr("Core", "shortcuts.edit.cells.add_shortcut.caption") + } + } internal enum Sections { internal enum All { /// Existing shortcuts @@ -1085,6 +1039,18 @@ internal enum L10n { internal static let message = L10n.tr("Core", "wizards.host.alerts.existing.message") } } + internal enum Cells { + internal enum TitleInput { + /// Title + internal static let caption = L10n.tr("Core", "wizards.host.cells.title_input.caption") + } + } + internal enum Sections { + internal enum Existing { + /// Existing profiles + internal static let header = L10n.tr("Core", "wizards.host.sections.existing.header") + } + } } internal enum Provider { internal enum Alerts { diff --git a/Passepartout/App/iOS/Scenes/AccountViewController.swift b/Passepartout/App/iOS/Scenes/AccountViewController.swift index 0be9e8b8..ef197098 100644 --- a/Passepartout/App/iOS/Scenes/AccountViewController.swift +++ b/Passepartout/App/iOS/Scenes/AccountViewController.swift @@ -67,7 +67,7 @@ class AccountViewController: UIViewController, StrongTableHost { model.clear() model.add(.credentials) - model.setHeader(L10n.App.Account.Sections.Credentials.header, forSection: .credentials) + model.setHeader(L10n.Core.Account.Sections.Credentials.header, forSection: .credentials) model.set([.username, .password], forSection: .credentials) if let _ = infrastructureName { diff --git a/Passepartout/App/iOS/Scenes/EndpointViewController.swift b/Passepartout/App/iOS/Scenes/EndpointViewController.swift index 38ebc82f..cab5cb82 100644 --- a/Passepartout/App/iOS/Scenes/EndpointViewController.swift +++ b/Passepartout/App/iOS/Scenes/EndpointViewController.swift @@ -67,8 +67,8 @@ class EndpointViewController: UIViewController, StrongTableHost { model.add(.locationAddresses) model.add(.locationProtocols) - model.setHeader(L10n.App.Endpoint.Sections.LocationAddresses.header, forSection: .locationAddresses) - model.setHeader(L10n.App.Endpoint.Sections.LocationProtocols.header, forSection: .locationProtocols) + model.setHeader(L10n.Core.Endpoint.Sections.LocationAddresses.header, forSection: .locationAddresses) + model.setHeader(L10n.Core.Endpoint.Sections.LocationProtocols.header, forSection: .locationProtocols) if dataSource.canCustomizeEndpoint { var addressRows: [RowType] = Array(repeating: .availableAddress, count: dataSource.addresses.count) diff --git a/Passepartout/App/iOS/Scenes/NetworkSettingsViewController.swift b/Passepartout/App/iOS/Scenes/NetworkSettingsViewController.swift index 6d1208e0..3c38d19c 100644 --- a/Passepartout/App/iOS/Scenes/NetworkSettingsViewController.swift +++ b/Passepartout/App/iOS/Scenes/NetworkSettingsViewController.swift @@ -495,7 +495,7 @@ extension NetworkSettingsViewController { case .dnsAddAddress: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) cell.applyAction(.current) - cell.leftText = L10n.App.NetworkSettings.Cells.AddDnsServer.caption + cell.leftText = L10n.Core.NetworkSettings.Cells.AddDnsServer.caption return cell case .dnsDomain: @@ -516,7 +516,7 @@ extension NetworkSettingsViewController { case .dnsAddDomain: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) cell.applyAction(.current) - cell.leftText = L10n.App.NetworkSettings.Cells.AddDnsDomain.caption + cell.leftText = L10n.Core.NetworkSettings.Cells.AddDnsDomain.caption return cell case .proxyAddress: @@ -562,7 +562,7 @@ extension NetworkSettingsViewController { let i = indexPath.row - Offsets.proxyBypass let cell = Cells.field.dequeue(from: tableView, for: indexPath) - cell.caption = L10n.App.NetworkSettings.Cells.ProxyBypass.caption + cell.caption = L10n.Core.NetworkSettings.Cells.ProxyBypass.caption cell.field.tag = FieldTag.proxyBypass.rawValue + i cell.field.placeholder = L10n.Core.Global.Values.none cell.field.text = networkSettings.proxyBypassDomains?[i] @@ -576,7 +576,7 @@ extension NetworkSettingsViewController { case .proxyAddBypass: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) cell.applyAction(.current) - cell.leftText = L10n.App.NetworkSettings.Cells.AddProxyBypass.caption + cell.leftText = L10n.Core.NetworkSettings.Cells.AddProxyBypass.caption return cell case .mtuBytes: diff --git a/Passepartout/App/iOS/Scenes/Organizer/ImportedHostsViewController.swift b/Passepartout/App/iOS/Scenes/Organizer/ImportedHostsViewController.swift index 30c7f12e..f070611f 100644 --- a/Passepartout/App/iOS/Scenes/Organizer/ImportedHostsViewController.swift +++ b/Passepartout/App/iOS/Scenes/Organizer/ImportedHostsViewController.swift @@ -42,7 +42,7 @@ class ImportedHostsViewController: UITableViewController { override func viewDidLoad() { super.viewDidLoad() - title = L10n.App.ImportedHosts.title + title = L10n.Core.ImportedHosts.title } private func selectHost(withUrl url: URL) { diff --git a/Passepartout/App/iOS/Scenes/Organizer/OrganizerViewController.swift b/Passepartout/App/iOS/Scenes/Organizer/OrganizerViewController.swift index f862a81e..cb7a0436 100644 --- a/Passepartout/App/iOS/Scenes/Organizer/OrganizerViewController.swift +++ b/Passepartout/App/iOS/Scenes/Organizer/OrganizerViewController.swift @@ -66,7 +66,7 @@ class OrganizerViewController: UITableViewController, StrongTableHost { } model.add(.about) model.add(.destruction) - model.setHeader(L10n.App.Service.Sections.Vpn.header, forSection: .vpn) + model.setHeader(L10n.Core.Service.Sections.Vpn.header, forSection: .vpn) model.setHeader(L10n.Core.Organizer.Sections.Providers.header, forSection: .providers) model.setHeader(L10n.Core.Organizer.Sections.Hosts.header, forSection: .hosts) model.setFooter(L10n.Core.Organizer.Sections.Providers.footer, forSection: .providers) @@ -515,19 +515,19 @@ extension OrganizerViewController { case .addProvider: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) cell.applyAction(.current) - cell.leftText = L10n.App.Organizer.Cells.AddProvider.caption + cell.leftText = L10n.Core.Organizer.Cells.AddProvider.caption return cell case .addHost: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) cell.applyAction(.current) - cell.leftText = L10n.App.Organizer.Cells.AddHost.caption + cell.leftText = L10n.Core.Organizer.Cells.AddHost.caption return cell case .importHost: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) cell.applyAction(.current) - cell.leftText = L10n.App.Organizer.Cells.ImportHost.caption + cell.leftText = L10n.Core.Organizer.Cells.ImportHost.caption return cell case .siriShortcuts: diff --git a/Passepartout/App/iOS/Scenes/Organizer/WizardHostViewController.swift b/Passepartout/App/iOS/Scenes/Organizer/WizardHostViewController.swift index 1bc888f3..c43cd05a 100644 --- a/Passepartout/App/iOS/Scenes/Organizer/WizardHostViewController.swift +++ b/Passepartout/App/iOS/Scenes/Organizer/WizardHostViewController.swift @@ -58,7 +58,7 @@ class WizardHostViewController: UITableViewController, StrongTableHost { // model.setFooter(L10n.Core.Global.Host.TitleInput.message, forSection: .meta) if !existingHostIds.isEmpty { model.add(.existing) - model.setHeader(L10n.App.Wizards.Host.Sections.Existing.header, forSection: .existing) + model.setHeader(L10n.Core.Wizards.Host.Sections.Existing.header, forSection: .existing) } model.set([.titleInput], forSection: .meta) model.set(.existingHost, count: existingHostIds.count, forSection: .existing) @@ -211,7 +211,7 @@ extension WizardHostViewController { switch model.row(at: indexPath) { case .titleInput: let cell = Cells.field.dequeue(from: tableView, for: indexPath) - cell.caption = L10n.App.Wizards.Host.Cells.TitleInput.caption + cell.caption = L10n.Core.Wizards.Host.Cells.TitleInput.caption cell.captionWidth = 100.0 // cell.allowedCharset = .filename cell.field.applyHostTitle(.current) diff --git a/Passepartout/App/iOS/Scenes/ProviderPoolViewController.swift b/Passepartout/App/iOS/Scenes/ProviderPoolViewController.swift index 826d31de..afc6361a 100644 --- a/Passepartout/App/iOS/Scenes/ProviderPoolViewController.swift +++ b/Passepartout/App/iOS/Scenes/ProviderPoolViewController.swift @@ -181,7 +181,7 @@ extension ProviderPoolViewController: UITableViewDataSource, UITableViewDelegate func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String? { if isShowingEmptyFavorites { - return L10n.App.Provider.Pool.Sections.EmptyFavorites.footer + return L10n.Core.Provider.Pool.Sections.EmptyFavorites.footer } return nil } @@ -251,12 +251,12 @@ extension ProviderPoolViewController: UITableViewDataSource, UITableViewDelegate let action: UIContextualAction if favoriteGroupIds.contains(groupId) { - action = UIContextualAction(style: .destructive, title: L10n.App.Provider.Pool.Actions.unfavorite) { + action = UIContextualAction(style: .destructive, title: L10n.Core.Provider.Pool.Actions.unfavorite) { self.unfavoriteGroup(in: category, withId: groupId, deletingRowAt: self.isShowingFavorites ? indexPath : nil) $2(true) } } else if !isShowingFavorites { - action = UIContextualAction(style: .normal, title: L10n.App.Provider.Pool.Actions.favorite) { + action = UIContextualAction(style: .normal, title: L10n.Core.Provider.Pool.Actions.favorite) { self.favoriteGroup(withId: groupId) $2(true) } diff --git a/Passepartout/App/iOS/Scenes/ProviderPresetViewController.swift b/Passepartout/App/iOS/Scenes/ProviderPresetViewController.swift index 7b464aa2..f8748bb8 100644 --- a/Passepartout/App/iOS/Scenes/ProviderPresetViewController.swift +++ b/Passepartout/App/iOS/Scenes/ProviderPresetViewController.swift @@ -107,7 +107,7 @@ extension ProviderPresetViewController: UITableViewDataSource, UITableViewDelega case .techDetails: cell.applyAction(.current) - cell.leftText = L10n.App.Provider.Preset.Cells.TechDetails.caption + cell.leftText = L10n.Core.Provider.Preset.Cells.TechDetails.caption cell.accessoryType = .none } return cell diff --git a/Passepartout/App/iOS/Scenes/ServerNetworkViewController.swift b/Passepartout/App/iOS/Scenes/ServerNetworkViewController.swift index 29f69b97..564cc63a 100644 --- a/Passepartout/App/iOS/Scenes/ServerNetworkViewController.swift +++ b/Passepartout/App/iOS/Scenes/ServerNetworkViewController.swift @@ -267,7 +267,7 @@ extension ServerNetworkViewController { guard let domain = configuration.proxyBypassDomains?[indexPath.row - indexOfFirstProxyBypassDomain] else { fatalError("Got proxy bypass domain with empty domains") } - cell.leftText = L10n.App.NetworkSettings.Cells.ProxyBypass.caption + cell.leftText = L10n.Core.NetworkSettings.Cells.ProxyBypass.caption cell.rightText = domain default: diff --git a/Passepartout/App/iOS/Scenes/ServiceViewController.swift b/Passepartout/App/iOS/Scenes/ServiceViewController.swift index 6cd50b82..e01ed37f 100644 --- a/Passepartout/App/iOS/Scenes/ServiceViewController.swift +++ b/Passepartout/App/iOS/Scenes/ServiceViewController.swift @@ -190,7 +190,7 @@ class ServiceViewController: UIViewController, StrongTableHost { case .hostParametersSegueIdentifier: let vc = destination as? ConfigurationViewController - vc?.title = L10n.App.Service.Cells.Host.Parameters.caption + vc?.title = L10n.Core.Service.Cells.Host.Parameters.caption vc?.initialConfiguration = uncheckedHostProfile.parameters.sessionConfiguration vc?.originalConfigurationURL = service.configurationURL(for: uncheckedHostProfile) vc?.delegate = self @@ -290,7 +290,7 @@ class ServiceViewController: UIViewController, StrongTableHost { } guard !service.needsCredentials(for: uncheckedProfile) else { let alert = UIAlertController.asAlert( - L10n.App.Service.Sections.Vpn.header, + L10n.Core.Service.Sections.Vpn.header, L10n.Core.Service.Alerts.CredentialsNeeded.message ) alert.addCancelAction(L10n.Core.Global.ok) { @@ -420,11 +420,11 @@ class ServiceViewController: UIViewController, StrongTableHost { case .denied: isPendingTrustedWiFi = false let alert = UIAlertController.asAlert( - L10n.App.Service.Cells.TrustedAddWifi.caption, - L10n.App.Service.Alerts.Location.Message.denied + L10n.Core.Service.Cells.TrustedAddWifi.caption, + L10n.Core.Service.Alerts.Location.Message.denied ) alert.addCancelAction(L10n.Core.Global.ok) - alert.addPreferredAction(L10n.App.Service.Alerts.Location.Button.settings) { + alert.addPreferredAction(L10n.Core.Service.Alerts.Location.Button.settings) { UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!, options: [:], completionHandler: nil) } present(alert, animated: true, completion: nil) @@ -450,7 +450,7 @@ class ServiceViewController: UIViewController, StrongTableHost { field.delegate = self } alert.addCancelAction(L10n.Core.Global.cancel) - alert.addPreferredAction(L10n.App.Service.Cells.TrustedAddWifi.caption) { + alert.addPreferredAction(L10n.Core.Service.Cells.TrustedAddWifi.caption) { guard let wifi = alert.textFields?.first?.text else { return } @@ -891,7 +891,7 @@ extension ServiceViewController: UITableViewDataSource, UITableViewDelegate, Tog } let cell = Cells.toggle.dequeue(from: tableView, for: indexPath, tag: row.rawValue, delegate: self) - cell.caption = L10n.App.Service.Cells.VpnService.caption + cell.caption = L10n.Core.Service.Cells.VpnService.caption cell.isOn = vpn.isEnabled return cell @@ -957,7 +957,7 @@ extension ServiceViewController: UITableViewDataSource, UITableViewDelegate, Tog case .providerRefresh: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) cell.applyAction(.current) - cell.leftText = L10n.App.Service.Cells.Provider.Refresh.caption + cell.leftText = L10n.Core.Service.Cells.Provider.Refresh.caption return cell // host cells @@ -965,7 +965,7 @@ extension ServiceViewController: UITableViewDataSource, UITableViewDelegate, Tog case .hostParameters: let parameters = uncheckedHostProfile.parameters let cell = Cells.setting.dequeue(from: tableView, for: indexPath) - cell.leftText = L10n.App.Service.Cells.Host.Parameters.caption + cell.leftText = L10n.Core.Service.Cells.Host.Parameters.caption if !parameters.sessionConfiguration.fallbackCipher.embedsDigest { cell.rightText = "\(parameters.sessionConfiguration.fallbackCipher.genericName) / \(parameters.sessionConfiguration.fallbackDigest.genericName)" } else { @@ -1003,7 +1003,7 @@ extension ServiceViewController: UITableViewDataSource, UITableViewDelegate, Tog case .trustedAddCurrentWiFi: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) cell.applyAction(.current) - cell.leftText = L10n.App.Service.Cells.TrustedAddWifi.caption + cell.leftText = L10n.Core.Service.Cells.TrustedAddWifi.caption return cell case .trustedPolicy: @@ -1238,11 +1238,11 @@ extension ServiceViewController: UITableViewDataSource, UITableViewDelegate, Tog } // headers - model.setHeader(L10n.App.Service.Sections.Vpn.header, forSection: .vpn) + model.setHeader(L10n.Core.Service.Sections.Vpn.header, forSection: .vpn) if isProvider { - model.setHeader(L10n.App.Service.Sections.Configuration.header, forSection: .authentication) + model.setHeader(L10n.Core.Service.Sections.Configuration.header, forSection: .authentication) } else { - model.setHeader(L10n.App.Service.Sections.Configuration.header, forSection: .configuration) + model.setHeader(L10n.Core.Service.Sections.Configuration.header, forSection: .configuration) } if isActiveProfile { if isProvider { diff --git a/Passepartout/App/iOS/Scenes/Shortcuts/ShortcutsAddViewController.swift b/Passepartout/App/iOS/Scenes/Shortcuts/ShortcutsAddViewController.swift index 07be924a..c59f7aa5 100644 --- a/Passepartout/App/iOS/Scenes/Shortcuts/ShortcutsAddViewController.swift +++ b/Passepartout/App/iOS/Scenes/Shortcuts/ShortcutsAddViewController.swift @@ -56,7 +56,7 @@ class ShortcutsAddViewController: UITableViewController, StrongTableHost { override func viewDidLoad() { super.viewDidLoad() - title = L10n.App.Shortcuts.Add.title + title = L10n.Core.Shortcuts.Add.title } // MARK: UITableViewController diff --git a/Passepartout/App/iOS/Scenes/Shortcuts/ShortcutsViewController.swift b/Passepartout/App/iOS/Scenes/Shortcuts/ShortcutsViewController.swift index fcd5e2a2..4577947d 100644 --- a/Passepartout/App/iOS/Scenes/Shortcuts/ShortcutsViewController.swift +++ b/Passepartout/App/iOS/Scenes/Shortcuts/ShortcutsViewController.swift @@ -192,7 +192,7 @@ class ShortcutsViewController: UITableViewController, INUIAddVoiceShortcutViewCo case .addShortcut: cell.applyAction(.current) - cell.leftText = L10n.App.Shortcuts.Edit.Cells.AddShortcut.caption + cell.leftText = L10n.Core.Shortcuts.Edit.Cells.AddShortcut.caption cell.accessoryType = .none cell.isTappable = true } diff --git a/Passepartout/App/iOS/en.lproj/App.strings b/Passepartout/App/iOS/en.lproj/App.strings index 1d10e874..9fee1cf5 100644 --- a/Passepartout/App/iOS/en.lproj/App.strings +++ b/Passepartout/App/iOS/en.lproj/App.strings @@ -22,44 +22,3 @@ // You should have received a copy of the GNU General Public License // along with Passepartout. If not, see . // - -"organizer.cells.add_provider.caption" = "Add new provider"; -"organizer.cells.add_host.caption" = "Add from Files"; -"organizer.cells.import_host.caption" = "Add from imported"; - -"wizards.host.cells.title_input.caption" = "Title"; -"wizards.host.sections.existing.header" = "Existing profiles"; - -"imported_hosts.title" = "Imported hosts"; - -"service.sections.vpn.header" = "VPN"; -"service.sections.status.header" = "Connection"; -"service.sections.configuration.header" = "Configuration"; - -"service.cells.vpn_service.caption" = "Enabled"; -"service.cells.provider.refresh.caption" = "Refresh infrastructure"; -"service.cells.host.parameters.caption" = "Parameters"; -"service.cells.trusted_add_wifi.caption" = "Add Wi-Fi"; -"service.alerts.location.message.denied" = "You must allow location access to trust this Wi-Fi network. Go to iOS settings and review your location permissions for Passepartout."; -"service.alerts.location.button.settings" = "Settings"; - -"account.sections.credentials.header" = "Credentials"; - -"endpoint.sections.location_addresses.header" = "Addresses"; -"endpoint.sections.location_protocols.header" = "Protocols"; - -"provider.pool.actions.favorite" = "Favorite"; -"provider.pool.actions.unfavorite" = "Unfavorite"; -"provider.pool.sections.empty_favorites.footer" = "Swipe left on a location to add or remove it from Favorites."; - -"provider.preset.cells.tech_details.caption" = "Technical details"; - -"network_settings.cells.add_dns_server.caption" = "Add address"; -"network_settings.cells.add_dns_domain.caption" = "Add search domain"; -"network_settings.cells.proxy_bypass.caption" = "Bypass domain"; -"network_settings.cells.add_proxy_bypass.caption" = "Add bypass domain"; - -"shortcuts.add.title" = "Add shortcut"; - -"shortcuts.edit.title" = "Manage shortcuts"; -"shortcuts.edit.cells.add_shortcut.caption" = "Add shortcut"; diff --git a/Passepartout/App/macOS/Global/SwiftGen+Strings.swift b/Passepartout/App/macOS/Global/SwiftGen+Strings.swift index 49d38794..9832f2ad 100644 --- a/Passepartout/App/macOS/Global/SwiftGen+Strings.swift +++ b/Passepartout/App/macOS/Global/SwiftGen+Strings.swift @@ -775,6 +775,16 @@ internal enum L10n { } } } + internal enum Provider { + internal enum Pool { + internal enum Actions { + /// Favorite + internal static let favorite = L10n.tr("Core", "provider.pool.actions.favorite") + /// Unfavorite + internal static let unfavorite = L10n.tr("Core", "provider.pool.actions.unfavorite") + } + } + } internal enum Purchase { /// Purchase internal static let title = L10n.tr("Core", "purchase.title") @@ -918,6 +928,10 @@ internal enum L10n { /// Preset internal static let caption = L10n.tr("Core", "service.cells.provider.preset.caption") } + internal enum Refresh { + /// Refresh infrastructure + internal static let caption = L10n.tr("Core", "service.cells.provider.refresh.caption") + } } internal enum Reconnect { /// Reconnect diff --git a/Passepartout/Core/Resources/en.lproj/Core.strings b/Passepartout/Core/Resources/en.lproj/Core.strings index eeff5c06..74d90177 100644 --- a/Passepartout/Core/Resources/en.lproj/Core.strings +++ b/Passepartout/Core/Resources/en.lproj/Core.strings @@ -107,6 +107,9 @@ "organizer.cells.translate.caption" = "Offer to translate"; "organizer.cells.about.caption" = "About %@"; "organizer.cells.uninstall.caption" = "Remove VPN configuration"; +"organizer.cells.add_provider.caption" = "Add new provider"; +"organizer.cells.add_host.caption" = "Add from Files"; +"organizer.cells.import_host.caption" = "Add from imported"; "organizer.alerts.exhausted_providers.message" = "You have created profiles for any available provider."; "organizer.alerts.add_host.message" = "Open an URL to an .ovpn configuration file from Safari, Mail or another app to set up a host profile.\n\nYou can also import an .ovpn with iTunes File Sharing."; "organizer.alerts.cannot_donate.message" = "There is no payment method configured on this device."; @@ -114,10 +117,17 @@ "wizards.provider.cells.update_list.caption" = "Update list"; "wizards.provider.alerts.unavailable.message" = "Could not download provider infrastructure, please retry later."; +"wizards.host.sections.existing.header" = "Existing profiles"; +"wizards.host.cells.title_input.caption" = "Title"; "wizards.host.alerts.existing.message" = "A host profile with the same title already exists. Replace it?"; +"imported_hosts.title" = "Imported hosts"; + "service.welcome.message" = "Welcome to Passepartout!\n\nUse the organizer to add a new profile."; +"service.sections.vpn.header" = "VPN"; "service.sections.vpn.footer" = "The connection will be established whenever necessary."; +"service.sections.status.header" = "Connection"; +"service.sections.configuration.header" = "Configuration"; "service.sections.provider_infrastructure.footer" = "Last updated on %@."; "service.sections.vpn_survives_sleep.footer" = "Disable to improve battery usage, at the expense of occasional slowdowns due to wake-up reconnections."; "service.sections.vpn_resolves_hostname.footer" = "Preferred in most networks and required in some IPv6 networks. Disable where DNS is blocked, or to speed up negotiation when DNS is slow to respond."; @@ -126,11 +136,15 @@ "service.sections.diagnostics.header" = "Diagnostics"; "service.sections.diagnostics.footer" = "Masking status will be effective after reconnecting. Network data are hostnames, IP addresses, routing, SSID. Credentials and private keys are not logged regardless."; "service.cells.use_profile.caption" = "Use this profile"; +"service.cells.vpn_service.caption" = "Enabled"; "service.cells.connection_status.caption" = "Status"; +"service.cells.host.parameters.caption" = "Parameters"; "service.cells.provider.pool.caption" = "Location"; "service.cells.provider.preset.caption" = "Preset"; +"service.cells.provider.refresh.caption" = "Refresh infrastructure"; "service.cells.vpn_survives_sleep.caption" = "Keep alive on sleep"; "service.cells.vpn_resolves_hostname.caption" = "Resolve provider hostname"; +"service.cells.trusted_add_wifi.caption" = "Add Wi-Fi"; "service.cells.trusted_mobile.caption" = "Cellular network"; "service.cells.trusted_policy.caption" = "Trust disables VPN"; "service.cells.test_connectivity.caption" = "Test connectivity"; @@ -159,8 +173,17 @@ "service.alerts.download.message" = "%@ requires the download of additional configuration files.\n\nConfirm to start the download."; "service.alerts.download.failed" = "Failed to download configuration files. %@"; "service.alerts.download.hud.extracting" = "Extracting files, please be patient..."; +"service.alerts.location.message.denied" = "You must allow location access to trust this Wi-Fi network. Go to iOS settings and review your location permissions for Passepartout."; +"service.alerts.location.button.settings" = "Settings"; + +"provider.pool.sections.empty_favorites.footer" = "Swipe left on a location to add or remove it from Favorites."; +"provider.pool.actions.favorite" = "Favorite"; +"provider.pool.actions.unfavorite" = "Unfavorite"; + +"provider.preset.cells.tech_details.caption" = "Technical details"; "account.title" = "Account"; +"account.sections.credentials.header" = "Credentials"; "account.sections.guidance.footer.infrastructure.default.web" = "Use your %@ website credentials."; "account.sections.guidance.footer.infrastructure.default.specific" = "Use your %@ service credentials, which may differ from website credentials."; "account.sections.guidance.footer.infrastructure.mullvad" = "Use your %@ website credentials. Your username is usually numeric (without spaces)."; @@ -179,10 +202,16 @@ "account.cells.signup.caption" = "Register with %@"; "endpoint.title" = "Endpoint"; +"endpoint.sections.location_addresses.header" = "Addresses"; +"endpoint.sections.location_protocols.header" = "Protocols"; "endpoint.cells.any_address.caption" = "Automatic"; "endpoint.cells.any_protocol.caption" = "Automatic"; "network_settings.title" = "Network settings"; +"network_settings.cells.add_dns_server.caption" = "Add address"; +"network_settings.cells.add_dns_domain.caption" = "Add search domain"; +"network_settings.cells.proxy_bypass.caption" = "Bypass domain"; +"network_settings.cells.add_proxy_bypass.caption" = "Add bypass domain"; "configuration.sections.communication.header" = "Communication"; "configuration.sections.reset.footer" = "If you ended up with broken connectivity after changing the communication parameters, tap to revert to the original configuration."; @@ -226,6 +255,7 @@ "debug_log.buttons.next" = "Next"; "debug_log.alerts.empty_log.message" = "The debug log is empty."; +"shortcuts.add.title" = "Add shortcut"; "shortcuts.add.sections.vpn.header" = "VPN"; "shortcuts.add.sections.wifi.header" = "Wi-Fi"; "shortcuts.add.sections.cellular.header" = "Cellular"; @@ -238,7 +268,9 @@ "shortcuts.add.cells.untrust_cellular.caption" = "Untrust cellular network"; "shortcuts.add.alerts.no_profiles.message" = "There is no profile to connect to."; +"shortcuts.edit.title" = "Manage shortcuts"; "shortcuts.edit.sections.all.header" = "Existing shortcuts"; +"shortcuts.edit.cells.add_shortcut.caption" = "Add shortcut"; "purchase.title" = "Purchase"; "purchase.sections.products.footer" = "Every product is a one-time purchase. Provider purchases do not include a VPN subscription."; From 23c497968f4bebacf1e783b696a49eb99315101d Mon Sep 17 00:00:00 2001 From: Davide De Rosa Date: Sat, 7 Aug 2021 12:23:17 +0200 Subject: [PATCH 2/5] Merge macOS strings into Core --- Passepartout/App/macOS/AppDelegate.swift | 4 +- .../App/macOS/Global/SwiftGen+Strings.swift | 486 +++++++++++------- .../App/macOS/Global/Theme+Views.swift | 2 +- .../App/macOS/Global/WindowManager.swift | 2 +- Passepartout/App/macOS/Menu/StatusMenu.swift | 24 +- .../Scenes/OrganizerViewController.swift | 12 +- .../Preferences/DebugLogViewController.swift | 2 +- .../PreferencesGeneralViewController.swift | 8 +- .../PreferencesViewController.swift | 2 +- .../Customization/DNSViewController.swift | 4 +- .../EndpointViewController.swift | 2 +- .../ProfileCustomizationViewController.swift | 10 +- .../Customization/ProxyViewController.swift | 2 +- .../TrustedNetworksViewController.swift | 6 +- .../Scenes/Service/HostServiceView.swift | 2 +- .../Scenes/Service/ProviderServiceView.swift | 4 +- .../Service/ServiceViewController.swift | 6 +- Passepartout/App/macOS/en.lproj/App.strings | 52 -- .../Core/Resources/en.lproj/Core.strings | 45 ++ 19 files changed, 379 insertions(+), 296 deletions(-) diff --git a/Passepartout/App/macOS/AppDelegate.swift b/Passepartout/App/macOS/AppDelegate.swift index 9a7a2cdf..8cee63a3 100644 --- a/Passepartout/App/macOS/AppDelegate.swift +++ b/Passepartout/App/macOS/AppDelegate.swift @@ -90,8 +90,8 @@ class AppDelegate: NSObject, NSApplicationDelegate { return .terminateNow } let alert = Macros.warning( - L10n.App.Menu.Quit.title(GroupConstants.App.name), - L10n.App.Menu.Quit.Messages.confirm + L10n.Core.Menu.Quit.title(GroupConstants.App.name), + L10n.Core.Menu.Quit.Messages.confirm ) switch alert.presentModallyEx(withOK: L10n.Core.Global.ok, other1: L10n.Core.Global.cancel, other2: L10n.Core.Reddit.Buttons.never) { case .alertSecondButtonReturn: diff --git a/Passepartout/App/macOS/Global/SwiftGen+Strings.swift b/Passepartout/App/macOS/Global/SwiftGen+Strings.swift index 9832f2ad..fd1bad74 100644 --- a/Passepartout/App/macOS/Global/SwiftGen+Strings.swift +++ b/Passepartout/App/macOS/Global/SwiftGen+Strings.swift @@ -11,204 +11,6 @@ import Foundation // swiftlint:disable nesting type_body_length type_name vertical_whitespace_opening_braces internal enum L10n { internal enum App { - internal enum Configuration { - /// Configuration - internal static let title = L10n.tr("App", "configuration.title") - internal enum Alerts { - internal enum Commit { - /// New parameters will not be effective until you reconnect manually. Changes in trusted networks will apply immediately. - internal static let message = L10n.tr("App", "configuration.alerts.commit.message") - internal enum Buttons { - /// Reconnect now - internal static let reconnect = L10n.tr("App", "configuration.alerts.commit.buttons.reconnect") - /// Skip - internal static let skip = L10n.tr("App", "configuration.alerts.commit.buttons.skip") - } - } - } - } - internal enum DebugLog { - internal enum Buttons { - /// Copy - internal static let copy = L10n.tr("App", "debug_log.buttons.copy") - } - } - internal enum Endpoint { - internal enum Cells { - /// Address - internal static let address = L10n.tr("App", "endpoint.cells.address") - /// Protocol - internal static let `protocol` = L10n.tr("App", "endpoint.cells.protocol") - } - } - internal enum Menu { - internal enum ActiveProfile { - internal enum Items { - internal enum Customize { - /// Customize... - internal static let title = L10n.tr("App", "menu.active_profile.items.customize.title") - } - } - internal enum Messages { - /// No account configured - internal static let missingCredentials = L10n.tr("App", "menu.active_profile.messages.missing_credentials") - } - internal enum Title { - /// No active profile - internal static let `none` = L10n.tr("App", "menu.active_profile.title.none") - } - } - internal enum Organizer { - /// Organizer - internal static let title = L10n.tr("App", "menu.organizer.title") - } - internal enum Preferences { - /// Preferences - internal static let title = L10n.tr("App", "menu.preferences.title") - } - internal enum Quit { - /// Quit %@ - internal static func title(_ p1: Any) -> String { - return L10n.tr("App", "menu.quit.title", String(describing: p1)) - } - internal enum Messages { - /// The VPN, if enabled, will still run in the background. Do you want to quit? - internal static let confirm = L10n.tr("App", "menu.quit.messages.confirm") - } - } - internal enum Show { - /// Show - internal static let title = L10n.tr("App", "menu.show.title") - } - internal enum Support { - /// Support - internal static let title = L10n.tr("App", "menu.support.title") - } - internal enum SwitchProfile { - /// Active profile - internal static let title = L10n.tr("App", "menu.switch_profile.title") - } - } - internal enum NetworkSettings { - internal enum Dns { - internal enum Cells { - internal enum Addresses { - /// Servers - internal static let title = L10n.tr("App", "network_settings.dns.cells.addresses.title") - } - internal enum Domains { - /// Domains - internal static let title = L10n.tr("App", "network_settings.dns.cells.domains.title") - } - } - } - internal enum Proxy { - internal enum Cells { - internal enum BypassDomains { - /// Bypass domains - internal static let title = L10n.tr("App", "network_settings.proxy.cells.bypass_domains.title") - } - } - } - } - internal enum Organizer { - /// %@ - internal static func title(_ p1: Any) -> String { - return L10n.tr("App", "organizer.title", String(describing: p1)) - } - internal enum Alerts { - internal enum OpenHostFile { - /// Select an .ovpn file - internal static let title = L10n.tr("App", "organizer.alerts.open_host_file.title") - } - internal enum RemoveProfile { - /// Are you sure you want to delete profile %@? - internal static func message(_ p1: Any) -> String { - return L10n.tr("App", "organizer.alerts.remove_profile.message", String(describing: p1)) - } - /// Remove profile - internal static let title = L10n.tr("App", "organizer.alerts.remove_profile.title") - } - } - internal enum Menus { - /// Host - internal static let host = L10n.tr("App", "organizer.menus.host") - /// Provider - internal static let provider = L10n.tr("App", "organizer.menus.provider") - internal enum Provider { - /// No providers left - internal static let unavailable = L10n.tr("App", "organizer.menus.provider.unavailable") - } - } - } - internal enum Preferences { - /// Preferences - internal static let title = L10n.tr("App", "preferences.title") - internal enum Cells { - internal enum ConfirmQuit { - /// Confirm quit - internal static let caption = L10n.tr("App", "preferences.cells.confirm_quit.caption") - /// Check to present a quit confirmation alert. - internal static let footer = L10n.tr("App", "preferences.cells.confirm_quit.footer") - } - internal enum LaunchesOnLogin { - /// Launch on login - internal static let caption = L10n.tr("App", "preferences.cells.launches_on_login.caption") - /// Check to automatically launch the app on boot or login. - internal static let footer = L10n.tr("App", "preferences.cells.launches_on_login.footer") - } - } - internal enum Sections { - internal enum General { - /// General - internal static let header = L10n.tr("App", "preferences.sections.general.header") - } - } - } - internal enum Service { - internal enum Cells { - internal enum Addresses { - /// Addresses - internal static let caption = L10n.tr("App", "service.cells.addresses.caption") - } - internal enum Category { - /// Category - internal static let caption = L10n.tr("App", "service.cells.category.caption") - } - internal enum OnlyShowsFavorites { - /// Only show favorite locations - internal static let caption = L10n.tr("App", "service.cells.only_shows_favorites.caption") - } - internal enum Vpn { - internal enum TurnOff { - /// Disable VPN - internal static let caption = L10n.tr("App", "service.cells.vpn.turn_off.caption") - } - internal enum TurnOn { - /// Enable VPN - internal static let caption = L10n.tr("App", "service.cells.vpn.turn_on.caption") - } - } - } - } - internal enum Trusted { - internal enum Columns { - internal enum Trust { - /// Trust - internal static let title = L10n.tr("App", "trusted.columns.trust.title") - } - } - internal enum Ethernet { - /// Check to trust any wired cable connection. - internal static let description = L10n.tr("App", "trusted.ethernet.description") - /// Trust wired connections - internal static let title = L10n.tr("App", "trusted.ethernet.title") - } - } - internal enum Vpn { - /// Off - internal static let unused = L10n.tr("App", "vpn.unused") - } } internal enum Core { internal enum About { @@ -283,6 +85,10 @@ internal enum L10n { } } internal enum Sections { + internal enum Credentials { + /// Credentials + internal static let header = L10n.tr("Core", "account.sections.credentials.header") + } internal enum Guidance { internal enum Footer { internal enum Infrastructure { @@ -336,6 +142,20 @@ internal enum L10n { } } internal enum Configuration { + /// Configuration + internal static let title = L10n.tr("Core", "configuration.title") + internal enum Alerts { + internal enum Commit { + /// New parameters will not be effective until you reconnect manually. Changes in trusted networks will apply immediately. + internal static let message = L10n.tr("Core", "configuration.alerts.commit.message") + internal enum Buttons { + /// Reconnect now + internal static let reconnect = L10n.tr("Core", "configuration.alerts.commit.buttons.reconnect") + /// Skip + internal static let skip = L10n.tr("Core", "configuration.alerts.commit.buttons.skip") + } + } + } internal enum Cells { internal enum Cipher { /// Cipher @@ -475,6 +295,8 @@ internal enum L10n { } } internal enum Buttons { + /// Copy + internal static let copy = L10n.tr("Core", "debug_log.buttons.copy") /// Next internal static let next = L10n.tr("Core", "debug_log.buttons.next") /// Previous @@ -523,6 +345,10 @@ internal enum L10n { /// Endpoint internal static let title = L10n.tr("Core", "endpoint.title") internal enum Cells { + /// Address + internal static let address = L10n.tr("Core", "endpoint.cells.address") + /// Protocol + internal static let `protocol` = L10n.tr("Core", "endpoint.cells.protocol") internal enum AnyAddress { /// Automatic internal static let caption = L10n.tr("Core", "endpoint.cells.any_address.caption") @@ -532,6 +358,16 @@ internal enum L10n { internal static let caption = L10n.tr("Core", "endpoint.cells.any_protocol.caption") } } + internal enum Sections { + internal enum LocationAddresses { + /// Addresses + internal static let header = L10n.tr("Core", "endpoint.sections.location_addresses.header") + } + internal enum LocationProtocols { + /// Protocols + internal static let header = L10n.tr("Core", "endpoint.sections.location_protocols.header") + } + } } internal enum Global { /// Cancel @@ -575,6 +411,10 @@ internal enum L10n { internal static let `none` = L10n.tr("Core", "global.values.none") } } + internal enum ImportedHosts { + /// Imported hosts + internal static let title = L10n.tr("Core", "imported_hosts.title") + } internal enum IssueReporter { /// The debug log of your latest connections is crucial to resolve your connectivity issues and is completely anonymous.\n\nThe .ovpn configuration file, if any, is attached stripped of any sensitive data.\n\nPlease double check the e-mail attachments if unsure. internal static let message = L10n.tr("Core", "issue_reporter.message") @@ -591,6 +431,54 @@ internal enum L10n { internal static let error = L10n.tr("Core", "label.license.error") } } + internal enum Menu { + internal enum ActiveProfile { + internal enum Items { + internal enum Customize { + /// Customize... + internal static let title = L10n.tr("Core", "menu.active_profile.items.customize.title") + } + } + internal enum Messages { + /// No account configured + internal static let missingCredentials = L10n.tr("Core", "menu.active_profile.messages.missing_credentials") + } + internal enum Title { + /// No active profile + internal static let `none` = L10n.tr("Core", "menu.active_profile.title.none") + } + } + internal enum Organizer { + /// Organizer + internal static let title = L10n.tr("Core", "menu.organizer.title") + } + internal enum Preferences { + /// Preferences + internal static let title = L10n.tr("Core", "menu.preferences.title") + } + internal enum Quit { + /// Quit %@ + internal static func title(_ p1: Any) -> String { + return L10n.tr("Core", "menu.quit.title", String(describing: p1)) + } + internal enum Messages { + /// The VPN, if enabled, will still run in the background. Do you want to quit? + internal static let confirm = L10n.tr("Core", "menu.quit.messages.confirm") + } + } + internal enum Show { + /// Show + internal static let title = L10n.tr("Core", "menu.show.title") + } + internal enum Support { + /// Support + internal static let title = L10n.tr("Core", "menu.support.title") + } + internal enum SwitchProfile { + /// Active profile + internal static let title = L10n.tr("Core", "menu.switch_profile.title") + } + } internal enum NetworkChoice { /// Read .ovpn internal static let client = L10n.tr("Core", "network_choice.client") @@ -600,14 +488,40 @@ internal enum L10n { internal enum NetworkSettings { /// Network settings internal static let title = L10n.tr("Core", "network_settings.title") + internal enum Cells { + internal enum AddDnsDomain { + /// Add search domain + internal static let caption = L10n.tr("Core", "network_settings.cells.add_dns_domain.caption") + } + internal enum AddDnsServer { + /// Add address + internal static let caption = L10n.tr("Core", "network_settings.cells.add_dns_server.caption") + } + internal enum AddProxyBypass { + /// Add bypass domain + internal static let caption = L10n.tr("Core", "network_settings.cells.add_proxy_bypass.caption") + } + internal enum ProxyBypass { + /// Bypass domain + internal static let caption = L10n.tr("Core", "network_settings.cells.proxy_bypass.caption") + } + } internal enum Dns { /// DNS internal static let title = L10n.tr("Core", "network_settings.dns.title") internal enum Cells { + internal enum Addresses { + /// Servers + internal static let title = L10n.tr("Core", "network_settings.dns.cells.addresses.title") + } internal enum Domain { /// Domain internal static let caption = L10n.tr("Core", "network_settings.dns.cells.domain.caption") } + internal enum Domains { + /// Domains + internal static let title = L10n.tr("Core", "network_settings.dns.cells.domains.title") + } } } internal enum Gateway { @@ -627,9 +541,19 @@ internal enum L10n { internal enum Proxy { /// Proxy internal static let title = L10n.tr("Core", "network_settings.proxy.title") + internal enum Cells { + internal enum BypassDomains { + /// Bypass domains + internal static let title = L10n.tr("Core", "network_settings.proxy.cells.bypass_domains.title") + } + } } } internal enum Organizer { + /// %@ + internal static func title(_ p1: Any) -> String { + return L10n.tr("Core", "organizer.title", String(describing: p1)) + } internal enum Alerts { internal enum AddHost { /// Open an URL to an .ovpn configuration file from Safari, Mail or another app to set up a host profile.\n\nYou can also import an .ovpn with iTunes File Sharing. @@ -647,6 +571,18 @@ internal enum L10n { /// You have created profiles for any available provider. internal static let message = L10n.tr("Core", "organizer.alerts.exhausted_providers.message") } + internal enum OpenHostFile { + /// Select an .ovpn file + internal static let title = L10n.tr("Core", "organizer.alerts.open_host_file.title") + } + internal enum RemoveProfile { + /// Are you sure you want to delete profile %@? + internal static func message(_ p1: Any) -> String { + return L10n.tr("Core", "organizer.alerts.remove_profile.message", String(describing: p1)) + } + /// Remove profile + internal static let title = L10n.tr("Core", "organizer.alerts.remove_profile.title") + } } internal enum Cells { internal enum About { @@ -655,6 +591,14 @@ internal enum L10n { return L10n.tr("Core", "organizer.cells.about.caption", String(describing: p1)) } } + internal enum AddHost { + /// Add from Files + internal static let caption = L10n.tr("Core", "organizer.cells.add_host.caption") + } + internal enum AddProvider { + /// Add new provider + internal static let caption = L10n.tr("Core", "organizer.cells.add_provider.caption") + } internal enum Donate { /// Make a donation internal static let caption = L10n.tr("Core", "organizer.cells.donate.caption") @@ -667,6 +611,10 @@ internal enum L10n { /// Support me on GitHub internal static let caption = L10n.tr("Core", "organizer.cells.github_sponsors.caption") } + internal enum ImportHost { + /// Add from imported + internal static let caption = L10n.tr("Core", "organizer.cells.import_host.caption") + } internal enum JoinCommunity { /// Join community internal static let caption = L10n.tr("Core", "organizer.cells.join_community.caption") @@ -694,6 +642,16 @@ internal enum L10n { internal static let caption = L10n.tr("Core", "organizer.cells.write_review.caption") } } + internal enum Menus { + /// Host + internal static let host = L10n.tr("Core", "organizer.menus.host") + /// Provider + internal static let provider = L10n.tr("Core", "organizer.menus.provider") + internal enum Provider { + /// No providers left + internal static let unavailable = L10n.tr("Core", "organizer.menus.provider.unavailable") + } + } internal enum Sections { internal enum Feedback { /// Feedback @@ -775,6 +733,30 @@ internal enum L10n { } } } + internal enum Preferences { + /// Preferences + internal static let title = L10n.tr("Core", "preferences.title") + internal enum Cells { + internal enum ConfirmQuit { + /// Confirm quit + internal static let caption = L10n.tr("Core", "preferences.cells.confirm_quit.caption") + /// Check to present a quit confirmation alert. + internal static let footer = L10n.tr("Core", "preferences.cells.confirm_quit.footer") + } + internal enum LaunchesOnLogin { + /// Launch on login + internal static let caption = L10n.tr("Core", "preferences.cells.launches_on_login.caption") + /// Check to automatically launch the app on boot or login. + internal static let footer = L10n.tr("Core", "preferences.cells.launches_on_login.footer") + } + } + internal enum Sections { + internal enum General { + /// General + internal static let header = L10n.tr("Core", "preferences.sections.general.header") + } + } + } internal enum Provider { internal enum Pool { internal enum Actions { @@ -783,6 +765,20 @@ internal enum L10n { /// Unfavorite internal static let unfavorite = L10n.tr("Core", "provider.pool.actions.unfavorite") } + internal enum Sections { + internal enum EmptyFavorites { + /// Swipe left on a location to add or remove it from Favorites. + internal static let footer = L10n.tr("Core", "provider.pool.sections.empty_favorites.footer") + } + } + } + internal enum Preset { + internal enum Cells { + internal enum TechDetails { + /// Technical details + internal static let caption = L10n.tr("Core", "provider.preset.cells.tech_details.caption") + } + } } } internal enum Purchase { @@ -861,6 +857,16 @@ internal enum L10n { internal static let extracting = L10n.tr("Core", "service.alerts.download.hud.extracting") } } + internal enum Location { + internal enum Button { + /// Settings + internal static let settings = L10n.tr("Core", "service.alerts.location.button.settings") + } + internal enum Message { + /// You must allow location access to trust this Wi-Fi network. Go to iOS settings and review your location permissions for Passepartout. + internal static let denied = L10n.tr("Core", "service.alerts.location.message.denied") + } + } internal enum MasksPrivateData { internal enum Messages { /// In order to safely reset the current debug log and apply the new masking preference, you must reconnect to the VPN now. @@ -901,6 +907,14 @@ internal enum L10n { } } internal enum Cells { + internal enum Addresses { + /// Addresses + internal static let caption = L10n.tr("Core", "service.cells.addresses.caption") + } + internal enum Category { + /// Category + internal static let caption = L10n.tr("Core", "service.cells.category.caption") + } internal enum ConnectionStatus { /// Status internal static let caption = L10n.tr("Core", "service.cells.connection_status.caption") @@ -915,10 +929,20 @@ internal enum L10n { /// Debug log internal static let caption = L10n.tr("Core", "service.cells.debug_log.caption") } + internal enum Host { + internal enum Parameters { + /// Parameters + internal static let caption = L10n.tr("Core", "service.cells.host.parameters.caption") + } + } internal enum MasksPrivateData { /// Mask network data internal static let caption = L10n.tr("Core", "service.cells.masks_private_data.caption") } + internal enum OnlyShowsFavorites { + /// Only show favorite locations + internal static let caption = L10n.tr("Core", "service.cells.only_shows_favorites.caption") + } internal enum Provider { internal enum Pool { /// Location @@ -953,6 +977,10 @@ internal enum L10n { /// Test connectivity internal static let caption = L10n.tr("Core", "service.cells.test_connectivity.caption") } + internal enum TrustedAddWifi { + /// Add Wi-Fi + internal static let caption = L10n.tr("Core", "service.cells.trusted_add_wifi.caption") + } internal enum TrustedMobile { /// Cellular network internal static let caption = L10n.tr("Core", "service.cells.trusted_mobile.caption") @@ -965,16 +993,34 @@ internal enum L10n { /// Use this profile internal static let caption = L10n.tr("Core", "service.cells.use_profile.caption") } + internal enum Vpn { + internal enum TurnOff { + /// Disable VPN + internal static let caption = L10n.tr("Core", "service.cells.vpn.turn_off.caption") + } + internal enum TurnOn { + /// Enable VPN + internal static let caption = L10n.tr("Core", "service.cells.vpn.turn_on.caption") + } + } internal enum VpnResolvesHostname { /// Resolve provider hostname internal static let caption = L10n.tr("Core", "service.cells.vpn_resolves_hostname.caption") } + internal enum VpnService { + /// Enabled + internal static let caption = L10n.tr("Core", "service.cells.vpn_service.caption") + } internal enum VpnSurvivesSleep { /// Keep alive on sleep internal static let caption = L10n.tr("Core", "service.cells.vpn_survives_sleep.caption") } } internal enum Sections { + internal enum Configuration { + /// Configuration + internal static let header = L10n.tr("Core", "service.sections.configuration.header") + } internal enum Diagnostics { /// Masking status will be effective after reconnecting. Network data are hostnames, IP addresses, routing, SSID. Credentials and private keys are not logged regardless. internal static let footer = L10n.tr("Core", "service.sections.diagnostics.footer") @@ -987,6 +1033,10 @@ internal enum L10n { return L10n.tr("Core", "service.sections.provider_infrastructure.footer", String(describing: p1)) } } + internal enum Status { + /// Connection + internal static let header = L10n.tr("Core", "service.sections.status.header") + } internal enum Trusted { /// When entering a trusted network, the VPN is normally shut down and kept disconnected. Disable this option to not enforce such behavior. internal static let footer = L10n.tr("Core", "service.sections.trusted.footer") @@ -996,6 +1046,8 @@ internal enum L10n { internal enum Vpn { /// The connection will be established whenever necessary. internal static let footer = L10n.tr("Core", "service.sections.vpn.footer") + /// VPN + internal static let header = L10n.tr("Core", "service.sections.vpn.header") } internal enum VpnResolvesHostname { /// Preferred in most networks and required in some IPv6 networks. Disable where DNS is blocked, or to speed up negotiation when DNS is slow to respond. @@ -1017,6 +1069,8 @@ internal enum L10n { } internal enum Shortcuts { internal enum Add { + /// Add shortcut + internal static let title = L10n.tr("Core", "shortcuts.add.title") internal enum Alerts { internal enum NoProfiles { /// There is no profile to connect to. @@ -1069,6 +1123,14 @@ internal enum L10n { } } internal enum Edit { + /// Manage shortcuts + internal static let title = L10n.tr("Core", "shortcuts.edit.title") + internal enum Cells { + internal enum AddShortcut { + /// Add shortcut + internal static let caption = L10n.tr("Core", "shortcuts.edit.cells.add_shortcut.caption") + } + } internal enum Sections { internal enum All { /// Existing shortcuts @@ -1081,6 +1143,20 @@ internal enum L10n { /// Translations internal static let title = L10n.tr("Core", "translations.title") } + internal enum Trusted { + internal enum Columns { + internal enum Trust { + /// Trust + internal static let title = L10n.tr("Core", "trusted.columns.trust.title") + } + } + internal enum Ethernet { + /// Check to trust any wired cable connection. + internal static let description = L10n.tr("Core", "trusted.ethernet.description") + /// Trust wired connections + internal static let title = L10n.tr("Core", "trusted.ethernet.title") + } + } internal enum Version { /// Version internal static let title = L10n.tr("Core", "version.title") @@ -1100,6 +1176,8 @@ internal enum L10n { internal static let disconnecting = L10n.tr("Core", "vpn.disconnecting") /// Inactive internal static let inactive = L10n.tr("Core", "vpn.inactive") + /// Off + internal static let unused = L10n.tr("Core", "vpn.unused") internal enum Errors { /// Auth failed internal static let auth = L10n.tr("Core", "vpn.errors.auth") @@ -1131,6 +1209,18 @@ internal enum L10n { internal static let message = L10n.tr("Core", "wizards.host.alerts.existing.message") } } + internal enum Cells { + internal enum TitleInput { + /// Title + internal static let caption = L10n.tr("Core", "wizards.host.cells.title_input.caption") + } + } + internal enum Sections { + internal enum Existing { + /// Existing profiles + internal static let header = L10n.tr("Core", "wizards.host.sections.existing.header") + } + } } internal enum Provider { internal enum Alerts { diff --git a/Passepartout/App/macOS/Global/Theme+Views.swift b/Passepartout/App/macOS/Global/Theme+Views.swift index b9fc828a..b7348780 100644 --- a/Passepartout/App/macOS/Global/Theme+Views.swift +++ b/Passepartout/App/macOS/Global/Theme+Views.swift @@ -30,7 +30,7 @@ import TunnelKit extension NSTextField { func applyVPN(_ theme: Theme, isActive: Bool, with vpnStatus: VPNStatus?, error: OpenVPNTunnelProvider.ProviderError?) { guard isActive else { - stringValue = L10n.App.Vpn.unused + stringValue = L10n.Core.Vpn.unused textColor = theme.palette.colorSecondaryText return } diff --git a/Passepartout/App/macOS/Global/WindowManager.swift b/Passepartout/App/macOS/Global/WindowManager.swift index e53533ae..44522002 100644 --- a/Passepartout/App/macOS/Global/WindowManager.swift +++ b/Passepartout/App/macOS/Global/WindowManager.swift @@ -44,7 +44,7 @@ class WindowManager: NSObject { @discardableResult func showPreferences() -> NSWindowController? { preferences = presentWindowController(StoryboardScene.Preferences.preferencesWindowController, existing: preferences) - preferences?.window?.title = L10n.App.Preferences.title + preferences?.window?.title = L10n.Core.Preferences.title return preferences } diff --git a/Passepartout/App/macOS/Menu/StatusMenu.swift b/Passepartout/App/macOS/Menu/StatusMenu.swift index e2f779ff..71020ceb 100644 --- a/Passepartout/App/macOS/Menu/StatusMenu.swift +++ b/Passepartout/App/macOS/Menu/StatusMenu.swift @@ -67,7 +67,7 @@ class StatusMenu: NSObject { private let menuAllProfiles = NSMenu() - private lazy var itemSwitchProfile = NSMenuItem(title: L10n.App.Menu.SwitchProfile.title, action: nil, keyEquivalent: "") + private lazy var itemSwitchProfile = NSMenuItem(title: L10n.Core.Menu.SwitchProfile.title, action: nil, keyEquivalent: "") private var itemsAllProfiles: [NSMenuItem] = [] @@ -77,7 +77,7 @@ class StatusMenu: NSObject { private lazy var itemPool = NSMenuItem(title: "", action: nil, keyEquivalent: "") - private lazy var itemToggleVPN = NSMenuItem(title: L10n.App.Service.Cells.Vpn.TurnOn.caption, action: nil, keyEquivalent: "") + private lazy var itemToggleVPN = NSMenuItem(title: L10n.Core.Service.Cells.Vpn.TurnOn.caption, action: nil, keyEquivalent: "") private lazy var itemReconnectVPN = NSMenuItem(title: L10n.Core.Service.Cells.Reconnect.caption, action: #selector(reconnectVPN), keyEquivalent: "") @@ -111,8 +111,8 @@ class StatusMenu: NSObject { // main actions - let itemShow = NSMenuItem(title: L10n.App.Menu.Show.title, action: #selector(showOrganizer), keyEquivalent: "") - let itemPreferences = NSMenuItem(title: L10n.App.Menu.Preferences.title.asContinuation, action: #selector(showPreferences), keyEquivalent: ",") + let itemShow = NSMenuItem(title: L10n.Core.Menu.Show.title, action: #selector(showOrganizer), keyEquivalent: "") + let itemPreferences = NSMenuItem(title: L10n.Core.Menu.Preferences.title.asContinuation, action: #selector(showPreferences), keyEquivalent: ",") itemShow.target = self itemPreferences.target = self menu.addItem(itemShow) @@ -157,7 +157,7 @@ class StatusMenu: NSObject { itemReport.target = self menuSupport.addItem(itemReport) } - let itemSupport = NSMenuItem(title: L10n.App.Menu.Support.title, action: nil, keyEquivalent: "") + let itemSupport = NSMenuItem(title: L10n.Core.Menu.Support.title, action: nil, keyEquivalent: "") menu.setSubmenu(menuSupport, for: itemSupport) menu.addItem(itemSupport) @@ -181,7 +181,7 @@ class StatusMenu: NSObject { // secondary let itemAbout = NSMenuItem(title: L10n.Core.Organizer.Cells.About.caption(GroupConstants.App.name), action: #selector(showAbout), keyEquivalent: "") - let itemQuit = NSMenuItem(title: L10n.App.Menu.Quit.title(GroupConstants.App.name), action: #selector(quit), keyEquivalent: "q") + let itemQuit = NSMenuItem(title: L10n.Core.Menu.Quit.title(GroupConstants.App.name), action: #selector(quit), keyEquivalent: "q") itemAbout.target = self itemQuit.target = self menu.addItem(itemAbout) @@ -224,7 +224,7 @@ class StatusMenu: NSObject { itemsProfile.removeAll() guard let profile = profile else { - itemProfileName.title = L10n.App.Menu.ActiveProfile.Title.none + itemProfileName.title = L10n.Core.Menu.ActiveProfile.Title.none // itemProfileName.image = nil statusItem.button?.image = imageStatusInactive statusItem.button?.toolTip = nil @@ -248,7 +248,7 @@ class StatusMenu: NSObject { itemsProfile.append(itemToggleVPN) itemsProfile.append(itemReconnectVPN) } else { - let itemMissingCredentials = NSMenuItem(title: L10n.App.Menu.ActiveProfile.Messages.missingCredentials, action: nil, keyEquivalent: "") + let itemMissingCredentials = NSMenuItem(title: L10n.Core.Menu.ActiveProfile.Messages.missingCredentials, action: nil, keyEquivalent: "") itemMissingCredentials.indentationLevel = 1 menu.insertItem(itemMissingCredentials, at: i) i += 1 @@ -295,7 +295,7 @@ class StatusMenu: NSObject { itemsProfile.append(itemAccount) // customize - let itemCustomize = NSMenuItem(title: L10n.App.Menu.ActiveProfile.Items.Customize.title, action: #selector(customizeProfile(_:)), keyEquivalent: "") + let itemCustomize = NSMenuItem(title: L10n.Core.Menu.ActiveProfile.Items.Customize.title, action: #selector(customizeProfile(_:)), keyEquivalent: "") menu.insertItem(itemCustomize, at: i) i += 1 itemCustomize.target = self @@ -370,7 +370,7 @@ class StatusMenu: NSObject { itemsProfile.append(itemAccount) // customize - let itemCustomize = NSMenuItem(title: L10n.App.Menu.ActiveProfile.Items.Customize.title, action: #selector(customizeProfile(_:)), keyEquivalent: "") + let itemCustomize = NSMenuItem(title: L10n.Core.Menu.ActiveProfile.Items.Customize.title, action: #selector(customizeProfile(_:)), keyEquivalent: "") menu.insertItem(itemCustomize, at: i) i += 1 itemCustomize.target = self @@ -572,10 +572,10 @@ class StatusMenu: NSObject { private func reloadVpnStatus() { if vpn.isEnabled { - itemToggleVPN.title = L10n.App.Service.Cells.Vpn.TurnOff.caption + itemToggleVPN.title = L10n.Core.Service.Cells.Vpn.TurnOff.caption itemToggleVPN.action = #selector(disableVPN) } else { - itemToggleVPN.title = L10n.App.Service.Cells.Vpn.TurnOn.caption + itemToggleVPN.title = L10n.Core.Service.Cells.Vpn.TurnOn.caption itemToggleVPN.action = #selector(enableVPN) } if let profile = service.activeProfile { diff --git a/Passepartout/App/macOS/Scenes/OrganizerViewController.swift b/Passepartout/App/macOS/Scenes/OrganizerViewController.swift index db65569c..bd4f7b9d 100644 --- a/Passepartout/App/macOS/Scenes/OrganizerViewController.swift +++ b/Passepartout/App/macOS/Scenes/OrganizerViewController.swift @@ -128,7 +128,7 @@ class OrganizerViewController: NSViewController { @objc private func addHost() { let panel = NSOpenPanel() - panel.title = L10n.App.Organizer.Alerts.OpenHostFile.title + panel.title = L10n.Core.Organizer.Alerts.OpenHostFile.title panel.allowsMultipleSelection = false panel.canChooseDirectories = false panel.canChooseFiles = true @@ -312,7 +312,7 @@ extension OrganizerViewController: OrganizerProfileTableViewDelegate { let menu = NSMenu() - let itemProvider = NSMenuItem(title: L10n.App.Organizer.Menus.provider, action: nil, keyEquivalent: "") + let itemProvider = NSMenuItem(title: L10n.Core.Organizer.Menus.provider, action: nil, keyEquivalent: "") let menuProvider = NSMenu() let availableMetadata = service.availableProviders() if !availableMetadata.isEmpty { @@ -323,7 +323,7 @@ extension OrganizerViewController: OrganizerProfileTableViewDelegate { menuProvider.addItem(item) } } else { - let item = NSMenuItem(title: L10n.App.Organizer.Menus.Provider.unavailable, action: nil, keyEquivalent: "") + let item = NSMenuItem(title: L10n.Core.Organizer.Menus.Provider.unavailable, action: nil, keyEquivalent: "") item.isEnabled = false menuProvider.addItem(item) } @@ -333,7 +333,7 @@ extension OrganizerViewController: OrganizerProfileTableViewDelegate { menu.setSubmenu(menuProvider, for: itemProvider) menu.addItem(itemProvider) - let menuHost = NSMenuItem(title: L10n.App.Organizer.Menus.host.asContinuation, action: #selector(addHost), keyEquivalent: "") + let menuHost = NSMenuItem(title: L10n.Core.Organizer.Menus.host.asContinuation, action: #selector(addHost), keyEquivalent: "") menu.addItem(menuHost) NSMenu.popUpContextMenu(menu, with: event, for: sender) @@ -343,8 +343,8 @@ extension OrganizerViewController: OrganizerProfileTableViewDelegate { profilePendingRemoval = profile let alert = Macros.warning( - L10n.App.Organizer.Alerts.RemoveProfile.title, - L10n.App.Organizer.Alerts.RemoveProfile.message(service.screenTitle(ProfileKey(profile))) + L10n.Core.Organizer.Alerts.RemoveProfile.title, + L10n.Core.Organizer.Alerts.RemoveProfile.message(service.screenTitle(ProfileKey(profile))) ) alert.present(in: view.window, withOK: L10n.Core.Global.ok, cancel: L10n.Core.Global.cancel, handler: { self.removePendingProfile() diff --git a/Passepartout/App/macOS/Scenes/Preferences/DebugLogViewController.swift b/Passepartout/App/macOS/Scenes/Preferences/DebugLogViewController.swift index de7cb102..f2a3f5c9 100644 --- a/Passepartout/App/macOS/Scenes/Preferences/DebugLogViewController.swift +++ b/Passepartout/App/macOS/Scenes/Preferences/DebugLogViewController.swift @@ -68,7 +68,7 @@ class DebugLogViewController: NSViewController { labelExchangedCaption.stringValue = L10n.Core.Service.Cells.DataCount.caption.asCaption labelLog.stringValue = L10n.Core.Service.Cells.DebugLog.caption.asCaption - buttonCopy.title = L10n.App.DebugLog.Buttons.copy + buttonCopy.title = L10n.Core.DebugLog.Buttons.copy buttonPrevious.image = NSImage(named: NSImage.touchBarRewindTemplateName) buttonNext.image = NSImage(named: NSImage.touchBarFastForwardTemplateName) buttonShare.image = NSImage(named: NSImage.shareTemplateName) diff --git a/Passepartout/App/macOS/Scenes/Preferences/PreferencesGeneralViewController.swift b/Passepartout/App/macOS/Scenes/Preferences/PreferencesGeneralViewController.swift index a5c185a8..85f701ef 100644 --- a/Passepartout/App/macOS/Scenes/Preferences/PreferencesGeneralViewController.swift +++ b/Passepartout/App/macOS/Scenes/Preferences/PreferencesGeneralViewController.swift @@ -45,10 +45,10 @@ class PreferencesGeneralViewController: NSViewController { override func viewDidLoad() { super.viewDidLoad() - checkLaunchOnLogin.title = L10n.App.Preferences.Cells.LaunchesOnLogin.caption - labelLaunchOnLogin.stringValue = L10n.App.Preferences.Cells.LaunchesOnLogin.footer - checkConfirmQuit.title = L10n.App.Preferences.Cells.ConfirmQuit.caption - labelConfirmQuit.stringValue = L10n.App.Preferences.Cells.ConfirmQuit.footer + checkLaunchOnLogin.title = L10n.Core.Preferences.Cells.LaunchesOnLogin.caption + labelLaunchOnLogin.stringValue = L10n.Core.Preferences.Cells.LaunchesOnLogin.footer + checkConfirmQuit.title = L10n.Core.Preferences.Cells.ConfirmQuit.caption + labelConfirmQuit.stringValue = L10n.Core.Preferences.Cells.ConfirmQuit.footer checkResolveHostname.title = L10n.Core.Service.Cells.VpnResolvesHostname.caption labelResolveHostname.stringValue = L10n.Core.Service.Sections.VpnResolvesHostname.footer diff --git a/Passepartout/App/macOS/Scenes/Preferences/PreferencesViewController.swift b/Passepartout/App/macOS/Scenes/Preferences/PreferencesViewController.swift index 47c808c4..a5cb05bb 100644 --- a/Passepartout/App/macOS/Scenes/Preferences/PreferencesViewController.swift +++ b/Passepartout/App/macOS/Scenes/Preferences/PreferencesViewController.swift @@ -33,7 +33,7 @@ class PreferencesViewController: NSViewController { super.viewDidLoad() let labels = [ - L10n.App.Preferences.Sections.General.header, + L10n.Core.Preferences.Sections.General.header, L10n.Core.Service.Sections.Diagnostics.header ] tabView.tabViewItems.enumerated().forEach { diff --git a/Passepartout/App/macOS/Scenes/Service/Customization/DNSViewController.swift b/Passepartout/App/macOS/Scenes/Service/Customization/DNSViewController.swift index ff1be4ee..bee4d241 100644 --- a/Passepartout/App/macOS/Scenes/Service/Customization/DNSViewController.swift +++ b/Passepartout/App/macOS/Scenes/Service/Customization/DNSViewController.swift @@ -67,7 +67,7 @@ class DNSViewController: NSViewController, ProfileCustomization { labelDNSProtocol.stringValue = L10n.Core.Global.Captions.protocol.asCaption - tableDNSAddresses.title = L10n.App.NetworkSettings.Dns.Cells.Addresses.title.asCaption + tableDNSAddresses.title = L10n.Core.NetworkSettings.Dns.Cells.Addresses.title.asCaption viewDNSAddresses.addSubview(tableDNSAddresses) tableDNSAddresses.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ @@ -77,7 +77,7 @@ class DNSViewController: NSViewController, ProfileCustomization { tableDNSAddresses.rightAnchor.constraint(equalTo: viewDNSAddresses.rightAnchor), ]) - tableDNSDomains.title = L10n.App.NetworkSettings.Dns.Cells.Domains.title.asCaption + tableDNSDomains.title = L10n.Core.NetworkSettings.Dns.Cells.Domains.title.asCaption viewDNSDomains.addSubview(tableDNSDomains) tableDNSDomains.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ diff --git a/Passepartout/App/macOS/Scenes/Service/Customization/EndpointViewController.swift b/Passepartout/App/macOS/Scenes/Service/Customization/EndpointViewController.swift index 78d5c904..8cbb147a 100644 --- a/Passepartout/App/macOS/Scenes/Service/Customization/EndpointViewController.swift +++ b/Passepartout/App/macOS/Scenes/Service/Customization/EndpointViewController.swift @@ -52,7 +52,7 @@ class EndpointViewController: NSViewController, ProfileCustomization { override func viewDidLoad() { super.viewDidLoad() - labelAddressCaption.stringValue = L10n.App.Endpoint.Cells.address.asCaption + labelAddressCaption.stringValue = L10n.Core.Endpoint.Cells.address.asCaption labelProtocolCaption.stringValue = L10n.Core.Global.Captions.protocol.asCaption reloadEndpoints() diff --git a/Passepartout/App/macOS/Scenes/Service/Customization/ProfileCustomizationViewController.swift b/Passepartout/App/macOS/Scenes/Service/Customization/ProfileCustomizationViewController.swift index a585e7da..fd2b477e 100644 --- a/Passepartout/App/macOS/Scenes/Service/Customization/ProfileCustomizationViewController.swift +++ b/Passepartout/App/macOS/Scenes/Service/Customization/ProfileCustomizationViewController.swift @@ -153,12 +153,12 @@ class ProfileCustomizationContainerViewController: NSViewController { switch vpn.status { case .connected, .connecting: let alert = Macros.warning( - L10n.App.Configuration.title, - L10n.App.Configuration.Alerts.Commit.message + L10n.Core.Configuration.title, + L10n.Core.Configuration.Alerts.Commit.message ) if alert.presentModally( - withOK: L10n.App.Configuration.Alerts.Commit.Buttons.reconnect, - cancel: L10n.App.Configuration.Alerts.Commit.Buttons.skip) { + withOK: L10n.Core.Configuration.Alerts.Commit.Buttons.reconnect, + cancel: L10n.Core.Configuration.Alerts.Commit.Buttons.skip) { vpn.reconnect(completionHandler: nil) } else { @@ -259,7 +259,7 @@ class ProfileCustomizationViewController: NSTabViewController { assert(tabViewItems.count == expectedTabs, "Customization tabs misconfigured (expected \(expectedTabs))") tabViewItems[0].label = L10n.Core.Endpoint.title - tabViewItems[1].label = L10n.App.Configuration.title + tabViewItems[1].label = L10n.Core.Configuration.title tabViewItems[2].label = L10n.Core.Service.Sections.Trusted.header tabViewItems[3].label = L10n.Core.NetworkSettings.Gateway.title tabViewItems[4].label = L10n.Core.NetworkSettings.Dns.title diff --git a/Passepartout/App/macOS/Scenes/Service/Customization/ProxyViewController.swift b/Passepartout/App/macOS/Scenes/Service/Customization/ProxyViewController.swift index c7bc7290..6be2ecfe 100644 --- a/Passepartout/App/macOS/Scenes/Service/Customization/ProxyViewController.swift +++ b/Passepartout/App/macOS/Scenes/Service/Customization/ProxyViewController.swift @@ -76,7 +76,7 @@ class ProxyViewController: NSViewController, ProfileCustomization { labelPACCaption.stringValue = "PAC".asCaption textPAC.placeholderString = L10n.Core.Global.Values.none - tableProxyBypass.title = L10n.App.NetworkSettings.Proxy.Cells.BypassDomains.title.asCaption + tableProxyBypass.title = L10n.Core.NetworkSettings.Proxy.Cells.BypassDomains.title.asCaption viewProxyBypass.addSubview(tableProxyBypass) tableProxyBypass.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ diff --git a/Passepartout/App/macOS/Scenes/Service/Customization/TrustedNetworksViewController.swift b/Passepartout/App/macOS/Scenes/Service/Customization/TrustedNetworksViewController.swift index 9889f55c..a6844793 100644 --- a/Passepartout/App/macOS/Scenes/Service/Customization/TrustedNetworksViewController.swift +++ b/Passepartout/App/macOS/Scenes/Service/Customization/TrustedNetworksViewController.swift @@ -67,8 +67,8 @@ class TrustedNetworksViewController: NSViewController, ProfileCustomization { labelTitle.stringValue = L10n.Core.Service.Sections.Trusted.header.asCaption buttonAdd.image = NSImage(named: NSImage.addTemplateName) buttonRemove.image = NSImage(named: NSImage.removeTemplateName) - checkTrustEthernet.title = L10n.App.Trusted.Ethernet.title - labelTrustEthernetDescription.stringValue = L10n.App.Trusted.Ethernet.description + checkTrustEthernet.title = L10n.Core.Trusted.Ethernet.title + labelTrustEthernetDescription.stringValue = L10n.Core.Trusted.Ethernet.description checkDisableConnection.title = L10n.Core.Service.Cells.TrustedPolicy.caption labelDisableConnectionDescription.stringValue = L10n.Core.Service.Sections.Trusted.footer @@ -86,7 +86,7 @@ class TrustedNetworksViewController: NSViewController, ProfileCustomization { column.isEditable = false case Columns.trust: - column.title = L10n.App.Trusted.Columns.Trust.title + column.title = L10n.Core.Trusted.Columns.Trust.title default: break diff --git a/Passepartout/App/macOS/Scenes/Service/HostServiceView.swift b/Passepartout/App/macOS/Scenes/Service/HostServiceView.swift index 7cb0ad63..07ab2591 100644 --- a/Passepartout/App/macOS/Scenes/Service/HostServiceView.swift +++ b/Passepartout/App/macOS/Scenes/Service/HostServiceView.swift @@ -50,7 +50,7 @@ class HostServiceView: NSView { override func viewWillMove(toSuperview newSuperview: NSView?) { super.viewWillMove(toSuperview: newSuperview) - labelAddressesCaption.stringValue = L10n.App.Service.Cells.Addresses.caption.asCaption + labelAddressesCaption.stringValue = L10n.Core.Service.Cells.Addresses.caption.asCaption } func reloadData() { diff --git a/Passepartout/App/macOS/Scenes/Service/ProviderServiceView.swift b/Passepartout/App/macOS/Scenes/Service/ProviderServiceView.swift index 4e43de9b..a4512b04 100644 --- a/Passepartout/App/macOS/Scenes/Service/ProviderServiceView.swift +++ b/Passepartout/App/macOS/Scenes/Service/ProviderServiceView.swift @@ -95,9 +95,9 @@ class ProviderServiceView: NSView { override func viewWillMove(toSuperview newSuperview: NSView?) { super.viewWillMove(toSuperview: newSuperview) - labelCategoryCaption.stringValue = L10n.App.Service.Cells.Category.caption.asCaption + labelCategoryCaption.stringValue = L10n.Core.Service.Cells.Category.caption.asCaption labelLocationCaption.stringValue = L10n.Core.Service.Cells.Provider.Pool.caption.asCaption - checkOnlyShowsFavorites.title = L10n.App.Service.Cells.OnlyShowsFavorites.caption + checkOnlyShowsFavorites.title = L10n.Core.Service.Cells.OnlyShowsFavorites.caption checkOnlyShowsFavorites.state = .off buttonRefreshInfrastructure.image = NSImage(named: NSImage.refreshTemplateName) buttonFavorite.image = NSImage(named: NSImage.bookmarksTemplateName) diff --git a/Passepartout/App/macOS/Scenes/Service/ServiceViewController.swift b/Passepartout/App/macOS/Scenes/Service/ServiceViewController.swift index a5aa9985..eddd73e1 100644 --- a/Passepartout/App/macOS/Scenes/Service/ServiceViewController.swift +++ b/Passepartout/App/macOS/Scenes/Service/ServiceViewController.swift @@ -154,7 +154,7 @@ class ServiceViewController: NSViewController { labelStatusCaption.stringValue = L10n.Core.Service.Cells.ConnectionStatus.caption.asCaption labelServiceDescription.stringValue = L10n.Core.Service.Sections.Vpn.footer buttonUse.title = L10n.Core.Service.Cells.UseProfile.caption - buttonToggle.title = L10n.App.Service.Cells.Vpn.TurnOn.caption + buttonToggle.title = L10n.Core.Service.Cells.Vpn.TurnOn.caption buttonReconnect.title = L10n.Core.Service.Cells.Reconnect.caption buttonCustomize.image = NSImage(named: NSImage.actionTemplateName) buttonAccount.title = L10n.Core.Account.title.asContinuation @@ -276,14 +276,14 @@ class ServiceViewController: NSViewController { guard isActive && vpn.isEnabled else { labelStatus.applyVPN(Theme.current, isActive: isActive, with: nil, error: nil) activityVPN.stopAnimation(nil) - buttonToggle.title = L10n.App.Service.Cells.Vpn.TurnOn.caption + buttonToggle.title = L10n.Core.Service.Cells.Vpn.TurnOn.caption buttonToggle.isEnabled = true buttonReconnect.isEnabled = false return } labelStatus.applyVPN(Theme.current, isActive: isActive, with: vpn.status, error: service.vpnLastError) - buttonToggle.title = vpn.isEnabled ? L10n.App.Service.Cells.Vpn.TurnOff.caption : L10n.App.Service.Cells.Vpn.TurnOn.caption + buttonToggle.title = vpn.isEnabled ? L10n.Core.Service.Cells.Vpn.TurnOff.caption : L10n.Core.Service.Cells.Vpn.TurnOn.caption buttonReconnect.isEnabled = true // append connected location for providers diff --git a/Passepartout/App/macOS/en.lproj/App.strings b/Passepartout/App/macOS/en.lproj/App.strings index 25a33add..9fee1cf5 100644 --- a/Passepartout/App/macOS/en.lproj/App.strings +++ b/Passepartout/App/macOS/en.lproj/App.strings @@ -22,55 +22,3 @@ // You should have received a copy of the GNU General Public License // along with Passepartout. If not, see . // - -"vpn.unused" = "Off"; - -"organizer.title" = "%@"; -"organizer.menus.provider" = "Provider"; -"organizer.menus.provider.unavailable" = "No providers left"; -"organizer.menus.host" = "Host"; -"organizer.alerts.remove_profile.title" = "Remove profile"; -"organizer.alerts.remove_profile.message" = "Are you sure you want to delete profile %@?"; -"organizer.alerts.open_host_file.title" = "Select an .ovpn file"; - -"service.cells.vpn.turn_on.caption" = "Enable VPN"; -"service.cells.vpn.turn_off.caption" = "Disable VPN"; -"service.cells.category.caption" = "Category"; -"service.cells.addresses.caption" = "Addresses"; -"service.cells.only_shows_favorites.caption" = "Only show favorite locations"; - -"endpoint.cells.address" = "Address"; -"endpoint.cells.protocol" = "Protocol"; - -"configuration.title" = "Configuration"; -"configuration.alerts.commit.message" = "New parameters will not be effective until you reconnect manually. Changes in trusted networks will apply immediately."; -"configuration.alerts.commit.buttons.reconnect" = "Reconnect now"; -"configuration.alerts.commit.buttons.skip" = "Skip"; - -"network_settings.dns.cells.addresses.title" = "Servers"; -"network_settings.dns.cells.domains.title" = "Domains"; -"network_settings.proxy.cells.bypass_domains.title" = "Bypass domains"; - -"preferences.title" = "Preferences"; -"preferences.sections.general.header" = "General"; -"preferences.cells.launches_on_login.caption" = "Launch on login"; -"preferences.cells.launches_on_login.footer" = "Check to automatically launch the app on boot or login."; -"preferences.cells.confirm_quit.caption" = "Confirm quit"; -"preferences.cells.confirm_quit.footer" = "Check to present a quit confirmation alert."; - -"debug_log.buttons.copy" = "Copy"; - -"trusted.columns.trust.title" = "Trust"; -"trusted.ethernet.title" = "Trust wired connections"; -"trusted.ethernet.description" = "Check to trust any wired cable connection."; - -"menu.show.title" = "Show"; -"menu.switch_profile.title" = "Active profile"; -"menu.active_profile.title.none" = "No active profile"; -"menu.active_profile.items.customize.title" = "Customize..."; -"menu.active_profile.messages.missing_credentials" = "No account configured"; -"menu.organizer.title" = "Organizer"; -"menu.preferences.title" = "Preferences"; -"menu.support.title" = "Support"; -"menu.quit.title" = "Quit %@"; -"menu.quit.messages.confirm" = "The VPN, if enabled, will still run in the background. Do you want to quit?"; diff --git a/Passepartout/Core/Resources/en.lproj/Core.strings b/Passepartout/Core/Resources/en.lproj/Core.strings index 74d90177..cd54e8c6 100644 --- a/Passepartout/Core/Resources/en.lproj/Core.strings +++ b/Passepartout/Core/Resources/en.lproj/Core.strings @@ -53,6 +53,7 @@ "vpn.disconnecting" = "Disconnecting"; "vpn.inactive" = "Inactive"; "vpn.disabled" = "Disabled"; +"vpn.unused" = "Off"; "vpn.errors.timeout" = "Timeout"; "vpn.errors.dns" = "DNS failed"; @@ -87,6 +88,10 @@ // //////////////////// +"organizer.title" = "%@"; +"organizer.menus.provider" = "Provider"; +"organizer.menus.provider.unavailable" = "No providers left"; +"organizer.menus.host" = "Host"; "organizer.sections.twitch.header" = "Twitch"; "organizer.sections.twitch.footer" = "Come watch me make Passepartout live on Twitch, join the chat to interact and contribute!"; "organizer.sections.providers.header" = "Providers"; @@ -114,6 +119,9 @@ "organizer.alerts.add_host.message" = "Open an URL to an .ovpn configuration file from Safari, Mail or another app to set up a host profile.\n\nYou can also import an .ovpn with iTunes File Sharing."; "organizer.alerts.cannot_donate.message" = "There is no payment method configured on this device."; "organizer.alerts.delete_vpn_profile.message" = "Do you really want to erase the VPN configuration from your device settings? This may fix some broken VPN states and will not affect your provider and host profiles."; +"organizer.alerts.remove_profile.title" = "Remove profile"; +"organizer.alerts.remove_profile.message" = "Are you sure you want to delete profile %@?"; +"organizer.alerts.open_host_file.title" = "Select an .ovpn file"; "wizards.provider.cells.update_list.caption" = "Update list"; "wizards.provider.alerts.unavailable.message" = "Could not download provider infrastructure, please retry later."; @@ -137,11 +145,16 @@ "service.sections.diagnostics.footer" = "Masking status will be effective after reconnecting. Network data are hostnames, IP addresses, routing, SSID. Credentials and private keys are not logged regardless."; "service.cells.use_profile.caption" = "Use this profile"; "service.cells.vpn_service.caption" = "Enabled"; +"service.cells.vpn.turn_on.caption" = "Enable VPN"; +"service.cells.vpn.turn_off.caption" = "Disable VPN"; "service.cells.connection_status.caption" = "Status"; "service.cells.host.parameters.caption" = "Parameters"; "service.cells.provider.pool.caption" = "Location"; "service.cells.provider.preset.caption" = "Preset"; "service.cells.provider.refresh.caption" = "Refresh infrastructure"; +"service.cells.category.caption" = "Category"; +"service.cells.addresses.caption" = "Addresses"; +"service.cells.only_shows_favorites.caption" = "Only show favorite locations"; "service.cells.vpn_survives_sleep.caption" = "Keep alive on sleep"; "service.cells.vpn_resolves_hostname.caption" = "Resolve provider hostname"; "service.cells.trusted_add_wifi.caption" = "Add Wi-Fi"; @@ -204,6 +217,8 @@ "endpoint.title" = "Endpoint"; "endpoint.sections.location_addresses.header" = "Addresses"; "endpoint.sections.location_protocols.header" = "Protocols"; +"endpoint.cells.address" = "Address"; +"endpoint.cells.protocol" = "Protocol"; "endpoint.cells.any_address.caption" = "Automatic"; "endpoint.cells.any_protocol.caption" = "Automatic"; @@ -213,6 +228,7 @@ "network_settings.cells.proxy_bypass.caption" = "Bypass domain"; "network_settings.cells.add_proxy_bypass.caption" = "Add bypass domain"; +"configuration.title" = "Configuration"; "configuration.sections.communication.header" = "Communication"; "configuration.sections.reset.footer" = "If you ended up with broken connectivity after changing the communication parameters, tap to revert to the original configuration."; "configuration.sections.tls.header" = "TLS"; @@ -241,11 +257,28 @@ "configuration.cells.renegotiation_seconds.caption" = "Renegotiation"; "configuration.cells.renegotiation_seconds.value.after" = "after %@"; "configuration.cells.random_endpoint.caption" = "Randomize endpoint"; +"configuration.alerts.commit.message" = "New parameters will not be effective until you reconnect manually. Changes in trusted networks will apply immediately."; +"configuration.alerts.commit.buttons.reconnect" = "Reconnect now"; +"configuration.alerts.commit.buttons.skip" = "Skip"; + +"trusted.columns.trust.title" = "Trust"; +"trusted.ethernet.title" = "Trust wired connections"; +"trusted.ethernet.description" = "Check to trust any wired cable connection."; + +"preferences.title" = "Preferences"; +"preferences.sections.general.header" = "General"; +"preferences.cells.launches_on_login.caption" = "Launch on login"; +"preferences.cells.launches_on_login.footer" = "Check to automatically launch the app on boot or login."; +"preferences.cells.confirm_quit.caption" = "Confirm quit"; +"preferences.cells.confirm_quit.footer" = "Check to present a quit confirmation alert."; "network_settings.gateway.title" = "Default gateway"; "network_settings.dns.title" = "DNS"; +"network_settings.dns.cells.addresses.title" = "Servers"; "network_settings.dns.cells.domain.caption" = "Domain"; +"network_settings.dns.cells.domains.title" = "Domains"; "network_settings.proxy.title" = "Proxy"; +"network_settings.proxy.cells.bypass_domains.title" = "Bypass domains"; "network_settings.mtu.title" = "MTU"; "network_settings.mtu.cells.bytes.caption" = "Bytes"; @@ -253,8 +286,20 @@ "debug_log.buttons.previous" = "Previous"; "debug_log.buttons.next" = "Next"; +"debug_log.buttons.copy" = "Copy"; "debug_log.alerts.empty_log.message" = "The debug log is empty."; +"menu.show.title" = "Show"; +"menu.switch_profile.title" = "Active profile"; +"menu.active_profile.title.none" = "No active profile"; +"menu.active_profile.items.customize.title" = "Customize..."; +"menu.active_profile.messages.missing_credentials" = "No account configured"; +"menu.organizer.title" = "Organizer"; +"menu.preferences.title" = "Preferences"; +"menu.support.title" = "Support"; +"menu.quit.title" = "Quit %@"; +"menu.quit.messages.confirm" = "The VPN, if enabled, will still run in the background. Do you want to quit?"; + "shortcuts.add.title" = "Add shortcut"; "shortcuts.add.sections.vpn.header" = "VPN"; "shortcuts.add.sections.wifi.header" = "Wi-Fi"; From dab7d5061080738cb0ef85248f5f2338ef588763 Mon Sep 17 00:00:00 2001 From: Davide De Rosa Date: Sat, 7 Aug 2021 12:30:44 +0200 Subject: [PATCH 3/5] Distinguish platform-specific strings --- .../Core/Resources/en.lproj/Core.strings | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/Passepartout/Core/Resources/en.lproj/Core.strings b/Passepartout/Core/Resources/en.lproj/Core.strings index cd54e8c6..97e28227 100644 --- a/Passepartout/Core/Resources/en.lproj/Core.strings +++ b/Passepartout/Core/Resources/en.lproj/Core.strings @@ -129,8 +129,6 @@ "wizards.host.cells.title_input.caption" = "Title"; "wizards.host.alerts.existing.message" = "A host profile with the same title already exists. Replace it?"; -"imported_hosts.title" = "Imported hosts"; - "service.welcome.message" = "Welcome to Passepartout!\n\nUse the organizer to add a new profile."; "service.sections.vpn.header" = "VPN"; "service.sections.vpn.footer" = "The connection will be established whenever necessary."; @@ -289,17 +287,6 @@ "debug_log.buttons.copy" = "Copy"; "debug_log.alerts.empty_log.message" = "The debug log is empty."; -"menu.show.title" = "Show"; -"menu.switch_profile.title" = "Active profile"; -"menu.active_profile.title.none" = "No active profile"; -"menu.active_profile.items.customize.title" = "Customize..."; -"menu.active_profile.messages.missing_credentials" = "No account configured"; -"menu.organizer.title" = "Organizer"; -"menu.preferences.title" = "Preferences"; -"menu.support.title" = "Support"; -"menu.quit.title" = "Quit %@"; -"menu.quit.messages.confirm" = "The VPN, if enabled, will still run in the background. Do you want to quit?"; - "shortcuts.add.title" = "Add shortcut"; "shortcuts.add.sections.vpn.header" = "VPN"; "shortcuts.add.sections.wifi.header" = "Wi-Fi"; @@ -352,3 +339,20 @@ "credits.sections.translations.header" = "Translations"; "label.license.error" = "Unable to download full license content."; + +// iOS only + +"imported_hosts.title" = "Imported hosts"; + +// macOS only + +"menu.show.title" = "Show"; +"menu.switch_profile.title" = "Active profile"; +"menu.active_profile.title.none" = "No active profile"; +"menu.active_profile.items.customize.title" = "Customize..."; +"menu.active_profile.messages.missing_credentials" = "No account configured"; +"menu.organizer.title" = "Organizer"; +"menu.preferences.title" = "Preferences"; +"menu.support.title" = "Support"; +"menu.quit.title" = "Quit %@"; +"menu.quit.messages.confirm" = "The VPN, if enabled, will still run in the background. Do you want to quit?"; From c985ed4256ad8e1d70a6dd42b80654dd2d7c8ca4 Mon Sep 17 00:00:00 2001 From: Davide De Rosa Date: Sat, 7 Aug 2021 13:46:46 +0200 Subject: [PATCH 4/5] Merge all strings with keys reordered --- .../Core/Resources/de.lproj/Core.strings | 82 ++++++++++++++++++ .../Core/Resources/el.lproj/Core.strings | 82 ++++++++++++++++++ .../Core/Resources/en.lproj/Core.strings | 1 + .../Core/Resources/es.lproj/Core.strings | 82 ++++++++++++++++++ .../Core/Resources/fr.lproj/Core.strings | 82 ++++++++++++++++++ .../Core/Resources/it.lproj/Core.strings | 82 ++++++++++++++++++ .../Core/Resources/nl.lproj/Core.strings | 82 ++++++++++++++++++ .../Core/Resources/pl.lproj/Core.strings | 82 ++++++++++++++++++ .../Core/Resources/pt.lproj/Core.strings | 82 ++++++++++++++++++ .../Core/Resources/ru.lproj/Core.strings | 82 ++++++++++++++++++ .../Core/Resources/sv.lproj/Core.strings | 82 ++++++++++++++++++ .../Core/Resources/zh-Hans.lproj/Core.strings | 84 ++++++++++++++++++- scripts/import-onesky-translations.sh | 5 +- 13 files changed, 906 insertions(+), 4 deletions(-) diff --git a/Passepartout/Core/Resources/de.lproj/Core.strings b/Passepartout/Core/Resources/de.lproj/Core.strings index 48e52318..58e67754 100644 --- a/Passepartout/Core/Resources/de.lproj/Core.strings +++ b/Passepartout/Core/Resources/de.lproj/Core.strings @@ -53,6 +53,7 @@ "vpn.disconnecting" = "Trenne"; "vpn.inactive" = "Inaktiv"; "vpn.disabled" = "Deaktiviert"; +"vpn.unused" = "Aus"; "vpn.errors.timeout" = "Timeout"; "vpn.errors.dns" = "DNS fehlgeschlagen"; @@ -87,6 +88,11 @@ // //////////////////// +"organizer.title" = "%@"; +"organizer.menus.provider" = "Anbieter"; +"organizer.menus.provider.unavailable" = "Keine Anbieter übrig"; +"organizer.menus.host" = "Host"; +/* //////////////////// */ "organizer.sections.twitch.header" = "Twitch"; "organizer.sections.twitch.footer" = "Come watch me make Passepartout live on Twitch, join the chat to interact and contribute!"; "organizer.sections.providers.header" = "Anbieter"; @@ -107,17 +113,28 @@ "organizer.cells.translate.caption" = "Übersetzung anbieten"; "organizer.cells.about.caption" = "Über %@"; "organizer.cells.uninstall.caption" = "VPN-Konfiguration entfernen"; +"organizer.cells.add_provider.caption" = "Neuen Anbieter hinzufügen"; +"organizer.cells.add_host.caption" = "Aus Dateien hinzufügen"; +"organizer.cells.import_host.caption" = "Vom Import hinzufügen"; "organizer.alerts.exhausted_providers.message" = "Du hast Profile für alle verfügbaren Anbieter erstellt."; "organizer.alerts.add_host.message" = "Öffne eine URL zu einer .ovpn-Konfigurationsdatei aus Safari, Mail oder anderen App um ein Host-Profil einzurichten.\n\nDu kannst auch eine .ovpn-Datei mit iTunes Dateifreigabe importieren."; "organizer.alerts.cannot_donate.message" = "Auf diesem Gerät ist keine Bezahlmethode konfiguriert."; "organizer.alerts.delete_vpn_profile.message" = "Möchtest du wirklich die VPN-Konfiguration aus deinen Geräte-Einstellungen löschen? Dies behebt möglicherweise manche kaputten VPN-Zustände und beeinflusst nicht deine Anbieter und Hosts-Profile."; +"organizer.alerts.remove_profile.title" = "Profil entfernen"; +"organizer.alerts.remove_profile.message" = "Bist du sicher, dass du das Profil %@ löschen möchtest?"; +"organizer.alerts.open_host_file.title" = "Wähle eine .ovpn-Datei."; "wizards.provider.cells.update_list.caption" = "Aktualisiere Liste"; "wizards.provider.alerts.unavailable.message" = "Die Provider-Infrastruktur konnte nicht heruntergeladen werden. Bitte versuchen Sie es später erneut."; +"wizards.host.sections.existing.header" = "Bestehende Profile"; +"wizards.host.cells.title_input.caption" = "Titel"; "wizards.host.alerts.existing.message" = "Ein Host-Profil mit identischem Titel existiert bereits. Ersetzen?"; "service.welcome.message" = "Willkommen bei Passepartout!\n\nBenutze den Organizer um ein neues Profil hinzuzufügen."; +"service.sections.vpn.header" = "VPN"; "service.sections.vpn.footer" = "Die Verbindung wird immer aufgebaut wenn notwendig."; +"service.sections.status.header" = "Verbindung"; +"service.sections.configuration.header" = "Konfiguration"; "service.sections.provider_infrastructure.footer" = "Zuletzt aktualisiert am %@."; "service.sections.vpn_survives_sleep.footer" = "Deaktivieren um die Batterielaufzeit zu verbessern, allerdings verzögert sich der Verbindungsaufbau beim Aufwachen."; "service.sections.vpn_resolves_hostname.footer" = "Bevorzugt in den meisten Netzwerken und benötigt in manchen IPv6 Netzwerken. Deaktivieren wo DNS geblockt ist oder um die Aushandlung zu beschleunigen bei langsam antwortenden DNS."; @@ -126,11 +143,20 @@ "service.sections.diagnostics.header" = "Diagnose"; "service.sections.diagnostics.footer" = "Zensier-Status wird aktiv nach erneutem Verbinden. Netzwerk-Daten sind Hostnamen, IP-Adressen, Routingtabellen, SSID. Zugangsdaten und Private Keys werden nie gelogged."; "service.cells.use_profile.caption" = "Dieses Profil verwenden"; +"service.cells.vpn_service.caption" = "Aktiviert"; +"service.cells.vpn.turn_on.caption" = "Aktiviere VPN"; +"service.cells.vpn.turn_off.caption" = "Deaktiviere VPN"; "service.cells.connection_status.caption" = "Status"; +"service.cells.host.parameters.caption" = "Parameter"; "service.cells.provider.pool.caption" = "Ort"; "service.cells.provider.preset.caption" = "Voreinstellung"; +"service.cells.provider.refresh.caption" = "Infrastruktur neu laden"; +"service.cells.category.caption" = "Kategorie"; +"service.cells.addresses.caption" = "Adressen"; +"service.cells.only_shows_favorites.caption" = "Nur favorisierte Standorte anzeigen"; "service.cells.vpn_survives_sleep.caption" = "Verbindung aktiv halten trotz Schlafmodus"; "service.cells.vpn_resolves_hostname.caption" = "Server Hostname auflösen"; +"service.cells.trusted_add_wifi.caption" = "WLAN hinzufügen"; "service.cells.trusted_mobile.caption" = "Mobilfunknetz"; "service.cells.trusted_policy.caption" = "Vertrauen deaktiviert VPN"; "service.cells.test_connectivity.caption" = "Verbindung testen"; @@ -159,8 +185,17 @@ "service.alerts.download.message" = "%@ benötigt den Download von zusätzlichen Konfigurationsdateien.\n\nBestätige um mit dem Download zu beginnen."; "service.alerts.download.failed" = "Herunterladen der Konfigurationsdateien fehlgeschlagen. %@"; "service.alerts.download.hud.extracting" = "Extrahiere Dateien, bitte warten..."; +"service.alerts.location.message.denied" = "Sie müssen den Standortzugriff zulassen, um diesem Wi-Fi-Netzwerk vertrauen zu können. Gehen Sie zu den iOS-Einstellungen und überprüfen Sie Ihre Standortberechtigungen für Passepartout."; +"service.alerts.location.button.settings" = "Einstellungen"; + +"provider.pool.sections.empty_favorites.footer" = "Wische nach Links um einen Standort zu den Favoriten hinzuzufügen oder zu entfernen."; +"provider.pool.actions.favorite" = "Favorit hinzuzufügen"; +"provider.pool.actions.unfavorite" = "Favorit entfernen"; + +"provider.preset.cells.tech_details.caption" = "Technische Details"; "account.title" = "Account"; +"account.sections.credentials.header" = "Zugangsdaten"; "account.sections.guidance.footer.infrastructure.default.web" = "Benutze deine %@ Web-Zugangsdaten."; "account.sections.guidance.footer.infrastructure.default.specific" = "Verwenden Sie Ihre %@ service-Anmeldeinformationen, die von den Website-Anmeldeinformationen abweichen können."; "account.sections.guidance.footer.infrastructure.mullvad" = "Benutze deine %@ Web-Zugangsdaten. Dein Benutzername ist üblicherweise numerischt (ohne Zwischenraum)."; @@ -179,11 +214,20 @@ "account.cells.signup.caption" = "Registrieren bei %@"; "endpoint.title" = "Endpoint"; +"endpoint.sections.location_addresses.header" = "Adressen"; +"endpoint.sections.location_protocols.header" = "Protokolle"; +"endpoint.cells.address" = "Adresse"; +"endpoint.cells.protocol" = "Protokoll"; "endpoint.cells.any_address.caption" = "Automatisch"; "endpoint.cells.any_protocol.caption" = "Automatisch"; "network_settings.title" = "Netzwerk-Einstellungen"; +"network_settings.cells.add_dns_server.caption" = "Adresse hinzufügen"; +"network_settings.cells.add_dns_domain.caption" = "Domäne hinzufügen"; +"network_settings.cells.proxy_bypass.caption" = "Domäne umgehen"; +"network_settings.cells.add_proxy_bypass.caption" = "Zu umgehende Domäne hinzufügen"; +"configuration.title" = "Konfiguration"; "configuration.sections.communication.header" = "Kommunikation"; "configuration.sections.reset.footer" = "Wenn du nach einer Änderung der Kommunikations-Parameter dich nicht mehr verbinden kannst, hier tippen um zur originalen Konfiguration zurückzukehren."; "configuration.sections.tls.header" = "TLS"; @@ -212,11 +256,28 @@ "configuration.cells.renegotiation_seconds.caption" = "erneute Aushandlung"; "configuration.cells.renegotiation_seconds.value.after" = "nach %@"; "configuration.cells.random_endpoint.caption" = "Endpunkt zufällig wählen"; +"configuration.alerts.commit.message" = "Neue Parameter werden erst nach einer manuellen Wiederherstellung der Verbindung wirksam. Änderungen in vertrauenswürdigen Netzwerken werden sofort wirksam."; +"configuration.alerts.commit.buttons.reconnect" = "Jetzt erneut verbinden"; +"configuration.alerts.commit.buttons.skip" = "Überspringen"; + +"trusted.columns.trust.title" = "Vertrauen"; +"trusted.ethernet.title" = "Kabelverbindungen vertrauen"; +"trusted.ethernet.description" = "Hier ein Häkchen setzen, um jeder Kabelverbindung zu vertrauen."; + +"preferences.title" = "Einstellungen"; +"preferences.sections.general.header" = "Allgemein"; +"preferences.cells.launches_on_login.caption" = "Bei Anmeldung starten"; +"preferences.cells.launches_on_login.footer" = "Hier ein Häkchen setzen, um die App beim Systemstart oder der Anmeldung automatisch zu starten."; +"preferences.cells.confirm_quit.caption" = "Beenden bestätigen"; +"preferences.cells.confirm_quit.footer" = "Hier ein Häkchen setzen, um einen Hinweis zur Bestätigung des Beendens anzuzeigen."; "network_settings.gateway.title" = "Standard-Gateway"; "network_settings.dns.title" = "DNS"; +"network_settings.dns.cells.addresses.title" = "Server"; "network_settings.dns.cells.domain.caption" = "Domäne"; +"network_settings.dns.cells.domains.title" = "Domänen"; "network_settings.proxy.title" = "Proxy"; +"network_settings.proxy.cells.bypass_domains.title" = "Domänen umgehen"; "network_settings.mtu.title" = "MTU"; "network_settings.mtu.cells.bytes.caption" = "Bytes"; @@ -224,8 +285,10 @@ "debug_log.buttons.previous" = "Zurück"; "debug_log.buttons.next" = "Weiter"; +"debug_log.buttons.copy" = "Kopieren"; "debug_log.alerts.empty_log.message" = "Das Debug-Log ist leer."; +"shortcuts.add.title" = "Füge Kurzbefehl hinzu"; "shortcuts.add.sections.vpn.header" = "VPN"; "shortcuts.add.sections.wifi.header" = "WLAN"; "shortcuts.add.sections.cellular.header" = "Mobilfunknetz"; @@ -238,7 +301,9 @@ "shortcuts.add.cells.untrust_cellular.caption" = "Misstraue Mobilfunknetz"; "shortcuts.add.alerts.no_profiles.message" = "Es gibt kein Profil mit dem eine Verbindung hergestellt werden kann."; +"shortcuts.edit.title" = "Kurzbefehle bearbeiten"; "shortcuts.edit.sections.all.header" = "Existierende Kurzbefehle"; +"shortcuts.edit.cells.add_shortcut.caption" = "Kurzbefehl hinzufügen"; "purchase.title" = "Kaufen"; "purchase.sections.products.footer" = "Jedes Produkt ist ein einmaliger Kauf. Der Kauf eines Providers beinhaltet kein VPN-Abonnement."; @@ -275,3 +340,20 @@ "credits.sections.translations.header" = "Übersetzungen"; "label.license.error" = "Konnte vollständigen Lizenz-Inhalt nicht herunterladen."; + +// iOS only + +"imported_hosts.title" = "Importierte Hosts"; + +// macOS only + +"menu.show.title" = "Anzeigen"; +"menu.switch_profile.title" = "Aktives Profil"; +"menu.active_profile.title.none" = "Keine aktiven Profile"; +"menu.active_profile.items.customize.title" = "Anpassen..."; +"menu.active_profile.messages.missing_credentials" = "Es wurde keine Konto konfiguriert"; +"menu.organizer.title" = "Organizer"; +"menu.preferences.title" = "Einstellungen"; +"menu.support.title" = "Support"; +"menu.quit.title" = "%@ beenden"; +"menu.quit.messages.confirm" = "Wenn das VPN aktiviert wurde, läuft es weiter im Hintergrund. Möchtest du beenden?"; diff --git a/Passepartout/Core/Resources/el.lproj/Core.strings b/Passepartout/Core/Resources/el.lproj/Core.strings index ecebd089..c274ac09 100644 --- a/Passepartout/Core/Resources/el.lproj/Core.strings +++ b/Passepartout/Core/Resources/el.lproj/Core.strings @@ -53,6 +53,7 @@ "vpn.disconnecting" = "Αποσυνδέετε"; "vpn.inactive" = "Μη ενεργό"; "vpn.disabled" = "Απενεργοποιημένο"; +"vpn.unused" = "Ανενεργό"; "vpn.errors.timeout" = "Τέλος χρονικού Ορίου"; "vpn.errors.dns" = "Το DNS απέτυχε"; @@ -87,6 +88,11 @@ // //////////////////// +"organizer.title" = "%@"; +"organizer.menus.provider" = "Πάροχος"; +"organizer.menus.provider.unavailable" = "Δεν απομένουν πάροχοι"; +"organizer.menus.host" = "Εξυπηρετητής"; +/* //////////////////// */ "organizer.sections.twitch.header" = "Twitch"; "organizer.sections.twitch.footer" = "Ελάτε να με παρακολουθήσετε ζωντανά το Passepartout στο Twitch, εγγραφείτε στη συνομιλία για να αλληλεπιδράσετε και να συνεισφέρετε!"; "organizer.sections.providers.header" = "Πάροχοι"; @@ -107,17 +113,28 @@ "organizer.cells.translate.caption" = "Βοηθήστε στη μετάφραση"; "organizer.cells.about.caption" = "Σχετικά με %@"; "organizer.cells.uninstall.caption" = "Αφαίρεση ρύθμισης VPN"; +"organizer.cells.add_provider.caption" = "Προσθήκη νέου παρόχου"; +"organizer.cells.add_host.caption" = "Προσθήκη από αρχεία"; +"organizer.cells.import_host.caption" = "Προσθήκη από εισαγωγή"; "organizer.alerts.exhausted_providers.message" = "Έχετε δημιουργήσει προφίλ για οποιονδήποτε διαθέσιμο πάροχο."; "organizer.alerts.add_host.message" = "Εισάγετε μια διεύθυνση από ένα αρχείο .ovpn στο Safari, το Mail ή άλλη εφαρμογή για να ρυθμίσετε ένα προφίλ διακομιστή.\n\nΜπορείτε επίσης να εισάγετε ένα .ovpn αρχείο από το iTunes File Sharing."; "organizer.alerts.cannot_donate.message" = "Δεν έχει ρυθμιστεί καμία μέθοδος πληρωμής σε αυτήν τη συσκευή."; "organizer.alerts.delete_vpn_profile.message" = "Θέλετε πραγματικά να διαγράψετε τη διαμόρφωση VPN από τις ρυθμίσεις της συσκευής σας; Αυτό μπορεί να διορθώσει κάποιες καταστραμμένες καταστάσεις VPN και δεν θα επηρεάσει τα προφίλ του παροχέα και του διακομιστή σας."; +"organizer.alerts.remove_profile.title" = "Κατάργηση προφίλ"; +"organizer.alerts.remove_profile.message" = "Είστε βέβαιοι ότι θέλετε να διαγράψετε το προφίλ %@;"; +"organizer.alerts.open_host_file.title" = "Επιλέξτε ένα αρχείο .ovpn"; "wizards.provider.cells.update_list.caption" = "Αναβάθμιση Λίστας"; "wizards.provider.alerts.unavailable.message" = "Δεν ήταν δυνατή η λήψη της υποδομής του παρόχου, δοκιμάστε ξανά αργότερα."; +"wizards.host.sections.existing.header" = "Υπάρχον Προφίλ"; +"wizards.host.cells.title_input.caption" = "Τίτλος"; "wizards.host.alerts.existing.message" = "Ένα προφίλ διακομιστή με τον ίδιο τίτλο υπάρχει ήδη. Αντικατέστησέ το;"; "service.welcome.message" = "Καλώς Ήλθατε στο Passepartout!\n\nΧρησιμοποιήστε τον διοργανωτή για να προσθέσετε ένα νέο προφίλ."; +"service.sections.vpn.header" = "VPN"; "service.sections.vpn.footer" = "Η σύνδεση θα πραγματοποιηθεί όποτε είναι απαραίτητο."; +"service.sections.status.header" = "Σύνδεση"; +"service.sections.configuration.header" = "Ρύθμιση"; "service.sections.provider_infrastructure.footer" = "Τελευταία ενημέρωση στις %@."; "service.sections.vpn_survives_sleep.footer" = "Απενεργοποιήστε για να βελτιώσετε τη χρήση της μπαταρίας, εις βάρος των περιστασιακών επιβραδύνσεων που οφείλονται σε επανασύνδεση αφύπνισης."; "service.sections.vpn_resolves_hostname.footer" = "Προτιμάται στα περισσότερα δίκτυα και απαιτείται σε ορισμένα δίκτυα IPv6. Απενεργοποιήστε το εκεί που μπλοκάρεται το DNS ή για να επιταχύνετε τη επικοινωνία όταν το DNS είναι αργό για να ανταποκριθεί."; @@ -126,11 +143,20 @@ "service.sections.diagnostics.header" = "Διαγνωστικά"; "service.sections.diagnostics.footer" = "Η κατάσταση κάλυψης θα είναι αποτελεσματική μετά την επανασύνδεση. Τα δεδομένα δικτύου είναι του διακομιστή, διευθύνσεις IP, δρομολόγηση και SSID. Τα διαπιστευτήρια και τα ιδιωτικά κλειδιά δεν καταγράφονται ανεξάρτητα."; "service.cells.use_profile.caption" = "Χρησιμοποιήστε αυτό το προφίλ"; +"service.cells.vpn_service.caption" = "Ενεργοποιήθηκε"; +"service.cells.vpn.turn_on.caption" = "Ενεργοποίηση VPN"; +"service.cells.vpn.turn_off.caption" = "Απενεργοποίηση VPN"; "service.cells.connection_status.caption" = "Κατάσταση"; +"service.cells.host.parameters.caption" = "Παράμετροι"; "service.cells.provider.pool.caption" = "Τοποθεσία"; "service.cells.provider.preset.caption" = "Προεπιλογή"; +"service.cells.provider.refresh.caption" = "Ανανέωση της υποδομής"; +"service.cells.category.caption" = "Κατηγορία"; +"service.cells.addresses.caption" = "Διευθύνσεις"; +"service.cells.only_shows_favorites.caption" = "Προβολή αγαπημένων τοποθεσιών μόνο"; "service.cells.vpn_survives_sleep.caption" = "Κρατήστε ζωντανό στον ύπνο"; "service.cells.vpn_resolves_hostname.caption" = "Επίλυση του ονόματος σέρβερ διακομιστή"; +"service.cells.trusted_add_wifi.caption" = "Προσθέστε Wi-Fi"; "service.cells.trusted_mobile.caption" = "Δίκτυο Κινητής"; "service.cells.trusted_policy.caption" = "Τα αξιόπιστα δίκτυα απενεργοποιούν το VPN"; "service.cells.test_connectivity.caption" = "Δοκιμή συνδεσιμότητας"; @@ -159,8 +185,17 @@ "service.alerts.download.message" = "%@ απαιτεί τη λήψη πρόσθετων αρχείων ρυθμίσεων.\n\nΕπιβεβαιώστε για να ξεκινήσετε τη λήψη."; "service.alerts.download.failed" = "Αποτυχία λήψης αρχείων ρυθμίσεων. %@"; "service.alerts.download.hud.extracting" = "Εξάγοντας τα αρχεία, παρακαλώ να είστε υπομονετικοί..."; +"service.alerts.location.message.denied" = "Πρέπει να επιτρέψετε τη πρόσβαση τοποθεσίας για να εμπιστευτείτε το Wi-Fi δίκτυο. Μεταβείτε στις ρυθμίσεις του iOS και επιθεωρείστε τις ρυθμίσεις για το Passepartout."; +"service.alerts.location.button.settings" = "Ρυθμίσεις"; + +"provider.pool.sections.empty_favorites.footer" = "Σείρετε αριστερά για να προσθέσετε ή να αφαιρέσεται από τα αγαπημένα."; +"provider.pool.actions.favorite" = "Αγαπημένο"; +"provider.pool.actions.unfavorite" = "Δεν προτιμάται"; + +"provider.preset.cells.tech_details.caption" = "Τεχνικές Λεπτομέρειες"; "account.title" = "Λογαριασμός"; +"account.sections.credentials.header" = "Διαπιστευτήρια"; "account.sections.guidance.footer.infrastructure.default.web" = "Χρησιμοποιήστε τα διαπιστευτήρια ιστοτόπου %@."; "account.sections.guidance.footer.infrastructure.default.specific" = "Χρησιμοποιήστε τα διαπιστευτήρια της υπηρεσίας %@, τα οποία ενδέχεται να διαφέρουν από τα διαπιστευτήρια του ιστότοπου."; "account.sections.guidance.footer.infrastructure.mullvad" = "Χρησιμοποιήστε τα διαπιστευτήρια ιστοτόπου %@. Το όνομα χρήστη είναι συνήθως αριθμητικό (χωρίς διαστήματα)."; @@ -179,11 +214,20 @@ "account.cells.signup.caption" = "Εγγραφείτε με %@"; "endpoint.title" = "Τελικό σημείο"; +"endpoint.sections.location_addresses.header" = "Διεθύνσεις"; +"endpoint.sections.location_protocols.header" = "Πρωτόκολλα"; +"endpoint.cells.address" = "Διεύθυνση"; +"endpoint.cells.protocol" = "Πρωτόκολλο"; "endpoint.cells.any_address.caption" = "Αυτόματο"; "endpoint.cells.any_protocol.caption" = "Αυτόματο"; "network_settings.title" = "Ρυθμίσεις Δικτύου"; +"network_settings.cells.add_dns_server.caption" = "Προσθήκη Διεύθυνσης"; +"network_settings.cells.add_dns_domain.caption" = "Προσθήκη τομέα αναζήτησης"; +"network_settings.cells.proxy_bypass.caption" = "Παράκαμψη Τομέα"; +"network_settings.cells.add_proxy_bypass.caption" = "Προσθήκη τομέα παράκαμψης"; +"configuration.title" = "Ρύθμιση"; "configuration.sections.communication.header" = "Επικοινωνία"; "configuration.sections.reset.footer" = "Αν καταλήξατε σε κατεστραμένη συνδεσιμότητα μετά την αλλαγή των παραμέτρων επικοινωνίας, πατήστε για να επανέλθετε στην αρχική διαμόρφωση."; "configuration.sections.tls.header" = "TLS"; @@ -212,11 +256,28 @@ "configuration.cells.renegotiation_seconds.caption" = "Επαναδιαπραγμάτευση"; "configuration.cells.renegotiation_seconds.value.after" = "μετά από %@"; "configuration.cells.random_endpoint.caption" = "Τυχαίο τελικό σημείο"; +"configuration.alerts.commit.message" = "Οι νέες παράμετροι δεν θα είναι αποτελεσματικές έως ότου επανασυνδεθείτε χειροκίνητα. Οι αλλαγές στα αξιόπιστα δίκτυα θα εφαρμοστούν αμέσως."; +"configuration.alerts.commit.buttons.reconnect" = "Επανασυνδεθείτε τώρα"; +"configuration.alerts.commit.buttons.skip" = "Παράλειψη"; + +"trusted.columns.trust.title" = "Εμπιστευθείτε"; +"trusted.ethernet.title" = "Εμπιστευθείτε τις ενσύρματες συνδέσεις"; +"trusted.ethernet.description" = "Επιλέξτε για να εμπιστευθείτε οποιαδήποτε ενσύρματη σύνδεση καλωδίου."; + +"preferences.title" = "Προτιμήσεις"; +"preferences.sections.general.header" = "Γενικός"; +"preferences.cells.launches_on_login.caption" = "Εκκίνηση κατά τη σύνδεση"; +"preferences.cells.launches_on_login.footer" = "Επιλέξτε για αυτόματη εκκίνηση της εφαρμογής κατά την εκκίνηση ή τη σύνδεση."; +"preferences.cells.confirm_quit.caption" = "Επιβεβαίωση διακοπής"; +"preferences.cells.confirm_quit.footer" = "Επιλέξτε για παρουσίαση ειδοποίησης ότι επιβεβαιώνεται η διακοπή."; "network_settings.gateway.title" = "Προεπιλεγμένη πύλη"; "network_settings.dns.title" = "DNS"; +"network_settings.dns.cells.addresses.title" = "Διακομιστές"; "network_settings.dns.cells.domain.caption" = "Domain"; +"network_settings.dns.cells.domains.title" = "Τομείς"; "network_settings.proxy.title" = "Proxy"; +"network_settings.proxy.cells.bypass_domains.title" = "Παράκαμψη τομέων"; "network_settings.mtu.title" = "MTU"; "network_settings.mtu.cells.bytes.caption" = "Bytes"; @@ -224,8 +285,10 @@ "debug_log.buttons.previous" = "Προηγούμενο"; "debug_log.buttons.next" = "Επόμενο"; +"debug_log.buttons.copy" = "Αντιγραφή"; "debug_log.alerts.empty_log.message" = "Το αρχείο εντοπισμού σφαλμάτων είναι κενό."; +"shortcuts.add.title" = "Προσθήκη Συντόμευσης"; "shortcuts.add.sections.vpn.header" = "VPN"; "shortcuts.add.sections.wifi.header" = "Wi-Fi"; "shortcuts.add.sections.cellular.header" = "Δίκτυο Κινητής"; @@ -238,7 +301,9 @@ "shortcuts.add.cells.untrust_cellular.caption" = "Μην εμπιστευθείτε το δίκτυο κινητής τηλεφωνίας"; "shortcuts.add.alerts.no_profiles.message" = "Δεν υπάρχει προφίλ για σύνδεση."; +"shortcuts.edit.title" = "Διαχείριση συντομεύσεων"; "shortcuts.edit.sections.all.header" = "Υπάρχουσες συντομεύσεις"; +"shortcuts.edit.cells.add_shortcut.caption" = "Προσθήκη Συντόμευσης"; "purchase.title" = "Αγορά"; "purchase.sections.products.footer" = "Κάθε προϊόν είναι μια αγορά. Οι αγορές παρόχων δεν περιλαμβάνουν τη συνδρομή VPN."; @@ -275,3 +340,20 @@ "credits.sections.translations.header" = "Μεταφράσεις"; "label.license.error" = "Δεν είναι δυνατή η λήψη πλήρους περιεχομένου άδειας χρήσης."; + +// iOS only + +"imported_hosts.title" = "Εισαγόμενοι διακομιστές"; + +// macOS only + +"menu.show.title" = "Προβολή"; +"menu.switch_profile.title" = "Ενεργό προφίλ"; +"menu.active_profile.title.none" = "Δεν υπάρχει ενεργό προφίλ"; +"menu.active_profile.items.customize.title" = "Προσαρμογή..."; +"menu.active_profile.messages.missing_credentials" = "Δεν έχει διαμορφωθεί λογαριασμός"; +"menu.organizer.title" = "Διοργανωτής"; +"menu.preferences.title" = "Προτιμήσεις"; +"menu.support.title" = "Υποστήριξη"; +"menu.quit.title" = "Διακοπή %@"; +"menu.quit.messages.confirm" = "Το VPN, αν είναι ενεργοποιημένο, θα εξακολουθεί να εκτελείται στο παρασκήνιο. Θέλετε να το διακόψετε;"; diff --git a/Passepartout/Core/Resources/en.lproj/Core.strings b/Passepartout/Core/Resources/en.lproj/Core.strings index 97e28227..2eb6a862 100644 --- a/Passepartout/Core/Resources/en.lproj/Core.strings +++ b/Passepartout/Core/Resources/en.lproj/Core.strings @@ -92,6 +92,7 @@ "organizer.menus.provider" = "Provider"; "organizer.menus.provider.unavailable" = "No providers left"; "organizer.menus.host" = "Host"; +/* //////////////////// */ "organizer.sections.twitch.header" = "Twitch"; "organizer.sections.twitch.footer" = "Come watch me make Passepartout live on Twitch, join the chat to interact and contribute!"; "organizer.sections.providers.header" = "Providers"; diff --git a/Passepartout/Core/Resources/es.lproj/Core.strings b/Passepartout/Core/Resources/es.lproj/Core.strings index 799eb23c..5cbdc587 100644 --- a/Passepartout/Core/Resources/es.lproj/Core.strings +++ b/Passepartout/Core/Resources/es.lproj/Core.strings @@ -53,6 +53,7 @@ "vpn.disconnecting" = "Desconectando"; "vpn.inactive" = "Inactivo"; "vpn.disabled" = "Deshabilitado"; +"vpn.unused" = "Desactivada"; "vpn.errors.timeout" = "Timeout"; "vpn.errors.dns" = "DNS fallido"; @@ -87,6 +88,11 @@ // //////////////////// +"organizer.title" = "%@"; +"organizer.menus.provider" = "Proveedor"; +"organizer.menus.provider.unavailable" = "No quedan proveedores"; +"organizer.menus.host" = "Host"; +/* //////////////////// */ "organizer.sections.twitch.header" = "Twitch"; "organizer.sections.twitch.footer" = "¡Ven a ver cómo hago Passepartout en vivo en Twitch, únete al chat para interactuar y contribuir!"; "organizer.sections.providers.header" = "Proveedores"; @@ -107,17 +113,28 @@ "organizer.cells.translate.caption" = "Ofrecer una traducción"; "organizer.cells.about.caption" = "Sobre %@"; "organizer.cells.uninstall.caption" = "Borrar configuración VPN"; +"organizer.cells.add_provider.caption" = "Añadir proveedor"; +"organizer.cells.add_host.caption" = "Añadir desde Ficheros"; +"organizer.cells.import_host.caption" = "Añadir desde importados"; "organizer.alerts.exhausted_providers.message" = "Has creado perfiles para todos los proveedores disponibles."; "organizer.alerts.add_host.message" = "Abre el URL de un fichero de configuración .ovpn a través de Safari, Mail u otra aplicación para configurar un host.\n\nTambién puedes importar un .ovpn con iTunes File Sharing."; "organizer.alerts.cannot_donate.message" = "No hay métodos de pago configurados en este dispositivo."; "organizer.alerts.delete_vpn_profile.message" = "Realmente quieres eliminar la configuración VPN de tu dispositivo? Ésto puede corregir algunos estados incorrectos del VPN y no afectará tus perfiles."; +"organizer.alerts.remove_profile.title" = "Quitar perfil"; +"organizer.alerts.remove_profile.message" = "¿Seguro que deseas eliminar el perfil %@?"; +"organizer.alerts.open_host_file.title" = "Selecciona un archivo .ovpn"; "wizards.provider.cells.update_list.caption" = "Actualizar lista"; "wizards.provider.alerts.unavailable.message" = "No fue posible bajar la infraestructura del proveedor, por favor reinténtalo más tarde."; +"wizards.host.sections.existing.header" = "Perfiles existentes"; +"wizards.host.cells.title_input.caption" = "Título"; "wizards.host.alerts.existing.message" = "Ya existe un host con el mismo título. Reemplazar?"; "service.welcome.message" = "Bienvenid@ a Passepartout!\n\nUsa el organizador para añadir un nuevo perfil."; +"service.sections.vpn.header" = "VPN"; "service.sections.vpn.footer" = "La conexión se establecerá siempre y cuando sea necesario."; +"service.sections.status.header" = "Conexión"; +"service.sections.configuration.header" = "Configuración"; "service.sections.provider_infrastructure.footer" = "Última actualización: %@."; "service.sections.vpn_survives_sleep.footer" = "Deshabilitar para mejorar el uso de la batería, a costa de ralentizaciones ocasionales por las reconexiones al despertar el dispositivo."; "service.sections.vpn_resolves_hostname.footer" = "Preferido en la mayoría de las redes y necesario en algunas redes IPv6. Deshabilitar donde el DNS esté bloqueado, o para acelerar la negociación cuando el DNS sea lento en responder."; @@ -126,11 +143,20 @@ "service.sections.diagnostics.header" = "Diagnósticos"; "service.sections.diagnostics.footer" = "El estado de ocultación será efectivo tras reconectar. Los datos de red son hostnames, direcciones IP, routing, SSID. Las credenciales y las claves privadas no son registrados a pesar."; "service.cells.use_profile.caption" = "Usar este perfil"; +"service.cells.vpn_service.caption" = "Habilitado"; +"service.cells.vpn.turn_on.caption" = "Habilitar VPN"; +"service.cells.vpn.turn_off.caption" = "Deshabilitar VPN"; "service.cells.connection_status.caption" = "Estado"; +"service.cells.host.parameters.caption" = "Parámetros"; "service.cells.provider.pool.caption" = "Ubicación"; "service.cells.provider.preset.caption" = "Ajuste"; +"service.cells.provider.refresh.caption" = "Refrescar infraestructura"; +"service.cells.category.caption" = "Categoría"; +"service.cells.addresses.caption" = "Direcciones"; +"service.cells.only_shows_favorites.caption" = "Mostrar solo ubicaciones favoritas"; "service.cells.vpn_survives_sleep.caption" = "Mantener en modo inactivo"; "service.cells.vpn_resolves_hostname.caption" = "Resolver hostname del servidor"; +"service.cells.trusted_add_wifi.caption" = "Añadir Wi-Fi"; "service.cells.trusted_mobile.caption" = "Red móvil"; "service.cells.trusted_policy.caption" = "Red de confianza deshabilita el VPN"; "service.cells.test_connectivity.caption" = "Testear conectividad"; @@ -159,8 +185,17 @@ "service.alerts.download.message" = "%@ requiere la descarga de fichero de configuración adicionales.\n\nConfirmar para empezar la descarga."; "service.alerts.download.failed" = "Imposible descargar los ficheros de configuración. %@"; "service.alerts.download.hud.extracting" = "Extrayendo ficheros, por favor ten paciencia..."; +"service.alerts.location.message.denied" = "Debes dar acceso a tu posición para añadir esta red Wi-Fi a las redes de confianza. Mira los ajustes iOS y revisa los permisos de posición para Passepartout."; +"service.alerts.location.button.settings" = "Ajustes"; + +"provider.pool.sections.empty_favorites.footer" = "Desliza a la izquierda de una ubicación para agregarla o quitarla de los Favoritos."; +"provider.pool.actions.favorite" = "Favorita"; +"provider.pool.actions.unfavorite" = "No favorita"; + +"provider.preset.cells.tech_details.caption" = "Detalles técnicos"; "account.title" = "Cuenta"; +"account.sections.credentials.header" = "Credenciales"; "account.sections.guidance.footer.infrastructure.default.web" = "Usa tus credenciales de la web %@."; "account.sections.guidance.footer.infrastructure.default.specific" = "Usa tus credenciales de servicio %@, que pueden diferir de las credenciales de la web."; "account.sections.guidance.footer.infrastructure.mullvad" = "Usa tus credenciales de la web %@. Normalmente tu usuario es numérico (sin espacios)."; @@ -179,11 +214,20 @@ "account.cells.signup.caption" = "Registrarse con %@"; "endpoint.title" = "Destino"; +"endpoint.sections.location_addresses.header" = "Direcciones"; +"endpoint.sections.location_protocols.header" = "Protocolos"; +"endpoint.cells.address" = "Dirección"; +"endpoint.cells.protocol" = "Protocolo"; "endpoint.cells.any_address.caption" = "Automática"; "endpoint.cells.any_protocol.caption" = "Automático"; "network_settings.title" = "Ajustes de red"; +"network_settings.cells.add_dns_server.caption" = "Añadir dirección"; +"network_settings.cells.add_dns_domain.caption" = "Añadir dominio"; +"network_settings.cells.proxy_bypass.caption" = "Dominio ignorado"; +"network_settings.cells.add_proxy_bypass.caption" = "Añadir dominio ignorado"; +"configuration.title" = "Configuración"; "configuration.sections.communication.header" = "Comunicación"; "configuration.sections.reset.footer" = "Si acabaste estropeando tu conectividad tras cambiar los parámetros de comunicación, pulsa para volver a la configuración inicial."; "configuration.sections.tls.header" = "TLS"; @@ -212,11 +256,28 @@ "configuration.cells.renegotiation_seconds.caption" = "Renegociación"; "configuration.cells.renegotiation_seconds.value.after" = "después de %@"; "configuration.cells.random_endpoint.caption" = "Aleatorizar destino"; +"configuration.alerts.commit.message" = "Los nuevos parámetros no serán efectivos hasta que te reconectes manualmente. Los cambios en las redes de confianza se aplicarán de inmediato."; +"configuration.alerts.commit.buttons.reconnect" = "Reconectar ahora"; +"configuration.alerts.commit.buttons.skip" = "Omitir"; + +"trusted.columns.trust.title" = "Confianza"; +"trusted.ethernet.title" = "Confiar en conexiones cableadas"; +"trusted.ethernet.description" = "Activa esta opción para confiar en cualquier conexión cableada."; + +"preferences.title" = "Preferencias"; +"preferences.sections.general.header" = "General"; +"preferences.cells.launches_on_login.caption" = "Iniciar al iniciar sesión"; +"preferences.cells.launches_on_login.footer" = "Activa esta opción para que la aplicación se inicie automáticamente al iniciar o al iniciar sesión."; +"preferences.cells.confirm_quit.caption" = "Confirmar salir"; +"preferences.cells.confirm_quit.footer" = "Activa esta opción para que se muestre una alerta de confirmación al salir."; "network_settings.gateway.title" = "Puerta de enlace"; "network_settings.dns.title" = "DNS"; +"network_settings.dns.cells.addresses.title" = "Servidores"; "network_settings.dns.cells.domain.caption" = "Dominio"; +"network_settings.dns.cells.domains.title" = "Dominios"; "network_settings.proxy.title" = "Proxy"; +"network_settings.proxy.cells.bypass_domains.title" = "Dominios ignorados"; "network_settings.mtu.title" = "MTU"; "network_settings.mtu.cells.bytes.caption" = "Bytes"; @@ -224,8 +285,10 @@ "debug_log.buttons.previous" = "Anterior"; "debug_log.buttons.next" = "Siguiente"; +"debug_log.buttons.copy" = "Copiar"; "debug_log.alerts.empty_log.message" = "El registro de debug está vacío."; +"shortcuts.add.title" = "Añadir atajo"; "shortcuts.add.sections.vpn.header" = "VPN"; "shortcuts.add.sections.wifi.header" = "Wi-Fi"; "shortcuts.add.sections.cellular.header" = "Móvil"; @@ -238,7 +301,9 @@ "shortcuts.add.cells.untrust_cellular.caption" = "Borrar red móvil de confianza"; "shortcuts.add.alerts.no_profiles.message" = "No hay ningún perfil al que conectarse."; +"shortcuts.edit.title" = "Gestionar atajos"; "shortcuts.edit.sections.all.header" = "Atajos existentes"; +"shortcuts.edit.cells.add_shortcut.caption" = "Añadir atajo"; "purchase.title" = "Comprar"; "purchase.sections.products.footer" = "Cada producto es una compra única y no recurrente. La compra de un proveedor no incluye una suscripción al servicio."; @@ -275,3 +340,20 @@ "credits.sections.translations.header" = "Traducciones"; "label.license.error" = "Imposible descargar el contenido completo de la licencia."; + +// iOS only + +"imported_hosts.title" = "Hosts importados"; + +// macOS only + +"menu.show.title" = "Mostrar"; +"menu.switch_profile.title" = "Perfil activo"; +"menu.active_profile.title.none" = "Ningún perfil activo"; +"menu.active_profile.items.customize.title" = "Personalizar..."; +"menu.active_profile.messages.missing_credentials" = "Ninguna cuenta configurada"; +"menu.organizer.title" = "Organizador"; +"menu.preferences.title" = "Preferencias"; +"menu.support.title" = "Soporte"; +"menu.quit.title" = "Salir de %@"; +"menu.quit.messages.confirm" = "Si la VPN está habilitada, seguirá funcionando en segundo plano. ¿Deseas salir?"; diff --git a/Passepartout/Core/Resources/fr.lproj/Core.strings b/Passepartout/Core/Resources/fr.lproj/Core.strings index 1c8e98ff..3e1943a2 100644 --- a/Passepartout/Core/Resources/fr.lproj/Core.strings +++ b/Passepartout/Core/Resources/fr.lproj/Core.strings @@ -53,6 +53,7 @@ "vpn.disconnecting" = "Déconnection..."; "vpn.inactive" = "Inactif"; "vpn.disabled" = "Désactivé"; +"vpn.unused" = "Désactivé"; "vpn.errors.timeout" = "Délais dépassé"; "vpn.errors.dns" = "Échec DNS"; @@ -87,6 +88,11 @@ // //////////////////// +"organizer.title" = "%@"; +"organizer.menus.provider" = "Fournisseur"; +"organizer.menus.provider.unavailable" = "Aucun fournisseur restant"; +"organizer.menus.host" = "Hôte"; +/* //////////////////// */ "organizer.sections.twitch.header" = "Twitch"; "organizer.sections.twitch.footer" = "Venez me regarder faire passer Passepartout en direct sur Twitch, rejoignez le chat pour interagir et contribuer!"; "organizer.sections.providers.header" = "Fournisseurs"; @@ -107,17 +113,28 @@ "organizer.cells.translate.caption" = "Offre de traduction"; "organizer.cells.about.caption" = "À propos %@"; "organizer.cells.uninstall.caption" = "Supprimer la configuration VPN"; +"organizer.cells.add_provider.caption" = "Ajouter un nouveau fournisseur"; +"organizer.cells.add_host.caption" = "Ajouter de Fichiers"; +"organizer.cells.import_host.caption" = "Ajouter depuis importé"; "organizer.alerts.exhausted_providers.message" = "Vous avez créé un profile pour un fournisseur existant."; "organizer.alerts.add_host.message" = "Ouvrir un URL vers un fichier de configuration .ovpn depuis Safari, Courriels ou un autre app pour installer un profile hôte.\n\nVous pouvez importer une configuration .ovpn avec le transfert de fichiers iTunes."; "organizer.alerts.cannot_donate.message" = "Il n'y a aucune méthode de paiement configuré sur cet appareil."; "organizer.alerts.delete_vpn_profile.message" = "Voulez-vous vraiment effacer la configuration VPN de vos paramètres? Ceci peux fixer certains VPN en arrêt et n'affectera pas vos profiles de fournisseurs et hôtes."; +"organizer.alerts.remove_profile.title" = "Supprimer le profil"; +"organizer.alerts.remove_profile.message" = "Voulez-vous vraiment supprimer le profil %@ ?"; +"organizer.alerts.open_host_file.title" = "Sélectionnez un fichier .ovpn"; "wizards.provider.cells.update_list.caption" = "Actualiser la liste"; "wizards.provider.alerts.unavailable.message" = "Impossible de télécharger l'infrastructure du fournisseur, veuillez réessayer plus tard."; +"wizards.host.sections.existing.header" = "Profiles existants"; +"wizards.host.cells.title_input.caption" = "Titre"; "wizards.host.alerts.existing.message" = "Un profile hôte avec ce même nom existe déjà. Le remplacer?"; "service.welcome.message" = "Bienvenue à Passepartout!\n\nUtilisez l'organiseur pour ajouter un nouveau profile."; +"service.sections.vpn.header" = "VPN"; "service.sections.vpn.footer" = "La connection sera établie lorsque nécessaire."; +"service.sections.status.header" = "Connection"; +"service.sections.configuration.header" = "Configuration"; "service.sections.provider_infrastructure.footer" = "Mis à jour : %@."; "service.sections.vpn_survives_sleep.footer" = "Désactiver pour augmenter l'autonomie de la batterie, au dépends de la rapidité au réveil pour la reconnection."; "service.sections.vpn_resolves_hostname.footer" = "Préféré dans la plus part des réseaux et requis dans certains réseaux IPv6. Désactiver lorsque le DNS est bloqué ou pour augmenter la rapidité des négociations lorsque le DNS est lent à répondre."; @@ -126,11 +143,20 @@ "service.sections.diagnostics.header" = "Diagnostiques"; "service.sections.diagnostics.footer" = "Camouflage du status sera effectif après la reconnection. Les données réseaux sont les noms d'hôtes, adresses IP, routage, SSID. Les identifiants et clés privés ne sont pas enregistrés."; "service.cells.use_profile.caption" = "Utiliser ce profile"; +"service.cells.vpn_service.caption" = "Activer"; +"service.cells.vpn.turn_on.caption" = "Activer VPN"; +"service.cells.vpn.turn_off.caption" = "Désactiver VPN"; "service.cells.connection_status.caption" = "Statut"; +"service.cells.host.parameters.caption" = "Paramètres"; "service.cells.provider.pool.caption" = "Locallisation"; "service.cells.provider.preset.caption" = "Préréglage"; +"service.cells.provider.refresh.caption" = "Rafraîchir l'infrastructure"; +"service.cells.category.caption" = "Catégorie"; +"service.cells.addresses.caption" = "Adresses"; +"service.cells.only_shows_favorites.caption" = "Afficher uniquement les emplacements favoris"; "service.cells.vpn_survives_sleep.caption" = "Garder actif lors de la veille"; "service.cells.vpn_resolves_hostname.caption" = "Résoudre le nom d'hôte du serveur"; +"service.cells.trusted_add_wifi.caption" = "Ajouter Wi-Fi"; "service.cells.trusted_mobile.caption" = "Réseau cellulaire"; "service.cells.trusted_policy.caption" = "La confiance désactive le VPN"; "service.cells.test_connectivity.caption" = "Tester la connection"; @@ -159,8 +185,17 @@ "service.alerts.download.message" = "%@ requiert le téléchargement de fichiers de configuration supplémentaires.\n\nConfirmer le début du téléchargement."; "service.alerts.download.failed" = "Échec de téléchargement des fichiers de configuration. %@"; "service.alerts.download.hud.extracting" = "Extraction des fichiers, veuillez patienter..."; +"service.alerts.location.message.denied" = "Vous devez autoriser la localisation pour faire confiance à ce réseau WiFi. Acceptez les permissions de localisation pour Passepartout dans les réglages."; +"service.alerts.location.button.settings" = "Réglages"; + +"provider.pool.sections.empty_favorites.footer" = "Glissez vers la gauche d'un item pour l'ajouter ou le retirer des Favoris."; +"provider.pool.actions.favorite" = "Favoris"; +"provider.pool.actions.unfavorite" = "Retirer des Favoris"; + +"provider.preset.cells.tech_details.caption" = "Détails techniques"; "account.title" = "Compte"; +"account.sections.credentials.header" = "Indetifiants"; "account.sections.guidance.footer.infrastructure.default.web" = "Utilisez votre identifiants web de %@."; "account.sections.guidance.footer.infrastructure.default.specific" = "Utilisez vos informations d'identification de service %@, qui peuvent différer des informations d'identification du web."; "account.sections.guidance.footer.infrastructure.mullvad" = "Utilisez votre identifiants web de %@. Votre nom d'utilisateur est normalement numérique (sans espaces)."; @@ -179,11 +214,20 @@ "account.cells.signup.caption" = "S'inscrire avec %@"; "endpoint.title" = "Extrémité"; +"endpoint.sections.location_addresses.header" = "Adresses"; +"endpoint.sections.location_protocols.header" = "Protocols"; +"endpoint.cells.address" = "Adresse"; +"endpoint.cells.protocol" = "Protocole"; "endpoint.cells.any_address.caption" = "Automatique"; "endpoint.cells.any_protocol.caption" = "Automatique"; "network_settings.title" = "Paramètres réseaux"; +"network_settings.cells.add_dns_server.caption" = "Ajouter une adresse"; +"network_settings.cells.add_dns_domain.caption" = "Ajouter un domaine"; +"network_settings.cells.proxy_bypass.caption" = "Outrepasser le domaine"; +"network_settings.cells.add_proxy_bypass.caption" = "Ajouter outrepasser le domaine"; +"configuration.title" = "Configuration"; "configuration.sections.communication.header" = "Communications"; "configuration.sections.reset.footer" = "Si vous obtenez une connection erronnée après le changement des parameters de communication, tapotez pour revenir à la configuration initiale."; "configuration.sections.tls.header" = "TLS"; @@ -212,11 +256,28 @@ "configuration.cells.renegotiation_seconds.caption" = "Renégociation"; "configuration.cells.renegotiation_seconds.value.after" = "aprè %@"; "configuration.cells.random_endpoint.caption" = "Extrémité aléatoire"; +"configuration.alerts.commit.message" = "Vous devez vous reconnecter manuellement pour confirmer les nouveaux paramètres. Les modifications apportées sur les réseaux de confiance seront immédiatement mises en place."; +"configuration.alerts.commit.buttons.reconnect" = "Se reconnecter"; +"configuration.alerts.commit.buttons.skip" = "Passer"; + +"trusted.columns.trust.title" = "Fiables"; +"trusted.ethernet.title" = "Faire confiance aux connexions filaires"; +"trusted.ethernet.description" = "Cochez pour faire confiance à toutes les connexions filaires."; + +"preferences.title" = "Préférences"; +"preferences.sections.general.header" = "Général"; +"preferences.cells.launches_on_login.caption" = "Lancer au démarrage"; +"preferences.cells.launches_on_login.footer" = "Cochez pour lancer automatiquement l'application à la connexion ou au démarrage."; +"preferences.cells.confirm_quit.caption" = "Notification de sortie"; +"preferences.cells.confirm_quit.footer" = "Cochez pour recevoir une demande de confirmation lorsque vous quittez."; "network_settings.gateway.title" = "Gateway"; "network_settings.dns.title" = "DNS"; +"network_settings.dns.cells.addresses.title" = "Serveurs"; "network_settings.dns.cells.domain.caption" = "Domaine"; +"network_settings.dns.cells.domains.title" = "Domaines"; "network_settings.proxy.title" = "Proxy"; +"network_settings.proxy.cells.bypass_domains.title" = "Outrepasser le domaine"; "network_settings.mtu.title" = "MTU"; "network_settings.mtu.cells.bytes.caption" = "Bytes"; @@ -224,8 +285,10 @@ "debug_log.buttons.previous" = "Précédent"; "debug_log.buttons.next" = "Suivant"; +"debug_log.buttons.copy" = "Copier"; "debug_log.alerts.empty_log.message" = "Le journal de débogage est vide. "; +"shortcuts.add.title" = "Ajouter un raccourcis"; "shortcuts.add.sections.vpn.header" = "VPN"; "shortcuts.add.sections.wifi.header" = "Wi-Fi"; "shortcuts.add.sections.cellular.header" = "Cellulaire"; @@ -238,7 +301,9 @@ "shortcuts.add.cells.untrust_cellular.caption" = "Retirer le présent réseau cellulaire des réseaux de confiance."; "shortcuts.add.alerts.no_profiles.message" = "Il n'y a aucun profile pour se connecter."; +"shortcuts.edit.title" = "Gérer les raccourcis"; "shortcuts.edit.sections.all.header" = "Raccourcis existants"; +"shortcuts.edit.cells.add_shortcut.caption" = "Ajouter un raccourcis"; "purchase.title" = "Acheter"; "purchase.sections.products.footer" = "Chaque produit est un achat unique. Les achats n'incluent pas une souscription à un service de VPN."; @@ -275,3 +340,20 @@ "credits.sections.translations.header" = "Traductions"; "label.license.error" = "Impossible de télécharger le contenu complet de la license."; + +// iOS only + +"imported_hosts.title" = "Hôtes importés"; + +// macOS only + +"menu.show.title" = "Afficher"; +"menu.switch_profile.title" = "Profil actif"; +"menu.active_profile.title.none" = "Pas de profil actif"; +"menu.active_profile.items.customize.title" = "Personnaliser..."; +"menu.active_profile.messages.missing_credentials" = "Pas de compte configuré"; +"menu.organizer.title" = "Organisateur"; +"menu.preferences.title" = "Préférences"; +"menu.support.title" = "Assistance"; +"menu.quit.title" = "Quitter %@"; +"menu.quit.messages.confirm" = "S'il est activé, le VPN fonctionnera en tâche de fond. Voulez-vous quitter ?"; diff --git a/Passepartout/Core/Resources/it.lproj/Core.strings b/Passepartout/Core/Resources/it.lproj/Core.strings index 066e4f94..0515cd39 100644 --- a/Passepartout/Core/Resources/it.lproj/Core.strings +++ b/Passepartout/Core/Resources/it.lproj/Core.strings @@ -53,6 +53,7 @@ "vpn.disconnecting" = "Disconnettendo"; "vpn.inactive" = "Inattiva"; "vpn.disabled" = "Disabilitata"; +"vpn.unused" = "Spento"; "vpn.errors.timeout" = "Timeout"; "vpn.errors.dns" = "DNS fallito"; @@ -87,6 +88,11 @@ // //////////////////// +"organizer.title" = "%@"; +"organizer.menus.provider" = "Provider"; +"organizer.menus.provider.unavailable" = "Nessun altro provider disponibile"; +"organizer.menus.host" = "Host"; +/* //////////////////// */ "organizer.sections.twitch.header" = "Twitch"; "organizer.sections.twitch.footer" = "Vieni a vedermi creare Passepartout in diretta su Twitch, unisciti alla chat per interagire e contribuire!"; "organizer.sections.providers.header" = "Provider"; @@ -107,17 +113,28 @@ "organizer.cells.translate.caption" = "Offri una traduzione"; "organizer.cells.about.caption" = "Informazioni su %@"; "organizer.cells.uninstall.caption" = "Rimuovi configurazione VPN"; +"organizer.cells.add_provider.caption" = "Aggiungi provider"; +"organizer.cells.add_host.caption" = "Aggiungi da Files"; +"organizer.cells.import_host.caption" = "Aggiungi da importati"; "organizer.alerts.exhausted_providers.message" = "Hai creato profili per tutti i provider disponibili."; "organizer.alerts.add_host.message" = "Apri l'URL di un file di configurazione .ovpn da Safari, Mail o da un'altra app per configurare un host.\n\nPuoi anche importare un file .ovpn con iTunes File Sharing."; "organizer.alerts.cannot_donate.message" = "Nessun metodo di pagamento configurato su questo dispositivo."; "organizer.alerts.delete_vpn_profile.message" = "Vuoi veramente cancellare la configurazione VPN dalle impostazioni del tuo dispositivo? Quest'azione potrebbe risolvere alcuni stati erronei della VPN e non altererà i tuoi provider e i tuoi host."; +"organizer.alerts.remove_profile.title" = "Cancella profilo"; +"organizer.alerts.remove_profile.message" = "Sei sicuro di voler cancellare il profilo %@?"; +"organizer.alerts.open_host_file.title" = "Seleziona un file .ovpn"; "wizards.provider.cells.update_list.caption" = "Aggiorna lista"; "wizards.provider.alerts.unavailable.message" = "Non è stato possibile scaricare l'infrastruttura del provider, per favore riprova più tardi."; +"wizards.host.sections.existing.header" = "Profili esistenti"; +"wizards.host.cells.title_input.caption" = "Titolo"; "wizards.host.alerts.existing.message" = "Esiste già un host con lo stesso titolo. Sostituire?"; "service.welcome.message" = "Benvenuto in Passepartout!\n\nUsa il menu per aggiungere un nuovo profilo."; +"service.sections.vpn.header" = "VPN"; "service.sections.vpn.footer" = "La connessione sarà stabilita ogni volta che è necessario."; +"service.sections.status.header" = "Connessione"; +"service.sections.configuration.header" = "Configurazione"; "service.sections.provider_infrastructure.footer" = "Ultimo aggiornamento: %@."; "service.sections.vpn_survives_sleep.footer" = "Disabilita per migliorare il consumo della batteria, a discapito di rallentamenti occasionali causati dalle riconnessioni."; "service.sections.vpn_resolves_hostname.footer" = "Preferibile nella maggior parte delle reti e necessario in alcune reti IPv6. Disabilita dove il DNS è bloccato, o per velocizzare la negoziazione quando il DNS tarda a rispondere."; @@ -126,11 +143,20 @@ "service.sections.diagnostics.header" = "Diagnostica"; "service.sections.diagnostics.footer" = "Il mascheramento sarà effettivo dopo una riconnessione. I dati di rete sono hostname, indirizzi IP, routing, SSID. Credenziali e chiavi private non sono registrati in ogni caso."; "service.cells.use_profile.caption" = "Usa questo profilo"; +"service.cells.vpn_service.caption" = "Abilitato"; +"service.cells.vpn.turn_on.caption" = "Abilita VPN"; +"service.cells.vpn.turn_off.caption" = "Disabilita VPN"; "service.cells.connection_status.caption" = "Stato"; +"service.cells.host.parameters.caption" = "Parametri"; "service.cells.provider.pool.caption" = "Regione"; "service.cells.provider.preset.caption" = "Preset"; +"service.cells.provider.refresh.caption" = "Aggiorna infrastruttura"; +"service.cells.category.caption" = "Categoria"; +"service.cells.addresses.caption" = "Indirizzi"; +"service.cells.only_shows_favorites.caption" = "Mostra solo le posizioni preferite"; "service.cells.vpn_survives_sleep.caption" = "Mantieni attivo in sleep"; "service.cells.vpn_resolves_hostname.caption" = "Risolvi hostname del server"; +"service.cells.trusted_add_wifi.caption" = "Aggiungi Wi-Fi"; "service.cells.trusted_mobile.caption" = "Rete cellulare"; "service.cells.trusted_policy.caption" = "Spegni VPN in rete sicura"; "service.cells.test_connectivity.caption" = "Verifica connettività"; @@ -159,8 +185,17 @@ "service.alerts.download.message" = "%@ richiede lo scaricamento di file di configurazione aggiuntivi.\n\nConferma per avviare lo scaricamento."; "service.alerts.download.failed" = "Impossibile scaricare i file di configurazione. %@"; "service.alerts.download.hud.extracting" = "Estraendo i file, un attimo di pazienza..."; +"service.alerts.location.message.denied" = "Devi dare accesso alla tua posizione per aggiungere questa rete Wi-Fi alle reti sicure. Vai alle impostazioni iOS e verifica i permessi sulla posizione per Passepartout."; +"service.alerts.location.button.settings" = "Impostazioni"; + +"provider.pool.sections.empty_favorites.footer" = "Scorri a sinistra su una regione per aggiungerla o rimuoverla dai Preferiti."; +"provider.pool.actions.favorite" = "Preferita"; +"provider.pool.actions.unfavorite" = "Non preferita"; + +"provider.preset.cells.tech_details.caption" = "Dettagli tecnici"; "account.title" = "Account"; +"account.sections.credentials.header" = "Credenziali"; "account.sections.guidance.footer.infrastructure.default.web" = "Usa le credenziali del sito di %@."; "account.sections.guidance.footer.infrastructure.default.specific" = "Usa le tue credenziali del servizio %@, che potrebbero differire dalle credenziali del sito web."; "account.sections.guidance.footer.infrastructure.mullvad" = "Usa le credenziali del sito di %@. Il tuo username è generalmente numerico (senza spazi)."; @@ -179,11 +214,20 @@ "account.cells.signup.caption" = "Registrati con %@"; "endpoint.title" = "Endpoint"; +"endpoint.sections.location_addresses.header" = "Indirizzi"; +"endpoint.sections.location_protocols.header" = "Protocolli"; +"endpoint.cells.address" = "Indirizzo"; +"endpoint.cells.protocol" = "Protocollo"; "endpoint.cells.any_address.caption" = "Automatico"; "endpoint.cells.any_protocol.caption" = "Automatico"; "network_settings.title" = "Impostazioni di rete"; +"network_settings.cells.add_dns_server.caption" = "Aggiungi indirizzo"; +"network_settings.cells.add_dns_domain.caption" = "Aggiungi dominio"; +"network_settings.cells.proxy_bypass.caption" = "Dominio ignorato"; +"network_settings.cells.add_proxy_bypass.caption" = "Aggiungi dominio ignorato"; +"configuration.title" = "Configurazione"; "configuration.sections.communication.header" = "Comunicazione"; "configuration.sections.reset.footer" = "Se ti trovi con una connettività compromessa dopo aver cambiato i parametri di comunicazione, tocca per tornare alla configurazione originale."; "configuration.sections.tls.header" = "TLS"; @@ -212,11 +256,28 @@ "configuration.cells.renegotiation_seconds.caption" = "Rinegoziazione"; "configuration.cells.renegotiation_seconds.value.after" = "dopo %@"; "configuration.cells.random_endpoint.caption" = "Endpoint casuale"; +"configuration.alerts.commit.message" = "I nuovi parametri non saranno effettivi finché non ti riconnetti manualmente. I cambi nelle reti sicure saranno applicati immediatamente."; +"configuration.alerts.commit.buttons.reconnect" = "Riconnetti adesso"; +"configuration.alerts.commit.buttons.skip" = "Ignora"; + +"trusted.columns.trust.title" = "Sicura"; +"trusted.ethernet.title" = "Connessioni cablate sicure"; +"trusted.ethernet.description" = "Seleziona per considerare sicura qualsiasi rete cablata."; + +"preferences.title" = "Preferenze"; +"preferences.sections.general.header" = "Generale"; +"preferences.cells.launches_on_login.caption" = "Apri al login"; +"preferences.cells.launches_on_login.footer" = "Seleziona per aprire automaticamente l'app all'avvio o al login."; +"preferences.cells.confirm_quit.caption" = "Conferma uscita"; +"preferences.cells.confirm_quit.footer" = "Seleziona per confermare l'uscita dall'applicazione."; "network_settings.gateway.title" = "Gateway predefinito"; "network_settings.dns.title" = "DNS"; +"network_settings.dns.cells.addresses.title" = "Server"; "network_settings.dns.cells.domain.caption" = "Dominio"; +"network_settings.dns.cells.domains.title" = "Dominii"; "network_settings.proxy.title" = "Proxy"; +"network_settings.proxy.cells.bypass_domains.title" = "Dominii ignorati"; "network_settings.mtu.title" = "MTU"; "network_settings.mtu.cells.bytes.caption" = "Bytes"; @@ -224,8 +285,10 @@ "debug_log.buttons.previous" = "Precedente"; "debug_log.buttons.next" = "Successivo"; +"debug_log.buttons.copy" = "Copia"; "debug_log.alerts.empty_log.message" = "Il debug log è vuoto."; +"shortcuts.add.title" = "Aggiungi comando rapido"; "shortcuts.add.sections.vpn.header" = "VPN"; "shortcuts.add.sections.wifi.header" = "Wi-Fi"; "shortcuts.add.sections.cellular.header" = "Cellulare"; @@ -238,7 +301,9 @@ "shortcuts.add.cells.untrust_cellular.caption" = "Rimuovi rete mobile sicura"; "shortcuts.add.alerts.no_profiles.message" = "Non c'è nessun profilo a cui connettersi."; +"shortcuts.edit.title" = "Gestisci comandi rapidi"; "shortcuts.edit.sections.all.header" = "Comandi esistenti"; +"shortcuts.edit.cells.add_shortcut.caption" = "Aggiungi comando rapido"; "purchase.title" = "Acquista"; "purchase.sections.products.footer" = "Ogni prodotto è un acquisto unico e non ricorrente. L'acquisto di un provider non include una sottoscrizione."; @@ -275,3 +340,20 @@ "credits.sections.translations.header" = "Traduzioni"; "label.license.error" = "Impossibile scaricare il contenuto completo della licenza."; + +// iOS only + +"imported_hosts.title" = "Host importati"; + +// macOS only + +"menu.show.title" = "Mostra"; +"menu.switch_profile.title" = "Profilo attivo"; +"menu.active_profile.title.none" = "Nessun profilo attivo"; +"menu.active_profile.items.customize.title" = "Personalizza..."; +"menu.active_profile.messages.missing_credentials" = "Nessun account configurato"; +"menu.organizer.title" = "Organizer"; +"menu.preferences.title" = "Preferenze"; +"menu.support.title" = "Supporto"; +"menu.quit.title" = "Esci da %@"; +"menu.quit.messages.confirm" = "La VPN, se abilitata, continuerà ad essere attiva in background. Vuoi comunque uscire?"; diff --git a/Passepartout/Core/Resources/nl.lproj/Core.strings b/Passepartout/Core/Resources/nl.lproj/Core.strings index 6e48c137..07bb1a8e 100644 --- a/Passepartout/Core/Resources/nl.lproj/Core.strings +++ b/Passepartout/Core/Resources/nl.lproj/Core.strings @@ -53,6 +53,7 @@ "vpn.disconnecting" = "Verbinding verbreken"; "vpn.inactive" = "Inactief"; "vpn.disabled" = "Uitgeschakeld"; +"vpn.unused" = "Uit"; "vpn.errors.timeout" = "Time-out"; "vpn.errors.dns" = "DNS niet gelukt"; @@ -87,6 +88,11 @@ // //////////////////// +"organizer.title" = "%@"; +"organizer.menus.provider" = "Aanbieder"; +"organizer.menus.provider.unavailable" = "Geen aanbieders meer"; +"organizer.menus.host" = "Host"; +/* //////////////////// */ "organizer.sections.twitch.header" = "Twitch"; "organizer.sections.twitch.footer" = "Kom kijken hoe ik Passepartout live maak op Twitch, doe mee aan de chat om te communiceren en bij te dragen!"; "organizer.sections.providers.header" = "Aanbieders"; @@ -107,17 +113,28 @@ "organizer.cells.translate.caption" = "Help met vertalen"; "organizer.cells.about.caption" = "Over %@"; "organizer.cells.uninstall.caption" = "Verwijder VPN configuratie"; +"organizer.cells.add_provider.caption" = "Voeg nieuwe aanbieder toe"; +"organizer.cells.add_host.caption" = "Toevoegen vanuit Bestanden"; +"organizer.cells.import_host.caption" = "Toevoegen vanuit geïmporteerd"; "organizer.alerts.exhausted_providers.message" = "Er zijn profielen gemaakt voor elke beschikbare aanbieder."; "organizer.alerts.add_host.message" = "Open een URL naar een .ovpn configuratie bestand met Safari, Mail of een andere app om een host profile te configureren.\n\nJe kan ook een .ovpn importeren met behulp van iTunes bestandsdeling."; "organizer.alerts.cannot_donate.message" = "Er is geen betaalmethode geconfigureerd op dit apparaat."; "organizer.alerts.delete_vpn_profile.message" = "Wilt u de VPN-configuratie van uw apparaatinstellingen verwijderen? Dit kan enkele problemen met VPN oplossen en heeft geen invloed op uw provider- en hostprofielen."; +"organizer.alerts.remove_profile.title" = "Profiel verwijderen"; +"organizer.alerts.remove_profile.message" = "Weet u zeker dat u profiel %@ wilt verwijderen?"; +"organizer.alerts.open_host_file.title" = "Selecteer een .ovpn-bestand"; "wizards.provider.cells.update_list.caption" = "Lijst bijwerken"; "wizards.provider.alerts.unavailable.message" = "Kon de provider-infrastructuur niet downloaden, probeer het later opnieuw."; +"wizards.host.sections.existing.header" = "Bestaande profielen"; +"wizards.host.cells.title_input.caption" = "Titel"; "wizards.host.alerts.existing.message" = "Er bestaat al een host profiel met deze titel, wil je hem vervangen?"; "service.welcome.message" = "Welkom bij Passepartout!\n\nGebruik de organizer om een nieuw profiel toe te voegen."; +"service.sections.vpn.header" = "VPN"; "service.sections.vpn.footer" = "De verbinding zal worden gestart wanneer nodig."; +"service.sections.status.header" = "Verbinding"; +"service.sections.configuration.header" = "Configuratie"; "service.sections.provider_infrastructure.footer" = "Laatste update was op %@."; "service.sections.vpn_survives_sleep.footer" = "Uitschakelen om het batterijverbruik te verbeteren, ten koste van incidentele vertragingen als gevolg van het opnieuw opstarten na wake-up."; "service.sections.vpn_resolves_hostname.footer" = "Voorkeur om dit aan te zetten voor de meeste netwerken en vereist in sommige IPv6-netwerken. Uitschakelen waar DNS wordt geblokkeerd, of om de onderhandelingen te versnellen wanneer DNS traag reageert."; @@ -126,11 +143,20 @@ "service.sections.diagnostics.header" = "Diagnose"; "service.sections.diagnostics.footer" = "De maskeerstatus is effectief na opnieuw verbinden. Netwerkgegevens zijn hostnamen, IP-adressen, routing, SSID's. Inloggegevens en privésleutels worden niet geregistreerd."; "service.cells.use_profile.caption" = "Gebruik dit profiel"; +"service.cells.vpn_service.caption" = "Ingeschakeld"; +"service.cells.vpn.turn_on.caption" = "VPN activeren"; +"service.cells.vpn.turn_off.caption" = "VPN deactiveren"; "service.cells.connection_status.caption" = "Status"; +"service.cells.host.parameters.caption" = "Parameters"; "service.cells.provider.pool.caption" = "Locatie"; "service.cells.provider.preset.caption" = "Voorkeur"; +"service.cells.provider.refresh.caption" = "Vernieuw de infrastructuur"; +"service.cells.category.caption" = "Categorie"; +"service.cells.addresses.caption" = "Adressen"; +"service.cells.only_shows_favorites.caption" = "Alleen favoriete locaties weergeven"; "service.cells.vpn_survives_sleep.caption" = "Actief tijdens slaapstand"; "service.cells.vpn_resolves_hostname.caption" = "Haal de naam van de host op"; +"service.cells.trusted_add_wifi.caption" = "Wi-Fi toevoegen"; "service.cells.trusted_mobile.caption" = "Mobiel netwerk"; "service.cells.trusted_policy.caption" = "Trust disables VPN"; "service.cells.test_connectivity.caption" = "Test connectiviteit"; @@ -159,8 +185,17 @@ "service.alerts.download.message" = "%@ vereist het downloaden van extra configuratiebestanden.\n\nBevestig om het downloaden te starten."; "service.alerts.download.failed" = "Downloaden van configuratiebestanden is mislukt. %@"; "service.alerts.download.hud.extracting" = "Bestanden uitpakken, even geduld..."; +"service.alerts.location.message.denied" = "Om dit Wi-Fi netwerk te vertrouwen is toestemming tot locatie gegevens nodig. Ga naar Instellingen -> Privacy -> Locatievoorzieningen en check de locatie bevoegdheden voor Passepartout."; +"service.alerts.location.button.settings" = "Instellingen"; + +"provider.pool.sections.empty_favorites.footer" = "Veeg naar links op een locatie om deze toe te voegen of te verwijderen aan Favorieten."; +"provider.pool.actions.favorite" = "Favoriet"; +"provider.pool.actions.unfavorite" = "Geen favoriet"; + +"provider.preset.cells.tech_details.caption" = "Technische details"; "account.title" = "Account"; +"account.sections.credentials.header" = "Inloggegevens"; "account.sections.guidance.footer.infrastructure.default.web" = "Gebruik de inloggegevens van %@."; "account.sections.guidance.footer.infrastructure.default.specific" = "Gebruik uw %@ service-gegevens, die kunnen verschillen van de gegevens van de website."; "account.sections.guidance.footer.infrastructure.mullvad" = "Gebruik de inloggegevens van %@. Uw gebruikersnaam is meestal numeriek (zonder ruimte)."; @@ -179,11 +214,20 @@ "account.cells.signup.caption" = "Registreer bij %@"; "endpoint.title" = "Endpoint"; +"endpoint.sections.location_addresses.header" = "Adressen"; +"endpoint.sections.location_protocols.header" = "Protocollen"; +"endpoint.cells.address" = "Adres"; +"endpoint.cells.protocol" = "Protocol"; "endpoint.cells.any_address.caption" = "Automatisch"; "endpoint.cells.any_protocol.caption" = "Automatisch"; "network_settings.title" = "Netwerk instellingen"; +"network_settings.cells.add_dns_server.caption" = "Voeg adress toe"; +"network_settings.cells.add_dns_domain.caption" = "Zoekdomein toevoegen"; +"network_settings.cells.proxy_bypass.caption" = "Omzeil domein"; +"network_settings.cells.add_proxy_bypass.caption" = "Voeg omzeil optie voor domein toe"; +"configuration.title" = "Configuratie"; "configuration.sections.communication.header" = "Communicatie"; "configuration.sections.reset.footer" = "Tik hier als de connectiviteit niet meer werkt na het aanpassen van instellingen, om terug te gaan naar de originele configuratie."; "configuration.sections.tls.header" = "TLS"; @@ -212,11 +256,28 @@ "configuration.cells.renegotiation_seconds.caption" = "Renegotiation"; "configuration.cells.renegotiation_seconds.value.after" = "na %@"; "configuration.cells.random_endpoint.caption" = "Willekeurig eindpunt"; +"configuration.alerts.commit.message" = "Nieuwe parameters worden pas van kracht als u handmatig opnieuw verbinding maakt. Wijzigingen in vertrouwde netwerken zijn direct van toepassing."; +"configuration.alerts.commit.buttons.reconnect" = "Opnieuw verbinden"; +"configuration.alerts.commit.buttons.skip" = "Overslaan"; + +"trusted.columns.trust.title" = "Vertrouwen"; +"trusted.ethernet.title" = "Bekabelde verbindingen vertrouwen"; +"trusted.ethernet.description" = "Vink aan om alle bekabelde verbindingen te vertrouwen."; + +"preferences.title" = "Voorkeuren"; +"preferences.sections.general.header" = "Algemeen"; +"preferences.cells.launches_on_login.caption" = "Lanceren bij aanmelden"; +"preferences.cells.launches_on_login.footer" = "Vink aan als u wilt dat de app automatisch wordt gelanceerd bij opstarten of aanmelden."; +"preferences.cells.confirm_quit.caption" = "Sluiten bevestigen"; +"preferences.cells.confirm_quit.footer" = "Vink aan om een bevestigingsmelding te sluiten."; "network_settings.gateway.title" = "Standaard gateway"; "network_settings.dns.title" = "DNS"; +"network_settings.dns.cells.addresses.title" = "Servers"; "network_settings.dns.cells.domain.caption" = "Domein"; +"network_settings.dns.cells.domains.title" = "Domeinen"; "network_settings.proxy.title" = "Proxy"; +"network_settings.proxy.cells.bypass_domains.title" = "Domeinen omzeilen"; "network_settings.mtu.title" = "MTU"; "network_settings.mtu.cells.bytes.caption" = "Bytes"; @@ -224,8 +285,10 @@ "debug_log.buttons.previous" = "Vorige"; "debug_log.buttons.next" = "Volgende"; +"debug_log.buttons.copy" = "Kopiëren"; "debug_log.alerts.empty_log.message" = "Het logboek voor foutopsporing is leeg."; +"shortcuts.add.title" = "Voeg snelkoppeling toe"; "shortcuts.add.sections.vpn.header" = "VPN"; "shortcuts.add.sections.wifi.header" = "Wi-Fi"; "shortcuts.add.sections.cellular.header" = "Mobiel"; @@ -238,7 +301,9 @@ "shortcuts.add.cells.untrust_cellular.caption" = "Untrust mobiel netwerk"; "shortcuts.add.alerts.no_profiles.message" = "Er is geen profiel om verbinding mee te maken."; +"shortcuts.edit.title" = "Beheer snelkoppelingen"; "shortcuts.edit.sections.all.header" = "Bestaande snelkoppelingen"; +"shortcuts.edit.cells.add_shortcut.caption" = "Voeg snelkoppeling toe"; "purchase.title" = "Aanschaffen"; "purchase.sections.products.footer" = "Elk product is een eenmalige aankoop. Aankopen van providers bevatten geen VPN-abonnement."; @@ -275,3 +340,20 @@ "credits.sections.translations.header" = "Vertalingen"; "label.license.error" = "Kan volledige licentie-inhoud niet downloaden."; + +// iOS only + +"imported_hosts.title" = "Geïmporteerde hosts"; + +// macOS only + +"menu.show.title" = "Weergeven"; +"menu.switch_profile.title" = "Actief profiel"; +"menu.active_profile.title.none" = "Geen actief profiel"; +"menu.active_profile.items.customize.title" = "Aanpassen..."; +"menu.active_profile.messages.missing_credentials" = "Geen account geconfigureerd"; +"menu.organizer.title" = "Organisator"; +"menu.preferences.title" = "Voorkeuren"; +"menu.support.title" = "Ondersteuning"; +"menu.quit.title" = "%@ afsluiten"; +"menu.quit.messages.confirm" = "De VPN zal, indien geactiveerd, op de achtergrond blijven draaien. Wilt u sluiten?"; diff --git a/Passepartout/Core/Resources/pl.lproj/Core.strings b/Passepartout/Core/Resources/pl.lproj/Core.strings index 8d189285..dc91dbb3 100644 --- a/Passepartout/Core/Resources/pl.lproj/Core.strings +++ b/Passepartout/Core/Resources/pl.lproj/Core.strings @@ -53,6 +53,7 @@ "vpn.disconnecting" = "Rozłączanie"; "vpn.inactive" = "Nieaktywne"; "vpn.disabled" = "Wyłączone"; +"vpn.unused" = "Wył"; "vpn.errors.timeout" = "Upłynąl limit czasu połączenia"; "vpn.errors.dns" = "Błąd DNS"; @@ -87,6 +88,11 @@ // //////////////////// +"organizer.title" = "%@"; +"organizer.menus.provider" = "Dostawca"; +"organizer.menus.provider.unavailable" = "Brak dostawców"; +"organizer.menus.host" = "Host"; +/* //////////////////// */ "organizer.sections.twitch.header" = "Twitch"; "organizer.sections.twitch.footer" = "Przyjdź i zobacz, jak tworzę Passepartout na żywo na Twitchu, dołącz do czatu, aby współdziałać i udzielać się!"; "organizer.sections.providers.header" = "Usługodawcy"; @@ -107,17 +113,28 @@ "organizer.cells.translate.caption" = "Zaproponuj tłumaczenie"; "organizer.cells.about.caption" = "O %@"; "organizer.cells.uninstall.caption" = "Usuń konfiguracje VPN"; +"organizer.cells.add_provider.caption" = "Dodaj nowego usługodawcę"; +"organizer.cells.add_host.caption" = "Dodaj z Plików"; +"organizer.cells.import_host.caption" = "Dodaj z zaimportowanych"; "organizer.alerts.exhausted_providers.message" = "Stworzyłeś/aś już profile dla każdego usługodawcy."; "organizer.alerts.add_host.message" = "Otwórz link z plikiem .ovpn w Safari, Poczcie lub innej aplikacji aby utworzyć profil hosta.\n\nMożesz też zaimportować plik .ovpn używając 'File Sharing' w iTunes."; "organizer.alerts.cannot_donate.message" = "Żadna metoda płatności nie jest skonfigurowana na tym urządzeniu."; "organizer.alerts.delete_vpn_profile.message" = "Na pewno chcesz usunąć konfigurację VPN z urządzenia? Może to naprawić błędy z statusem VPN i nie będzie miało wpływu na konfigurację usługodawców/hostów."; +"organizer.alerts.remove_profile.title" = "Usuń profil"; +"organizer.alerts.remove_profile.message" = "Na pewno chcesz usunąć profil %@?"; +"organizer.alerts.open_host_file.title" = "Wybierz plik .ovpn"; "wizards.provider.cells.update_list.caption" = "Zaktualizuj listę"; "wizards.provider.alerts.unavailable.message" = "Nie można pobrać infrastruktury dostawcy, spróbuj ponownie później."; +"wizards.host.sections.existing.header" = "Istniejące profile"; +"wizards.host.cells.title_input.caption" = "Tytuł"; "wizards.host.alerts.existing.message" = "Profil hosta z taką nazwą już istnieje. Nadpisać profil?"; "service.welcome.message" = "Witaj w Passepartout!\n\nUżyj organizera by utworzyć nowy profil."; +"service.sections.vpn.header" = "VPN"; "service.sections.vpn.footer" = "Połączenie zostanie nawiązane zgodnie z ustawieniami."; +"service.sections.status.header" = "Połączenie"; +"service.sections.configuration.header" = "Konfiguracja"; "service.sections.provider_infrastructure.footer" = "Ostatnio aktualizowane %@."; "service.sections.vpn_survives_sleep.footer" = "Wyłącz dla mniejszego zużycia baterii kosztem wolniejszego działania spowodowanego ponownym połączeniem przy wybudzeniu urządzenia."; "service.sections.vpn_resolves_hostname.footer" = "Preferowane w większości sieci i potrzebne w niektórych sieciach IPv6. Wyłącz kiedy DNS jest zablokowane, lub żeby przyspieszyć ustanawianie połączenia gdy DNS jest zbyt wolne."; @@ -126,11 +143,20 @@ "service.sections.diagnostics.header" = "Diagnostyka"; "service.sections.diagnostics.footer" = "Status maskowania będzie widoczny po ponownym połączeniu. Dane połączenia to nazwy hostów, adresy IP, routing, SSID. Loginy i klucze prywatne nie są zapisywane."; "service.cells.use_profile.caption" = "Używaj tego profilu"; +"service.cells.vpn_service.caption" = "Włączone"; +"service.cells.vpn.turn_on.caption" = "Włącz VPN"; +"service.cells.vpn.turn_off.caption" = "Wyłącz VPN"; "service.cells.connection_status.caption" = "Status"; +"service.cells.host.parameters.caption" = "Parametry"; "service.cells.provider.pool.caption" = "Lokalizacja"; "service.cells.provider.preset.caption" = "Preset"; +"service.cells.provider.refresh.caption" = "Odśwież infrastrukturę"; +"service.cells.category.caption" = "Kategoria"; +"service.cells.addresses.caption" = "Adresy"; +"service.cells.only_shows_favorites.caption" = "Pokazuj tylko ulubione lokalizacje"; "service.cells.vpn_survives_sleep.caption" = "Utrzymuj połączenie przy zablokowanym ekranie"; "service.cells.vpn_resolves_hostname.caption" = "Rozwiązuj nazwy hostów usługodawcy"; +"service.cells.trusted_add_wifi.caption" = "Dodaj Wi-Fi"; "service.cells.trusted_mobile.caption" = "Sieć komórkowa"; "service.cells.trusted_policy.caption" = "Wyłącz VPN dla zaufanych sieci"; "service.cells.test_connectivity.caption" = "Testuj połączenie"; @@ -159,8 +185,17 @@ "service.alerts.download.message" = "%@ potrzebuje pobrania dodatkowych plików konfiguracyjnych.\n\nPotwierdź aby zacząć pobieranie."; "service.alerts.download.failed" = "Nie udało się pobrać plików konfiguracyjnych. %@"; "service.alerts.download.hud.extracting" = "Wypakowywanie plików, proszę czekać ..."; +"service.alerts.location.message.denied" = "Musisz pozwolić na dostęp do lokalizacji żeby zaufać tej sieci Wi-Fi. Przejdź do ustawień prywatności i pozwól Passepartout na wykorzystywanie usług lokalizacji."; +"service.alerts.location.button.settings" = "Ustawienia"; + +"provider.pool.sections.empty_favorites.footer" = "Aby usunąć zakładkę, przesuń w lewo."; +"provider.pool.actions.favorite" = "Dodaj do ulubionych"; +"provider.pool.actions.unfavorite" = "Usuń z ulubionych"; + +"provider.preset.cells.tech_details.caption" = "Dane techniczne"; "account.title" = "Konto"; +"account.sections.credentials.header" = "Dane logowania"; "account.sections.guidance.footer.infrastructure.default.web" = "Użyj loginu do %@."; "account.sections.guidance.footer.infrastructure.default.specific" = "Użyj poświadczeń usługi %@, które mogą różnić się od poświadczeń witryny."; "account.sections.guidance.footer.infrastructure.mullvad" = "Użyj loginu do %@. Twoja nazwa użytkownika jest najczęściej ciągiem liczb (bez przestrzeni)."; @@ -179,11 +214,20 @@ "account.cells.signup.caption" = "Zarejstruj się w %@"; "endpoint.title" = "Host końcowy"; +"endpoint.sections.location_addresses.header" = "Adresy"; +"endpoint.sections.location_protocols.header" = "Protokoły"; +"endpoint.cells.address" = "Adres"; +"endpoint.cells.protocol" = "Protokół"; "endpoint.cells.any_address.caption" = "Automatyczny"; "endpoint.cells.any_protocol.caption" = "Automatyczny"; "network_settings.title" = "Ustawienia sieci"; +"network_settings.cells.add_dns_server.caption" = "Dodaj adres"; +"network_settings.cells.add_dns_domain.caption" = "Dodaj domenę wyszukiwania"; +"network_settings.cells.proxy_bypass.caption" = "Pomiń domenę"; +"network_settings.cells.add_proxy_bypass.caption" = "Dodaj domenę"; +"configuration.title" = "Konfiguracja"; "configuration.sections.communication.header" = "Komunikacja"; "configuration.sections.reset.footer" = "Jeśli masz problemy z połączeniem po zmianie konfiguracji komunikacji, kliknij żeby przywrócić domyślną konfigurację."; "configuration.sections.tls.header" = "TLS"; @@ -212,11 +256,28 @@ "configuration.cells.renegotiation_seconds.caption" = "Ponowna negocjacja"; "configuration.cells.renegotiation_seconds.value.after" = "po %@"; "configuration.cells.random_endpoint.caption" = "Losowy host końcowy"; +"configuration.alerts.commit.message" = "Nowe parametry zaczną obowiązywać dopiero po ponownym ręcznym połączeniu. Zmiany w sieciach zaufanych zostaną zastosowane natychmiast."; +"configuration.alerts.commit.buttons.reconnect" = "Połącz ponownie teraz"; +"configuration.alerts.commit.buttons.skip" = "Pomiń"; + +"trusted.columns.trust.title" = "Ufaj"; +"trusted.ethernet.title" = "Ufaj połączeniom przewodowym"; +"trusted.ethernet.description" = "Zaznacz, aby traktować każde przewodowe połączenie kablowe jako zaufane."; + +"preferences.title" = "Preferencje"; +"preferences.sections.general.header" = "Ogólne"; +"preferences.cells.launches_on_login.caption" = "Uruchom po zalogowaniu"; +"preferences.cells.launches_on_login.footer" = "Zaznacz, aby automatycznie uruchamiać aplikację przy restarcie systemu lub logowaniu."; +"preferences.cells.confirm_quit.caption" = "Potwierdź zakończenie pracy"; +"preferences.cells.confirm_quit.footer" = "Zaznacz, aby wyświetlić monit o potwierdzeniu zakończenia."; "network_settings.gateway.title" = "Domyślna brama sieciowa"; "network_settings.dns.title" = "DNS"; +"network_settings.dns.cells.addresses.title" = "Serwery"; "network_settings.dns.cells.domain.caption" = "Domena"; +"network_settings.dns.cells.domains.title" = "Domeny"; "network_settings.proxy.title" = "Proxy"; +"network_settings.proxy.cells.bypass_domains.title" = "Pomiń domeny"; "network_settings.mtu.title" = "MTU"; "network_settings.mtu.cells.bytes.caption" = "Bytes"; @@ -224,8 +285,10 @@ "debug_log.buttons.previous" = "Poprzedni"; "debug_log.buttons.next" = "Następny"; +"debug_log.buttons.copy" = "Kopiuj"; "debug_log.alerts.empty_log.message" = "Rejestr debugowania jest pusty."; +"shortcuts.add.title" = "Dodaj skrót"; "shortcuts.add.sections.vpn.header" = "VPN"; "shortcuts.add.sections.wifi.header" = "Wi-Fi"; "shortcuts.add.sections.cellular.header" = "Dane komórkowe"; @@ -238,7 +301,9 @@ "shortcuts.add.cells.untrust_cellular.caption" = "Przestań ufać danym komórkowym"; "shortcuts.add.alerts.no_profiles.message" = "Brak wybranego profilu połączenia."; +"shortcuts.edit.title" = "Zarządzaj skrótami"; "shortcuts.edit.sections.all.header" = "Istniejące skróty"; +"shortcuts.edit.cells.add_shortcut.caption" = "Dodaj skrót"; "purchase.title" = "Kup"; "purchase.sections.products.footer" = "Każdy produkt to zakup jednorazowy. Kuipno usługodawcy nie zawiera subskrypcji VPN."; @@ -275,3 +340,20 @@ "credits.sections.translations.header" = "Tłumaczenia"; "label.license.error" = "Nie udało się pobrać danych licencyjnych."; + +// iOS only + +"imported_hosts.title" = "Zaimportowane hosty"; + +// macOS only + +"menu.show.title" = "Pokaż"; +"menu.switch_profile.title" = "Aktywny profil"; +"menu.active_profile.title.none" = "Brak aktywnych profili"; +"menu.active_profile.items.customize.title" = "Personalizuj"; +"menu.active_profile.messages.missing_credentials" = "Brak skonfigurowanych kont"; +"menu.organizer.title" = "Organzator"; +"menu.preferences.title" = "Preferencje"; +"menu.support.title" = "Obsługa techniczna"; +"menu.quit.title" = "Zakończ %@"; +"menu.quit.messages.confirm" = "Jeśli sieć VPN, jest włączona, będzie nadal działać w tle. Chcesz zakończyć?"; diff --git a/Passepartout/Core/Resources/pt.lproj/Core.strings b/Passepartout/Core/Resources/pt.lproj/Core.strings index b3492abe..54b489e3 100644 --- a/Passepartout/Core/Resources/pt.lproj/Core.strings +++ b/Passepartout/Core/Resources/pt.lproj/Core.strings @@ -53,6 +53,7 @@ "vpn.disconnecting" = "Desconectando"; "vpn.inactive" = "Inativo"; "vpn.disabled" = "Desativado"; +"vpn.unused" = "Desativado"; "vpn.errors.timeout" = "Timeout"; "vpn.errors.dns" = "Falha no DNS"; @@ -87,6 +88,11 @@ // //////////////////// +"organizer.title" = "%@"; +"organizer.menus.provider" = "Fornecedor"; +"organizer.menus.provider.unavailable" = "Não restam fornecedores"; +"organizer.menus.host" = "Anfitreão"; +/* //////////////////// */ "organizer.sections.twitch.header" = "Twitch"; "organizer.sections.twitch.footer" = "Venha me ver fazer o Passepartout ao vivo no Twitch, entre no chat para interagir e contribuir!"; "organizer.sections.providers.header" = "Provedores"; @@ -107,17 +113,28 @@ "organizer.cells.translate.caption" = "Ajudar-nos na tradução"; "organizer.cells.about.caption" = "Sobre %@"; "organizer.cells.uninstall.caption" = "Remover configuração VPN"; +"organizer.cells.add_provider.caption" = "Adicionar novo perfil"; +"organizer.cells.add_host.caption" = "Adicionar dos Arquivos"; +"organizer.cells.import_host.caption" = "Adicionar dos importados"; "organizer.alerts.exhausted_providers.message" = "Você criou um perfil para qualquer provedor disponível."; "organizer.alerts.add_host.message" = "Abre uma URL para um arquivo de configuração .ovpn no Safari, Mail ou outro aplicativo.\n\nVocê pode também importar um .ovpn com o compartilhamento de arquivos do iTunes."; "organizer.alerts.cannot_donate.message" = "Nenhum meio de pagamento configurado nesse dispositivo."; "organizer.alerts.delete_vpn_profile.message" = "Tem certeza que deseja remover as configurações de VPN do seu dispositivo? Isso poderá corrigir problemas com o estado atual, sem afetar seu provedor e perfis do host."; +"organizer.alerts.remove_profile.title" = "Remover perfil"; +"organizer.alerts.remove_profile.message" = "Tem a certeza de que pretende eliminar o perfil %@?"; +"organizer.alerts.open_host_file.title" = "Selecionar um ficheiro .ovpn"; "wizards.provider.cells.update_list.caption" = "Atualizar lista"; "wizards.provider.alerts.unavailable.message" = "Não foi possível baixar a infraestrutura do provedor, tente novamente mais tarde."; +"wizards.host.sections.existing.header" = "Perfis existentes"; +"wizards.host.cells.title_input.caption" = "Título"; "wizards.host.alerts.existing.message" = "Já existe um perfil com esse nome, deseja substituí-lo?"; "service.welcome.message" = "Bem-vindo ao Passepartout!\n\nUse o organizador para adicionar um novo perfil."; +"service.sections.vpn.header" = "VPN"; "service.sections.vpn.footer" = "A conexão será estabelecida assim que necessária."; +"service.sections.status.header" = "Conexão"; +"service.sections.configuration.header" = "Configuração"; "service.sections.provider_infrastructure.footer" = "Última atualização em %@."; "service.sections.vpn_survives_sleep.footer" = "Desative para melhorar o consumo de bateria, o que poderá ocasionar queda de performance quando o restabelecimento de conexão for realizado."; "service.sections.vpn_resolves_hostname.footer" = "Recomendado para maioria das redes e requirido em algumas redes IPv6. Desative se o DNS estiver bloqueado, ou para acelerar o DNS quando o mesmo está devagar."; @@ -126,11 +143,20 @@ "service.sections.diagnostics.header" = "Diagnóstico"; "service.sections.diagnostics.footer" = "O status será escondido após reconectado. Os dados da rede são hostnames, endereços de IP, rotas, SSID. Credenciais e chaves privadas não será logadas em nenhum dos casos."; "service.cells.use_profile.caption" = "Usar esse perfil"; +"service.cells.vpn_service.caption" = "Ativado"; +"service.cells.vpn.turn_on.caption" = "Ativar VPN"; +"service.cells.vpn.turn_off.caption" = "Desativar VPN"; "service.cells.connection_status.caption" = "Status"; +"service.cells.host.parameters.caption" = "Parâmetros"; "service.cells.provider.pool.caption" = "Localização"; "service.cells.provider.preset.caption" = "Pré-definição"; +"service.cells.provider.refresh.caption" = "Atualizar infraestrutura"; +"service.cells.category.caption" = "Categoria"; +"service.cells.addresses.caption" = "Endereços"; +"service.cells.only_shows_favorites.caption" = "Mostrar apenas os locais preferidos"; "service.cells.vpn_survives_sleep.caption" = "Manter ativo em modo descanço"; "service.cells.vpn_resolves_hostname.caption" = "Resolver hostname do servidor"; +"service.cells.trusted_add_wifi.caption" = "Adicionar Wi-Fi"; "service.cells.trusted_mobile.caption" = "Rede celular"; "service.cells.trusted_policy.caption" = "Trust disables VPN"; "service.cells.test_connectivity.caption" = "Testar conexão"; @@ -159,8 +185,17 @@ "service.alerts.download.message" = "%@ requer o download de arquivos de configuração adicionais.\n\nConfirme para iniciar."; "service.alerts.download.failed" = "Erro no download do arquivo de configuração. %@"; "service.alerts.download.hud.extracting" = "Extraindo arquivos, seja paciente..."; +"service.alerts.location.message.denied" = "Você precisa autorizar o compartilhamento de localização. Acesse ajustes do iOS e verifique permissões de localização do Passepartout."; +"service.alerts.location.button.settings" = "Ajustes"; + +"provider.pool.sections.empty_favorites.footer" = "Deslize para a esquerda em um local para adicioná-lo ou removê-lo dos Favoritos."; +"provider.pool.actions.favorite" = "Favorito"; +"provider.pool.actions.unfavorite" = "Não favorito"; + +"provider.preset.cells.tech_details.caption" = "Detalhes técnicos"; "account.title" = "Conta"; +"account.sections.credentials.header" = "Credenciais"; "account.sections.guidance.footer.infrastructure.default.web" = "Utilize %@ credenciais do site."; "account.sections.guidance.footer.infrastructure.default.specific" = "Utilize suas credenciais de serviço %@, que podem diferir das credenciais do site."; "account.sections.guidance.footer.infrastructure.mullvad" = "Utilize %@ credenciais do site. Seu usuário é normalmente numérico (sem espaços)."; @@ -179,11 +214,20 @@ "account.cells.signup.caption" = "Registrar com %@"; "endpoint.title" = "Endereço"; +"endpoint.sections.location_addresses.header" = "Endereços"; +"endpoint.sections.location_protocols.header" = "Protocolos"; +"endpoint.cells.address" = "Endereço"; +"endpoint.cells.protocol" = "Protocolo"; "endpoint.cells.any_address.caption" = "Automático"; "endpoint.cells.any_protocol.caption" = "Automático"; "network_settings.title" = "Configurações de rede"; +"network_settings.cells.add_dns_server.caption" = "Adicionar endereço"; +"network_settings.cells.add_dns_domain.caption" = "Adicionar domínio"; +"network_settings.cells.proxy_bypass.caption" = "Domínio ignorado"; +"network_settings.cells.add_proxy_bypass.caption" = "Adicionar domínio ignorado"; +"configuration.title" = "Configuração"; "configuration.sections.communication.header" = "Comunicação"; "configuration.sections.reset.footer" = "Se você foi desconectado após mudar parâmetros de comunicação, toque para restaurar a configuração original."; "configuration.sections.tls.header" = "TLS"; @@ -212,11 +256,28 @@ "configuration.cells.renegotiation_seconds.caption" = "Renegociando"; "configuration.cells.renegotiation_seconds.value.after" = "depois de %@"; "configuration.cells.random_endpoint.caption" = "Destino randômico"; +"configuration.alerts.commit.message" = "Os novos parâmetros não serão efetivos até que se volte a ligar manualmente. As alterações às redes de confiança serão aplicadas de imediato."; +"configuration.alerts.commit.buttons.reconnect" = "Voltar a ligar agora"; +"configuration.alerts.commit.buttons.skip" = "Ignorar"; + +"trusted.columns.trust.title" = "Confiar"; +"trusted.ethernet.title" = "Confiar em ligações com fios"; +"trusted.ethernet.description" = "Assinale para confiar em qualquer ligação com cabo."; + +"preferences.title" = "Preferências"; +"preferences.sections.general.header" = "Geral"; +"preferences.cells.launches_on_login.caption" = "Iniciar ao iniciar a sessão"; +"preferences.cells.launches_on_login.footer" = "Assinale para executar automaticamente a aplicação ao arrancar ou com o início de sessão."; +"preferences.cells.confirm_quit.caption" = "Confirmar a saída"; +"preferences.cells.confirm_quit.footer" = "Assinale para apresentar um alerta de confirmação da saída."; "network_settings.gateway.title" = "Gateway padrão"; "network_settings.dns.title" = "DNS"; +"network_settings.dns.cells.addresses.title" = "Servidores"; "network_settings.dns.cells.domain.caption" = "Domínio"; +"network_settings.dns.cells.domains.title" = "Domínios"; "network_settings.proxy.title" = "Proxy"; +"network_settings.proxy.cells.bypass_domains.title" = "Fazer um bypass aos domínios"; "network_settings.mtu.title" = "MTU"; "network_settings.mtu.cells.bytes.caption" = "Bytes"; @@ -224,8 +285,10 @@ "debug_log.buttons.previous" = "Anterior"; "debug_log.buttons.next" = "Próximo"; +"debug_log.buttons.copy" = "Copiar"; "debug_log.alerts.empty_log.message" = "O log está vazio."; +"shortcuts.add.title" = "Adicionar atalho"; "shortcuts.add.sections.vpn.header" = "VPN"; "shortcuts.add.sections.wifi.header" = "Wi-Fi"; "shortcuts.add.sections.cellular.header" = "Celular"; @@ -238,7 +301,9 @@ "shortcuts.add.cells.untrust_cellular.caption" = "Não confiar em rede celular"; "shortcuts.add.alerts.no_profiles.message" = "Ainda não existe nenhum perfil para se conectar."; +"shortcuts.edit.title" = "Configuração de atalhos"; "shortcuts.edit.sections.all.header" = "Atalhos existentes"; +"shortcuts.edit.cells.add_shortcut.caption" = "Adicionar atalho"; "purchase.title" = "Comprar"; "purchase.sections.products.footer" = "Todo produto é uma compra única. As compras do fornecedor não incluem uma assinatura VPN."; @@ -275,3 +340,20 @@ "credits.sections.translations.header" = "Traduções"; "label.license.error" = "Não foi possível realizar o download da licença."; + +// iOS only + +"imported_hosts.title" = "Hosts importados"; + +// macOS only + +"menu.show.title" = "Mostrar"; +"menu.switch_profile.title" = "Perfil ativo"; +"menu.active_profile.title.none" = "Sem perfil ativo"; +"menu.active_profile.items.customize.title" = "Personalizar..."; +"menu.active_profile.messages.missing_credentials" = "Não há uma conta configurada"; +"menu.organizer.title" = "Organizador"; +"menu.preferences.title" = "Preferências"; +"menu.support.title" = "Apoio"; +"menu.quit.title" = "Sair %@"; +"menu.quit.messages.confirm" = "A VPN, se ativa, ainda vai ser executada em segundo plano. Quer sair?"; diff --git a/Passepartout/Core/Resources/ru.lproj/Core.strings b/Passepartout/Core/Resources/ru.lproj/Core.strings index 8422c74c..0301830f 100644 --- a/Passepartout/Core/Resources/ru.lproj/Core.strings +++ b/Passepartout/Core/Resources/ru.lproj/Core.strings @@ -53,6 +53,7 @@ "vpn.disconnecting" = "Отключается"; "vpn.inactive" = "Не активен"; "vpn.disabled" = "Отключен"; +"vpn.unused" = "Выкл"; "vpn.errors.timeout" = "Тайм-аут"; "vpn.errors.dns" = "Ошибка DNS"; @@ -87,6 +88,11 @@ // //////////////////// +"organizer.title" = "%@"; +"organizer.menus.provider" = "Провайдер"; +"organizer.menus.provider.unavailable" = "Не осталось провайдеров"; +"organizer.menus.host" = "Хост"; +/* //////////////////// */ "organizer.sections.twitch.header" = "Twitch"; "organizer.sections.twitch.footer" = "Приходите посмотреть, как я делаю Passepartout в прямом эфире на Twitch, присоединяйтесь к чату, чтобы общаться и вносить свой вклад!"; "organizer.sections.providers.header" = "Провайдеры"; @@ -107,17 +113,28 @@ "organizer.cells.translate.caption" = "Помощь с переводом"; "organizer.cells.about.caption" = "Об %@"; "organizer.cells.uninstall.caption" = "Удалить VPN конфигурацию"; +"organizer.cells.add_provider.caption" = "Добавить нового провайдера"; +"organizer.cells.add_host.caption" = "Добавить из файлов"; +"organizer.cells.import_host.caption" = "Добавить из импортированных"; "organizer.alerts.exhausted_providers.message" = "Вы создали профили для всех доступных провайдеров."; "organizer.alerts.add_host.message" = "Откройте ссылку на .ovpn файл конфигурации через Safari, Почту или другое приложение для добавление хост профиля.\n\nВы также можете импортировать .ovpn файл через общие файлы iTunes."; "organizer.alerts.cannot_donate.message" = "На этом усторйстве не выбран способ платежа."; "organizer.alerts.delete_vpn_profile.message" = "Вы действительно хотите убрать VPN конфигурацию из настроек устройства? Это может исправить несколько VPN ошибок, но не изменит установки приложения."; +"organizer.alerts.remove_profile.title" = "Удалить профиль"; +"organizer.alerts.remove_profile.message" = "Вы точно хотите удалить профиль %@?"; +"organizer.alerts.open_host_file.title" = "Выберите файл .ovpn"; "wizards.provider.cells.update_list.caption" = "Обновить список"; "wizards.provider.alerts.unavailable.message" = "Не удалось загрузить инфраструктуру провайдера, повторите попытку позже."; +"wizards.host.sections.existing.header" = "Существующие профили"; +"wizards.host.cells.title_input.caption" = "Название"; "wizards.host.alerts.existing.message" = "Хост профиль с этим названием уже существует. Заменить?"; "service.welcome.message" = "Добро пожаловать в Passepartout!\n\nИспользуйте организатор для добавления нового профиля."; +"service.sections.vpn.header" = "VPN"; "service.sections.vpn.footer" = "Соединение будет установлено при необходимости."; +"service.sections.status.header" = "Соединение"; +"service.sections.configuration.header" = "Конфигурация"; "service.sections.provider_infrastructure.footer" = "Последнее обновление %@."; "service.sections.vpn_survives_sleep.footer" = "Отключите для уменьшения расхода заряда аккумулятора, может привести к временным замедлениям в связи с повторным подключением после \"пробуждения\"."; "service.sections.vpn_resolves_hostname.footer" = "Предпочтительно в большинстве сетей и необходимо в некоторых IPv6 сетях. Отключите если  DNS заблокирован, или для увеличения скорости в случае медленных ответов DNS."; @@ -126,11 +143,20 @@ "service.sections.diagnostics.header" = "Диагностика"; "service.sections.diagnostics.footer" = "Маскировка включится после повторного подключения. Информация о сети - это названия хост профилей, IP адрес, маршрутизация и SSID. Данные для входа и приватные ключи не собираются."; "service.cells.use_profile.caption" = "Использовать это профиль."; +"service.cells.vpn_service.caption" = "Включен"; +"service.cells.vpn.turn_on.caption" = "Включить VPN"; +"service.cells.vpn.turn_off.caption" = "Отключить VPN"; "service.cells.connection_status.caption" = "Статус"; +"service.cells.host.parameters.caption" = "Параметры"; "service.cells.provider.pool.caption" = "Местоположение"; "service.cells.provider.preset.caption" = "Пресет"; +"service.cells.provider.refresh.caption" = "Обновить инфраструктуру"; +"service.cells.category.caption" = "Категория"; +"service.cells.addresses.caption" = "Адреса"; +"service.cells.only_shows_favorites.caption" = "Показывать только места из избранного"; "service.cells.vpn_survives_sleep.caption" = "Оставлять включенным во время сна"; "service.cells.vpn_resolves_hostname.caption" = "Разрешить имя хоста сервера"; +"service.cells.trusted_add_wifi.caption" = "Добавить Wi-Fi"; "service.cells.trusted_mobile.caption" = "Мобильная сеть"; "service.cells.trusted_policy.caption" = "Дов. сеть отключает VPN"; "service.cells.test_connectivity.caption" = "Проверить подключение"; @@ -159,8 +185,17 @@ "service.alerts.download.message" = "%@ необходимы дополнительные файлы конфигурации.\n\nПодтвердите для скачивания."; "service.alerts.download.failed" = "Не удалось скачать файлы конфигурации.%@"; "service.alerts.download.hud.extracting" = "Извлечение файлов, пожалуста подождите..."; +"service.alerts.location.message.denied" = "Вам нужно разрешить использование геопозиции для добавления этой Wi-Fi сети в доверенные. Перейдите в настройки iOS, и измените разрешения геолокации для Passepartout."; +"service.alerts.location.button.settings" = "Настройки"; + +"provider.pool.sections.empty_favorites.footer" = "Свайп в лево на локации, чтобы добавить или убрать из избранного."; +"provider.pool.actions.favorite" = "Добавить в избранное"; +"provider.pool.actions.unfavorite" = "Убрать из избранного"; + +"provider.preset.cells.tech_details.caption" = "Техническая информация"; "account.title" = "Аккаунт"; +"account.sections.credentials.header" = "Данные для входа"; "account.sections.guidance.footer.infrastructure.default.web" = "Используйте Ваши данные для входа с веб-сайта %@."; "account.sections.guidance.footer.infrastructure.default.specific" = "Используйте свои учетные данные %@ service, которые могут отличаться от учетных данных веб-сайта."; "account.sections.guidance.footer.infrastructure.mullvad" = "Используйте Ваши данные для входа с веб-сайта %@. Ваш логин обычно числовой с (без пробелов)."; @@ -179,11 +214,20 @@ "account.cells.signup.caption" = "Зарегистрируйтесь с %@"; "endpoint.title" = "Конечная точка"; +"endpoint.sections.location_addresses.header" = "Адреса"; +"endpoint.sections.location_protocols.header" = "Протоколы"; +"endpoint.cells.address" = "Адрес"; +"endpoint.cells.protocol" = "Протокол"; "endpoint.cells.any_address.caption" = "Автоматически"; "endpoint.cells.any_protocol.caption" = "Автоматически"; "network_settings.title" = "Сетевые настройки"; +"network_settings.cells.add_dns_server.caption" = "Добавить адрес"; +"network_settings.cells.add_dns_domain.caption" = "Добавить домен поиска"; +"network_settings.cells.proxy_bypass.caption" = "Обход домена"; +"network_settings.cells.add_proxy_bypass.caption" = "Добавить обходной домен"; +"configuration.title" = "Конфигурация"; "configuration.sections.communication.header" = "Связь"; "configuration.sections.reset.footer" = "Если после изменения параметров связи у Вас разорвалось соединение, нажмите, чтобы вернуться к исходной конфигурации."; "configuration.sections.tls.header" = "TLS"; @@ -212,11 +256,28 @@ "configuration.cells.renegotiation_seconds.caption" = "Перезаключение"; "configuration.cells.renegotiation_seconds.value.after" = "после %@"; "configuration.cells.random_endpoint.caption" = "Рандомная конечная точка"; +"configuration.alerts.commit.message" = "Новые параметры не вступят в силу до ручного переподключения. Изменения в доверенных сетях вступят в силу сразу."; +"configuration.alerts.commit.buttons.reconnect" = "Переподключиться"; +"configuration.alerts.commit.buttons.skip" = "Пропустить"; + +"trusted.columns.trust.title" = "Доверенные"; +"trusted.ethernet.title" = "Доверенные проводные подключения"; +"trusted.ethernet.description" = "Включите, чтобы добавить в доверенные проводное подключение."; + +"preferences.title" = "Настройки"; +"preferences.sections.general.header" = "Общие"; +"preferences.cells.launches_on_login.caption" = "Запускать при входе"; +"preferences.cells.launches_on_login.footer" = "Включите, чтобы приложение автоматически запускалось при загрузке или входе."; +"preferences.cells.confirm_quit.caption" = "Подтверждать выход"; +"preferences.cells.confirm_quit.footer" = "Включите, чтобы выход надо было подтверждать."; "network_settings.gateway.title" = "Шлюз по умолчанию"; "network_settings.dns.title" = "DNS"; +"network_settings.dns.cells.addresses.title" = "Серверы"; "network_settings.dns.cells.domain.caption" = "Домен"; +"network_settings.dns.cells.domains.title" = "Домены"; "network_settings.proxy.title" = "Прокси"; +"network_settings.proxy.cells.bypass_domains.title" = "Обходные домены"; "network_settings.mtu.title" = "MTU"; "network_settings.mtu.cells.bytes.caption" = "байты"; @@ -224,8 +285,10 @@ "debug_log.buttons.previous" = "Предыдущий"; "debug_log.buttons.next" = "Следующий"; +"debug_log.buttons.copy" = "Копировать"; "debug_log.alerts.empty_log.message" = "Журнал отладки пуст."; +"shortcuts.add.title" = "Создать команду"; "shortcuts.add.sections.vpn.header" = "VPN"; "shortcuts.add.sections.wifi.header" = "Wi-Fi"; "shortcuts.add.sections.cellular.header" = "Мобильная сеть"; @@ -238,7 +301,9 @@ "shortcuts.add.cells.untrust_cellular.caption" = "Не доверять мобильной сети"; "shortcuts.add.alerts.no_profiles.message" = "Нет профиля для подключения."; +"shortcuts.edit.title" = "Управлять командами"; "shortcuts.edit.sections.all.header" = "Существующие команды"; +"shortcuts.edit.cells.add_shortcut.caption" = "Создать команду"; "purchase.title" = "Покупка"; "purchase.sections.products.footer" = "Каждый продукт является разовой покупкой. Покупка провайдера не включает подписку на VPN."; @@ -275,3 +340,20 @@ "credits.sections.translations.header" = "Переводы"; "label.license.error" = "Не получается загрузить полную лицензию."; + +// iOS only + +"imported_hosts.title" = "Импортированные хост профили"; + +// macOS only + +"menu.show.title" = "Показать"; +"menu.switch_profile.title" = "Активный профиль"; +"menu.active_profile.title.none" = "Нет активных профилей"; +"menu.active_profile.items.customize.title" = "Настроить..."; +"menu.active_profile.messages.missing_credentials" = "Нет настроенных аккаунтов"; +"menu.organizer.title" = "Организатор"; +"menu.preferences.title" = "Настройки"; +"menu.support.title" = "Поддержка"; +"menu.quit.title" = "Выйти из %@"; +"menu.quit.messages.confirm" = "Если включить VPN, он всё равно будет работать в фоновом режиме. Вы точно хотите выйти?"; diff --git a/Passepartout/Core/Resources/sv.lproj/Core.strings b/Passepartout/Core/Resources/sv.lproj/Core.strings index c1f2136b..19d57622 100644 --- a/Passepartout/Core/Resources/sv.lproj/Core.strings +++ b/Passepartout/Core/Resources/sv.lproj/Core.strings @@ -53,6 +53,7 @@ "vpn.disconnecting" = "Koppla från"; "vpn.inactive" = "Inaktiv"; "vpn.disabled" = "Inaktiverad"; +"vpn.unused" = "Av"; "vpn.errors.timeout" = "Timeout"; "vpn.errors.dns" = "DNS misslyckades"; @@ -87,6 +88,11 @@ // //////////////////// +"organizer.title" = "%@"; +"organizer.menus.provider" = "Leverantör"; +"organizer.menus.provider.unavailable" = "Inga leverantörer kvar"; +"organizer.menus.host" = "Värd"; +/* //////////////////// */ "organizer.sections.twitch.header" = "Twitch"; "organizer.sections.twitch.footer" = "Kom och se mig göra Passepartout live på Twitch, gå med i chatten för att interagera och bidra!"; "organizer.sections.providers.header" = "Leverantörer"; @@ -107,17 +113,28 @@ "organizer.cells.translate.caption" = "Erbjuda att översätta"; "organizer.cells.about.caption" = "Om %@"; "organizer.cells.uninstall.caption" = "Ta bort VPN-konfiguration"; +"organizer.cells.add_provider.caption" = "Lägg till ny leverantör"; +"organizer.cells.add_host.caption" = "Lägg till från Filer"; +"organizer.cells.import_host.caption" = "Lägg till från importerad"; "organizer.alerts.exhausted_providers.message" = "Du har skapat profiler för alla tillgängliga leverantörer."; "organizer.alerts.add_host.message" = "Öppna en URL till en .ovpn konfigurationsfil från Safari, Mail eller en annan app för att skapa en värdprofil. \n\nDu kan också importera en .ovpn med iTunes Fildelning."; "organizer.alerts.cannot_donate.message" = "Det finns ingen betalningsmetod konfigurerad på den här enheten."; "organizer.alerts.delete_vpn_profile.message" = "Vill du verkligen radera VPN-konfigurationen från enhetens inställningar? Detta kan fixa några trasiga VPN tillstånd och påverkar inte dina leverantörs- och värdprofiler."; +"organizer.alerts.remove_profile.title" = "Ta bort profil"; +"organizer.alerts.remove_profile.message" = "Är det säkert att du vill ta bort profilen %@?"; +"organizer.alerts.open_host_file.title" = "Välj en .ovpn-fil"; "wizards.provider.cells.update_list.caption" = "Uppdatera listan"; "wizards.provider.alerts.unavailable.message" = "Det gick inte att ladda ner leverantörens infrastruktur, försök igen senare."; +"wizards.host.sections.existing.header" = "Befintliga profiler"; +"wizards.host.cells.title_input.caption" = "Namn"; "wizards.host.alerts.existing.message" = "En värdprofil med samma namn finns redan. Byt ut det?"; "service.welcome.message" = "Välkommen till Passepartout! \n\nAnvänd arrangören för att lägga till en ny profil."; +"service.sections.vpn.header" = "VPN"; "service.sections.vpn.footer" = "Anslutningen kommer att upprättas vid behov."; +"service.sections.status.header" = "Koppling"; +"service.sections.configuration.header" = "Konfiguration"; "service.sections.provider_infrastructure.footer" = "Senast uppdaterad på %@."; "service.sections.vpn_survives_sleep.footer" = "Inaktivera för att förbättra batterianvändningen, på bekostnad av tillfälliga avmattningar på grund av återuppkoppling."; "service.sections.vpn_resolves_hostname.footer" = "Föredragna i de flesta nätverk och krävs i vissa IPv6-nätverk. Inaktivera var DNS blockeras eller för att påskynda förhandlingar när DNS är långsamt att svara."; @@ -126,11 +143,20 @@ "service.sections.diagnostics.header" = "Diagnostics"; "service.sections.diagnostics.footer" = "Masking status kommer att fungera efter återanslutning. Nätverksdata är värdnamn, IP-adresser, routing, SSID. Referenser och privata nycklar loggas inte oavsett."; "service.cells.use_profile.caption" = "Använd den här profilen"; +"service.cells.vpn_service.caption" = "Aktiverad"; +"service.cells.vpn.turn_on.caption" = "Aktivera VPN"; +"service.cells.vpn.turn_off.caption" = "Inaktivera VPN"; "service.cells.connection_status.caption" = "Status"; +"service.cells.host.parameters.caption" = "Parametrar"; "service.cells.provider.pool.caption" = "Plats"; "service.cells.provider.preset.caption" = "Förinställt"; +"service.cells.provider.refresh.caption" = "Uppdatera infrastruktur"; +"service.cells.category.caption" = "Kategori"; +"service.cells.addresses.caption" = "Adresser"; +"service.cells.only_shows_favorites.caption" = "Visa endast favoritplatser"; "service.cells.vpn_survives_sleep.caption" = "Håll dig levande i sömnen"; "service.cells.vpn_resolves_hostname.caption" = "Lösa server värdnamn"; +"service.cells.trusted_add_wifi.caption" = "Lägg till Wi-Fi"; "service.cells.trusted_mobile.caption" = "Mobilt nätverk"; "service.cells.trusted_policy.caption" = "Förtroende inaktiverar VPN"; "service.cells.test_connectivity.caption" = "Testanslutning"; @@ -159,8 +185,17 @@ "service.alerts.download.message" = "%@ kräver nedladdning av ytterligare konfigurationsfiler. \n\nKontrollera för att starta nedladdningen."; "service.alerts.download.failed" = "Misslyckades med att ladda ner konfigurationsfiler. %@"; "service.alerts.download.hud.extracting" = "Extraherar filer, var så tålmodig ..."; +"service.alerts.location.message.denied" = "Du måste tillåta lägetillgång för att förlita detta nätverk. Öppna iOS inställningar och se över tillstånd för Passepartout."; +"service.alerts.location.button.settings" = "Inställningar"; + +"provider.pool.sections.empty_favorites.footer" = "Dra åt vänster på en plats för att lägga till eller ta bort den från favoriter."; +"provider.pool.actions.favorite" = "Favorit"; +"provider.pool.actions.unfavorite" = "Inte favorit"; + +"provider.preset.cells.tech_details.caption" = "Tekniska detaljer"; "account.title" = "Konto"; +"account.sections.credentials.header" = "Referenser"; "account.sections.guidance.footer.infrastructure.default.web" = "Använd dina %@ webbplatsuppgifter."; "account.sections.guidance.footer.infrastructure.default.specific" = "Använd dina %@ service-referenser, som kan skilja sig från webbplatsens referenser."; "account.sections.guidance.footer.infrastructure.mullvad" = "Använd dina %@ webbplatsuppgifter. Ditt användarnamn är vanligtvis numeriskt (utan utrymmen)."; @@ -179,11 +214,20 @@ "account.cells.signup.caption" = "Registrera med %@"; "endpoint.title" = "Slutpunkt"; +"endpoint.sections.location_addresses.header" = "Adresser"; +"endpoint.sections.location_protocols.header" = "Protokoll"; +"endpoint.cells.address" = "Adress"; +"endpoint.cells.protocol" = "Protokoll"; "endpoint.cells.any_address.caption" = "Automatiskt"; "endpoint.cells.any_protocol.caption" = "Automatiskt"; "network_settings.title" = "Nätverksinställningar"; +"network_settings.cells.add_dns_server.caption" = "Lägg till adress"; +"network_settings.cells.add_dns_domain.caption" = "Lägg till domän"; +"network_settings.cells.proxy_bypass.caption" = "Bypass-domän"; +"network_settings.cells.add_proxy_bypass.caption" = "Add bypass domain"; +"configuration.title" = "Konfiguration"; "configuration.sections.communication.header" = "Communication"; "configuration.sections.reset.footer" = "Om du slutade med bruten anslutning efter att ha ändrat kommunikationsparametrarna trycker du på för att återgå till den ursprungliga konfigurationen."; "configuration.sections.tls.header" = "TLS"; @@ -212,11 +256,28 @@ "configuration.cells.renegotiation_seconds.caption" = "Omförhandling"; "configuration.cells.renegotiation_seconds.value.after" = "efter %@"; "configuration.cells.random_endpoint.caption" = "Omställ slutpunkt på slumpmässigt sätt"; +"configuration.alerts.commit.message" = "Nya parametrar kommer inte att införas förrän du återansluter manuellt. Ändringar i betrodda nätverk kommer att införas omedelbart."; +"configuration.alerts.commit.buttons.reconnect" = "Återanslut nu"; +"configuration.alerts.commit.buttons.skip" = "Hoppa över"; + +"trusted.columns.trust.title" = "Betrodda"; +"trusted.ethernet.title" = "Lita på kabelanslutna uppkopplingar"; +"trusted.ethernet.description" = "Markera för att lita på alla kabelanslutna uppkopplingar."; + +"preferences.title" = "Inställningar"; +"preferences.sections.general.header" = "Allmänt"; +"preferences.cells.launches_on_login.caption" = "Öppna vid inloggning"; +"preferences.cells.launches_on_login.footer" = "Markera för att starta appen automatiskt efter omstart eller vid inloggning."; +"preferences.cells.confirm_quit.caption" = "Bekräfta lämna"; +"preferences.cells.confirm_quit.footer" = "Markera för att visa en uppmaning att bekräfta att man vill lämna appen."; "network_settings.gateway.title" = "Normal gateway"; "network_settings.dns.title" = "DNS"; +"network_settings.dns.cells.addresses.title" = "Servrar"; "network_settings.dns.cells.domain.caption" = "Domain"; +"network_settings.dns.cells.domains.title" = "Domäner"; "network_settings.proxy.title" = "Proxy"; +"network_settings.proxy.cells.bypass_domains.title" = "Kringgå domäner"; "network_settings.mtu.title" = "MTU"; "network_settings.mtu.cells.bytes.caption" = "Bytes"; @@ -224,8 +285,10 @@ "debug_log.buttons.previous" = "Previous"; "debug_log.buttons.next" = "Next"; +"debug_log.buttons.copy" = "Kopiera"; "debug_log.alerts.empty_log.message" = "Felsökningsloggen är tom."; +"shortcuts.add.title" = "Lägg till genväg"; "shortcuts.add.sections.vpn.header" = "VPN"; "shortcuts.add.sections.wifi.header" = "Wi-Fi"; "shortcuts.add.sections.cellular.header" = "Cellular"; @@ -238,7 +301,9 @@ "shortcuts.add.cells.untrust_cellular.caption" = "Untrust cellular network"; "shortcuts.add.alerts.no_profiles.message" = "Det finns ingen profil att ansluta till."; +"shortcuts.edit.title" = "Hantera genvägar"; "shortcuts.edit.sections.all.header" = "Befintliga genvägar"; +"shortcuts.edit.cells.add_shortcut.caption" = "Lägg till genväg"; "purchase.title" = "Köp"; "purchase.sections.products.footer" = "Varje produkt är ett engångsköp. Leverantörsköp inkluderar inte ett VPN-abonnemang."; @@ -275,3 +340,20 @@ "credits.sections.translations.header" = "Translations"; "label.license.error" = "Kan inte ladda ner fullständigt licensinnehåll."; + +// iOS only + +"imported_hosts.title" = "Importerade värdar"; + +// macOS only + +"menu.show.title" = "Visa"; +"menu.switch_profile.title" = "Aktiv profil"; +"menu.active_profile.title.none" = "Ingen aktiv profil"; +"menu.active_profile.items.customize.title" = "Anpassa"; +"menu.active_profile.messages.missing_credentials" = "Inget konto har konfigurerats"; +"menu.organizer.title" = "Organisatör"; +"menu.preferences.title" = "Inställningar"; +"menu.support.title" = "Support"; +"menu.quit.title" = "Lämna %@"; +"menu.quit.messages.confirm" = "Om ett VPN är aktiverat kommer detta fortfarande att köra i bakgrunden. Vill du lämna?"; diff --git a/Passepartout/Core/Resources/zh-Hans.lproj/Core.strings b/Passepartout/Core/Resources/zh-Hans.lproj/Core.strings index daff360e..8ae35004 100644 --- a/Passepartout/Core/Resources/zh-Hans.lproj/Core.strings +++ b/Passepartout/Core/Resources/zh-Hans.lproj/Core.strings @@ -53,6 +53,7 @@ "vpn.disconnecting" = "断开中"; "vpn.inactive" = "不活动"; "vpn.disabled" = "未启用"; +"vpn.unused" = "关"; "vpn.errors.timeout" = "超时"; "vpn.errors.dns" = "DNS解析失败"; @@ -87,6 +88,11 @@ // //////////////////// +"organizer.title" = "%@"; +"organizer.menus.provider" = "提供商"; +"organizer.menus.provider.unavailable" = "没有提供商了"; +"organizer.menus.host" = "主机"; +/* //////////////////// */ "organizer.sections.twitch.header" = "Twitch"; "organizer.sections.twitch.footer" = "快来看我让Passepartout在Twitch上直播,加入聊天互动并做出贡献!"; "organizer.sections.providers.header" = "提供商"; @@ -107,17 +113,28 @@ "organizer.cells.translate.caption" = "提供翻译"; "organizer.cells.about.caption" = "关于 %@"; "organizer.cells.uninstall.caption" = "移除VPN配置"; +"organizer.cells.add_provider.caption" = "添加新的提供商配置"; +"organizer.cells.add_host.caption" = "从文件添加"; +"organizer.cells.import_host.caption" = "从导入中添加"; "organizer.alerts.exhausted_providers.message" = "你已针对每个可用的提供商创建了配置。"; "organizer.alerts.add_host.message" = "从Safari、邮件或其他App中打开.ovpn文件的URL来设置主机配置。\n\n你同样可以通过iTunes文件分享来导入.ovpnf文件。"; "organizer.alerts.cannot_donate.message" = "此设备未设置付款方式。"; "organizer.alerts.delete_vpn_profile.message" = "你确定要从此设备移除VPN配置吗?这可能会固定一些断开的VPN状态,不会影响已经存在的配置。"; +"organizer.alerts.remove_profile.title" = "删除配置"; +"organizer.alerts.remove_profile.message" = "确定要删除配置%@吗?"; +"organizer.alerts.open_host_file.title" = "选择.ovpn文件"; "wizards.provider.cells.update_list.caption" = "更新列表"; "wizards.provider.alerts.unavailable.message" = "无法下载提供商基础架构,请稍后重试。"; +"wizards.host.sections.existing.header" = "已存在的配置"; +"wizards.host.cells.title_input.caption" = "名称"; "wizards.host.alerts.existing.message" = "已经存在同名的配置。要替换它吗?"; "service.welcome.message" = "欢迎使用Passepartout!\n\n使用分类页面来添加一个新的配置。"; +"service.sections.vpn.header" = "VPN"; "service.sections.vpn.footer" = "必要时连接将会建立。"; +"service.sections.status.header" = "连接"; +"service.sections.configuration.header" = "配置"; "service.sections.provider_infrastructure.footer" = "最后在%@时更新"; "service.sections.vpn_survives_sleep.footer" = "禁用以减少电池消耗,由于存在可能的唤醒时重连消耗。"; "service.sections.vpn_resolves_hostname.footer" = "推荐在大部分的网络中打开,并要求在IPv6环境下。当DNS被阻断或相应缓慢时禁用。"; @@ -126,11 +143,20 @@ "service.sections.diagnostics.header" = "分析数据"; "service.sections.diagnostics.footer" = "在重连后状态隐藏才有效。网络数据包括主机名、IP地址、路由、SSID、认证方式,但私钥不会出现在日志中。"; "service.cells.use_profile.caption" = "使用此配置"; +"service.cells.vpn_service.caption" = "已启用"; +"service.cells.vpn.turn_on.caption" = "启用VPN"; +"service.cells.vpn.turn_off.caption" = "禁用VPN"; "service.cells.connection_status.caption" = "状态"; +"service.cells.host.parameters.caption" = "参数"; "service.cells.provider.pool.caption" = "位置"; "service.cells.provider.preset.caption" = "预设"; +"service.cells.provider.refresh.caption" = "刷新基础设置"; +"service.cells.category.caption" = "类别"; +"service.cells.addresses.caption" = "地址"; +"service.cells.only_shows_favorites.caption" = "仅显示收藏的地点"; "service.cells.vpn_survives_sleep.caption" = "休眠时保持连接"; "service.cells.vpn_resolves_hostname.caption" = "解析服务器主机名"; +"service.cells.trusted_add_wifi.caption" = "新增Wi-Fi"; "service.cells.trusted_mobile.caption" = "蜂窝网络"; "service.cells.trusted_policy.caption" = "信任网络中禁用VPN"; "service.cells.test_connectivity.caption" = "测试连接性"; @@ -159,10 +185,19 @@ "service.alerts.download.message" = "%@要求下载额外的配置文件。\n\n确认以开始下载。"; "service.alerts.download.failed" = "下载配置文件失败。 %@"; "service.alerts.download.hud.extracting" = "提取文件中,请等待..."; +"service.alerts.location.message.denied" = "你必须允许位置访问以信任此Wi-Fi。请至iOS设置对Passepartout的位置权限。"; +"service.alerts.location.button.settings" = "设置"; + +"provider.pool.sections.empty_favorites.footer" = "向左轻扫以将其从最喜爱列表中移除或添加。"; +"provider.pool.actions.favorite" = "最喜爱"; +"provider.pool.actions.unfavorite" = "不喜爱"; + +"provider.preset.cells.tech_details.caption" = "技术细节"; "account.title" = "账户"; +"account.sections.credentials.header" = "认证方式"; "account.sections.guidance.footer.infrastructure.default.web" = "使用你的%@网站认证信息。"; -"account.sections.guidance.footer.infrastructure.default.specific" = "使用您的%@服务凭据,该凭据可能与网站凭据不同。"; +"account.sections.guidance.footer.infrastructure.default.specific" = "使用您的%@服务凭据,该凭据可能与网站凭据不同。"; "account.sections.guidance.footer.infrastructure.mullvad" = "使用你的%@网站认证信息。你的用户名一般是数字 (没有空格)。"; "account.sections.guidance.footer.infrastructure.nordvpn" = "使用你的%@网站认证信息。你的用户名一般是你的e-mail。"; "account.sections.guidance.footer.infrastructure.pia" = "使用你的%@网站认证信息。你的用户名一般是数字且带有前缀\"p\"。"; @@ -179,11 +214,20 @@ "account.cells.signup.caption" = "以%@注册"; "endpoint.title" = "服务端"; +"endpoint.sections.location_addresses.header" = "地址"; +"endpoint.sections.location_protocols.header" = "协议"; +"endpoint.cells.address" = "地址"; +"endpoint.cells.protocol" = "协议"; "endpoint.cells.any_address.caption" = "自动"; "endpoint.cells.any_protocol.caption" = "自动"; "network_settings.title" = "网络设置"; +"network_settings.cells.add_dns_server.caption" = "添加地址"; +"network_settings.cells.add_dns_domain.caption" = "添加搜索域名"; +"network_settings.cells.proxy_bypass.caption" = "旁路域名"; +"network_settings.cells.add_proxy_bypass.caption" = "添加旁路域名"; +"configuration.title" = "配置"; "configuration.sections.communication.header" = "通信"; "configuration.sections.reset.footer" = "如果你在更改连接参数后变成断开状态,点按已恢复到原始的配置。"; "configuration.sections.tls.header" = "TLS"; @@ -212,11 +256,28 @@ "configuration.cells.renegotiation_seconds.caption" = "重协商"; "configuration.cells.renegotiation_seconds.value.after" = "在%@之后"; "configuration.cells.random_endpoint.caption" = "随机的服务端"; +"configuration.alerts.commit.message" = "除非手动重新连接,否则新参数将无效。受信任的网络中的更改将立即生效。"; +"configuration.alerts.commit.buttons.reconnect" = "立即重新连接"; +"configuration.alerts.commit.buttons.skip" = "跳过"; + +"trusted.columns.trust.title" = "信任"; +"trusted.ethernet.title" = "信任有线连接"; +"trusted.ethernet.description" = "选中以信任所有有线连接。"; + +"preferences.title" = "偏好设置"; +"preferences.sections.general.header" = "一般"; +"preferences.cells.launches_on_login.caption" = "登录时启动"; +"preferences.cells.launches_on_login.footer" = "选中以在启动或登录时自动启动应用。"; +"preferences.cells.confirm_quit.caption" = "确认退出"; +"preferences.cells.confirm_quit.footer" = "选中以显示退出确认提醒。"; "network_settings.gateway.title" = "默认网关"; "network_settings.dns.title" = "DNS"; +"network_settings.dns.cells.addresses.title" = "服务器"; "network_settings.dns.cells.domain.caption" = "域名"; +"network_settings.dns.cells.domains.title" = "域"; "network_settings.proxy.title" = "代理"; +"network_settings.proxy.cells.bypass_domains.title" = "旁路域"; "network_settings.mtu.title" = "MTU"; "network_settings.mtu.cells.bytes.caption" = "Bytes"; @@ -224,8 +285,10 @@ "debug_log.buttons.previous" = "上一步"; "debug_log.buttons.next" = "下一步"; +"debug_log.buttons.copy" = "复制"; "debug_log.alerts.empty_log.message" = "日志为空"; +"shortcuts.add.title" = "添加捷径"; "shortcuts.add.sections.vpn.header" = "VPN"; "shortcuts.add.sections.wifi.header" = "Wi-Fi"; "shortcuts.add.sections.cellular.header" = "蜂窝网络"; @@ -238,7 +301,9 @@ "shortcuts.add.cells.untrust_cellular.caption" = "不信任蜂窝网络"; "shortcuts.add.alerts.no_profiles.message" = "没有可以连接的配置。"; +"shortcuts.edit.title" = "管理捷径"; "shortcuts.edit.sections.all.header" = "已经存在的捷径"; +"shortcuts.edit.cells.add_shortcut.caption" = "添加捷径"; "purchase.title" = "购买"; "purchase.sections.products.footer" = "每件产品都是一次性的购买。 购买的提供商并不包含VPN订阅。"; @@ -275,3 +340,20 @@ "credits.sections.translations.header" = "翻译"; "label.license.error" = "不能下载到完整的许可证内容。"; + +// iOS only + +"imported_hosts.title" = "导入主机配置"; + +// macOS only + +"menu.show.title" = "显示"; +"menu.switch_profile.title" = "有效配置"; +"menu.active_profile.title.none" = "无有效配置"; +"menu.active_profile.items.customize.title" = "自定义......"; +"menu.active_profile.messages.missing_credentials" = "未配置账户"; +"menu.organizer.title" = "分类页面"; +"menu.preferences.title" = "偏好设置"; +"menu.support.title" = "支持"; +"menu.quit.title" = "退出%@"; +"menu.quit.messages.confirm" = "VPN(如果启用)仍将在后台运行。您要退出吗?"; diff --git a/scripts/import-onesky-translations.sh b/scripts/import-onesky-translations.sh index 9f24246b..05dd97dd 100755 --- a/scripts/import-onesky-translations.sh +++ b/scripts/import-onesky-translations.sh @@ -1,7 +1,6 @@ #!/bin/sh SRC="$1" DST="$2" -for LANG in "de" "el" "en" "es" "fr" "it" "nl" "pl" "ru" "sv" "zh-Hans"; do - cp $SRC/$LANG/* $DST/$LANG.lproj/* +for LANG in "de" "el" "en" "es" "fr" "it" "nl" "pl" "pt" "ru" "sv" "zh-Hans"; do + cp $SRC/$LANG/* $DST/$LANG.lproj done -cp $SRC/pt-PT/* $DST/pt.lproj/* From 0ebddc6a680cbe3f15d10227db6c2967c8d423a4 Mon Sep 17 00:00:00 2001 From: Davide De Rosa Date: Sat, 7 Aug 2021 13:57:22 +0200 Subject: [PATCH 5/5] Drop unused app strings and redo SwiftGen Prefix is now just L10n without strings filename. --- Passepartout.xcodeproj/project.pbxproj | 68 - Passepartout/App/Descriptible.swift | 42 +- .../App/iOS/Global/HostImporter.swift | 22 +- .../App/iOS/Global/IssueReporter.swift | 10 +- .../App/iOS/Global/SwiftGen+Strings.swift | 2163 ++++++++------- Passepartout/App/iOS/Global/Theme+Cells.swift | 30 +- Passepartout/App/iOS/Global/Theme.swift | 2 +- .../Scenes/About/AboutViewController.swift | 36 +- .../iOS/Scenes/AccountViewController.swift | 18 +- .../Scenes/ConfigurationViewController.swift | 18 +- .../iOS/Scenes/DebugLogViewController.swift | 6 +- .../iOS/Scenes/EndpointViewController.swift | 10 +- .../NetworkSettingsViewController.swift | 54 +- .../Organizer/DonationViewController.swift | 16 +- .../ImportedHostsViewController.swift | 2 +- .../Organizer/OrganizerViewController.swift | 80 +- .../Organizer/WizardHostViewController.swift | 16 +- .../WizardProviderViewController.swift | 8 +- .../Scenes/ProviderPoolViewController.swift | 10 +- .../Scenes/ProviderPresetViewController.swift | 6 +- .../Purchase/PurchaseViewController.swift | 10 +- .../Scenes/ServerNetworkViewController.swift | 32 +- .../iOS/Scenes/ServiceViewController.swift | 190 +- .../ShortcutsAddViewController.swift | 28 +- .../ShortcutsConnectToViewController.swift | 6 +- .../Shortcuts/ShortcutsViewController.swift | 10 +- Passepartout/App/iOS/de.lproj/App.strings | 65 - Passepartout/App/iOS/el.lproj/App.strings | 65 - Passepartout/App/iOS/en.lproj/App.strings | 24 - Passepartout/App/iOS/es.lproj/App.strings | 65 - Passepartout/App/iOS/fr.lproj/App.strings | 65 - Passepartout/App/iOS/it.lproj/App.strings | 65 - Passepartout/App/iOS/nl.lproj/App.strings | 65 - Passepartout/App/iOS/pl.lproj/App.strings | 65 - Passepartout/App/iOS/pt.lproj/App.strings | 65 - Passepartout/App/iOS/ru.lproj/App.strings | 65 - Passepartout/App/iOS/sv.lproj/App.strings | 65 - Passepartout/App/iOS/swiftgen.yml | 1 - .../App/iOS/zh-Hans.lproj/App.strings | 65 - Passepartout/App/macOS/AppDelegate.swift | 10 +- .../App/macOS/Global/HostImporter.swift | 26 +- .../App/macOS/Global/IssueReporter.swift | 4 +- .../App/macOS/Global/SwiftGen+Strings.swift | 2345 +++++++++-------- .../Global/TextInputViewController.swift | 4 +- .../App/macOS/Global/Theme+Views.swift | 14 +- .../App/macOS/Global/WindowManager.swift | 2 +- Passepartout/App/macOS/Menu/StatusMenu.swift | 64 +- .../Scenes/OrganizerViewController.swift | 38 +- .../Preferences/DebugLogViewController.swift | 24 +- .../PreferencesGeneralViewController.swift | 12 +- .../PreferencesViewController.swift | 4 +- .../Purchase/PurchaseViewController.swift | 12 +- .../Service/AccountViewController.swift | 14 +- .../ConfigurationViewController.swift | 6 +- .../Customization/DNSViewController.swift | 6 +- .../EndpointViewController.swift | 8 +- .../Customization/MTUViewController.swift | 6 +- .../ProfileCustomizationViewController.swift | 26 +- .../Customization/ProxyViewController.swift | 10 +- .../TrustedNetworksAddViewController.swift | 4 +- .../TrustedNetworksViewController.swift | 18 +- .../Scenes/Service/HostServiceView.swift | 2 +- .../Scenes/Service/ProviderServiceView.swift | 12 +- .../Service/ServiceViewController.swift | 26 +- Passepartout/App/macOS/de.lproj/App.strings | 77 - Passepartout/App/macOS/el.lproj/App.strings | 77 - Passepartout/App/macOS/en.lproj/App.strings | 24 - Passepartout/App/macOS/es.lproj/App.strings | 77 - Passepartout/App/macOS/fr.lproj/App.strings | 77 - Passepartout/App/macOS/it.lproj/App.strings | 77 - Passepartout/App/macOS/nl.lproj/App.strings | 77 - Passepartout/App/macOS/pl.lproj/App.strings | 77 - Passepartout/App/macOS/pt.lproj/App.strings | 77 - Passepartout/App/macOS/ru.lproj/App.strings | 77 - Passepartout/App/macOS/sv.lproj/App.strings | 77 - Passepartout/App/macOS/swiftgen.yml | 1 - .../App/macOS/zh-Hans.lproj/App.strings | 77 - 77 files changed, 2871 insertions(+), 4331 deletions(-) delete mode 100644 Passepartout/App/iOS/de.lproj/App.strings delete mode 100644 Passepartout/App/iOS/el.lproj/App.strings delete mode 100644 Passepartout/App/iOS/en.lproj/App.strings delete mode 100644 Passepartout/App/iOS/es.lproj/App.strings delete mode 100644 Passepartout/App/iOS/fr.lproj/App.strings delete mode 100644 Passepartout/App/iOS/it.lproj/App.strings delete mode 100644 Passepartout/App/iOS/nl.lproj/App.strings delete mode 100644 Passepartout/App/iOS/pl.lproj/App.strings delete mode 100644 Passepartout/App/iOS/pt.lproj/App.strings delete mode 100644 Passepartout/App/iOS/ru.lproj/App.strings delete mode 100644 Passepartout/App/iOS/sv.lproj/App.strings delete mode 100644 Passepartout/App/iOS/zh-Hans.lproj/App.strings delete mode 100644 Passepartout/App/macOS/de.lproj/App.strings delete mode 100644 Passepartout/App/macOS/el.lproj/App.strings delete mode 100644 Passepartout/App/macOS/en.lproj/App.strings delete mode 100644 Passepartout/App/macOS/es.lproj/App.strings delete mode 100644 Passepartout/App/macOS/fr.lproj/App.strings delete mode 100644 Passepartout/App/macOS/it.lproj/App.strings delete mode 100644 Passepartout/App/macOS/nl.lproj/App.strings delete mode 100644 Passepartout/App/macOS/pl.lproj/App.strings delete mode 100644 Passepartout/App/macOS/pt.lproj/App.strings delete mode 100644 Passepartout/App/macOS/ru.lproj/App.strings delete mode 100644 Passepartout/App/macOS/sv.lproj/App.strings delete mode 100644 Passepartout/App/macOS/zh-Hans.lproj/App.strings diff --git a/Passepartout.xcodeproj/project.pbxproj b/Passepartout.xcodeproj/project.pbxproj index 42161d96..be512e3b 100644 --- a/Passepartout.xcodeproj/project.pbxproj +++ b/Passepartout.xcodeproj/project.pbxproj @@ -59,7 +59,6 @@ 0E36D25C224034AD006AF062 /* ShortcutsConnectToViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E36D25B224034AD006AF062 /* ShortcutsConnectToViewController.swift */; }; 0E3CAFC0229AAE770008E5C8 /* Intents.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = 0E3CAFAD229AAE760008E5C8 /* Intents.intentdefinition */; }; 0E3CAFC4229AAF8E0008E5C8 /* API in Resources */ = {isa = PBXBuildFile; fileRef = 0E3CAFC3229AAF8E0008E5C8 /* API */; }; - 0E45E6E022BD793800F19312 /* App.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0E45E6E222BD793800F19312 /* App.strings */; }; 0E45E6E422BD799700F19312 /* SwiftGen+Strings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E45E6E322BD799700F19312 /* SwiftGen+Strings.swift */; }; 0E45E71022BE108100F19312 /* OpenVPNOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E45E70F22BE108100F19312 /* OpenVPNOptions.swift */; }; 0E4B0D6B2366E3C100C890B4 /* PurchaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E4B0D6A2366E3C000C890B4 /* PurchaseViewController.swift */; }; @@ -109,7 +108,6 @@ 0E520385259F593B00CBAB56 /* Credits.html in Resources */ = {isa = PBXBuildFile; fileRef = 0E569FA4259F41690022DFB8 /* Credits.html */; }; 0E520387259F593B00CBAB56 /* TextInputViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E569F97259F41690022DFB8 /* TextInputViewController.swift */; }; 0E520388259F593B00CBAB56 /* HostImporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E569F93259F41690022DFB8 /* HostImporter.swift */; }; - 0E52038F259F593F00CBAB56 /* App.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0E569F8D259F41690022DFB8 /* App.strings */; }; 0E5203B6259F5F3F00CBAB56 /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0ED31C3920CF39510027975F /* NetworkExtension.framework */; }; 0E5203BE259F5F3F00CBAB56 /* PassepartoutTunnel.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 0E5203B5259F5F3F00CBAB56 /* PassepartoutTunnel.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 0E5203F1259F60D600CBAB56 /* PassepartoutCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0E5203EA259F60D600CBAB56 /* PassepartoutCore.framework */; }; @@ -361,7 +359,6 @@ 0E1066C820E0F84A004F98B7 /* Cells.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Cells.swift; sourceTree = ""; }; 0E158AD920E11B0B00C85A82 /* EndpointViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EndpointViewController.swift; sourceTree = ""; }; 0E1C0A50238FFF97009FC087 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Intents.strings; sourceTree = ""; }; - 0E1C0A51238FFF97009FC087 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/App.strings; sourceTree = ""; }; 0E1C0A52238FFF97009FC087 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/InfoPlist.strings; sourceTree = ""; }; 0E1C0A53238FFF97009FC087 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Core.strings; sourceTree = ""; }; 0E1D72B1213BFFCF00BA1586 /* ProviderPresetViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProviderPresetViewController.swift; sourceTree = ""; }; @@ -375,7 +372,6 @@ 0E2B494120FD16540094784C /* TransientStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransientStore.swift; sourceTree = ""; }; 0E2C54C3230056C800F59453 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Intents.strings"; sourceTree = ""; }; 0E2C54C4230056EF00F59453 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Core.strings"; sourceTree = ""; }; - 0E2C54C52300570200F59453 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/App.strings"; sourceTree = ""; }; 0E2D11B9217DBEDE0096822C /* ConnectionService+Configurations.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ConnectionService+Configurations.swift"; sourceTree = ""; }; 0E31529B223F9EF400F61841 /* PassepartoutCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PassepartoutCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 0E31529D223F9EF500F61841 /* PassepartoutCore.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PassepartoutCore.h; sourceTree = ""; }; @@ -396,17 +392,7 @@ 0E3CAFB3229AAE760008E5C8 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Core.strings; sourceTree = ""; }; 0E3CAFB5229AAE760008E5C8 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Core.strings; sourceTree = ""; }; 0E3CAFC3229AAF8E0008E5C8 /* API */ = {isa = PBXFileReference; lastKnownFileType = folder; path = API; sourceTree = ""; }; - 0E45E6E122BD793800F19312 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/App.strings; sourceTree = ""; }; 0E45E6E322BD799700F19312 /* SwiftGen+Strings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SwiftGen+Strings.swift"; sourceTree = ""; }; - 0E45E6F122BD897E00F19312 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/App.strings; sourceTree = ""; }; - 0E45E6F222BD898000F19312 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/App.strings; sourceTree = ""; }; - 0E45E6F322BD898200F19312 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/App.strings; sourceTree = ""; }; - 0E45E6F422BD898300F19312 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/App.strings; sourceTree = ""; }; - 0E45E6F522BD898500F19312 /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/App.strings; sourceTree = ""; }; - 0E45E6F622BD898700F19312 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/App.strings; sourceTree = ""; }; - 0E45E6F722BD898800F19312 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/App.strings; sourceTree = ""; }; - 0E45E6F822BD898A00F19312 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/App.strings; sourceTree = ""; }; - 0E45E6F922BD898B00F19312 /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/App.strings; sourceTree = ""; }; 0E45E70F22BE108100F19312 /* OpenVPNOptions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenVPNOptions.swift; sourceTree = ""; }; 0E4B0D6A2366E3C000C890B4 /* PurchaseViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PurchaseViewController.swift; sourceTree = ""; }; 0E4B0D752366E6C800C890B4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Purchase.storyboard; sourceTree = ""; }; @@ -465,7 +451,6 @@ 0E569F8A259F41690022DFB8 /* MainMenu.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MainMenu.xib; sourceTree = ""; }; 0E569F8B259F41690022DFB8 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 0E569F8F259F41690022DFB8 /* IssueReporter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IssueReporter.swift; sourceTree = ""; }; - 0E569F91259F41690022DFB8 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/App.strings; sourceTree = ""; }; 0E569F92259F41690022DFB8 /* WindowManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WindowManager.swift; sourceTree = ""; }; 0E569F93259F41690022DFB8 /* HostImporter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HostImporter.swift; sourceTree = ""; }; 0E569F94259F41690022DFB8 /* NSTextView+Search.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSTextView+Search.swift"; sourceTree = ""; }; @@ -544,17 +529,6 @@ 0EBE3A9F213DC1A100BFA2F5 /* ConnectionService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConnectionService.swift; sourceTree = ""; }; 0EBE3AA3213DC1B000BFA2F5 /* HostConnectionProfile.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HostConnectionProfile.swift; sourceTree = ""; }; 0EBE3AA4213DC1B000BFA2F5 /* ProviderConnectionProfile.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProviderConnectionProfile.swift; sourceTree = ""; }; - 0EBE8D2E25C076F900798607 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/App.strings; sourceTree = ""; }; - 0EC12E9726283DEC007287DD /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/App.strings"; sourceTree = ""; }; - 0EC12E9826283DEE007287DD /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/App.strings; sourceTree = ""; }; - 0EC12E9926283DEF007287DD /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/App.strings; sourceTree = ""; }; - 0EC12E9A26283DF0007287DD /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/App.strings; sourceTree = ""; }; - 0EC12E9B26283DF2007287DD /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/App.strings; sourceTree = ""; }; - 0EC12E9C26283DF3007287DD /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/App.strings; sourceTree = ""; }; - 0EC12E9D26283DF4007287DD /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/App.strings; sourceTree = ""; }; - 0EC12E9E26283DF6007287DD /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/App.strings; sourceTree = ""; }; - 0EC12E9F26283DF8007287DD /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/App.strings; sourceTree = ""; }; - 0EC12EA026283DF9007287DD /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/App.strings; sourceTree = ""; }; 0EC7F20420E24308004EA58E /* DebugLog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DebugLog.swift; sourceTree = ""; }; 0ECC60DD2256B6890020BEAC /* SwiftGen+Assets.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SwiftGen+Assets.swift"; sourceTree = ""; }; 0ECEB105224FE51400E9E551 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; @@ -783,7 +757,6 @@ 0E569F59259F41690022DFB8 /* Tables */, 0E569F7E259F41690022DFB8 /* App.entitlements */, 0E569FA8259F41690022DFB8 /* Info.plist */, - 0E569F8D259F41690022DFB8 /* App.strings */, 0E569F8B259F41690022DFB8 /* AppDelegate.swift */, 0E569F7F259F41690022DFB8 /* Assets.xcassets */, 0E569FA7259F41690022DFB8 /* Flags.xcassets */, @@ -937,7 +910,6 @@ 0E2AC24422EC3AC10037B4B0 /* Settings.bundle */, 0EDE8DE220C86A13004C739C /* App.entitlements */, 0E57F64720C83FC7008323CF /* Info.plist */, - 0E45E6E222BD793800F19312 /* App.strings */, 0E0C072B236087A100155AAC /* InfoPlist.strings */, 0E57F63B20C83FC5008323CF /* AppDelegate.swift */, 0E57F64220C83FC7008323CF /* Assets.xcassets */, @@ -1516,7 +1488,6 @@ 0E520336259F58F500CBAB56 /* HostServiceView.xib in Resources */, 0E52031D259F58BF00CBAB56 /* Providers.xcassets in Resources */, 0E52047D259F642600CBAB56 /* Preferences.storyboard in Resources */, - 0E52038F259F593F00CBAB56 /* App.strings in Resources */, 0E6BA54B25C9EE3A000CDFAC /* Purchase.storyboard in Resources */, 0E520385259F593B00CBAB56 /* Credits.html in Resources */, 0E52047C259F642600CBAB56 /* Service.storyboard in Resources */, @@ -1562,7 +1533,6 @@ 0E57F64120C83FC5008323CF /* Main.storyboard in Resources */, 0E4B0D742366E6C800C890B4 /* Purchase.storyboard in Resources */, 0E2AC24522EC3AC10037B4B0 /* Settings.bundle in Resources */, - 0E45E6E022BD793800F19312 /* App.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2199,25 +2169,6 @@ name = Intents.intentdefinition; sourceTree = ""; }; - 0E45E6E222BD793800F19312 /* App.strings */ = { - isa = PBXVariantGroup; - children = ( - 0E45E6E122BD793800F19312 /* en */, - 0E45E6F122BD897E00F19312 /* it */, - 0E45E6F222BD898000F19312 /* de */, - 0E45E6F322BD898200F19312 /* ru */, - 0E45E6F422BD898300F19312 /* nl */, - 0E45E6F522BD898500F19312 /* el */, - 0E45E6F622BD898700F19312 /* sv */, - 0E45E6F722BD898800F19312 /* fr */, - 0E45E6F822BD898A00F19312 /* es */, - 0E45E6F922BD898B00F19312 /* pt */, - 0E2C54C52300570200F59453 /* zh-Hans */, - 0E1C0A51238FFF97009FC087 /* pl */, - ); - name = App.strings; - sourceTree = ""; - }; 0E4B0D762366E6C800C890B4 /* Purchase.storyboard */ = { isa = PBXVariantGroup; children = ( @@ -2258,25 +2209,6 @@ name = Main.storyboard; sourceTree = ""; }; - 0E569F8D259F41690022DFB8 /* App.strings */ = { - isa = PBXVariantGroup; - children = ( - 0E569F91259F41690022DFB8 /* en */, - 0EBE8D2E25C076F900798607 /* it */, - 0EC12E9726283DEC007287DD /* zh-Hans */, - 0EC12E9826283DEE007287DD /* nl */, - 0EC12E9926283DEF007287DD /* fr */, - 0EC12E9A26283DF0007287DD /* de */, - 0EC12E9B26283DF2007287DD /* el */, - 0EC12E9C26283DF3007287DD /* pl */, - 0EC12E9D26283DF4007287DD /* pt */, - 0EC12E9E26283DF6007287DD /* ru */, - 0EC12E9F26283DF8007287DD /* es */, - 0EC12EA026283DF9007287DD /* sv */, - ); - name = App.strings; - sourceTree = ""; - }; 0E57F63F20C83FC5008323CF /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( diff --git a/Passepartout/App/Descriptible.swift b/Passepartout/App/Descriptible.swift index bfe73c93..b4105a75 100644 --- a/Passepartout/App/Descriptible.swift +++ b/Passepartout/App/Descriptible.swift @@ -45,10 +45,10 @@ extension OpenVPN.Digest: UIDescriptible { extension OpenVPN.CompressionFraming: UIDescriptible { public var uiDescription: String { - let V = L10n.Core.Configuration.Cells.self + let V = L10n.Configuration.Cells.self switch self { case .disabled: - return L10n.Core.Global.Values.disabled + return L10n.Global.Values.disabled case .compLZO: return V.CompressionFraming.Value.lzo @@ -61,10 +61,10 @@ extension OpenVPN.CompressionFraming: UIDescriptible { extension OpenVPN.CompressionAlgorithm: UIDescriptible { public var uiDescription: String { - let V = L10n.Core.Configuration.Cells.self + let V = L10n.Configuration.Cells.self switch self { case .disabled: - return L10n.Core.Global.Values.disabled + return L10n.Global.Values.disabled case .LZO: return V.CompressionAlgorithm.Value.lzo @@ -77,7 +77,7 @@ extension OpenVPN.CompressionAlgorithm: UIDescriptible { extension OpenVPN.ConfigurationBuilder { public var uiDescriptionForTLSWrap: String { - let V = L10n.Core.Configuration.Cells.self + let V = L10n.Configuration.Cells.self if let strategy = tlsWrap?.strategy { switch strategy { case .auth: @@ -87,45 +87,45 @@ extension OpenVPN.ConfigurationBuilder { return V.TlsWrapping.Value.crypt } } else { - return L10n.Core.Global.Values.disabled + return L10n.Global.Values.disabled } } public var uiDescriptionForKeepAlive: String { - let V = L10n.Core.Configuration.Cells.self + let V = L10n.Configuration.Cells.self if let keepAlive = keepAliveInterval, keepAlive > 0 { return V.KeepAlive.Value.seconds(Int(keepAlive)) } else { - return L10n.Core.Global.Values.disabled + return L10n.Global.Values.disabled } } public var uiDescriptionForClientCertificate: String { - let V = L10n.Core.Configuration.Cells.Client.Value.self + let V = L10n.Configuration.Cells.Client.Value.self return (clientCertificate != nil) ? V.enabled : V.disabled } public var uiDescriptionForEKU: String { - let V = L10n.Core.Global.Values.self + let V = L10n.Global.Values.self return (checksEKU ?? false) ? V.enabled : V.disabled } public var uiDescriptionForRenegotiatesAfter: String { - let V = L10n.Core.Configuration.Cells.self + let V = L10n.Configuration.Cells.self if let reneg = renegotiatesAfter, reneg > 0 { return V.RenegotiationSeconds.Value.after(TimeInterval(reneg).localized) } else { - return L10n.Core.Global.Values.disabled + return L10n.Global.Values.disabled } } public var uiDescriptionForRandomizeEndpoint: String { - let V = L10n.Core.Global.Values.self + let V = L10n.Global.Values.self return (randomizeEndpoint ?? false) ? V.enabled : V.disabled } public var uiDescriptionForXOR: String { - let V = L10n.Core.Global.Values.self + let V = L10n.Global.Values.self guard let mask = xorMask, mask != 0 else { return V.disabled } @@ -138,13 +138,13 @@ extension NetworkChoice: CustomStringConvertible { public var description: String { switch self { case .client: - return L10n.Core.NetworkChoice.client + return L10n.NetworkChoice.client case .server: - return L10n.Core.NetworkChoice.server + return L10n.NetworkChoice.server case .manual: - return L10n.Core.Global.Values.manual + return L10n.Global.Values.manual } } } @@ -168,16 +168,16 @@ extension VPNStatus: UIDescriptible { public var uiDescription: String { switch self { case .connecting: - return L10n.Core.Vpn.connecting + return L10n.Vpn.connecting case .connected: - return L10n.Core.Vpn.active + return L10n.Vpn.active case .disconnecting: - return L10n.Core.Vpn.disconnecting + return L10n.Vpn.disconnecting case .disconnected: - return L10n.Core.Vpn.inactive + return L10n.Vpn.inactive } } } diff --git a/Passepartout/App/iOS/Global/HostImporter.swift b/Passepartout/App/iOS/Global/HostImporter.swift index f715486a..6eca8e80 100644 --- a/Passepartout/App/iOS/Global/HostImporter.swift +++ b/Passepartout/App/iOS/Global/HostImporter.swift @@ -75,7 +75,7 @@ class HostImporter { private func alertImportError(_ error: Error, removeOnError: Bool) { let message = HostImporter.localizedMessage(forError: error) let alert = UIAlertController.asAlert(configurationURL.normalizedFilename, message) - alert.addCancelAction(L10n.Core.Global.ok) + alert.addCancelAction(L10n.Global.ok) viewController?.present(alert, animated: true, completion: nil) if removeOnError { @@ -85,11 +85,11 @@ class HostImporter { private func alertImportWarning(_ warning: ConfigurationError, removeOnCancel: Bool, completionHandler: @escaping () -> Void) { let message = HostImporter.localizedDetailsMessage(forWarning: warning) - let alert = UIAlertController.asAlert(configurationURL.normalizedFilename, L10n.Core.ParsedFile.Alerts.PotentiallyUnsupported.message(message)) - alert.addPreferredAction(L10n.Core.Global.ok) { + let alert = UIAlertController.asAlert(configurationURL.normalizedFilename, L10n.ParsedFile.Alerts.PotentiallyUnsupported.message(message)) + alert.addPreferredAction(L10n.Global.ok) { completionHandler() } - alert.addCancelAction(L10n.Core.Global.cancel) { + alert.addCancelAction(L10n.Global.cancel) { if removeOnCancel { try? FileManager.default.removeItem(at: self.configurationURL) } @@ -98,11 +98,11 @@ class HostImporter { } private func enterPassphraseForHost(at url: URL, removeOnError: Bool, removeOnCancel: Bool, completionHandler: @escaping (OpenVPN.ConfigurationParser.Result) -> Void) { - let alert = UIAlertController.asAlert(configurationURL.normalizedFilename, L10n.Core.ParsedFile.Alerts.EncryptionPassphrase.message) + let alert = UIAlertController.asAlert(configurationURL.normalizedFilename, L10n.ParsedFile.Alerts.EncryptionPassphrase.message) alert.addTextField { (field) in field.isSecureTextEntry = true } - alert.addPreferredAction(L10n.Core.Global.ok) { + alert.addPreferredAction(L10n.Global.ok) { guard let passphrase = alert.textFields?.first?.text else { return } @@ -113,7 +113,7 @@ class HostImporter { completionHandler: completionHandler ) } - alert.addCancelAction(L10n.Core.Global.cancel) { + alert.addCancelAction(L10n.Global.cancel) { if removeOnCancel { try? FileManager.default.removeItem(at: url) } @@ -128,25 +128,25 @@ class HostImporter { switch appError { case .malformed(let option): log.error("Could not parse configuration URL: malformed option, \(option)") - return L10n.Core.ParsedFile.Alerts.Malformed.message(option) + return L10n.ParsedFile.Alerts.Malformed.message(option) case .missingConfiguration(let option): log.error("Could not parse configuration URL: missing configuration, \(option)") - return L10n.Core.ParsedFile.Alerts.Missing.message(option) + return L10n.ParsedFile.Alerts.Missing.message(option) case .unsupportedConfiguration(var option): if option.contains("external") { option.append(" (see FAQ)") } log.error("Could not parse configuration URL: unsupported configuration, \(option)") - return L10n.Core.ParsedFile.Alerts.Unsupported.message(option) + return L10n.ParsedFile.Alerts.Unsupported.message(option) default: break } } log.error("Could not parse configuration URL: \(error)") - return L10n.Core.ParsedFile.Alerts.Parsing.message(error.localizedDescription) + return L10n.ParsedFile.Alerts.Parsing.message(error.localizedDescription) } private static func localizedDetailsMessage(forWarning warning: ConfigurationError) -> String { diff --git a/Passepartout/App/iOS/Global/IssueReporter.swift b/Passepartout/App/iOS/Global/IssueReporter.swift index 1a2eedcd..43933747 100644 --- a/Passepartout/App/iOS/Global/IssueReporter.swift +++ b/Passepartout/App/iOS/Global/IssueReporter.swift @@ -43,8 +43,8 @@ class IssueReporter: NSObject { let V = AppConstants.IssueReporter.Email.self let body = V.body(V.template, DebugLog(raw: "--").decoratedString()) guard let url = URL.mailto(to: V.recipient, subject: V.subject, body: body), app.canOpenURL(url) else { - let alert = UIAlertController.asAlert(L10n.Core.IssueReporter.title, L10n.Core.Global.emailNotConfigured) - alert.addCancelAction(L10n.Core.Global.ok) + let alert = UIAlertController.asAlert(L10n.IssueReporter.title, L10n.Global.emailNotConfigured) + alert.addCancelAction(L10n.Global.ok) viewController.present(alert, animated: true, completion: nil) return } @@ -55,13 +55,13 @@ class IssueReporter: NSObject { self.viewController = viewController if issue.debugLog { - let alert = UIAlertController.asAlert(L10n.Core.IssueReporter.title, L10n.Core.IssueReporter.message) - alert.addPreferredAction(L10n.Core.IssueReporter.Buttons.accept) { + let alert = UIAlertController.asAlert(L10n.IssueReporter.title, L10n.IssueReporter.message) + alert.addPreferredAction(L10n.IssueReporter.Buttons.accept) { VPN.shared.requestDebugLog(fallback: AppConstants.Log.debugSnapshot) { self.composeEmail(withDebugLog: $0, issue: issue) } } - alert.addCancelAction(L10n.Core.Global.cancel) + alert.addCancelAction(L10n.Global.cancel) viewController.present(alert, animated: true, completion: nil) } else { composeEmail(withDebugLog: nil, issue: issue) diff --git a/Passepartout/App/iOS/Global/SwiftGen+Strings.swift b/Passepartout/App/iOS/Global/SwiftGen+Strings.swift index ea10f6d2..89db1ec4 100644 --- a/Passepartout/App/iOS/Global/SwiftGen+Strings.swift +++ b/Passepartout/App/iOS/Global/SwiftGen+Strings.swift @@ -10,1060 +10,1255 @@ import Foundation // swiftlint:disable explicit_type_interface function_parameter_count identifier_name line_length // swiftlint:disable nesting type_body_length type_name vertical_whitespace_opening_braces internal enum L10n { - internal enum App { + + internal enum About { + /// About + internal static let title = L10n.tr("Core", "about.title") + internal enum Cells { + internal enum Credits { + /// Credits + internal static let caption = L10n.tr("Core", "about.cells.credits.caption") + } + internal enum Disclaimer { + /// Disclaimer + internal static let caption = L10n.tr("Core", "about.cells.disclaimer.caption") + } + internal enum Faq { + /// FAQ + internal static let caption = L10n.tr("Core", "about.cells.faq.caption") + } + internal enum PrivacyPolicy { + /// Privacy policy + internal static let caption = L10n.tr("Core", "about.cells.privacy_policy.caption") + } + internal enum ShareGeneric { + /// Invite a friend + internal static let caption = L10n.tr("Core", "about.cells.share_generic.caption") + } + internal enum ShareTwitter { + /// Tweet about it! + internal static let caption = L10n.tr("Core", "about.cells.share_twitter.caption") + } + internal enum Website { + /// Home page + internal static let caption = L10n.tr("Core", "about.cells.website.caption") + } + } + internal enum Sections { + internal enum Share { + /// Share + internal static let header = L10n.tr("Core", "about.sections.share.header") + } + internal enum Web { + /// Web + internal static let header = L10n.tr("Core", "about.sections.web.header") + } + } } - internal enum Core { - internal enum About { - /// About - internal static let title = L10n.tr("Core", "about.title") - internal enum Cells { - internal enum Credits { - /// Credits - internal static let caption = L10n.tr("Core", "about.cells.credits.caption") - } - internal enum Disclaimer { - /// Disclaimer - internal static let caption = L10n.tr("Core", "about.cells.disclaimer.caption") - } - internal enum Faq { - /// FAQ - internal static let caption = L10n.tr("Core", "about.cells.faq.caption") - } - internal enum PrivacyPolicy { - /// Privacy policy - internal static let caption = L10n.tr("Core", "about.cells.privacy_policy.caption") - } - internal enum ShareGeneric { - /// Invite a friend - internal static let caption = L10n.tr("Core", "about.cells.share_generic.caption") - } - internal enum ShareTwitter { - /// Tweet about it! - internal static let caption = L10n.tr("Core", "about.cells.share_twitter.caption") - } - internal enum Website { - /// Home page - internal static let caption = L10n.tr("Core", "about.cells.website.caption") + + internal enum Account { + /// Account + internal static let title = L10n.tr("Core", "account.title") + internal enum Cells { + internal enum OpenGuide { + /// See your credentials + internal static let caption = L10n.tr("Core", "account.cells.open_guide.caption") + } + internal enum Password { + /// Password + internal static let caption = L10n.tr("Core", "account.cells.password.caption") + /// secret + internal static let placeholder = L10n.tr("Core", "account.cells.password.placeholder") + } + internal enum Signup { + /// Register with %@ + internal static func caption(_ p1: Any) -> String { + return L10n.tr("Core", "account.cells.signup.caption", String(describing: p1)) } } - internal enum Sections { - internal enum Share { - /// Share - internal static let header = L10n.tr("Core", "about.sections.share.header") - } - internal enum Web { - /// Web - internal static let header = L10n.tr("Core", "about.sections.web.header") - } + internal enum Username { + /// Username + internal static let caption = L10n.tr("Core", "account.cells.username.caption") + /// username + internal static let placeholder = L10n.tr("Core", "account.cells.username.placeholder") } } - internal enum Account { - /// Account - internal static let title = L10n.tr("Core", "account.title") - internal enum Cells { - internal enum OpenGuide { - /// See your credentials - internal static let caption = L10n.tr("Core", "account.cells.open_guide.caption") - } - internal enum Password { - /// Password - internal static let caption = L10n.tr("Core", "account.cells.password.caption") - /// secret - internal static let placeholder = L10n.tr("Core", "account.cells.password.placeholder") - } - internal enum Signup { - /// Register with %@ - internal static func caption(_ p1: Any) -> String { - return L10n.tr("Core", "account.cells.signup.caption", String(describing: p1)) - } - } - internal enum Username { - /// Username - internal static let caption = L10n.tr("Core", "account.cells.username.caption") - /// username - internal static let placeholder = L10n.tr("Core", "account.cells.username.placeholder") - } + internal enum Sections { + internal enum Credentials { + /// Credentials + internal static let header = L10n.tr("Core", "account.sections.credentials.header") } - internal enum Sections { - internal enum Credentials { - /// Credentials - internal static let header = L10n.tr("Core", "account.sections.credentials.header") - } - internal enum Guidance { - internal enum Footer { - internal enum Infrastructure { - /// Use your %@ website credentials. Your username is usually numeric (without spaces). - internal static func mullvad(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.mullvad", String(describing: p1)) + internal enum Guidance { + internal enum Footer { + internal enum Infrastructure { + /// Use your %@ website credentials. Your username is usually numeric (without spaces). + internal static func mullvad(_ p1: Any) -> String { + return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.mullvad", String(describing: p1)) + } + /// Use your %@ website credentials. Your username is usually your e-mail. + internal static func nordvpn(_ p1: Any) -> String { + return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.nordvpn", String(describing: p1)) + } + /// Use your %@ website credentials. Your username is usually numeric with a "p" prefix. + internal static func pia(_ p1: Any) -> String { + return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.pia", String(describing: p1)) + } + /// Find your %@ credentials in the "Account > OpenVPN / IKEv2 Username" section of the website. + internal static func protonvpn(_ p1: Any) -> String { + return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.protonvpn", String(describing: p1)) + } + /// Use your %@ website credentials. Your username is usually your e-mail. + internal static func tunnelbear(_ p1: Any) -> String { + return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.tunnelbear", String(describing: p1)) + } + /// Use your %@ website credentials. Your username is usually your e-mail. + internal static func vyprvpn(_ p1: Any) -> String { + return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.vyprvpn", String(describing: p1)) + } + /// Find your %@ credentials in the OpenVPN Config Generator on the website. + internal static func windscribe(_ p1: Any) -> String { + return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.windscribe", String(describing: p1)) + } + internal enum Default { + /// Use your %@ service credentials, which may differ from website credentials. + internal static func specific(_ p1: Any) -> String { + return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.default.specific", String(describing: p1)) } - /// Use your %@ website credentials. Your username is usually your e-mail. - internal static func nordvpn(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.nordvpn", String(describing: p1)) - } - /// Use your %@ website credentials. Your username is usually numeric with a "p" prefix. - internal static func pia(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.pia", String(describing: p1)) - } - /// Find your %@ credentials in the "Account > OpenVPN / IKEv2 Username" section of the website. - internal static func protonvpn(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.protonvpn", String(describing: p1)) - } - /// Use your %@ website credentials. Your username is usually your e-mail. - internal static func tunnelbear(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.tunnelbear", String(describing: p1)) - } - /// Use your %@ website credentials. Your username is usually your e-mail. - internal static func vyprvpn(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.vyprvpn", String(describing: p1)) - } - /// Find your %@ credentials in the OpenVPN Config Generator on the website. - internal static func windscribe(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.windscribe", String(describing: p1)) - } - internal enum Default { - /// Use your %@ service credentials, which may differ from website credentials. - internal static func specific(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.default.specific", String(describing: p1)) - } - /// Use your %@ website credentials. - internal static func web(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.default.web", String(describing: p1)) - } + /// Use your %@ website credentials. + internal static func web(_ p1: Any) -> String { + return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.default.web", String(describing: p1)) } } } } - internal enum Registration { - /// Go get an account on the %@ website. - internal static func footer(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.registration.footer", String(describing: p1)) - } + } + internal enum Registration { + /// Go get an account on the %@ website. + internal static func footer(_ p1: Any) -> String { + return L10n.tr("Core", "account.sections.registration.footer", String(describing: p1)) } } } - internal enum Configuration { - internal enum Cells { - internal enum Cipher { - /// Cipher - internal static let caption = L10n.tr("Core", "configuration.cells.cipher.caption") + } + + internal enum Configuration { + /// Configuration + internal static let title = L10n.tr("Core", "configuration.title") + internal enum Alerts { + internal enum Commit { + /// New parameters will not be effective until you reconnect manually. Changes in trusted networks will apply immediately. + internal static let message = L10n.tr("Core", "configuration.alerts.commit.message") + internal enum Buttons { + /// Reconnect now + internal static let reconnect = L10n.tr("Core", "configuration.alerts.commit.buttons.reconnect") + /// Skip + internal static let skip = L10n.tr("Core", "configuration.alerts.commit.buttons.skip") } - internal enum Client { - /// Client certificate - internal static let caption = L10n.tr("Core", "configuration.cells.client.caption") - internal enum Value { - /// Not verified - internal static let disabled = L10n.tr("Core", "configuration.cells.client.value.disabled") - /// Verified - internal static let enabled = L10n.tr("Core", "configuration.cells.client.value.enabled") + } + } + internal enum Cells { + internal enum Cipher { + /// Cipher + internal static let caption = L10n.tr("Core", "configuration.cells.cipher.caption") + } + internal enum Client { + /// Client certificate + internal static let caption = L10n.tr("Core", "configuration.cells.client.caption") + internal enum Value { + /// Not verified + internal static let disabled = L10n.tr("Core", "configuration.cells.client.value.disabled") + /// Verified + internal static let enabled = L10n.tr("Core", "configuration.cells.client.value.enabled") + } + } + internal enum CompressionAlgorithm { + /// Algorithm + internal static let caption = L10n.tr("Core", "configuration.cells.compression_algorithm.caption") + internal enum Value { + /// LZO + internal static let lzo = L10n.tr("Core", "configuration.cells.compression_algorithm.value.lzo") + /// Unsupported + internal static let other = L10n.tr("Core", "configuration.cells.compression_algorithm.value.other") + } + } + internal enum CompressionFraming { + /// Framing + internal static let caption = L10n.tr("Core", "configuration.cells.compression_framing.caption") + internal enum Value { + /// --compress + internal static let compress = L10n.tr("Core", "configuration.cells.compression_framing.value.compress") + /// --comp-lzo + internal static let lzo = L10n.tr("Core", "configuration.cells.compression_framing.value.lzo") + } + } + internal enum Digest { + /// Authentication + internal static let caption = L10n.tr("Core", "configuration.cells.digest.caption") + internal enum Value { + /// Embedded + internal static let embedded = L10n.tr("Core", "configuration.cells.digest.value.embedded") + } + } + internal enum Eku { + /// Extended verification + internal static let caption = L10n.tr("Core", "configuration.cells.eku.caption") + } + internal enum KeepAlive { + /// Keep-alive + internal static let caption = L10n.tr("Core", "configuration.cells.keep_alive.caption") + internal enum Value { + /// %d seconds + internal static func seconds(_ p1: Int) -> String { + return L10n.tr("Core", "configuration.cells.keep_alive.value.seconds", p1) } } - internal enum CompressionAlgorithm { - /// Algorithm - internal static let caption = L10n.tr("Core", "configuration.cells.compression_algorithm.caption") - internal enum Value { - /// LZO - internal static let lzo = L10n.tr("Core", "configuration.cells.compression_algorithm.value.lzo") - /// Unsupported - internal static let other = L10n.tr("Core", "configuration.cells.compression_algorithm.value.other") + } + internal enum RandomEndpoint { + /// Randomize endpoint + internal static let caption = L10n.tr("Core", "configuration.cells.random_endpoint.caption") + } + internal enum RenegotiationSeconds { + /// Renegotiation + internal static let caption = L10n.tr("Core", "configuration.cells.renegotiation_seconds.caption") + internal enum Value { + /// after %@ + internal static func after(_ p1: Any) -> String { + return L10n.tr("Core", "configuration.cells.renegotiation_seconds.value.after", String(describing: p1)) } } - internal enum CompressionFraming { - /// Framing - internal static let caption = L10n.tr("Core", "configuration.cells.compression_framing.caption") - internal enum Value { - /// --compress - internal static let compress = L10n.tr("Core", "configuration.cells.compression_framing.value.compress") - /// --comp-lzo - internal static let lzo = L10n.tr("Core", "configuration.cells.compression_framing.value.lzo") - } - } - internal enum Digest { + } + internal enum ResetOriginal { + /// Reset configuration + internal static let caption = L10n.tr("Core", "configuration.cells.reset_original.caption") + } + internal enum TlsWrapping { + /// Wrapping + internal static let caption = L10n.tr("Core", "configuration.cells.tls_wrapping.caption") + internal enum Value { /// Authentication - internal static let caption = L10n.tr("Core", "configuration.cells.digest.caption") - internal enum Value { - /// Embedded - internal static let embedded = L10n.tr("Core", "configuration.cells.digest.value.embedded") - } - } - internal enum Eku { - /// Extended verification - internal static let caption = L10n.tr("Core", "configuration.cells.eku.caption") - } - internal enum KeepAlive { - /// Keep-alive - internal static let caption = L10n.tr("Core", "configuration.cells.keep_alive.caption") - internal enum Value { - /// %d seconds - internal static func seconds(_ p1: Int) -> String { - return L10n.tr("Core", "configuration.cells.keep_alive.value.seconds", p1) - } - } - } - internal enum RandomEndpoint { - /// Randomize endpoint - internal static let caption = L10n.tr("Core", "configuration.cells.random_endpoint.caption") - } - internal enum RenegotiationSeconds { - /// Renegotiation - internal static let caption = L10n.tr("Core", "configuration.cells.renegotiation_seconds.caption") - internal enum Value { - /// after %@ - internal static func after(_ p1: Any) -> String { - return L10n.tr("Core", "configuration.cells.renegotiation_seconds.value.after", String(describing: p1)) - } - } - } - internal enum ResetOriginal { - /// Reset configuration - internal static let caption = L10n.tr("Core", "configuration.cells.reset_original.caption") - } - internal enum TlsWrapping { - /// Wrapping - internal static let caption = L10n.tr("Core", "configuration.cells.tls_wrapping.caption") - internal enum Value { - /// Authentication - internal static let auth = L10n.tr("Core", "configuration.cells.tls_wrapping.value.auth") - /// Encryption - internal static let crypt = L10n.tr("Core", "configuration.cells.tls_wrapping.value.crypt") - } - } - } - internal enum Sections { - internal enum Communication { - /// Communication - internal static let header = L10n.tr("Core", "configuration.sections.communication.header") - } - internal enum Compression { - /// Compression - internal static let header = L10n.tr("Core", "configuration.sections.compression.header") - } - internal enum Network { - /// Network - internal static let header = L10n.tr("Core", "configuration.sections.network.header") - } - internal enum Other { - /// Other - internal static let header = L10n.tr("Core", "configuration.sections.other.header") - } - internal enum Reset { - /// If you ended up with broken connectivity after changing the communication parameters, tap to revert to the original configuration. - internal static let footer = L10n.tr("Core", "configuration.sections.reset.footer") - } - internal enum Tls { - /// TLS - internal static let header = L10n.tr("Core", "configuration.sections.tls.header") + internal static let auth = L10n.tr("Core", "configuration.cells.tls_wrapping.value.auth") + /// Encryption + internal static let crypt = L10n.tr("Core", "configuration.cells.tls_wrapping.value.crypt") } } } - internal enum Credits { - /// Credits - internal static let title = L10n.tr("Core", "credits.title") - internal enum Sections { - internal enum Licenses { - /// Licenses - internal static let header = L10n.tr("Core", "credits.sections.licenses.header") - } - internal enum Notices { - /// Notices - internal static let header = L10n.tr("Core", "credits.sections.notices.header") - } - internal enum Translations { - /// Translations - internal static let header = L10n.tr("Core", "credits.sections.translations.header") - } + internal enum Sections { + internal enum Communication { + /// Communication + internal static let header = L10n.tr("Core", "configuration.sections.communication.header") + } + internal enum Compression { + /// Compression + internal static let header = L10n.tr("Core", "configuration.sections.compression.header") + } + internal enum Network { + /// Network + internal static let header = L10n.tr("Core", "configuration.sections.network.header") + } + internal enum Other { + /// Other + internal static let header = L10n.tr("Core", "configuration.sections.other.header") + } + internal enum Reset { + /// If you ended up with broken connectivity after changing the communication parameters, tap to revert to the original configuration. + internal static let footer = L10n.tr("Core", "configuration.sections.reset.footer") + } + internal enum Tls { + /// TLS + internal static let header = L10n.tr("Core", "configuration.sections.tls.header") } } - internal enum DebugLog { - internal enum Alerts { - internal enum EmptyLog { - /// The debug log is empty. - internal static let message = L10n.tr("Core", "debug_log.alerts.empty_log.message") - } + } + + internal enum Credits { + /// Credits + internal static let title = L10n.tr("Core", "credits.title") + internal enum Sections { + internal enum Licenses { + /// Licenses + internal static let header = L10n.tr("Core", "credits.sections.licenses.header") } - internal enum Buttons { - /// Next - internal static let next = L10n.tr("Core", "debug_log.buttons.next") - /// Previous - internal static let previous = L10n.tr("Core", "debug_log.buttons.previous") + internal enum Notices { + /// Notices + internal static let header = L10n.tr("Core", "credits.sections.notices.header") + } + internal enum Translations { + /// Translations + internal static let header = L10n.tr("Core", "credits.sections.translations.header") } } - internal enum Donation { - /// Donate - internal static let title = L10n.tr("Core", "donation.title") - internal enum Alerts { - internal enum Purchase { - internal enum Failure { - /// Unable to perform the donation. %@ - internal static func message(_ p1: Any) -> String { - return L10n.tr("Core", "donation.alerts.purchase.failure.message", String(describing: p1)) - } - } - internal enum Success { - /// This means a lot to me and I really hope you keep using and promoting this app. - internal static let message = L10n.tr("Core", "donation.alerts.purchase.success.message") - /// Thank you - internal static let title = L10n.tr("Core", "donation.alerts.purchase.success.title") - } - } - } - internal enum Cells { - internal enum Loading { - /// Loading donations - internal static let caption = L10n.tr("Core", "donation.cells.loading.caption") - } - internal enum Purchasing { - /// Performing donation - internal static let caption = L10n.tr("Core", "donation.cells.purchasing.caption") - } - } - internal enum Sections { - internal enum OneTime { - /// If you want to display gratitude for my free work, here are a couple amounts you can donate instantly.\n\nYou will only be charged once per donation, and you can donate multiple times. - internal static let footer = L10n.tr("Core", "donation.sections.one_time.footer") - /// One time - internal static let header = L10n.tr("Core", "donation.sections.one_time.header") - } + } + + internal enum DebugLog { + internal enum Alerts { + internal enum EmptyLog { + /// The debug log is empty. + internal static let message = L10n.tr("Core", "debug_log.alerts.empty_log.message") } } - internal enum Endpoint { - /// Endpoint - internal static let title = L10n.tr("Core", "endpoint.title") - internal enum Cells { - internal enum AnyAddress { - /// Automatic - internal static let caption = L10n.tr("Core", "endpoint.cells.any_address.caption") - } - internal enum AnyProtocol { - /// Automatic - internal static let caption = L10n.tr("Core", "endpoint.cells.any_protocol.caption") - } - } - internal enum Sections { - internal enum LocationAddresses { - /// Addresses - internal static let header = L10n.tr("Core", "endpoint.sections.location_addresses.header") - } - internal enum LocationProtocols { - /// Protocols - internal static let header = L10n.tr("Core", "endpoint.sections.location_protocols.header") - } - } - } - internal enum Global { - /// Cancel - internal static let cancel = L10n.tr("Core", "global.cancel") - /// Close - internal static let close = L10n.tr("Core", "global.close") - /// No e-mail account is configured. - internal static let emailNotConfigured = L10n.tr("Core", "global.email_not_configured") + internal enum Buttons { + /// Copy + internal static let copy = L10n.tr("Core", "debug_log.buttons.copy") /// Next - internal static let next = L10n.tr("Core", "global.next") - /// OK - internal static let ok = L10n.tr("Core", "global.ok") - internal enum Captions { - /// Address - internal static let address = L10n.tr("Core", "global.captions.address") - /// Port - internal static let port = L10n.tr("Core", "global.captions.port") - /// Protocol - internal static let `protocol` = L10n.tr("Core", "global.captions.protocol") - } - internal enum Host { - internal enum TitleInput { - /// Acceptable characters are alphanumerics plus dash "-", underscore "_" and dot ".". - internal static let message = L10n.tr("Core", "global.host.title_input.message") - /// My profile - internal static let placeholder = L10n.tr("Core", "global.host.title_input.placeholder") + internal static let next = L10n.tr("Core", "debug_log.buttons.next") + /// Previous + internal static let previous = L10n.tr("Core", "debug_log.buttons.previous") + } + } + + internal enum Donation { + /// Donate + internal static let title = L10n.tr("Core", "donation.title") + internal enum Alerts { + internal enum Purchase { + internal enum Failure { + /// Unable to perform the donation. %@ + internal static func message(_ p1: Any) -> String { + return L10n.tr("Core", "donation.alerts.purchase.failure.message", String(describing: p1)) + } + } + internal enum Success { + /// This means a lot to me and I really hope you keep using and promoting this app. + internal static let message = L10n.tr("Core", "donation.alerts.purchase.success.message") + /// Thank you + internal static let title = L10n.tr("Core", "donation.alerts.purchase.success.title") } } - internal enum Values { + } + internal enum Cells { + internal enum Loading { + /// Loading donations + internal static let caption = L10n.tr("Core", "donation.cells.loading.caption") + } + internal enum Purchasing { + /// Performing donation + internal static let caption = L10n.tr("Core", "donation.cells.purchasing.caption") + } + } + internal enum Sections { + internal enum OneTime { + /// If you want to display gratitude for my free work, here are a couple amounts you can donate instantly.\n\nYou will only be charged once per donation, and you can donate multiple times. + internal static let footer = L10n.tr("Core", "donation.sections.one_time.footer") + /// One time + internal static let header = L10n.tr("Core", "donation.sections.one_time.header") + } + } + } + + internal enum Endpoint { + /// Endpoint + internal static let title = L10n.tr("Core", "endpoint.title") + internal enum Cells { + /// Address + internal static let address = L10n.tr("Core", "endpoint.cells.address") + /// Protocol + internal static let `protocol` = L10n.tr("Core", "endpoint.cells.protocol") + internal enum AnyAddress { /// Automatic - internal static let automatic = L10n.tr("Core", "global.values.automatic") - /// Default - internal static let `default` = L10n.tr("Core", "global.values.default") - /// Disabled - internal static let disabled = L10n.tr("Core", "global.values.disabled") - /// Enabled - internal static let enabled = L10n.tr("Core", "global.values.enabled") - /// Manual - internal static let manual = L10n.tr("Core", "global.values.manual") - /// None - internal static let `none` = L10n.tr("Core", "global.values.none") + internal static let caption = L10n.tr("Core", "endpoint.cells.any_address.caption") + } + internal enum AnyProtocol { + /// Automatic + internal static let caption = L10n.tr("Core", "endpoint.cells.any_protocol.caption") } } - internal enum ImportedHosts { - /// Imported hosts - internal static let title = L10n.tr("Core", "imported_hosts.title") - } - internal enum IssueReporter { - /// The debug log of your latest connections is crucial to resolve your connectivity issues and is completely anonymous.\n\nThe .ovpn configuration file, if any, is attached stripped of any sensitive data.\n\nPlease double check the e-mail attachments if unsure. - internal static let message = L10n.tr("Core", "issue_reporter.message") - /// Report issue - internal static let title = L10n.tr("Core", "issue_reporter.title") - internal enum Buttons { - /// I understand - internal static let accept = L10n.tr("Core", "issue_reporter.buttons.accept") + internal enum Sections { + internal enum LocationAddresses { + /// Addresses + internal static let header = L10n.tr("Core", "endpoint.sections.location_addresses.header") + } + internal enum LocationProtocols { + /// Protocols + internal static let header = L10n.tr("Core", "endpoint.sections.location_protocols.header") } } - internal enum Label { - internal enum License { - /// Unable to download full license content. - internal static let error = L10n.tr("Core", "label.license.error") + } + + internal enum Global { + /// Cancel + internal static let cancel = L10n.tr("Core", "global.cancel") + /// Close + internal static let close = L10n.tr("Core", "global.close") + /// No e-mail account is configured. + internal static let emailNotConfigured = L10n.tr("Core", "global.email_not_configured") + /// Next + internal static let next = L10n.tr("Core", "global.next") + /// OK + internal static let ok = L10n.tr("Core", "global.ok") + internal enum Captions { + /// Address + internal static let address = L10n.tr("Core", "global.captions.address") + /// Port + internal static let port = L10n.tr("Core", "global.captions.port") + /// Protocol + internal static let `protocol` = L10n.tr("Core", "global.captions.protocol") + } + internal enum Host { + internal enum TitleInput { + /// Acceptable characters are alphanumerics plus dash "-", underscore "_" and dot ".". + internal static let message = L10n.tr("Core", "global.host.title_input.message") + /// My profile + internal static let placeholder = L10n.tr("Core", "global.host.title_input.placeholder") } } - internal enum NetworkChoice { - /// Read .ovpn - internal static let client = L10n.tr("Core", "network_choice.client") - /// Pull from server - internal static let server = L10n.tr("Core", "network_choice.server") + internal enum Values { + /// Automatic + internal static let automatic = L10n.tr("Core", "global.values.automatic") + /// Default + internal static let `default` = L10n.tr("Core", "global.values.default") + /// Disabled + internal static let disabled = L10n.tr("Core", "global.values.disabled") + /// Enabled + internal static let enabled = L10n.tr("Core", "global.values.enabled") + /// Manual + internal static let manual = L10n.tr("Core", "global.values.manual") + /// None + internal static let `none` = L10n.tr("Core", "global.values.none") } - internal enum NetworkSettings { - /// Network settings - internal static let title = L10n.tr("Core", "network_settings.title") - internal enum Cells { - internal enum AddDnsDomain { - /// Add search domain - internal static let caption = L10n.tr("Core", "network_settings.cells.add_dns_domain.caption") - } - internal enum AddDnsServer { - /// Add address - internal static let caption = L10n.tr("Core", "network_settings.cells.add_dns_server.caption") - } - internal enum AddProxyBypass { - /// Add bypass domain - internal static let caption = L10n.tr("Core", "network_settings.cells.add_proxy_bypass.caption") - } - internal enum ProxyBypass { - /// Bypass domain - internal static let caption = L10n.tr("Core", "network_settings.cells.proxy_bypass.caption") + } + + internal enum ImportedHosts { + /// Imported hosts + internal static let title = L10n.tr("Core", "imported_hosts.title") + } + + internal enum IssueReporter { + /// The debug log of your latest connections is crucial to resolve your connectivity issues and is completely anonymous.\n\nThe .ovpn configuration file, if any, is attached stripped of any sensitive data.\n\nPlease double check the e-mail attachments if unsure. + internal static let message = L10n.tr("Core", "issue_reporter.message") + /// Report issue + internal static let title = L10n.tr("Core", "issue_reporter.title") + internal enum Buttons { + /// I understand + internal static let accept = L10n.tr("Core", "issue_reporter.buttons.accept") + } + } + + internal enum Label { + internal enum License { + /// Unable to download full license content. + internal static let error = L10n.tr("Core", "label.license.error") + } + } + + internal enum Menu { + internal enum ActiveProfile { + internal enum Items { + internal enum Customize { + /// Customize... + internal static let title = L10n.tr("Core", "menu.active_profile.items.customize.title") } } - internal enum Dns { - /// DNS - internal static let title = L10n.tr("Core", "network_settings.dns.title") - internal enum Cells { - internal enum Domain { - /// Domain - internal static let caption = L10n.tr("Core", "network_settings.dns.cells.domain.caption") - } - } + internal enum Messages { + /// No account configured + internal static let missingCredentials = L10n.tr("Core", "menu.active_profile.messages.missing_credentials") } - internal enum Gateway { - /// Default gateway - internal static let title = L10n.tr("Core", "network_settings.gateway.title") - } - internal enum Mtu { - /// MTU - internal static let title = L10n.tr("Core", "network_settings.mtu.title") - internal enum Cells { - internal enum Bytes { - /// Bytes - internal static let caption = L10n.tr("Core", "network_settings.mtu.cells.bytes.caption") - } - } - } - internal enum Proxy { - /// Proxy - internal static let title = L10n.tr("Core", "network_settings.proxy.title") + internal enum Title { + /// No active profile + internal static let `none` = L10n.tr("Core", "menu.active_profile.title.none") } } internal enum Organizer { - internal enum Alerts { - internal enum AddHost { - /// Open an URL to an .ovpn configuration file from Safari, Mail or another app to set up a host profile.\n\nYou can also import an .ovpn with iTunes File Sharing. - internal static let message = L10n.tr("Core", "organizer.alerts.add_host.message") - } - internal enum CannotDonate { - /// There is no payment method configured on this device. - internal static let message = L10n.tr("Core", "organizer.alerts.cannot_donate.message") - } - internal enum DeleteVpnProfile { - /// Do you really want to erase the VPN configuration from your device settings? This may fix some broken VPN states and will not affect your provider and host profiles. - internal static let message = L10n.tr("Core", "organizer.alerts.delete_vpn_profile.message") - } - internal enum ExhaustedProviders { - /// You have created profiles for any available provider. - internal static let message = L10n.tr("Core", "organizer.alerts.exhausted_providers.message") - } + /// Organizer + internal static let title = L10n.tr("Core", "menu.organizer.title") + } + internal enum Preferences { + /// Preferences + internal static let title = L10n.tr("Core", "menu.preferences.title") + } + internal enum Quit { + /// Quit %@ + internal static func title(_ p1: Any) -> String { + return L10n.tr("Core", "menu.quit.title", String(describing: p1)) } + internal enum Messages { + /// The VPN, if enabled, will still run in the background. Do you want to quit? + internal static let confirm = L10n.tr("Core", "menu.quit.messages.confirm") + } + } + internal enum Show { + /// Show + internal static let title = L10n.tr("Core", "menu.show.title") + } + internal enum Support { + /// Support + internal static let title = L10n.tr("Core", "menu.support.title") + } + internal enum SwitchProfile { + /// Active profile + internal static let title = L10n.tr("Core", "menu.switch_profile.title") + } + } + + internal enum NetworkChoice { + /// Read .ovpn + internal static let client = L10n.tr("Core", "network_choice.client") + /// Pull from server + internal static let server = L10n.tr("Core", "network_choice.server") + } + + internal enum NetworkSettings { + /// Network settings + internal static let title = L10n.tr("Core", "network_settings.title") + internal enum Cells { + internal enum AddDnsDomain { + /// Add search domain + internal static let caption = L10n.tr("Core", "network_settings.cells.add_dns_domain.caption") + } + internal enum AddDnsServer { + /// Add address + internal static let caption = L10n.tr("Core", "network_settings.cells.add_dns_server.caption") + } + internal enum AddProxyBypass { + /// Add bypass domain + internal static let caption = L10n.tr("Core", "network_settings.cells.add_proxy_bypass.caption") + } + internal enum ProxyBypass { + /// Bypass domain + internal static let caption = L10n.tr("Core", "network_settings.cells.proxy_bypass.caption") + } + } + internal enum Dns { + /// DNS + internal static let title = L10n.tr("Core", "network_settings.dns.title") internal enum Cells { - internal enum About { - /// About %@ - internal static func caption(_ p1: Any) -> String { - return L10n.tr("Core", "organizer.cells.about.caption", String(describing: p1)) - } + internal enum Addresses { + /// Servers + internal static let title = L10n.tr("Core", "network_settings.dns.cells.addresses.title") } - internal enum AddHost { - /// Add from Files - internal static let caption = L10n.tr("Core", "organizer.cells.add_host.caption") + internal enum Domain { + /// Domain + internal static let caption = L10n.tr("Core", "network_settings.dns.cells.domain.caption") } - internal enum AddProvider { - /// Add new provider - internal static let caption = L10n.tr("Core", "organizer.cells.add_provider.caption") - } - internal enum Donate { - /// Make a donation - internal static let caption = L10n.tr("Core", "organizer.cells.donate.caption") - } - internal enum FollowTwitch { - /// Watch Passepartout on Twitch - internal static let caption = L10n.tr("Core", "organizer.cells.follow_twitch.caption") - } - internal enum GithubSponsors { - /// Support me on GitHub - internal static let caption = L10n.tr("Core", "organizer.cells.github_sponsors.caption") - } - internal enum ImportHost { - /// Add from imported - internal static let caption = L10n.tr("Core", "organizer.cells.import_host.caption") - } - internal enum JoinCommunity { - /// Join community - internal static let caption = L10n.tr("Core", "organizer.cells.join_community.caption") - } - internal enum Profile { - internal enum Value { - /// In use - internal static let current = L10n.tr("Core", "organizer.cells.profile.value.current") - } - } - internal enum SiriShortcuts { - /// Manage shortcuts - internal static let caption = L10n.tr("Core", "organizer.cells.siri_shortcuts.caption") - } - internal enum Translate { - /// Offer to translate - internal static let caption = L10n.tr("Core", "organizer.cells.translate.caption") - } - internal enum Uninstall { - /// Remove VPN configuration - internal static let caption = L10n.tr("Core", "organizer.cells.uninstall.caption") - } - internal enum WriteReview { - /// Write a review - internal static let caption = L10n.tr("Core", "organizer.cells.write_review.caption") - } - } - internal enum Sections { - internal enum Feedback { - /// Feedback - internal static let header = L10n.tr("Core", "organizer.sections.feedback.header") - } - internal enum Hosts { - /// Import hosts from raw .ovpn configuration files. - internal static let footer = L10n.tr("Core", "organizer.sections.hosts.footer") - /// Hosts - internal static let header = L10n.tr("Core", "organizer.sections.hosts.header") - } - internal enum Providers { - /// Here you find a few providers with preset configuration profiles. - internal static let footer = L10n.tr("Core", "organizer.sections.providers.footer") - /// Providers - internal static let header = L10n.tr("Core", "organizer.sections.providers.header") - } - internal enum Siri { - /// Get help from Siri to speed up your most common interactions with the app. - internal static let footer = L10n.tr("Core", "organizer.sections.siri.footer") - /// Siri - internal static let header = L10n.tr("Core", "organizer.sections.siri.header") - } - internal enum Support { - /// Support - internal static let header = L10n.tr("Core", "organizer.sections.support.header") - } - internal enum Twitch { - /// Come watch me make Passepartout live on Twitch, join the chat to interact and contribute! - internal static let footer = L10n.tr("Core", "organizer.sections.twitch.footer") - /// Twitch - internal static let header = L10n.tr("Core", "organizer.sections.twitch.header") + internal enum Domains { + /// Domains + internal static let title = L10n.tr("Core", "network_settings.dns.cells.domains.title") } } } - internal enum ParsedFile { + internal enum Gateway { + /// Default gateway + internal static let title = L10n.tr("Core", "network_settings.gateway.title") + } + internal enum Mtu { + /// MTU + internal static let title = L10n.tr("Core", "network_settings.mtu.title") + internal enum Cells { + internal enum Bytes { + /// Bytes + internal static let caption = L10n.tr("Core", "network_settings.mtu.cells.bytes.caption") + } + } + } + internal enum Proxy { + /// Proxy + internal static let title = L10n.tr("Core", "network_settings.proxy.title") + internal enum Cells { + internal enum BypassDomains { + /// Bypass domains + internal static let title = L10n.tr("Core", "network_settings.proxy.cells.bypass_domains.title") + } + } + } + } + + internal enum Organizer { + /// %@ + internal static func title(_ p1: Any) -> String { + return L10n.tr("Core", "organizer.title", String(describing: p1)) + } + internal enum Alerts { + internal enum AddHost { + /// Open an URL to an .ovpn configuration file from Safari, Mail or another app to set up a host profile.\n\nYou can also import an .ovpn with iTunes File Sharing. + internal static let message = L10n.tr("Core", "organizer.alerts.add_host.message") + } + internal enum CannotDonate { + /// There is no payment method configured on this device. + internal static let message = L10n.tr("Core", "organizer.alerts.cannot_donate.message") + } + internal enum DeleteVpnProfile { + /// Do you really want to erase the VPN configuration from your device settings? This may fix some broken VPN states and will not affect your provider and host profiles. + internal static let message = L10n.tr("Core", "organizer.alerts.delete_vpn_profile.message") + } + internal enum ExhaustedProviders { + /// You have created profiles for any available provider. + internal static let message = L10n.tr("Core", "organizer.alerts.exhausted_providers.message") + } + internal enum OpenHostFile { + /// Select an .ovpn file + internal static let title = L10n.tr("Core", "organizer.alerts.open_host_file.title") + } + internal enum RemoveProfile { + /// Are you sure you want to delete profile %@? + internal static func message(_ p1: Any) -> String { + return L10n.tr("Core", "organizer.alerts.remove_profile.message", String(describing: p1)) + } + /// Remove profile + internal static let title = L10n.tr("Core", "organizer.alerts.remove_profile.title") + } + } + internal enum Cells { + internal enum About { + /// About %@ + internal static func caption(_ p1: Any) -> String { + return L10n.tr("Core", "organizer.cells.about.caption", String(describing: p1)) + } + } + internal enum AddHost { + /// Add from Files + internal static let caption = L10n.tr("Core", "organizer.cells.add_host.caption") + } + internal enum AddProvider { + /// Add new provider + internal static let caption = L10n.tr("Core", "organizer.cells.add_provider.caption") + } + internal enum Donate { + /// Make a donation + internal static let caption = L10n.tr("Core", "organizer.cells.donate.caption") + } + internal enum FollowTwitch { + /// Watch Passepartout on Twitch + internal static let caption = L10n.tr("Core", "organizer.cells.follow_twitch.caption") + } + internal enum GithubSponsors { + /// Support me on GitHub + internal static let caption = L10n.tr("Core", "organizer.cells.github_sponsors.caption") + } + internal enum ImportHost { + /// Add from imported + internal static let caption = L10n.tr("Core", "organizer.cells.import_host.caption") + } + internal enum JoinCommunity { + /// Join community + internal static let caption = L10n.tr("Core", "organizer.cells.join_community.caption") + } + internal enum Profile { + internal enum Value { + /// In use + internal static let current = L10n.tr("Core", "organizer.cells.profile.value.current") + } + } + internal enum SiriShortcuts { + /// Manage shortcuts + internal static let caption = L10n.tr("Core", "organizer.cells.siri_shortcuts.caption") + } + internal enum Translate { + /// Offer to translate + internal static let caption = L10n.tr("Core", "organizer.cells.translate.caption") + } + internal enum Uninstall { + /// Remove VPN configuration + internal static let caption = L10n.tr("Core", "organizer.cells.uninstall.caption") + } + internal enum WriteReview { + /// Write a review + internal static let caption = L10n.tr("Core", "organizer.cells.write_review.caption") + } + } + internal enum Menus { + /// Host + internal static let host = L10n.tr("Core", "organizer.menus.host") + /// Provider + internal static let provider = L10n.tr("Core", "organizer.menus.provider") + internal enum Provider { + /// No providers left + internal static let unavailable = L10n.tr("Core", "organizer.menus.provider.unavailable") + } + } + internal enum Sections { + internal enum Feedback { + /// Feedback + internal static let header = L10n.tr("Core", "organizer.sections.feedback.header") + } + internal enum Hosts { + /// Import hosts from raw .ovpn configuration files. + internal static let footer = L10n.tr("Core", "organizer.sections.hosts.footer") + /// Hosts + internal static let header = L10n.tr("Core", "organizer.sections.hosts.header") + } + internal enum Providers { + /// Here you find a few providers with preset configuration profiles. + internal static let footer = L10n.tr("Core", "organizer.sections.providers.footer") + /// Providers + internal static let header = L10n.tr("Core", "organizer.sections.providers.header") + } + internal enum Siri { + /// Get help from Siri to speed up your most common interactions with the app. + internal static let footer = L10n.tr("Core", "organizer.sections.siri.footer") + /// Siri + internal static let header = L10n.tr("Core", "organizer.sections.siri.header") + } + internal enum Support { + /// Support + internal static let header = L10n.tr("Core", "organizer.sections.support.header") + } + internal enum Twitch { + /// Come watch me make Passepartout live on Twitch, join the chat to interact and contribute! + internal static let footer = L10n.tr("Core", "organizer.sections.twitch.footer") + /// Twitch + internal static let header = L10n.tr("Core", "organizer.sections.twitch.header") + } + } + } + + internal enum ParsedFile { + internal enum Alerts { + internal enum Buttons { + /// Report an issue + internal static let report = L10n.tr("Core", "parsed_file.alerts.buttons.report") + } + internal enum Decryption { + /// The configuration contains an encrypted private key and it could not be decrypted. Double check your entered passphrase. + internal static let message = L10n.tr("Core", "parsed_file.alerts.decryption.message") + } + internal enum EncryptionPassphrase { + /// Please enter the encryption passphrase. + internal static let message = L10n.tr("Core", "parsed_file.alerts.encryption_passphrase.message") + } + internal enum Malformed { + /// The configuration file contains a malformed option (%@). + internal static func message(_ p1: Any) -> String { + return L10n.tr("Core", "parsed_file.alerts.malformed.message", String(describing: p1)) + } + } + internal enum Missing { + /// The configuration file lacks a required option (%@). + internal static func message(_ p1: Any) -> String { + return L10n.tr("Core", "parsed_file.alerts.missing.message", String(describing: p1)) + } + } + internal enum Parsing { + /// Unable to parse the provided configuration file (%@). + internal static func message(_ p1: Any) -> String { + return L10n.tr("Core", "parsed_file.alerts.parsing.message", String(describing: p1)) + } + } + internal enum PotentiallyUnsupported { + /// The configuration file is correct but contains a potentially unsupported option (%@).\n\nConnectivity may break depending on server settings. + internal static func message(_ p1: Any) -> String { + return L10n.tr("Core", "parsed_file.alerts.potentially_unsupported.message", String(describing: p1)) + } + } + internal enum Unsupported { + /// The configuration file contains an unsupported option (%@). + internal static func message(_ p1: Any) -> String { + return L10n.tr("Core", "parsed_file.alerts.unsupported.message", String(describing: p1)) + } + } + } + } + + internal enum Preferences { + /// Preferences + internal static let title = L10n.tr("Core", "preferences.title") + internal enum Cells { + internal enum ConfirmQuit { + /// Confirm quit + internal static let caption = L10n.tr("Core", "preferences.cells.confirm_quit.caption") + /// Check to present a quit confirmation alert. + internal static let footer = L10n.tr("Core", "preferences.cells.confirm_quit.footer") + } + internal enum LaunchesOnLogin { + /// Launch on login + internal static let caption = L10n.tr("Core", "preferences.cells.launches_on_login.caption") + /// Check to automatically launch the app on boot or login. + internal static let footer = L10n.tr("Core", "preferences.cells.launches_on_login.footer") + } + } + internal enum Sections { + internal enum General { + /// General + internal static let header = L10n.tr("Core", "preferences.sections.general.header") + } + } + } + + internal enum Provider { + internal enum Pool { + internal enum Actions { + /// Favorite + internal static let favorite = L10n.tr("Core", "provider.pool.actions.favorite") + /// Unfavorite + internal static let unfavorite = L10n.tr("Core", "provider.pool.actions.unfavorite") + } + internal enum Sections { + internal enum EmptyFavorites { + /// Swipe left on a location to add or remove it from Favorites. + internal static let footer = L10n.tr("Core", "provider.pool.sections.empty_favorites.footer") + } + } + } + internal enum Preset { + internal enum Cells { + internal enum TechDetails { + /// Technical details + internal static let caption = L10n.tr("Core", "provider.preset.cells.tech_details.caption") + } + } + } + } + + internal enum Purchase { + /// Purchase + internal static let title = L10n.tr("Core", "purchase.title") + internal enum Cells { + internal enum FullVersion { + /// All providers (including future ones)\n%@ + internal static func extraDescription(_ p1: Any) -> String { + return L10n.tr("Core", "purchase.cells.full_version.extra_description", String(describing: p1)) + } + } + internal enum Restore { + /// If you bought this app or feature in the past, you can restore your purchases and this screen won't show again. + internal static let description = L10n.tr("Core", "purchase.cells.restore.description") + /// Restore purchases + internal static let title = L10n.tr("Core", "purchase.cells.restore.title") + } + } + internal enum Sections { + internal enum Products { + /// Every product is a one-time purchase. Provider purchases do not include a VPN subscription. + internal static let footer = L10n.tr("Core", "purchase.sections.products.footer") + } + } + } + + internal enum Reddit { + /// Did you know that Passepartout has a subreddit? Subscribe for updates or to discuss issues, features, new platforms or whatever you like.\n\nIt's also a great way to show you care about this project. + internal static let message = L10n.tr("Core", "reddit.message") + /// Reddit + internal static let title = L10n.tr("Core", "reddit.title") + internal enum Buttons { + /// Don't ask again + internal static let never = L10n.tr("Core", "reddit.buttons.never") + /// Remind me later + internal static let remind = L10n.tr("Core", "reddit.buttons.remind") + /// Subscribe now! + internal static let subscribe = L10n.tr("Core", "reddit.buttons.subscribe") + } + } + + internal enum ServerNetwork { + internal enum Cells { + internal enum Route { + /// Route + internal static let caption = L10n.tr("Core", "server_network.cells.route.caption") + } + } + } + + internal enum Service { + internal enum Alerts { + internal enum Buttons { + /// Reconnect + internal static let reconnect = L10n.tr("Core", "service.alerts.buttons.reconnect") + } + internal enum Configuration { + /// Configuration unavailable, make sure you are connected to the VPN. + internal static let disconnected = L10n.tr("Core", "service.alerts.configuration.disconnected") + } + internal enum CredentialsNeeded { + /// You need to enter account credentials first. + internal static let message = L10n.tr("Core", "service.alerts.credentials_needed.message") + } + internal enum Download { + /// Failed to download configuration files. %@ + internal static func failed(_ p1: Any) -> String { + return L10n.tr("Core", "service.alerts.download.failed", String(describing: p1)) + } + /// %@ requires the download of additional configuration files.\n\nConfirm to start the download. + internal static func message(_ p1: Any) -> String { + return L10n.tr("Core", "service.alerts.download.message", String(describing: p1)) + } + /// Download required + internal static let title = L10n.tr("Core", "service.alerts.download.title") + internal enum Hud { + /// Extracting files, please be patient... + internal static let extracting = L10n.tr("Core", "service.alerts.download.hud.extracting") + } + } + internal enum Location { + internal enum Button { + /// Settings + internal static let settings = L10n.tr("Core", "service.alerts.location.button.settings") + } + internal enum Message { + /// You must allow location access to trust this Wi-Fi network. Go to iOS settings and review your location permissions for Passepartout. + internal static let denied = L10n.tr("Core", "service.alerts.location.message.denied") + } + } + internal enum MasksPrivateData { + internal enum Messages { + /// In order to safely reset the current debug log and apply the new masking preference, you must reconnect to the VPN now. + internal static let mustReconnect = L10n.tr("Core", "service.alerts.masks_private_data.messages.must_reconnect") + } + } + internal enum ReconnectVpn { + /// Do you want to reconnect to the VPN? + internal static let message = L10n.tr("Core", "service.alerts.reconnect_vpn.message") + } + internal enum Rename { + /// Rename profile + internal static let title = L10n.tr("Core", "service.alerts.rename.title") + } + internal enum TestConnectivity { + /// Connectivity + internal static let title = L10n.tr("Core", "service.alerts.test_connectivity.title") + internal enum Messages { + /// Your device has no Internet connectivity, please review your profile parameters. + internal static let failure = L10n.tr("Core", "service.alerts.test_connectivity.messages.failure") + /// Your device is connected to the Internet! + internal static let success = L10n.tr("Core", "service.alerts.test_connectivity.messages.success") + } + } + internal enum Trusted { + internal enum NoNetwork { + /// You are not connected to any Wi-Fi network. + internal static let message = L10n.tr("Core", "service.alerts.trusted.no_network.message") + } + internal enum WillDisconnectPolicy { + /// By changing the trust policy, the VPN may be disconnected. Continue? + internal static let message = L10n.tr("Core", "service.alerts.trusted.will_disconnect_policy.message") + } + internal enum WillDisconnectTrusted { + /// By trusting this network, the VPN may be disconnected. Continue? + internal static let message = L10n.tr("Core", "service.alerts.trusted.will_disconnect_trusted.message") + } + } + } + internal enum Cells { + internal enum Addresses { + /// Addresses + internal static let caption = L10n.tr("Core", "service.cells.addresses.caption") + } + internal enum Category { + /// Category + internal static let caption = L10n.tr("Core", "service.cells.category.caption") + } + internal enum ConnectionStatus { + /// Status + internal static let caption = L10n.tr("Core", "service.cells.connection_status.caption") + } + internal enum DataCount { + /// Exchanged data + internal static let caption = L10n.tr("Core", "service.cells.data_count.caption") + /// Unavailable + internal static let `none` = L10n.tr("Core", "service.cells.data_count.none") + } + internal enum DebugLog { + /// Debug log + internal static let caption = L10n.tr("Core", "service.cells.debug_log.caption") + } + internal enum Host { + internal enum Parameters { + /// Parameters + internal static let caption = L10n.tr("Core", "service.cells.host.parameters.caption") + } + } + internal enum MasksPrivateData { + /// Mask network data + internal static let caption = L10n.tr("Core", "service.cells.masks_private_data.caption") + } + internal enum OnlyShowsFavorites { + /// Only show favorite locations + internal static let caption = L10n.tr("Core", "service.cells.only_shows_favorites.caption") + } + internal enum Provider { + internal enum Pool { + /// Location + internal static let caption = L10n.tr("Core", "service.cells.provider.pool.caption") + } + internal enum Preset { + /// Preset + internal static let caption = L10n.tr("Core", "service.cells.provider.preset.caption") + } + internal enum Refresh { + /// Refresh infrastructure + internal static let caption = L10n.tr("Core", "service.cells.provider.refresh.caption") + } + } + internal enum Reconnect { + /// Reconnect + internal static let caption = L10n.tr("Core", "service.cells.reconnect.caption") + } + internal enum ReportIssue { + /// Report connectivity issue + internal static let caption = L10n.tr("Core", "service.cells.report_issue.caption") + } + internal enum ServerConfiguration { + /// Server configuration + internal static let caption = L10n.tr("Core", "service.cells.server_configuration.caption") + } + internal enum ServerNetwork { + /// Server network + internal static let caption = L10n.tr("Core", "service.cells.server_network.caption") + } + internal enum TestConnectivity { + /// Test connectivity + internal static let caption = L10n.tr("Core", "service.cells.test_connectivity.caption") + } + internal enum TrustedAddWifi { + /// Add Wi-Fi + internal static let caption = L10n.tr("Core", "service.cells.trusted_add_wifi.caption") + } + internal enum TrustedMobile { + /// Cellular network + internal static let caption = L10n.tr("Core", "service.cells.trusted_mobile.caption") + } + internal enum TrustedPolicy { + /// Trust disables VPN + internal static let caption = L10n.tr("Core", "service.cells.trusted_policy.caption") + } + internal enum UseProfile { + /// Use this profile + internal static let caption = L10n.tr("Core", "service.cells.use_profile.caption") + } + internal enum Vpn { + internal enum TurnOff { + /// Disable VPN + internal static let caption = L10n.tr("Core", "service.cells.vpn.turn_off.caption") + } + internal enum TurnOn { + /// Enable VPN + internal static let caption = L10n.tr("Core", "service.cells.vpn.turn_on.caption") + } + } + internal enum VpnResolvesHostname { + /// Resolve provider hostname + internal static let caption = L10n.tr("Core", "service.cells.vpn_resolves_hostname.caption") + } + internal enum VpnService { + /// Enabled + internal static let caption = L10n.tr("Core", "service.cells.vpn_service.caption") + } + internal enum VpnSurvivesSleep { + /// Keep alive on sleep + internal static let caption = L10n.tr("Core", "service.cells.vpn_survives_sleep.caption") + } + } + internal enum Sections { + internal enum Configuration { + /// Configuration + internal static let header = L10n.tr("Core", "service.sections.configuration.header") + } + internal enum Diagnostics { + /// Masking status will be effective after reconnecting. Network data are hostnames, IP addresses, routing, SSID. Credentials and private keys are not logged regardless. + internal static let footer = L10n.tr("Core", "service.sections.diagnostics.footer") + /// Diagnostics + internal static let header = L10n.tr("Core", "service.sections.diagnostics.header") + } + internal enum ProviderInfrastructure { + /// Last updated on %@. + internal static func footer(_ p1: Any) -> String { + return L10n.tr("Core", "service.sections.provider_infrastructure.footer", String(describing: p1)) + } + } + internal enum Status { + /// Connection + internal static let header = L10n.tr("Core", "service.sections.status.header") + } + internal enum Trusted { + /// When entering a trusted network, the VPN is normally shut down and kept disconnected. Disable this option to not enforce such behavior. + internal static let footer = L10n.tr("Core", "service.sections.trusted.footer") + /// Trusted networks + internal static let header = L10n.tr("Core", "service.sections.trusted.header") + } + internal enum Vpn { + /// The connection will be established whenever necessary. + internal static let footer = L10n.tr("Core", "service.sections.vpn.footer") + /// VPN + internal static let header = L10n.tr("Core", "service.sections.vpn.header") + } + internal enum VpnResolvesHostname { + /// Preferred in most networks and required in some IPv6 networks. Disable where DNS is blocked, or to speed up negotiation when DNS is slow to respond. + internal static let footer = L10n.tr("Core", "service.sections.vpn_resolves_hostname.footer") + } + internal enum VpnSurvivesSleep { + /// Disable to improve battery usage, at the expense of occasional slowdowns due to wake-up reconnections. + internal static let footer = L10n.tr("Core", "service.sections.vpn_survives_sleep.footer") + } + } + internal enum Welcome { + /// Welcome to Passepartout!\n\nUse the organizer to add a new profile. + internal static let message = L10n.tr("Core", "service.welcome.message") + } + } + + internal enum Share { + /// Passepartout is an user-friendly, open source OpenVPN client for iOS and macOS + internal static let message = L10n.tr("Core", "share.message") + } + + internal enum Shortcuts { + internal enum Add { + /// Add shortcut + internal static let title = L10n.tr("Core", "shortcuts.add.title") internal enum Alerts { - internal enum Buttons { - /// Report an issue - internal static let report = L10n.tr("Core", "parsed_file.alerts.buttons.report") + internal enum NoProfiles { + /// There is no profile to connect to. + internal static let message = L10n.tr("Core", "shortcuts.add.alerts.no_profiles.message") } - internal enum Decryption { - /// The configuration contains an encrypted private key and it could not be decrypted. Double check your entered passphrase. - internal static let message = L10n.tr("Core", "parsed_file.alerts.decryption.message") + } + internal enum Cells { + internal enum Connect { + /// Connect to + internal static let caption = L10n.tr("Core", "shortcuts.add.cells.connect.caption") } - internal enum EncryptionPassphrase { - /// Please enter the encryption passphrase. - internal static let message = L10n.tr("Core", "parsed_file.alerts.encryption_passphrase.message") + internal enum DisableVpn { + /// Disable VPN + internal static let caption = L10n.tr("Core", "shortcuts.add.cells.disable_vpn.caption") } - internal enum Malformed { - /// The configuration file contains a malformed option (%@). - internal static func message(_ p1: Any) -> String { - return L10n.tr("Core", "parsed_file.alerts.malformed.message", String(describing: p1)) - } + internal enum EnableVpn { + /// Enable VPN + internal static let caption = L10n.tr("Core", "shortcuts.add.cells.enable_vpn.caption") } - internal enum Missing { - /// The configuration file lacks a required option (%@). - internal static func message(_ p1: Any) -> String { - return L10n.tr("Core", "parsed_file.alerts.missing.message", String(describing: p1)) - } + internal enum TrustCellular { + /// Trust cellular network + internal static let caption = L10n.tr("Core", "shortcuts.add.cells.trust_cellular.caption") } - internal enum Parsing { - /// Unable to parse the provided configuration file (%@). - internal static func message(_ p1: Any) -> String { - return L10n.tr("Core", "parsed_file.alerts.parsing.message", String(describing: p1)) - } + internal enum TrustCurrentWifi { + /// Trust current Wi-Fi + internal static let caption = L10n.tr("Core", "shortcuts.add.cells.trust_current_wifi.caption") } - internal enum PotentiallyUnsupported { - /// The configuration file is correct but contains a potentially unsupported option (%@).\n\nConnectivity may break depending on server settings. - internal static func message(_ p1: Any) -> String { - return L10n.tr("Core", "parsed_file.alerts.potentially_unsupported.message", String(describing: p1)) - } + internal enum UntrustCellular { + /// Untrust cellular network + internal static let caption = L10n.tr("Core", "shortcuts.add.cells.untrust_cellular.caption") } - internal enum Unsupported { - /// The configuration file contains an unsupported option (%@). - internal static func message(_ p1: Any) -> String { - return L10n.tr("Core", "parsed_file.alerts.unsupported.message", String(describing: p1)) - } + internal enum UntrustCurrentWifi { + /// Untrust current Wi-Fi + internal static let caption = L10n.tr("Core", "shortcuts.add.cells.untrust_current_wifi.caption") + } + } + internal enum Sections { + internal enum Cellular { + /// Cellular + internal static let header = L10n.tr("Core", "shortcuts.add.sections.cellular.header") + } + internal enum Vpn { + /// VPN + internal static let header = L10n.tr("Core", "shortcuts.add.sections.vpn.header") + } + internal enum Wifi { + /// Wi-Fi + internal static let header = L10n.tr("Core", "shortcuts.add.sections.wifi.header") + } + } + } + internal enum Edit { + /// Manage shortcuts + internal static let title = L10n.tr("Core", "shortcuts.edit.title") + internal enum Cells { + internal enum AddShortcut { + /// Add shortcut + internal static let caption = L10n.tr("Core", "shortcuts.edit.cells.add_shortcut.caption") + } + } + internal enum Sections { + internal enum All { + /// Existing shortcuts + internal static let header = L10n.tr("Core", "shortcuts.edit.sections.all.header") + } + } + } + } + + internal enum Translations { + /// Translations + internal static let title = L10n.tr("Core", "translations.title") + } + + internal enum Trusted { + internal enum Columns { + internal enum Trust { + /// Trust + internal static let title = L10n.tr("Core", "trusted.columns.trust.title") + } + } + internal enum Ethernet { + /// Check to trust any wired cable connection. + internal static let description = L10n.tr("Core", "trusted.ethernet.description") + /// Trust wired connections + internal static let title = L10n.tr("Core", "trusted.ethernet.title") + } + } + + internal enum Version { + /// Version + internal static let title = L10n.tr("Core", "version.title") + internal enum Labels { + /// Passepartout and TunnelKit are written and maintained by Davide De Rosa (keeshux).\n\nSource code for Passepartout and TunnelKit is publicly available on GitHub under the GPLv3, you can find links in the home page.\n\nPassepartout is a non-official client and is in no way affiliated with OpenVPN Inc. + internal static let intro = L10n.tr("Core", "version.labels.intro") + } + } + + internal enum Vpn { + /// Active + internal static let active = L10n.tr("Core", "vpn.active") + /// Connecting + internal static let connecting = L10n.tr("Core", "vpn.connecting") + /// Disabled + internal static let disabled = L10n.tr("Core", "vpn.disabled") + /// Disconnecting + internal static let disconnecting = L10n.tr("Core", "vpn.disconnecting") + /// Inactive + internal static let inactive = L10n.tr("Core", "vpn.inactive") + /// Off + internal static let unused = L10n.tr("Core", "vpn.unused") + internal enum Errors { + /// Auth failed + internal static let auth = L10n.tr("Core", "vpn.errors.auth") + /// Compression unsupported + internal static let compression = L10n.tr("Core", "vpn.errors.compression") + /// DNS failed + internal static let dns = L10n.tr("Core", "vpn.errors.dns") + /// Encryption failed + internal static let encryption = L10n.tr("Core", "vpn.errors.encryption") + /// No gateway + internal static let gateway = L10n.tr("Core", "vpn.errors.gateway") + /// Network changed + internal static let network = L10n.tr("Core", "vpn.errors.network") + /// Missing routing + internal static let routing = L10n.tr("Core", "vpn.errors.routing") + /// Server shutdown + internal static let shutdown = L10n.tr("Core", "vpn.errors.shutdown") + /// Timeout + internal static let timeout = L10n.tr("Core", "vpn.errors.timeout") + /// TLS failed + internal static let tls = L10n.tr("Core", "vpn.errors.tls") + } + } + + internal enum Wizards { + internal enum Host { + internal enum Alerts { + internal enum Existing { + /// A host profile with the same title already exists. Replace it? + internal static let message = L10n.tr("Core", "wizards.host.alerts.existing.message") + } + } + internal enum Cells { + internal enum TitleInput { + /// Title + internal static let caption = L10n.tr("Core", "wizards.host.cells.title_input.caption") + } + } + internal enum Sections { + internal enum Existing { + /// Existing profiles + internal static let header = L10n.tr("Core", "wizards.host.sections.existing.header") } } } internal enum Provider { - internal enum Pool { - internal enum Actions { - /// Favorite - internal static let favorite = L10n.tr("Core", "provider.pool.actions.favorite") - /// Unfavorite - internal static let unfavorite = L10n.tr("Core", "provider.pool.actions.unfavorite") - } - internal enum Sections { - internal enum EmptyFavorites { - /// Swipe left on a location to add or remove it from Favorites. - internal static let footer = L10n.tr("Core", "provider.pool.sections.empty_favorites.footer") - } - } - } - internal enum Preset { - internal enum Cells { - internal enum TechDetails { - /// Technical details - internal static let caption = L10n.tr("Core", "provider.preset.cells.tech_details.caption") - } - } - } - } - internal enum Purchase { - /// Purchase - internal static let title = L10n.tr("Core", "purchase.title") - internal enum Cells { - internal enum FullVersion { - /// All providers (including future ones)\n%@ - internal static func extraDescription(_ p1: Any) -> String { - return L10n.tr("Core", "purchase.cells.full_version.extra_description", String(describing: p1)) - } - } - internal enum Restore { - /// If you bought this app or feature in the past, you can restore your purchases and this screen won't show again. - internal static let description = L10n.tr("Core", "purchase.cells.restore.description") - /// Restore purchases - internal static let title = L10n.tr("Core", "purchase.cells.restore.title") - } - } - internal enum Sections { - internal enum Products { - /// Every product is a one-time purchase. Provider purchases do not include a VPN subscription. - internal static let footer = L10n.tr("Core", "purchase.sections.products.footer") - } - } - } - internal enum Reddit { - /// Did you know that Passepartout has a subreddit? Subscribe for updates or to discuss issues, features, new platforms or whatever you like.\n\nIt's also a great way to show you care about this project. - internal static let message = L10n.tr("Core", "reddit.message") - /// Reddit - internal static let title = L10n.tr("Core", "reddit.title") - internal enum Buttons { - /// Don't ask again - internal static let never = L10n.tr("Core", "reddit.buttons.never") - /// Remind me later - internal static let remind = L10n.tr("Core", "reddit.buttons.remind") - /// Subscribe now! - internal static let subscribe = L10n.tr("Core", "reddit.buttons.subscribe") - } - } - internal enum ServerNetwork { - internal enum Cells { - internal enum Route { - /// Route - internal static let caption = L10n.tr("Core", "server_network.cells.route.caption") - } - } - } - internal enum Service { internal enum Alerts { - internal enum Buttons { - /// Reconnect - internal static let reconnect = L10n.tr("Core", "service.alerts.buttons.reconnect") - } - internal enum Configuration { - /// Configuration unavailable, make sure you are connected to the VPN. - internal static let disconnected = L10n.tr("Core", "service.alerts.configuration.disconnected") - } - internal enum CredentialsNeeded { - /// You need to enter account credentials first. - internal static let message = L10n.tr("Core", "service.alerts.credentials_needed.message") - } - internal enum Download { - /// Failed to download configuration files. %@ - internal static func failed(_ p1: Any) -> String { - return L10n.tr("Core", "service.alerts.download.failed", String(describing: p1)) - } - /// %@ requires the download of additional configuration files.\n\nConfirm to start the download. - internal static func message(_ p1: Any) -> String { - return L10n.tr("Core", "service.alerts.download.message", String(describing: p1)) - } - /// Download required - internal static let title = L10n.tr("Core", "service.alerts.download.title") - internal enum Hud { - /// Extracting files, please be patient... - internal static let extracting = L10n.tr("Core", "service.alerts.download.hud.extracting") - } - } - internal enum Location { - internal enum Button { - /// Settings - internal static let settings = L10n.tr("Core", "service.alerts.location.button.settings") - } - internal enum Message { - /// You must allow location access to trust this Wi-Fi network. Go to iOS settings and review your location permissions for Passepartout. - internal static let denied = L10n.tr("Core", "service.alerts.location.message.denied") - } - } - internal enum MasksPrivateData { - internal enum Messages { - /// In order to safely reset the current debug log and apply the new masking preference, you must reconnect to the VPN now. - internal static let mustReconnect = L10n.tr("Core", "service.alerts.masks_private_data.messages.must_reconnect") - } - } - internal enum ReconnectVpn { - /// Do you want to reconnect to the VPN? - internal static let message = L10n.tr("Core", "service.alerts.reconnect_vpn.message") - } - internal enum Rename { - /// Rename profile - internal static let title = L10n.tr("Core", "service.alerts.rename.title") - } - internal enum TestConnectivity { - /// Connectivity - internal static let title = L10n.tr("Core", "service.alerts.test_connectivity.title") - internal enum Messages { - /// Your device has no Internet connectivity, please review your profile parameters. - internal static let failure = L10n.tr("Core", "service.alerts.test_connectivity.messages.failure") - /// Your device is connected to the Internet! - internal static let success = L10n.tr("Core", "service.alerts.test_connectivity.messages.success") - } - } - internal enum Trusted { - internal enum NoNetwork { - /// You are not connected to any Wi-Fi network. - internal static let message = L10n.tr("Core", "service.alerts.trusted.no_network.message") - } - internal enum WillDisconnectPolicy { - /// By changing the trust policy, the VPN may be disconnected. Continue? - internal static let message = L10n.tr("Core", "service.alerts.trusted.will_disconnect_policy.message") - } - internal enum WillDisconnectTrusted { - /// By trusting this network, the VPN may be disconnected. Continue? - internal static let message = L10n.tr("Core", "service.alerts.trusted.will_disconnect_trusted.message") - } + internal enum Unavailable { + /// Could not download provider infrastructure, please retry later. + internal static let message = L10n.tr("Core", "wizards.provider.alerts.unavailable.message") } } internal enum Cells { - internal enum ConnectionStatus { - /// Status - internal static let caption = L10n.tr("Core", "service.cells.connection_status.caption") - } - internal enum DataCount { - /// Exchanged data - internal static let caption = L10n.tr("Core", "service.cells.data_count.caption") - /// Unavailable - internal static let `none` = L10n.tr("Core", "service.cells.data_count.none") - } - internal enum DebugLog { - /// Debug log - internal static let caption = L10n.tr("Core", "service.cells.debug_log.caption") - } - internal enum Host { - internal enum Parameters { - /// Parameters - internal static let caption = L10n.tr("Core", "service.cells.host.parameters.caption") - } - } - internal enum MasksPrivateData { - /// Mask network data - internal static let caption = L10n.tr("Core", "service.cells.masks_private_data.caption") - } - internal enum Provider { - internal enum Pool { - /// Location - internal static let caption = L10n.tr("Core", "service.cells.provider.pool.caption") - } - internal enum Preset { - /// Preset - internal static let caption = L10n.tr("Core", "service.cells.provider.preset.caption") - } - internal enum Refresh { - /// Refresh infrastructure - internal static let caption = L10n.tr("Core", "service.cells.provider.refresh.caption") - } - } - internal enum Reconnect { - /// Reconnect - internal static let caption = L10n.tr("Core", "service.cells.reconnect.caption") - } - internal enum ReportIssue { - /// Report connectivity issue - internal static let caption = L10n.tr("Core", "service.cells.report_issue.caption") - } - internal enum ServerConfiguration { - /// Server configuration - internal static let caption = L10n.tr("Core", "service.cells.server_configuration.caption") - } - internal enum ServerNetwork { - /// Server network - internal static let caption = L10n.tr("Core", "service.cells.server_network.caption") - } - internal enum TestConnectivity { - /// Test connectivity - internal static let caption = L10n.tr("Core", "service.cells.test_connectivity.caption") - } - internal enum TrustedAddWifi { - /// Add Wi-Fi - internal static let caption = L10n.tr("Core", "service.cells.trusted_add_wifi.caption") - } - internal enum TrustedMobile { - /// Cellular network - internal static let caption = L10n.tr("Core", "service.cells.trusted_mobile.caption") - } - internal enum TrustedPolicy { - /// Trust disables VPN - internal static let caption = L10n.tr("Core", "service.cells.trusted_policy.caption") - } - internal enum UseProfile { - /// Use this profile - internal static let caption = L10n.tr("Core", "service.cells.use_profile.caption") - } - internal enum VpnResolvesHostname { - /// Resolve provider hostname - internal static let caption = L10n.tr("Core", "service.cells.vpn_resolves_hostname.caption") - } - internal enum VpnService { - /// Enabled - internal static let caption = L10n.tr("Core", "service.cells.vpn_service.caption") - } - internal enum VpnSurvivesSleep { - /// Keep alive on sleep - internal static let caption = L10n.tr("Core", "service.cells.vpn_survives_sleep.caption") - } - } - internal enum Sections { - internal enum Configuration { - /// Configuration - internal static let header = L10n.tr("Core", "service.sections.configuration.header") - } - internal enum Diagnostics { - /// Masking status will be effective after reconnecting. Network data are hostnames, IP addresses, routing, SSID. Credentials and private keys are not logged regardless. - internal static let footer = L10n.tr("Core", "service.sections.diagnostics.footer") - /// Diagnostics - internal static let header = L10n.tr("Core", "service.sections.diagnostics.header") - } - internal enum ProviderInfrastructure { - /// Last updated on %@. - internal static func footer(_ p1: Any) -> String { - return L10n.tr("Core", "service.sections.provider_infrastructure.footer", String(describing: p1)) - } - } - internal enum Status { - /// Connection - internal static let header = L10n.tr("Core", "service.sections.status.header") - } - internal enum Trusted { - /// When entering a trusted network, the VPN is normally shut down and kept disconnected. Disable this option to not enforce such behavior. - internal static let footer = L10n.tr("Core", "service.sections.trusted.footer") - /// Trusted networks - internal static let header = L10n.tr("Core", "service.sections.trusted.header") - } - internal enum Vpn { - /// The connection will be established whenever necessary. - internal static let footer = L10n.tr("Core", "service.sections.vpn.footer") - /// VPN - internal static let header = L10n.tr("Core", "service.sections.vpn.header") - } - internal enum VpnResolvesHostname { - /// Preferred in most networks and required in some IPv6 networks. Disable where DNS is blocked, or to speed up negotiation when DNS is slow to respond. - internal static let footer = L10n.tr("Core", "service.sections.vpn_resolves_hostname.footer") - } - internal enum VpnSurvivesSleep { - /// Disable to improve battery usage, at the expense of occasional slowdowns due to wake-up reconnections. - internal static let footer = L10n.tr("Core", "service.sections.vpn_survives_sleep.footer") - } - } - internal enum Welcome { - /// Welcome to Passepartout!\n\nUse the organizer to add a new profile. - internal static let message = L10n.tr("Core", "service.welcome.message") - } - } - internal enum Share { - /// Passepartout is an user-friendly, open source OpenVPN client for iOS and macOS - internal static let message = L10n.tr("Core", "share.message") - } - internal enum Shortcuts { - internal enum Add { - /// Add shortcut - internal static let title = L10n.tr("Core", "shortcuts.add.title") - internal enum Alerts { - internal enum NoProfiles { - /// There is no profile to connect to. - internal static let message = L10n.tr("Core", "shortcuts.add.alerts.no_profiles.message") - } - } - internal enum Cells { - internal enum Connect { - /// Connect to - internal static let caption = L10n.tr("Core", "shortcuts.add.cells.connect.caption") - } - internal enum DisableVpn { - /// Disable VPN - internal static let caption = L10n.tr("Core", "shortcuts.add.cells.disable_vpn.caption") - } - internal enum EnableVpn { - /// Enable VPN - internal static let caption = L10n.tr("Core", "shortcuts.add.cells.enable_vpn.caption") - } - internal enum TrustCellular { - /// Trust cellular network - internal static let caption = L10n.tr("Core", "shortcuts.add.cells.trust_cellular.caption") - } - internal enum TrustCurrentWifi { - /// Trust current Wi-Fi - internal static let caption = L10n.tr("Core", "shortcuts.add.cells.trust_current_wifi.caption") - } - internal enum UntrustCellular { - /// Untrust cellular network - internal static let caption = L10n.tr("Core", "shortcuts.add.cells.untrust_cellular.caption") - } - internal enum UntrustCurrentWifi { - /// Untrust current Wi-Fi - internal static let caption = L10n.tr("Core", "shortcuts.add.cells.untrust_current_wifi.caption") - } - } - internal enum Sections { - internal enum Cellular { - /// Cellular - internal static let header = L10n.tr("Core", "shortcuts.add.sections.cellular.header") - } - internal enum Vpn { - /// VPN - internal static let header = L10n.tr("Core", "shortcuts.add.sections.vpn.header") - } - internal enum Wifi { - /// Wi-Fi - internal static let header = L10n.tr("Core", "shortcuts.add.sections.wifi.header") - } - } - } - internal enum Edit { - /// Manage shortcuts - internal static let title = L10n.tr("Core", "shortcuts.edit.title") - internal enum Cells { - internal enum AddShortcut { - /// Add shortcut - internal static let caption = L10n.tr("Core", "shortcuts.edit.cells.add_shortcut.caption") - } - } - internal enum Sections { - internal enum All { - /// Existing shortcuts - internal static let header = L10n.tr("Core", "shortcuts.edit.sections.all.header") - } - } - } - } - internal enum Translations { - /// Translations - internal static let title = L10n.tr("Core", "translations.title") - } - internal enum Version { - /// Version - internal static let title = L10n.tr("Core", "version.title") - internal enum Labels { - /// Passepartout and TunnelKit are written and maintained by Davide De Rosa (keeshux).\n\nSource code for Passepartout and TunnelKit is publicly available on GitHub under the GPLv3, you can find links in the home page.\n\nPassepartout is a non-official client and is in no way affiliated with OpenVPN Inc. - internal static let intro = L10n.tr("Core", "version.labels.intro") - } - } - internal enum Vpn { - /// Active - internal static let active = L10n.tr("Core", "vpn.active") - /// Connecting - internal static let connecting = L10n.tr("Core", "vpn.connecting") - /// Disabled - internal static let disabled = L10n.tr("Core", "vpn.disabled") - /// Disconnecting - internal static let disconnecting = L10n.tr("Core", "vpn.disconnecting") - /// Inactive - internal static let inactive = L10n.tr("Core", "vpn.inactive") - internal enum Errors { - /// Auth failed - internal static let auth = L10n.tr("Core", "vpn.errors.auth") - /// Compression unsupported - internal static let compression = L10n.tr("Core", "vpn.errors.compression") - /// DNS failed - internal static let dns = L10n.tr("Core", "vpn.errors.dns") - /// Encryption failed - internal static let encryption = L10n.tr("Core", "vpn.errors.encryption") - /// No gateway - internal static let gateway = L10n.tr("Core", "vpn.errors.gateway") - /// Network changed - internal static let network = L10n.tr("Core", "vpn.errors.network") - /// Missing routing - internal static let routing = L10n.tr("Core", "vpn.errors.routing") - /// Server shutdown - internal static let shutdown = L10n.tr("Core", "vpn.errors.shutdown") - /// Timeout - internal static let timeout = L10n.tr("Core", "vpn.errors.timeout") - /// TLS failed - internal static let tls = L10n.tr("Core", "vpn.errors.tls") - } - } - internal enum Wizards { - internal enum Host { - internal enum Alerts { - internal enum Existing { - /// A host profile with the same title already exists. Replace it? - internal static let message = L10n.tr("Core", "wizards.host.alerts.existing.message") - } - } - internal enum Cells { - internal enum TitleInput { - /// Title - internal static let caption = L10n.tr("Core", "wizards.host.cells.title_input.caption") - } - } - internal enum Sections { - internal enum Existing { - /// Existing profiles - internal static let header = L10n.tr("Core", "wizards.host.sections.existing.header") - } - } - } - internal enum Provider { - internal enum Alerts { - internal enum Unavailable { - /// Could not download provider infrastructure, please retry later. - internal static let message = L10n.tr("Core", "wizards.provider.alerts.unavailable.message") - } - } - internal enum Cells { - internal enum UpdateList { - /// Update list - internal static let caption = L10n.tr("Core", "wizards.provider.cells.update_list.caption") - } + internal enum UpdateList { + /// Update list + internal static let caption = L10n.tr("Core", "wizards.provider.cells.update_list.caption") } } } diff --git a/Passepartout/App/iOS/Global/Theme+Cells.swift b/Passepartout/App/iOS/Global/Theme+Cells.swift index 47850a7a..45b51411 100644 --- a/Passepartout/App/iOS/Global/Theme+Cells.swift +++ b/Passepartout/App/iOS/Global/Theme+Cells.swift @@ -100,18 +100,18 @@ extension SettingTableViewCell { leftTextColor = theme.palette.primaryText guard let vpnStatus = vpnStatus else { - rightText = L10n.Core.Vpn.disabled + rightText = L10n.Vpn.disabled rightTextColor = theme.palette.secondaryText return } switch vpnStatus { case .connecting: - rightText = L10n.Core.Vpn.connecting + rightText = L10n.Vpn.connecting rightTextColor = theme.palette.indeterminate case .connected: - rightText = L10n.Core.Vpn.active + rightText = L10n.Vpn.active rightTextColor = theme.palette.on case .disconnecting, .disconnected: @@ -119,34 +119,34 @@ extension SettingTableViewCell { if let error = error { switch error { case .socketActivity, .timeout: - disconnectionReason = L10n.Core.Vpn.Errors.timeout + disconnectionReason = L10n.Vpn.Errors.timeout case .dnsFailure: - disconnectionReason = L10n.Core.Vpn.Errors.dns + disconnectionReason = L10n.Vpn.Errors.dns case .tlsInitialization, .tlsServerVerification, .tlsHandshake: - disconnectionReason = L10n.Core.Vpn.Errors.tls + disconnectionReason = L10n.Vpn.Errors.tls case .authentication: - disconnectionReason = L10n.Core.Vpn.Errors.auth + disconnectionReason = L10n.Vpn.Errors.auth case .encryptionInitialization, .encryptionData: - disconnectionReason = L10n.Core.Vpn.Errors.encryption + disconnectionReason = L10n.Vpn.Errors.encryption case .serverCompression, .lzo: - disconnectionReason = L10n.Core.Vpn.Errors.compression + disconnectionReason = L10n.Vpn.Errors.compression case .networkChanged: - disconnectionReason = L10n.Core.Vpn.Errors.network + disconnectionReason = L10n.Vpn.Errors.network case .routing: - disconnectionReason = L10n.Core.Vpn.Errors.routing + disconnectionReason = L10n.Vpn.Errors.routing case .gatewayUnattainable: - disconnectionReason = L10n.Core.Vpn.Errors.gateway + disconnectionReason = L10n.Vpn.Errors.gateway case .serverShutdown: - disconnectionReason = L10n.Core.Vpn.Errors.shutdown + disconnectionReason = L10n.Vpn.Errors.shutdown default: break @@ -154,11 +154,11 @@ extension SettingTableViewCell { } switch vpnStatus { case .disconnecting: - rightText = disconnectionReason ?? L10n.Core.Vpn.disconnecting + rightText = disconnectionReason ?? L10n.Vpn.disconnecting rightTextColor = theme.palette.indeterminate case .disconnected: - rightText = disconnectionReason ?? L10n.Core.Vpn.inactive + rightText = disconnectionReason ?? L10n.Vpn.inactive rightTextColor = theme.palette.off default: diff --git a/Passepartout/App/iOS/Global/Theme.swift b/Passepartout/App/iOS/Global/Theme.swift index 4258407a..fdc7ec0a 100644 --- a/Passepartout/App/iOS/Global/Theme.swift +++ b/Passepartout/App/iOS/Global/Theme.swift @@ -156,7 +156,7 @@ extension UITextField { func applyHostTitle(_ theme: Theme) { applyAlert(theme) - placeholder = L10n.Core.Global.Host.TitleInput.placeholder + placeholder = L10n.Global.Host.TitleInput.placeholder } func applyWiFiTitle(_ theme: Theme) { diff --git a/Passepartout/App/iOS/Scenes/About/AboutViewController.swift b/Passepartout/App/iOS/Scenes/About/AboutViewController.swift index fdc22cc9..82b9a188 100644 --- a/Passepartout/App/iOS/Scenes/About/AboutViewController.swift +++ b/Passepartout/App/iOS/Scenes/About/AboutViewController.swift @@ -39,8 +39,8 @@ class AboutViewController: UITableViewController, StrongTableHost { model.add(.share) model.setHeader("", forSection: .info) model.setHeader("GitHub", forSection: .github) - model.setHeader(L10n.Core.About.Sections.Web.header, forSection: .web) - model.setHeader(L10n.Core.About.Sections.Share.header, forSection: .share) + model.setHeader(L10n.About.Sections.Web.header, forSection: .web) + model.setHeader(L10n.About.Sections.Share.header, forSection: .share) model.set([.version, .credits], forSection: .info) model.set([.readme, .changelog], forSection: .github) model.set([.website, .faq, .disclaimer, .privacyPolicy], forSection: .web) @@ -56,7 +56,7 @@ class AboutViewController: UITableViewController, StrongTableHost { override func viewDidLoad() { super.viewDidLoad() - title = L10n.Core.About.title + title = L10n.About.title } // MARK: Actions @@ -64,7 +64,7 @@ class AboutViewController: UITableViewController, StrongTableHost { private func showVersion() { let vc = VersionViewController() vc.appIcon = Asset.Assets.logo.image - vc.extraText = L10n.Core.Version.Labels.intro + vc.extraText = L10n.Version.Labels.intro vc.backgroundColor = Theme.current.palette.primaryBackground vc.textColor = Theme.current.palette.primaryLightText navigationController?.pushViewController(vc, animated: true) @@ -72,10 +72,10 @@ class AboutViewController: UITableViewController, StrongTableHost { private func showCredits() { let vc = CreditsViewController() - vc.title = L10n.Core.Credits.title - vc.licensesHeader = L10n.Core.Credits.Sections.Licenses.header - vc.noticesHeader = L10n.Core.Credits.Sections.Notices.header - vc.translationsHeader = L10n.Core.Credits.Sections.Translations.header + vc.title = L10n.Credits.title + vc.licensesHeader = L10n.Credits.Sections.Licenses.header + vc.noticesHeader = L10n.Credits.Sections.Notices.header + vc.translationsHeader = L10n.Credits.Sections.Translations.header vc.software = AppConstants.Credits.software vc.translators = AppConstants.Translations.translators vc.accentColor = Theme.current.palette.accent1 @@ -83,7 +83,7 @@ class AboutViewController: UITableViewController, StrongTableHost { } private func inviteFriend(sender: UITableViewCell?) { - let message = "\(L10n.Core.Share.message) \(AppConstants.URLs.website)" + let message = "\(L10n.Share.message) \(AppConstants.URLs.website)" let vc = UIActivityViewController(activityItems: [message], applicationActivities: nil) vc.popoverPresentationController?.sourceView = sender present(vc, animated: true, completion: nil) @@ -159,11 +159,11 @@ extension AboutViewController { let cell = Cells.setting.dequeue(from: tableView, for: indexPath) switch model.row(at: indexPath) { case .version: - cell.leftText = L10n.Core.Version.title + cell.leftText = L10n.Version.title cell.rightText = ApplicationInfo.appVersion case .credits: - cell.leftText = L10n.Core.About.Cells.Credits.caption + cell.leftText = L10n.About.Cells.Credits.caption case .readme: cell.leftText = "README" @@ -172,22 +172,22 @@ extension AboutViewController { cell.leftText = "CHANGELOG" case .website: - cell.leftText = L10n.Core.About.Cells.Website.caption + cell.leftText = L10n.About.Cells.Website.caption case .faq: - cell.leftText = L10n.Core.About.Cells.Faq.caption + cell.leftText = L10n.About.Cells.Faq.caption case .disclaimer: - cell.leftText = L10n.Core.About.Cells.Disclaimer.caption + cell.leftText = L10n.About.Cells.Disclaimer.caption case .privacyPolicy: - cell.leftText = L10n.Core.About.Cells.PrivacyPolicy.caption + cell.leftText = L10n.About.Cells.PrivacyPolicy.caption case .shareTwitter: - cell.leftText = L10n.Core.About.Cells.ShareTwitter.caption + cell.leftText = L10n.About.Cells.ShareTwitter.caption case .shareGeneric: - cell.leftText = L10n.Core.About.Cells.ShareGeneric.caption + cell.leftText = L10n.About.Cells.ShareGeneric.caption case .visitAlternativeTo: cell.leftText = "AlternativeTo" @@ -222,7 +222,7 @@ extension AboutViewController { visitURL(AppConstants.URLs.privacyPolicy) case .shareTwitter: - visitURL(AppConstants.URLs.twitterIntent(withMessage: L10n.Core.Share.message)) + visitURL(AppConstants.URLs.twitterIntent(withMessage: L10n.Share.message)) case .shareGeneric: inviteFriend(sender: tableView.cellForRow(at: indexPath)) diff --git a/Passepartout/App/iOS/Scenes/AccountViewController.swift b/Passepartout/App/iOS/Scenes/AccountViewController.swift index ef197098..7bab615d 100644 --- a/Passepartout/App/iOS/Scenes/AccountViewController.swift +++ b/Passepartout/App/iOS/Scenes/AccountViewController.swift @@ -67,7 +67,7 @@ class AccountViewController: UIViewController, StrongTableHost { model.clear() model.add(.credentials) - model.setHeader(L10n.Core.Account.Sections.Credentials.header, forSection: .credentials) + model.setHeader(L10n.Account.Sections.Credentials.header, forSection: .credentials) model.set([.username, .password], forSection: .credentials) if let _ = infrastructureName { @@ -87,7 +87,7 @@ class AccountViewController: UIViewController, StrongTableHost { } // if let _ = referralURL { // model.add(.registration) -// model.setFooter(L10n.Core.Account.Sections.Registration.footer(name.rawValue), forSection: .registration) +// model.setFooter(L10n.Account.Sections.Registration.footer(name.rawValue), forSection: .registration) // model.set([.signUp], forSection: .registration) // } } @@ -98,7 +98,7 @@ class AccountViewController: UIViewController, StrongTableHost { override func viewDidLoad() { super.viewDidLoad() - title = L10n.Core.Account.title + title = L10n.Account.title cellUsername?.field.text = currentCredentials?.username cellPassword?.field.text = currentCredentials?.password @@ -190,8 +190,8 @@ extension AccountViewController: UITableViewDataSource, UITableViewDelegate, Fie case .username: let cell = Cells.field.dequeue(from: tableView, for: indexPath) cellUsername = cell - cell.caption = L10n.Core.Account.Cells.Username.caption - cell.field.placeholder = usernamePlaceholder ?? L10n.Core.Account.Cells.Username.placeholder + cell.caption = L10n.Account.Cells.Username.caption + cell.field.placeholder = usernamePlaceholder ?? L10n.Account.Cells.Username.placeholder cell.field.clearButtonMode = .always cell.field.isSecureTextEntry = false cell.field.text = currentCredentials?.username @@ -205,8 +205,8 @@ extension AccountViewController: UITableViewDataSource, UITableViewDelegate, Fie case .password: let cell = Cells.field.dequeue(from: tableView, for: indexPath) cellPassword = cell - cell.caption = L10n.Core.Account.Cells.Password.caption - cell.field.placeholder = L10n.Core.Account.Cells.Password.placeholder + cell.caption = L10n.Account.Cells.Password.caption + cell.field.placeholder = L10n.Account.Cells.Password.placeholder cell.field.clearButtonMode = .always cell.field.isSecureTextEntry = true cell.field.text = currentCredentials?.password @@ -218,7 +218,7 @@ extension AccountViewController: UITableViewDataSource, UITableViewDelegate, Fie case .openGuide: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) - cell.leftText = L10n.Core.Account.Cells.OpenGuide.caption + cell.leftText = L10n.Account.Cells.OpenGuide.caption cell.applyAction(.current) return cell @@ -227,7 +227,7 @@ extension AccountViewController: UITableViewDataSource, UITableViewDelegate, Fie fatalError("Sign-up shown when not a provider profile") } let cell = Cells.setting.dequeue(from: tableView, for: indexPath) - cell.leftText = L10n.Core.Account.Cells.Signup.caption(name) + cell.leftText = L10n.Account.Cells.Signup.caption(name) cell.applyAction(.current) return cell } diff --git a/Passepartout/App/iOS/Scenes/ConfigurationViewController.swift b/Passepartout/App/iOS/Scenes/ConfigurationViewController.swift index bf9633d1..de5a0f69 100644 --- a/Passepartout/App/iOS/Scenes/ConfigurationViewController.swift +++ b/Passepartout/App/iOS/Scenes/ConfigurationViewController.swift @@ -64,14 +64,14 @@ class ConfigurationViewController: UIViewController, StrongTableHost { } // headers - model.setHeader(L10n.Core.Configuration.Sections.Communication.header, forSection: .communication) - model.setHeader(L10n.Core.Configuration.Sections.Tls.header, forSection: .tls) - model.setHeader(L10n.Core.Configuration.Sections.Compression.header, forSection: .compression) - model.setHeader(L10n.Core.Configuration.Sections.Other.header, forSection: .other) + model.setHeader(L10n.Configuration.Sections.Communication.header, forSection: .communication) + model.setHeader(L10n.Configuration.Sections.Tls.header, forSection: .tls) + model.setHeader(L10n.Configuration.Sections.Compression.header, forSection: .compression) + model.setHeader(L10n.Configuration.Sections.Other.header, forSection: .other) // footers if isEditable { - model.setFooter(L10n.Core.Configuration.Sections.Reset.footer, forSection: .reset) + model.setFooter(L10n.Configuration.Sections.Reset.footer, forSection: .reset) } // rows @@ -190,17 +190,17 @@ class ConfigurationViewController: UIViewController, StrongTableHost { } private func askForResetConfigurationWithPassphrase(_ originalURL: URL) { - let alert = UIAlertController.asAlert(nil, L10n.Core.ParsedFile.Alerts.EncryptionPassphrase.message) + let alert = UIAlertController.asAlert(nil, L10n.ParsedFile.Alerts.EncryptionPassphrase.message) alert.addTextField { (field) in field.isSecureTextEntry = true } - alert.addPreferredAction(L10n.Core.Global.ok) { + alert.addPreferredAction(L10n.Global.ok) { guard let passphrase = alert.textFields?.first?.text else { return } self.resetOriginalConfiguration(passphrase: passphrase) } - alert.addCancelAction(L10n.Core.Global.cancel) { + alert.addCancelAction(L10n.Global.cancel) { } present(alert, animated: true, completion: nil) } @@ -279,7 +279,7 @@ extension ConfigurationViewController: UITableViewDataSource, UITableViewDelegat func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let row = model.row(at: indexPath) - let V = L10n.Core.Configuration.Cells.self + let V = L10n.Configuration.Cells.self let cell = Cells.setting.dequeue(from: tableView, for: indexPath) if !isEditable { diff --git a/Passepartout/App/iOS/Scenes/DebugLogViewController.swift b/Passepartout/App/iOS/Scenes/DebugLogViewController.swift index bad582c2..0c5a996c 100644 --- a/Passepartout/App/iOS/Scenes/DebugLogViewController.swift +++ b/Passepartout/App/iOS/Scenes/DebugLogViewController.swift @@ -44,7 +44,7 @@ class DebugLogViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - title = L10n.Core.Service.Cells.DebugLog.caption + title = L10n.Service.Cells.DebugLog.caption textLog?.contentInsetAdjustmentBehavior = .never let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(toggleBars)) @@ -79,8 +79,8 @@ class DebugLogViewController: UIViewController { @IBAction private func share(_ sender: Any?) { guard let raw = textLog?.text, !raw.isEmpty else { - let alert = UIAlertController.asAlert(title, L10n.Core.DebugLog.Alerts.EmptyLog.message) - alert.addCancelAction(L10n.Core.Global.ok) + let alert = UIAlertController.asAlert(title, L10n.DebugLog.Alerts.EmptyLog.message) + alert.addCancelAction(L10n.Global.ok) present(alert, animated: true, completion: nil) return } diff --git a/Passepartout/App/iOS/Scenes/EndpointViewController.swift b/Passepartout/App/iOS/Scenes/EndpointViewController.swift index cab5cb82..b8d430af 100644 --- a/Passepartout/App/iOS/Scenes/EndpointViewController.swift +++ b/Passepartout/App/iOS/Scenes/EndpointViewController.swift @@ -67,8 +67,8 @@ class EndpointViewController: UIViewController, StrongTableHost { model.add(.locationAddresses) model.add(.locationProtocols) - model.setHeader(L10n.Core.Endpoint.Sections.LocationAddresses.header, forSection: .locationAddresses) - model.setHeader(L10n.Core.Endpoint.Sections.LocationProtocols.header, forSection: .locationProtocols) + model.setHeader(L10n.Endpoint.Sections.LocationAddresses.header, forSection: .locationAddresses) + model.setHeader(L10n.Endpoint.Sections.LocationProtocols.header, forSection: .locationProtocols) if dataSource.canCustomizeEndpoint { var addressRows: [RowType] = Array(repeating: .availableAddress, count: dataSource.addresses.count) @@ -94,7 +94,7 @@ class EndpointViewController: UIViewController, StrongTableHost { override func viewDidLoad() { super.viewDidLoad() - title = L10n.Core.Endpoint.title + title = L10n.Endpoint.title guard let _ = dataSource else { fatalError("Data source not set") } @@ -203,7 +203,7 @@ extension EndpointViewController: UITableViewDataSource, UITableViewDelegate { switch row { case .anyAddress: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) - cell.leftText = L10n.Core.Endpoint.Cells.AnyAddress.caption + cell.leftText = L10n.Endpoint.Cells.AnyAddress.caption cell.accessoryType = .none cell.isTappable = true if let _ = currentAddress { @@ -230,7 +230,7 @@ extension EndpointViewController: UITableViewDataSource, UITableViewDelegate { case .anyProtocol: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) - cell.leftText = L10n.Core.Endpoint.Cells.AnyProtocol.caption + cell.leftText = L10n.Endpoint.Cells.AnyProtocol.caption cell.accessoryType = .none cell.isTappable = true if let _ = currentProtocol { diff --git a/Passepartout/App/iOS/Scenes/NetworkSettingsViewController.swift b/Passepartout/App/iOS/Scenes/NetworkSettingsViewController.swift index 3c38d19c..9502d89b 100644 --- a/Passepartout/App/iOS/Scenes/NetworkSettingsViewController.swift +++ b/Passepartout/App/iOS/Scenes/NetworkSettingsViewController.swift @@ -91,12 +91,12 @@ class NetworkSettingsViewController: UITableViewController { // headers model.setHeader("", forSection: .choices) - model.setHeader(L10n.Core.NetworkSettings.Gateway.title, forSection: .manualGateway) - model.setHeader(L10n.Core.NetworkSettings.Proxy.title, forSection: .manualProxy) - model.setHeader(L10n.Core.NetworkSettings.Mtu.title, forSection: .manualMTU) + model.setHeader(L10n.NetworkSettings.Gateway.title, forSection: .manualGateway) + model.setHeader(L10n.NetworkSettings.Proxy.title, forSection: .manualProxy) + model.setHeader(L10n.NetworkSettings.Mtu.title, forSection: .manualMTU) // footers -// model.setFooter(L10n.Core.Configuration.Sections.Reset.footer, for: .reset) +// model.setFooter(L10n.Configuration.Sections.Reset.footer, for: .reset) // rows model.set([.gateway, .dns, .proxy, .mtu], forSection: .choices) @@ -135,7 +135,7 @@ class NetworkSettingsViewController: UITableViewController { model.set(proxyRows, forSection: .manualProxy) // refine sections before add (DNS is tricky) - model.setHeader(L10n.Core.NetworkSettings.Dns.title, forSection: .manualDNSProtocol) + model.setHeader(L10n.NetworkSettings.Dns.title, forSection: .manualDNSProtocol) if !dnsServers.isEmpty { } else if !dnsDomains.isEmpty { sections.removeAll { $0 == .manualDNSServers } @@ -405,25 +405,25 @@ extension NetworkSettingsViewController { switch row { case .gateway: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) - cell.leftText = L10n.Core.NetworkSettings.Gateway.title + cell.leftText = L10n.NetworkSettings.Gateway.title cell.rightText = networkChoices.gateway.description return cell case .dns: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) - cell.leftText = L10n.Core.NetworkSettings.Dns.title + cell.leftText = L10n.NetworkSettings.Dns.title cell.rightText = networkChoices.dns.description return cell case .proxy: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) - cell.leftText = L10n.Core.NetworkSettings.Proxy.title + cell.leftText = L10n.NetworkSettings.Proxy.title cell.rightText = networkChoices.proxy.description return cell case .mtu: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) - cell.leftText = L10n.Core.NetworkSettings.Mtu.title + cell.leftText = L10n.NetworkSettings.Mtu.title cell.rightText = (networkChoices.mtu ?? ProfileNetworkChoices.defaultChoice).description return cell @@ -443,7 +443,7 @@ extension NetworkSettingsViewController { case .dnsProtocol: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) - cell.leftText = L10n.Core.Global.Captions.protocol + cell.leftText = L10n.Global.Captions.protocol cell.rightText = (networkSettings.dnsProtocol ?? .fallback)?.description if networkChoices.dns == .manual { cell.accessoryType = .disclosureIndicator @@ -481,9 +481,9 @@ extension NetworkSettingsViewController { let i = indexPath.row - Offsets.dnsAddress let cell = Cells.field.dequeue(from: tableView, for: indexPath) - cell.caption = L10n.Core.Global.Captions.address + cell.caption = L10n.Global.Captions.address cell.field.tag = FieldTag.dnsAddress.rawValue + i - cell.field.placeholder = L10n.Core.Global.Values.none + cell.field.placeholder = L10n.Global.Values.none cell.field.text = networkSettings.dnsServers?[i] cell.field.clearButtonMode = .always cell.field.keyboardType = .numbersAndPunctuation @@ -495,16 +495,16 @@ extension NetworkSettingsViewController { case .dnsAddAddress: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) cell.applyAction(.current) - cell.leftText = L10n.Core.NetworkSettings.Cells.AddDnsServer.caption + cell.leftText = L10n.NetworkSettings.Cells.AddDnsServer.caption return cell case .dnsDomain: let i = indexPath.row - Offsets.dnsDomain let cell = Cells.field.dequeue(from: tableView, for: indexPath) - cell.caption = L10n.Core.NetworkSettings.Dns.Cells.Domain.caption + cell.caption = L10n.NetworkSettings.Dns.Cells.Domain.caption cell.field.tag = FieldTag.dnsDomain.rawValue + i - cell.field.placeholder = L10n.Core.Global.Values.none + cell.field.placeholder = L10n.Global.Values.none cell.field.text = networkSettings.dnsSearchDomains?[i] cell.field.clearButtonMode = .always cell.field.keyboardType = .asciiCapable @@ -516,14 +516,14 @@ extension NetworkSettingsViewController { case .dnsAddDomain: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) cell.applyAction(.current) - cell.leftText = L10n.Core.NetworkSettings.Cells.AddDnsDomain.caption + cell.leftText = L10n.NetworkSettings.Cells.AddDnsDomain.caption return cell case .proxyAddress: let cell = Cells.field.dequeue(from: tableView, for: indexPath) - cell.caption = L10n.Core.Global.Captions.address + cell.caption = L10n.Global.Captions.address cell.field.tag = FieldTag.proxyAddress.rawValue - cell.field.placeholder = L10n.Core.Global.Values.none + cell.field.placeholder = L10n.Global.Values.none cell.field.text = networkSettings.proxyAddress cell.field.clearButtonMode = .always cell.field.keyboardType = .numbersAndPunctuation @@ -534,9 +534,9 @@ extension NetworkSettingsViewController { case .proxyPort: let cell = Cells.field.dequeue(from: tableView, for: indexPath) - cell.caption = L10n.Core.Global.Captions.port + cell.caption = L10n.Global.Captions.port cell.field.tag = FieldTag.proxyPort.rawValue - cell.field.placeholder = L10n.Core.Global.Values.none + cell.field.placeholder = L10n.Global.Values.none cell.field.text = networkSettings.proxyPort?.description cell.field.clearButtonMode = .always cell.field.keyboardType = .numberPad @@ -549,7 +549,7 @@ extension NetworkSettingsViewController { let cell = Cells.field.dequeue(from: tableView, for: indexPath) cell.caption = "PAC" cell.field.tag = FieldTag.proxyAutoConfigurationURL.rawValue - cell.field.placeholder = L10n.Core.Global.Values.none + cell.field.placeholder = L10n.Global.Values.none cell.field.text = networkSettings.proxyAutoConfigurationURL?.absoluteString cell.field.clearButtonMode = .always cell.field.keyboardType = .asciiCapable @@ -562,9 +562,9 @@ extension NetworkSettingsViewController { let i = indexPath.row - Offsets.proxyBypass let cell = Cells.field.dequeue(from: tableView, for: indexPath) - cell.caption = L10n.Core.NetworkSettings.Cells.ProxyBypass.caption + cell.caption = L10n.NetworkSettings.Cells.ProxyBypass.caption cell.field.tag = FieldTag.proxyBypass.rawValue + i - cell.field.placeholder = L10n.Core.Global.Values.none + cell.field.placeholder = L10n.Global.Values.none cell.field.text = networkSettings.proxyBypassDomains?[i] cell.field.clearButtonMode = .always cell.field.keyboardType = .asciiCapable @@ -576,13 +576,13 @@ extension NetworkSettingsViewController { case .proxyAddBypass: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) cell.applyAction(.current) - cell.leftText = L10n.Core.NetworkSettings.Cells.AddProxyBypass.caption + cell.leftText = L10n.NetworkSettings.Cells.AddProxyBypass.caption return cell case .mtuBytes: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) - cell.leftText = L10n.Core.NetworkSettings.Mtu.Cells.Bytes.caption - cell.rightText = networkSettings.mtuBytes?.description ?? L10n.Core.Global.Values.default + cell.leftText = L10n.NetworkSettings.Mtu.Cells.Bytes.caption + cell.rightText = networkSettings.mtuBytes?.description ?? L10n.Global.Values.default return cell } } @@ -706,7 +706,7 @@ extension NetworkSettingsViewController { vc.options = ProfileNetworkSettings.mtuOptions vc.descriptionBlock = { guard $0 != 0 else { - return L10n.Core.Global.Values.default + return L10n.Global.Values.default } return $0.description } diff --git a/Passepartout/App/iOS/Scenes/Organizer/DonationViewController.swift b/Passepartout/App/iOS/Scenes/Organizer/DonationViewController.swift index 8b2100c6..bc31bc86 100644 --- a/Passepartout/App/iOS/Scenes/Organizer/DonationViewController.swift +++ b/Passepartout/App/iOS/Scenes/Organizer/DonationViewController.swift @@ -57,8 +57,8 @@ class DonationViewController: UITableViewController, StrongTableHost { model.clear() model.add(.oneTime) - model.setHeader(L10n.Core.Donation.Sections.OneTime.header, forSection: .oneTime) - model.setFooter(L10n.Core.Donation.Sections.OneTime.footer, forSection: .oneTime) + model.setHeader(L10n.Donation.Sections.OneTime.header, forSection: .oneTime) + model.setFooter(L10n.Donation.Sections.OneTime.footer, forSection: .oneTime) guard !isLoading else { model.set([.loading], forSection: .oneTime) @@ -79,7 +79,7 @@ class DonationViewController: UITableViewController, StrongTableHost { override func viewDidLoad() { super.viewDidLoad() - title = L10n.Core.Donation.title + title = L10n.Donation.title reloadModel() ProductManager.shared.listProducts { @@ -118,12 +118,12 @@ class DonationViewController: UITableViewController, StrongTableHost { switch model.row(at: indexPath) { case .loading: let cell = Cells.activity.dequeue(from: tableView, for: indexPath) - cell.textLabel?.text = L10n.Core.Donation.Cells.Loading.caption + cell.textLabel?.text = L10n.Donation.Cells.Loading.caption return cell case .purchasing: let cell = Cells.activity.dequeue(from: tableView, for: indexPath) - cell.textLabel?.text = L10n.Core.Donation.Cells.Purchasing.caption + cell.textLabel?.text = L10n.Donation.Cells.Purchasing.caption return cell case .donation: @@ -174,12 +174,12 @@ class DonationViewController: UITableViewController, StrongTableHost { return case .success: - alert = UIAlertController.asAlert(L10n.Core.Donation.Alerts.Purchase.Success.title, L10n.Core.Donation.Alerts.Purchase.Success.message) + alert = UIAlertController.asAlert(L10n.Donation.Alerts.Purchase.Success.title, L10n.Donation.Alerts.Purchase.Success.message) case .failure: - alert = UIAlertController.asAlert(title, L10n.Core.Donation.Alerts.Purchase.Failure.message(error?.localizedDescription ?? "")) + alert = UIAlertController.asAlert(title, L10n.Donation.Alerts.Purchase.Failure.message(error?.localizedDescription ?? "")) } - alert.addCancelAction(L10n.Core.Global.ok) { + alert.addCancelAction(L10n.Global.ok) { self.isPurchasing = false self.reloadModel() self.tableView.reloadData() diff --git a/Passepartout/App/iOS/Scenes/Organizer/ImportedHostsViewController.swift b/Passepartout/App/iOS/Scenes/Organizer/ImportedHostsViewController.swift index f070611f..ae499cb6 100644 --- a/Passepartout/App/iOS/Scenes/Organizer/ImportedHostsViewController.swift +++ b/Passepartout/App/iOS/Scenes/Organizer/ImportedHostsViewController.swift @@ -42,7 +42,7 @@ class ImportedHostsViewController: UITableViewController { override func viewDidLoad() { super.viewDidLoad() - title = L10n.Core.ImportedHosts.title + title = L10n.ImportedHosts.title } private func selectHost(withUrl url: URL) { diff --git a/Passepartout/App/iOS/Scenes/Organizer/OrganizerViewController.swift b/Passepartout/App/iOS/Scenes/Organizer/OrganizerViewController.swift index cb7a0436..8b474e9a 100644 --- a/Passepartout/App/iOS/Scenes/Organizer/OrganizerViewController.swift +++ b/Passepartout/App/iOS/Scenes/Organizer/OrganizerViewController.swift @@ -61,22 +61,22 @@ class OrganizerViewController: UITableViewController, StrongTableHost { model.add(.support) if ProductManager.shared.isEligibleForFeedback() { model.add(.feedback) - model.setHeader(L10n.Core.Organizer.Sections.Feedback.header, forSection: .feedback) + model.setHeader(L10n.Organizer.Sections.Feedback.header, forSection: .feedback) model.set([.writeReview], forSection: .feedback) } model.add(.about) model.add(.destruction) - model.setHeader(L10n.Core.Service.Sections.Vpn.header, forSection: .vpn) - model.setHeader(L10n.Core.Organizer.Sections.Providers.header, forSection: .providers) - model.setHeader(L10n.Core.Organizer.Sections.Hosts.header, forSection: .hosts) - model.setFooter(L10n.Core.Organizer.Sections.Providers.footer, forSection: .providers) - model.setFooter(L10n.Core.Organizer.Sections.Hosts.footer, forSection: .hosts) + model.setHeader(L10n.Service.Sections.Vpn.header, forSection: .vpn) + model.setHeader(L10n.Organizer.Sections.Providers.header, forSection: .providers) + model.setHeader(L10n.Organizer.Sections.Hosts.header, forSection: .hosts) + model.setFooter(L10n.Organizer.Sections.Providers.footer, forSection: .providers) + model.setFooter(L10n.Organizer.Sections.Hosts.footer, forSection: .hosts) if #available(iOS 12, *) { - model.setHeader(L10n.Core.Organizer.Sections.Siri.header, forSection: .siri) - model.setFooter(L10n.Core.Organizer.Sections.Siri.footer, forSection: .siri) + model.setHeader(L10n.Organizer.Sections.Siri.header, forSection: .siri) + model.setFooter(L10n.Organizer.Sections.Siri.footer, forSection: .siri) model.set([.siriShortcuts], forSection: .siri) } - model.setHeader(L10n.Core.Organizer.Sections.Support.header, forSection: .support) + model.setHeader(L10n.Organizer.Sections.Support.header, forSection: .support) model.set([.connectionStatus], forSection: .vpn) model.set([.donate, .githubSponsors, .joinCommunity], forSection: .support) @@ -136,15 +136,15 @@ class OrganizerViewController: UITableViewController, StrongTableHost { if !didShowSubreddit && !TransientStore.didHandleSubreddit { didShowSubreddit = true - let alert = UIAlertController.asAlert(L10n.Core.Reddit.title, L10n.Core.Reddit.message) - alert.addPreferredAction(L10n.Core.Reddit.Buttons.subscribe) { + let alert = UIAlertController.asAlert(L10n.Reddit.title, L10n.Reddit.message) + alert.addPreferredAction(L10n.Reddit.Buttons.subscribe) { TransientStore.didHandleSubreddit = true self.subscribeSubreddit() } - alert.addAction(L10n.Core.Reddit.Buttons.never) { + alert.addAction(L10n.Reddit.Buttons.never) { TransientStore.didHandleSubreddit = true } - alert.addCancelAction(L10n.Core.Reddit.Buttons.remind) + alert.addCancelAction(L10n.Reddit.Buttons.remind) present(alert, animated: true, completion: nil) } } @@ -198,10 +198,10 @@ class OrganizerViewController: UITableViewController, StrongTableHost { private func addNewProvider() { guard service.hasAvailableProviders() else { let alert = UIAlertController.asAlert( - L10n.Core.Organizer.Sections.Providers.header, - L10n.Core.Organizer.Alerts.ExhaustedProviders.message + L10n.Organizer.Sections.Providers.header, + L10n.Organizer.Alerts.ExhaustedProviders.message ) - alert.addCancelAction(L10n.Core.Global.ok) + alert.addCancelAction(L10n.Global.ok) present(alert, animated: true, completion: nil) return } @@ -243,10 +243,10 @@ class OrganizerViewController: UITableViewController, StrongTableHost { private func donateToDeveloper() { guard SKPaymentQueue.canMakePayments() else { let alert = UIAlertController.asAlert( - L10n.Core.Organizer.Cells.Donate.caption, - L10n.Core.Organizer.Alerts.CannotDonate.message + L10n.Organizer.Cells.Donate.caption, + L10n.Organizer.Alerts.CannotDonate.message ) - alert.addCancelAction(L10n.Core.Global.ok) + alert.addCancelAction(L10n.Global.ok) present(alert, animated: true, completion: nil) return } @@ -262,8 +262,8 @@ class OrganizerViewController: UITableViewController, StrongTableHost { guard MFMailComposeViewController.canSendMail() else { let app = UIApplication.shared guard let url = URL.mailto(to: recipient, subject: subject, body: body), app.canOpenURL(url) else { - let alert = UIAlertController.asAlert(L10n.Core.Translations.title, L10n.Core.Global.emailNotConfigured) - alert.addCancelAction(L10n.Core.Global.ok) + let alert = UIAlertController.asAlert(L10n.Translations.title, L10n.Global.emailNotConfigured) + alert.addCancelAction(L10n.Global.ok) present(alert, animated: true, completion: nil) return } @@ -335,13 +335,13 @@ class OrganizerViewController: UITableViewController, StrongTableHost { private func confirmVpnProfileDeletion() { let alert = UIAlertController.asAlert( - L10n.Core.Organizer.Cells.Uninstall.caption, - L10n.Core.Organizer.Alerts.DeleteVpnProfile.message + L10n.Organizer.Cells.Uninstall.caption, + L10n.Organizer.Alerts.DeleteVpnProfile.message ) - alert.addPreferredAction(L10n.Core.Global.ok) { + alert.addPreferredAction(L10n.Global.ok) { VPN.shared.uninstall(completionHandler: nil) } - alert.addCancelAction(L10n.Core.Global.cancel) + alert.addCancelAction(L10n.Global.cancel) present(alert, animated: true, completion: nil) } @@ -362,7 +362,7 @@ class OrganizerViewController: UITableViewController, StrongTableHost { private func testInterfaces() { let alert = UIAlertController.asAlert("Test interfaces", nil) - alert.addCancelAction(L10n.Core.Global.ok) + alert.addCancelAction(L10n.Global.ok) defer { present(alert, animated: true, completion: nil) } @@ -390,7 +390,7 @@ class OrganizerViewController: UITableViewController, StrongTableHost { return } let alert = UIAlertController.asAlert("Debug log", log) - alert.addCancelAction(L10n.Core.Global.ok) + alert.addCancelAction(L10n.Global.ok) present(alert, animated: true, completion: nil) } @@ -496,7 +496,7 @@ extension OrganizerViewController { case .connectionStatus: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) cell.applyVPN(.current, with: VPN.shared.isEnabled ? VPN.shared.status : nil, error: nil) - cell.leftText = L10n.Core.Service.Cells.ConnectionStatus.caption + cell.leftText = L10n.Service.Cells.ConnectionStatus.caption return cell case .profile: @@ -509,67 +509,67 @@ extension OrganizerViewController { cell.imageView?.image = nil } cell.leftText = service.screenTitle(rowProfile) - cell.rightText = service.isActiveProfile(rowProfile) ? L10n.Core.Organizer.Cells.Profile.Value.current : nil + cell.rightText = service.isActiveProfile(rowProfile) ? L10n.Organizer.Cells.Profile.Value.current : nil return cell case .addProvider: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) cell.applyAction(.current) - cell.leftText = L10n.Core.Organizer.Cells.AddProvider.caption + cell.leftText = L10n.Organizer.Cells.AddProvider.caption return cell case .addHost: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) cell.applyAction(.current) - cell.leftText = L10n.Core.Organizer.Cells.AddHost.caption + cell.leftText = L10n.Organizer.Cells.AddHost.caption return cell case .importHost: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) cell.applyAction(.current) - cell.leftText = L10n.Core.Organizer.Cells.ImportHost.caption + cell.leftText = L10n.Organizer.Cells.ImportHost.caption return cell case .siriShortcuts: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) cell.applyAction(.current) - cell.leftText = L10n.Core.Organizer.Cells.SiriShortcuts.caption + cell.leftText = L10n.Organizer.Cells.SiriShortcuts.caption return cell case .donate: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) - cell.leftText = L10n.Core.Organizer.Cells.Donate.caption + cell.leftText = L10n.Organizer.Cells.Donate.caption return cell case .githubSponsors: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) - cell.leftText = L10n.Core.Organizer.Cells.GithubSponsors.caption + cell.leftText = L10n.Organizer.Cells.GithubSponsors.caption return cell case .translate: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) - cell.leftText = L10n.Core.Organizer.Cells.Translate.caption + cell.leftText = L10n.Organizer.Cells.Translate.caption return cell case .joinCommunity: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) - cell.leftText = L10n.Core.Organizer.Cells.JoinCommunity.caption + cell.leftText = L10n.Organizer.Cells.JoinCommunity.caption return cell case .writeReview: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) - cell.leftText = L10n.Core.Organizer.Cells.WriteReview.caption + cell.leftText = L10n.Organizer.Cells.WriteReview.caption return cell case .openAbout: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) - cell.leftText = L10n.Core.Organizer.Cells.About.caption(GroupConstants.App.name) + cell.leftText = L10n.Organizer.Cells.About.caption(GroupConstants.App.name) cell.rightText = ApplicationInfo.appVersion return cell case .uninstall: let cell = Cells.destructive.dequeue(from: tableView, for: indexPath) - cell.caption = L10n.Core.Organizer.Cells.Uninstall.caption + cell.caption = L10n.Organizer.Cells.Uninstall.caption return cell case .testInterfaces: diff --git a/Passepartout/App/iOS/Scenes/Organizer/WizardHostViewController.swift b/Passepartout/App/iOS/Scenes/Organizer/WizardHostViewController.swift index c43cd05a..25680957 100644 --- a/Passepartout/App/iOS/Scenes/Organizer/WizardHostViewController.swift +++ b/Passepartout/App/iOS/Scenes/Organizer/WizardHostViewController.swift @@ -55,10 +55,10 @@ class WizardHostViewController: UITableViewController, StrongTableHost { lazy var model: StrongTableModel = { let model: StrongTableModel = StrongTableModel() model.add(.meta) -// model.setFooter(L10n.Core.Global.Host.TitleInput.message, forSection: .meta) +// model.setFooter(L10n.Global.Host.TitleInput.message, forSection: .meta) if !existingHostIds.isEmpty { model.add(.existing) - model.setHeader(L10n.Core.Wizards.Host.Sections.Existing.header, forSection: .existing) + model.setHeader(L10n.Wizards.Host.Sections.Existing.header, forSection: .existing) } model.set([.titleInput], forSection: .meta) model.set(.existingHost, count: existingHostIds.count, forSection: .existing) @@ -73,8 +73,8 @@ class WizardHostViewController: UITableViewController, StrongTableHost { override func viewDidLoad() { super.viewDidLoad() - title = L10n.Core.Organizer.Sections.Hosts.header - itemNext.title = L10n.Core.Global.next + title = L10n.Organizer.Sections.Hosts.header + itemNext.title = L10n.Global.next } override func viewWillAppear(_ animated: Bool) { @@ -114,11 +114,11 @@ class WizardHostViewController: UITableViewController, StrongTableHost { replacedProfile = nil if let existingProfile = service.hostProfile(withTitle: enteredTitle) { replacedProfile = existingProfile - let alert = UIAlertController.asAlert(title, L10n.Core.Wizards.Host.Alerts.Existing.message) - alert.addPreferredAction(L10n.Core.Global.ok) { + let alert = UIAlertController.asAlert(title, L10n.Wizards.Host.Alerts.Existing.message) + alert.addPreferredAction(L10n.Global.ok) { self.next(withProfile: profile, title: enteredTitle) } - alert.addCancelAction(L10n.Core.Global.cancel) + alert.addCancelAction(L10n.Global.cancel) present(alert, animated: true, completion: nil) return } @@ -211,7 +211,7 @@ extension WizardHostViewController { switch model.row(at: indexPath) { case .titleInput: let cell = Cells.field.dequeue(from: tableView, for: indexPath) - cell.caption = L10n.Core.Wizards.Host.Cells.TitleInput.caption + cell.caption = L10n.Wizards.Host.Cells.TitleInput.caption cell.captionWidth = 100.0 // cell.allowedCharset = .filename cell.field.applyHostTitle(.current) diff --git a/Passepartout/App/iOS/Scenes/Organizer/WizardProviderViewController.swift b/Passepartout/App/iOS/Scenes/Organizer/WizardProviderViewController.swift index a06a6fdb..01c9e203 100644 --- a/Passepartout/App/iOS/Scenes/Organizer/WizardProviderViewController.swift +++ b/Passepartout/App/iOS/Scenes/Organizer/WizardProviderViewController.swift @@ -63,7 +63,7 @@ class WizardProviderViewController: UITableViewController, StrongTableHost { let nc = NotificationCenter.default nc.addObserver(self, selector: #selector(didReloadReceipt), name: ProductManager.didReloadReceipt, object: nil) - title = L10n.Core.Organizer.Sections.Providers.header + title = L10n.Organizer.Sections.Providers.header reloadModel() } @@ -115,7 +115,7 @@ class WizardProviderViewController: UITableViewController, StrongTableHost { } private func alertMissingInfrastructure(forMetadata metadata: Infrastructure.Metadata, error: Error?) { - var message = L10n.Core.Wizards.Provider.Alerts.Unavailable.message + var message = L10n.Wizards.Provider.Alerts.Unavailable.message if let error = error { log.error("Unable to download missing \(metadata.description) infrastructure (network error): \(error.localizedDescription)") message.append(" \(error.localizedDescription)") @@ -124,7 +124,7 @@ class WizardProviderViewController: UITableViewController, StrongTableHost { } let alert = UIAlertController.asAlert(metadata.description, message) - alert.addCancelAction(L10n.Core.Global.ok) + alert.addCancelAction(L10n.Global.ok) present(alert, animated: true, completion: nil) if let ip = tableView.indexPathForSelectedRow { @@ -197,7 +197,7 @@ extension WizardProviderViewController { case .updateList: cell.applyAction(.current) cell.imageView?.image = nil - cell.leftText = L10n.Core.Wizards.Provider.Cells.UpdateList.caption + cell.leftText = L10n.Wizards.Provider.Cells.UpdateList.caption } return cell } diff --git a/Passepartout/App/iOS/Scenes/ProviderPoolViewController.swift b/Passepartout/App/iOS/Scenes/ProviderPoolViewController.swift index afc6361a..03cff1a7 100644 --- a/Passepartout/App/iOS/Scenes/ProviderPoolViewController.swift +++ b/Passepartout/App/iOS/Scenes/ProviderPoolViewController.swift @@ -79,7 +79,7 @@ class ProviderPoolViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - title = L10n.Core.Service.Cells.Provider.Pool.caption + title = L10n.Service.Cells.Provider.Pool.caption tableView.reloadData() if let ip = selectedIndexPath { tableView.selectRowAsync(at: ip) @@ -181,7 +181,7 @@ extension ProviderPoolViewController: UITableViewDataSource, UITableViewDelegate func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String? { if isShowingEmptyFavorites { - return L10n.Core.Provider.Pool.Sections.EmptyFavorites.footer + return L10n.Provider.Pool.Sections.EmptyFavorites.footer } return nil } @@ -232,7 +232,7 @@ extension ProviderPoolViewController: UITableViewDataSource, UITableViewDelegate vc.title = group.localizedCountry vc.options = group.pools.sortedPools() vc.selectedOption = currentPool - vc.descriptionBlock = { !$0.secondaryId.isEmpty ? $0.secondaryId : L10n.Core.Global.Values.default } + vc.descriptionBlock = { !$0.secondaryId.isEmpty ? $0.secondaryId : L10n.Global.Values.default } vc.selectionBlock = { self.currentPool = $0 self.delegate?.providerPoolController(self, didSelectPool: $0) @@ -251,12 +251,12 @@ extension ProviderPoolViewController: UITableViewDataSource, UITableViewDelegate let action: UIContextualAction if favoriteGroupIds.contains(groupId) { - action = UIContextualAction(style: .destructive, title: L10n.Core.Provider.Pool.Actions.unfavorite) { + action = UIContextualAction(style: .destructive, title: L10n.Provider.Pool.Actions.unfavorite) { self.unfavoriteGroup(in: category, withId: groupId, deletingRowAt: self.isShowingFavorites ? indexPath : nil) $2(true) } } else if !isShowingFavorites { - action = UIContextualAction(style: .normal, title: L10n.Core.Provider.Pool.Actions.favorite) { + action = UIContextualAction(style: .normal, title: L10n.Provider.Pool.Actions.favorite) { self.favoriteGroup(withId: groupId) $2(true) } diff --git a/Passepartout/App/iOS/Scenes/ProviderPresetViewController.swift b/Passepartout/App/iOS/Scenes/ProviderPresetViewController.swift index f8748bb8..ef7e09ce 100644 --- a/Passepartout/App/iOS/Scenes/ProviderPresetViewController.swift +++ b/Passepartout/App/iOS/Scenes/ProviderPresetViewController.swift @@ -48,7 +48,7 @@ class ProviderPresetViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - title = L10n.Core.Service.Cells.Provider.Preset.caption + title = L10n.Service.Cells.Provider.Preset.caption tableView.reloadData() if let ip = selectedIndexPath { tableView.scrollToRowAsync(at: ip) @@ -88,7 +88,7 @@ extension ProviderPresetViewController: UITableViewDataSource, UITableViewDelega } // func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String? { -// return L10n.Core.Provider.Preset.Sections.Main.footer +// return L10n.Provider.Preset.Sections.Main.footer // } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { @@ -107,7 +107,7 @@ extension ProviderPresetViewController: UITableViewDataSource, UITableViewDelega case .techDetails: cell.applyAction(.current) - cell.leftText = L10n.Core.Provider.Preset.Cells.TechDetails.caption + cell.leftText = L10n.Provider.Preset.Cells.TechDetails.caption cell.accessoryType = .none } return cell diff --git a/Passepartout/App/iOS/Scenes/Purchase/PurchaseViewController.swift b/Passepartout/App/iOS/Scenes/Purchase/PurchaseViewController.swift index 4e62bf02..a481b93c 100644 --- a/Passepartout/App/iOS/Scenes/Purchase/PurchaseViewController.swift +++ b/Passepartout/App/iOS/Scenes/Purchase/PurchaseViewController.swift @@ -59,7 +59,7 @@ class PurchaseViewController: UITableViewController, StrongTableHost { func reloadModel() { model.clear() model.add(.products) - model.setFooter(L10n.Core.Purchase.Sections.Products.footer, forSection: .products) + model.setFooter(L10n.Purchase.Sections.Products.footer, forSection: .products) var rows: [RowType] = [] let pm = ProductManager.shared @@ -94,7 +94,7 @@ class PurchaseViewController: UITableViewController, StrongTableHost { override func viewDidLoad() { super.viewDidLoad() - title = L10n.Core.Purchase.title + title = L10n.Purchase.title navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .stop, target: self, action: #selector(close)) isLoading = true @@ -172,7 +172,7 @@ class PurchaseViewController: UITableViewController, StrongTableHost { log.error("Unable to purchase \(product): \(error)") let alert = UIAlertController.asAlert(product.localizedTitle, error.localizedDescription) - alert.addCancelAction(L10n.Core.Global.ok) + alert.addCancelAction(L10n.Global.ok) present(alert, animated: true, completion: nil) } @@ -234,8 +234,8 @@ extension PurchaseViewController { case .restore: cell.fill( - title: L10n.Core.Purchase.Cells.Restore.title, - description: L10n.Core.Purchase.Cells.Restore.description + title: L10n.Purchase.Cells.Restore.title, + description: L10n.Purchase.Cells.Restore.description ) } return cell diff --git a/Passepartout/App/iOS/Scenes/ServerNetworkViewController.swift b/Passepartout/App/iOS/Scenes/ServerNetworkViewController.swift index 564cc63a..769f70dc 100644 --- a/Passepartout/App/iOS/Scenes/ServerNetworkViewController.swift +++ b/Passepartout/App/iOS/Scenes/ServerNetworkViewController.swift @@ -102,8 +102,8 @@ class ServerNetworkViewController: UITableViewController, StrongTableHost { // headers model.setHeader("IPv4", forSection: .ipv4) model.setHeader("IPv6", forSection: .ipv6) - model.setHeader(L10n.Core.NetworkSettings.Dns.title, forSection: .dns) - model.setHeader(L10n.Core.NetworkSettings.Proxy.title, forSection: .proxy) + model.setHeader(L10n.NetworkSettings.Dns.title, forSection: .dns) + model.setHeader(L10n.NetworkSettings.Proxy.title, forSection: .proxy) return model }() @@ -182,22 +182,22 @@ extension ServerNetworkViewController { case .ipv4: switch row { case .address: - cell.leftText = L10n.Core.Global.Captions.address + cell.leftText = L10n.Global.Captions.address if let ipv4 = configuration.ipv4 { cell.rightText = "\(ipv4.address)/\(ipv4.addressMask)" } else { - cell.rightText = L10n.Core.Global.Values.none + cell.rightText = L10n.Global.Values.none } case .defaultGateway: - cell.leftText = L10n.Core.NetworkSettings.Gateway.title - cell.rightText = configuration.ipv4?.defaultGateway ?? L10n.Core.Global.Values.none + cell.leftText = L10n.NetworkSettings.Gateway.title + cell.rightText = configuration.ipv4?.defaultGateway ?? L10n.Global.Values.none case .route: guard let route = configuration.ipv4?.routes[indexPath.row - indexOfFirstRoute4] else { fatalError("Got an IPv4 route cell with empty routes") } - cell.leftText = L10n.Core.ServerNetwork.Cells.Route.caption + cell.leftText = L10n.ServerNetwork.Cells.Route.caption cell.rightText = "\(route.destination)/\(route.mask) -> \(route.gateway)" default: @@ -207,22 +207,22 @@ extension ServerNetworkViewController { case .ipv6: switch row { case .address: - cell.leftText = L10n.Core.Global.Captions.address + cell.leftText = L10n.Global.Captions.address if let ipv6 = configuration.ipv6 { cell.rightText = "\(ipv6.address)/\(ipv6.addressPrefixLength)" } else { - cell.rightText = L10n.Core.Global.Values.none + cell.rightText = L10n.Global.Values.none } case .defaultGateway: - cell.leftText = L10n.Core.NetworkSettings.Gateway.title - cell.rightText = configuration.ipv6?.defaultGateway ?? L10n.Core.Global.Values.none + cell.leftText = L10n.NetworkSettings.Gateway.title + cell.rightText = configuration.ipv6?.defaultGateway ?? L10n.Global.Values.none case .route: guard let route = configuration.ipv6?.routes[indexPath.row - indexOfFirstRoute6] else { fatalError("Got an IPv6 route cell with empty routes") } - cell.leftText = L10n.Core.ServerNetwork.Cells.Route.caption + cell.leftText = L10n.ServerNetwork.Cells.Route.caption cell.rightText = "\(route.destination)/\(route.prefixLength) -> \(route.gateway)" default: @@ -239,21 +239,21 @@ extension ServerNetworkViewController { guard let domain = configuration.searchDomains?[indexPath.row] else { fatalError("Got DNS search domain with empty search domains") } - cell.leftText = L10n.Core.NetworkSettings.Dns.Cells.Domain.caption + cell.leftText = L10n.NetworkSettings.Dns.Cells.Domain.caption cell.rightText = domain case .dnsAddress: guard let server = configuration.dnsServers?[indexPath.row - indexOfFirstDNSAddress] else { fatalError("Got DNS server with empty servers") } - cell.leftText = L10n.Core.Global.Captions.address + cell.leftText = L10n.Global.Captions.address cell.rightText = server case .proxyAddress: guard let proxy = configuration.httpsProxy ?? configuration.httpProxy else { fatalError("Got proxy section without a proxy") } - cell.leftText = L10n.Core.Global.Captions.address + cell.leftText = L10n.Global.Captions.address cell.rightText = "\(proxy.address):\(proxy.port)" case .proxyAutoConfigurationURL: @@ -267,7 +267,7 @@ extension ServerNetworkViewController { guard let domain = configuration.proxyBypassDomains?[indexPath.row - indexOfFirstProxyBypassDomain] else { fatalError("Got proxy bypass domain with empty domains") } - cell.leftText = L10n.Core.NetworkSettings.Cells.ProxyBypass.caption + cell.leftText = L10n.NetworkSettings.Cells.ProxyBypass.caption cell.rightText = domain default: diff --git a/Passepartout/App/iOS/Scenes/ServiceViewController.swift b/Passepartout/App/iOS/Scenes/ServiceViewController.swift index e01ed37f..e4371254 100644 --- a/Passepartout/App/iOS/Scenes/ServiceViewController.swift +++ b/Passepartout/App/iOS/Scenes/ServiceViewController.swift @@ -108,7 +108,7 @@ class ServiceViewController: UIViewController, StrongTableHost { navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem navigationItem.leftItemsSupplementBackButton = true - labelWelcome.text = L10n.Core.Service.Welcome.message + labelWelcome.text = L10n.Service.Welcome.message labelWelcome.apply(.current) let nc = NotificationCenter.default @@ -190,14 +190,14 @@ class ServiceViewController: UIViewController, StrongTableHost { case .hostParametersSegueIdentifier: let vc = destination as? ConfigurationViewController - vc?.title = L10n.Core.Service.Cells.Host.Parameters.caption + vc?.title = L10n.Service.Cells.Host.Parameters.caption vc?.initialConfiguration = uncheckedHostProfile.parameters.sessionConfiguration vc?.originalConfigurationURL = service.configurationURL(for: uncheckedHostProfile) vc?.delegate = self case .networkSettingsSegueIdentifier: let vc = destination as? NetworkSettingsViewController - vc?.title = L10n.Core.NetworkSettings.title + vc?.title = L10n.NetworkSettings.title vc?.profile = profile case .serverNetworkSegueIdentifier: @@ -234,19 +234,19 @@ class ServiceViewController: UIViewController, StrongTableHost { } @IBAction private func renameProfile() { - let alert = UIAlertController.asAlert(L10n.Core.Service.Alerts.Rename.title, nil) + let alert = UIAlertController.asAlert(L10n.Service.Alerts.Rename.title, nil) alert.addTextField { (field) in field.text = self.service.screenTitle(ProfileKey(self.uncheckedProfile)) field.applyHostTitle(.current) field.delegate = self } - pendingRenameAction = alert.addPreferredAction(L10n.Core.Global.ok) { + pendingRenameAction = alert.addPreferredAction(L10n.Global.ok) { guard let newTitle = alert.textFields?.first?.text else { return } self.confirmRenameCurrentProfile(to: newTitle) } - alert.addCancelAction(L10n.Core.Global.cancel) + alert.addCancelAction(L10n.Global.cancel) pendingRenameAction?.isEnabled = false present(alert, animated: true, completion: nil) } @@ -256,11 +256,11 @@ class ServiceViewController: UIViewController, StrongTableHost { return } if let existingProfile = service.hostProfile(withTitle: newTitle) { - let alert = UIAlertController.asAlert(L10n.Core.Service.Alerts.Rename.title, L10n.Core.Wizards.Host.Alerts.Existing.message) - alert.addPreferredAction(L10n.Core.Global.ok) { + let alert = UIAlertController.asAlert(L10n.Service.Alerts.Rename.title, L10n.Wizards.Host.Alerts.Existing.message) + alert.addPreferredAction(L10n.Global.ok) { self.doReplaceProfile(profile, to: newTitle, existingProfile: existingProfile) } - alert.addCancelAction(L10n.Core.Global.cancel) + alert.addCancelAction(L10n.Global.cancel) present(alert, animated: true, completion: nil) return } @@ -290,10 +290,10 @@ class ServiceViewController: UIViewController, StrongTableHost { } guard !service.needsCredentials(for: uncheckedProfile) else { let alert = UIAlertController.asAlert( - L10n.Core.Service.Sections.Vpn.header, - L10n.Core.Service.Alerts.CredentialsNeeded.message + L10n.Service.Sections.Vpn.header, + L10n.Service.Alerts.CredentialsNeeded.message ) - alert.addCancelAction(L10n.Core.Global.ok) { + alert.addCancelAction(L10n.Global.ok) { cell.setOn(false, animated: true) } present(alert, animated: true, completion: nil) @@ -328,13 +328,13 @@ class ServiceViewController: UIViewController, StrongTableHost { private func confirmVpnReconnection() { guard vpn.status == .disconnected else { let alert = UIAlertController.asAlert( - L10n.Core.Service.Cells.ConnectionStatus.caption, - L10n.Core.Service.Alerts.ReconnectVpn.message + L10n.Service.Cells.ConnectionStatus.caption, + L10n.Service.Alerts.ReconnectVpn.message ) - alert.addPreferredAction(L10n.Core.Global.ok) { + alert.addPreferredAction(L10n.Global.ok) { self.vpn.reconnect(completionHandler: nil) } - alert.addCancelAction(L10n.Core.Global.cancel) + alert.addCancelAction(L10n.Global.cancel) present(alert, animated: true, completion: nil) return } @@ -420,11 +420,11 @@ class ServiceViewController: UIViewController, StrongTableHost { case .denied: isPendingTrustedWiFi = false let alert = UIAlertController.asAlert( - L10n.Core.Service.Cells.TrustedAddWifi.caption, - L10n.Core.Service.Alerts.Location.Message.denied + L10n.Service.Cells.TrustedAddWifi.caption, + L10n.Service.Alerts.Location.Message.denied ) - alert.addCancelAction(L10n.Core.Global.ok) - alert.addPreferredAction(L10n.Core.Service.Alerts.Location.Button.settings) { + alert.addCancelAction(L10n.Global.ok) + alert.addPreferredAction(L10n.Service.Alerts.Location.Button.settings) { UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!, options: [:], completionHandler: nil) } present(alert, animated: true, completion: nil) @@ -443,14 +443,14 @@ class ServiceViewController: UIViewController, StrongTableHost { IntentDispatcher.donateUntrustCurrentNetwork() } - let alert = UIAlertController.asAlert(L10n.Core.Service.Sections.Trusted.header, nil) + let alert = UIAlertController.asAlert(L10n.Service.Sections.Trusted.header, nil) alert.addTextField { (field) in field.text = Utils.currentWifiNetworkName() ?? "" field.applyWiFiTitle(.current) field.delegate = self } - alert.addCancelAction(L10n.Core.Global.cancel) - alert.addPreferredAction(L10n.Core.Service.Cells.TrustedAddWifi.caption) { + alert.addCancelAction(L10n.Global.cancel) + alert.addPreferredAction(L10n.Service.Cells.TrustedAddWifi.caption) { guard let wifi = alert.textFields?.first?.text else { return } @@ -499,13 +499,13 @@ class ServiceViewController: UIViewController, StrongTableHost { return } let alert = UIAlertController.asAlert( - L10n.Core.Service.Sections.Trusted.header, - L10n.Core.Service.Alerts.Trusted.WillDisconnectPolicy.message + L10n.Service.Sections.Trusted.header, + L10n.Service.Alerts.Trusted.WillDisconnectPolicy.message ) - alert.addPreferredAction(L10n.Core.Global.ok) { + alert.addPreferredAction(L10n.Global.ok) { completionHandler() } - alert.addCancelAction(L10n.Core.Global.cancel) { + alert.addCancelAction(L10n.Global.cancel) { sender.setOn(false, animated: true) } present(alert, animated: true, completion: nil) @@ -513,13 +513,13 @@ class ServiceViewController: UIViewController, StrongTableHost { private func confirmPotentialTrustedDisconnection(at rowIndex: Int?, completionHandler: @escaping () -> Void) { let alert = UIAlertController.asAlert( - L10n.Core.Service.Sections.Trusted.header, - L10n.Core.Service.Alerts.Trusted.WillDisconnectTrusted.message + L10n.Service.Sections.Trusted.header, + L10n.Service.Alerts.Trusted.WillDisconnectTrusted.message ) - alert.addPreferredAction(L10n.Core.Global.ok) { + alert.addPreferredAction(L10n.Global.ok) { completionHandler() } - alert.addCancelAction(L10n.Core.Global.cancel) { + alert.addCancelAction(L10n.Global.cancel) { guard let rowIndex = rowIndex else { return } @@ -535,12 +535,12 @@ class ServiceViewController: UIViewController, StrongTableHost { Utils.checkConnectivityURL(AppConstants.Services.connectivityURL, timeout: AppConstants.Services.connectivityTimeout) { hud.hide() - let V = L10n.Core.Service.Alerts.TestConnectivity.Messages.self + let V = L10n.Service.Alerts.TestConnectivity.Messages.self let alert = UIAlertController.asAlert( - L10n.Core.Service.Alerts.TestConnectivity.title, + L10n.Service.Alerts.TestConnectivity.title, $0 ? V.success : V.failure ) - alert.addCancelAction(L10n.Core.Global.ok) + alert.addCancelAction(L10n.Global.ok) self.present(alert, animated: true, completion: nil) } } @@ -548,10 +548,10 @@ class ServiceViewController: UIViewController, StrongTableHost { // private func displayDataCount() { // guard vpn.isEnabled else { // let alert = UIAlertController.asAlert( -// L10n.Core.Service.Cells.DataCount.caption, -// L10n.Core.Service.Alerts.DataCount.Messages.notAvailable +// L10n.Service.Cells.DataCount.caption, +// L10n.Service.Alerts.DataCount.Messages.notAvailable // ) -// alert.addCancelAction(L10n.Core.Global.ok) +// alert.addCancelAction(L10n.Global.ok) // present(alert, animated: true, completion: nil) // return // } @@ -559,21 +559,21 @@ class ServiceViewController: UIViewController, StrongTableHost { // vpn.requestBytesCount { // let message: String // if let count = $0 { -// message = L10n.Core.Service.Alerts.DataCount.Messages.current(Int(count.0), Int(count.1)) +// message = L10n.Service.Alerts.DataCount.Messages.current(Int(count.0), Int(count.1)) // } else { -// message = L10n.Core.Service.Alerts.DataCount.Messages.notAvailable +// message = L10n.Service.Alerts.DataCount.Messages.notAvailable // } // let alert = UIAlertController.asAlert( -// L10n.Core.Service.Cells.DataCount.caption, +// L10n.Service.Cells.DataCount.caption, // message // ) -// alert.addCancelAction(L10n.Core.Global.ok) +// alert.addCancelAction(L10n.Global.ok) // self.present(alert, animated: true, completion: nil) // } // } private func discloseServerConfiguration() { - let caption = L10n.Core.Service.Cells.ServerConfiguration.caption + let caption = L10n.Service.Cells.ServerConfiguration.caption tryRequestServerConfiguration(withCaption: caption) { [weak self] in let vc = StoryboardScene.Main.configurationIdentifier.instantiate() vc.title = caption @@ -584,7 +584,7 @@ class ServiceViewController: UIViewController, StrongTableHost { } private func discloseServerNetwork() { - let caption = L10n.Core.Service.Cells.ServerNetwork.caption + let caption = L10n.Service.Cells.ServerNetwork.caption tryRequestServerConfiguration(withCaption: caption) { [weak self] in let vc = StoryboardScene.Main.serverNetworkViewController.instantiate() vc.title = caption @@ -598,9 +598,9 @@ class ServiceViewController: UIViewController, StrongTableHost { guard let cfg = $0 as? OpenVPN.Configuration else { let alert = UIAlertController.asAlert( caption, - L10n.Core.Service.Alerts.Configuration.disconnected + L10n.Service.Alerts.Configuration.disconnected ) - alert.addCancelAction(L10n.Core.Global.ok) + alert.addCancelAction(L10n.Global.ok) self?.present(alert, animated: true, completion: nil) return } @@ -616,15 +616,15 @@ class ServiceViewController: UIViewController, StrongTableHost { guard vpn.status == .disconnected else { let alert = UIAlertController.asAlert( - L10n.Core.Service.Cells.MasksPrivateData.caption, - L10n.Core.Service.Alerts.MasksPrivateData.Messages.mustReconnect + L10n.Service.Cells.MasksPrivateData.caption, + L10n.Service.Alerts.MasksPrivateData.Messages.mustReconnect ) - alert.addDestructiveAction(L10n.Core.Service.Alerts.Buttons.reconnect) { + alert.addDestructiveAction(L10n.Service.Alerts.Buttons.reconnect) { handler() self.shouldDeleteLogOnDisconnection = true self.vpn.reconnect(completionHandler: nil) } - alert.addCancelAction(L10n.Core.Global.cancel) { + alert.addCancelAction(L10n.Global.cancel) { cell.setOn(!cell.isOn, animated: true) } present(alert, animated: true, completion: nil) @@ -650,11 +650,11 @@ class ServiceViewController: UIViewController, StrongTableHost { } let alert = UIAlertController.asAlert( - L10n.Core.Service.Alerts.Download.title, - L10n.Core.Service.Alerts.Download.message(providerProfile.name) + L10n.Service.Alerts.Download.title, + L10n.Service.Alerts.Download.message(providerProfile.name) ) - alert.addCancelAction(L10n.Core.Global.cancel) - alert.addPreferredAction(L10n.Core.Global.ok) { + alert.addCancelAction(L10n.Global.cancel) + alert.addPreferredAction(L10n.Global.ok) { self.confirmDownload(URL(string: downloadURL)!) } present(alert, animated: true, completion: nil) @@ -669,15 +669,15 @@ class ServiceViewController: UIViewController, StrongTableHost { private func handleDownloadedProviderResources(url: URL?, error: Error?) { guard let url = url else { let alert = UIAlertController.asAlert( - L10n.Core.Service.Alerts.Download.title, - L10n.Core.Service.Alerts.Download.failed(error?.localizedDescription ?? "") + L10n.Service.Alerts.Download.title, + L10n.Service.Alerts.Download.failed(error?.localizedDescription ?? "") ) - alert.addCancelAction(L10n.Core.Global.ok) + alert.addCancelAction(L10n.Global.ok) present(alert, animated: true, completion: nil) return } - let hud = HUD(view: view.window!, label: L10n.Core.Service.Alerts.Download.Hud.extracting) + let hud = HUD(view: view.window!, label: L10n.Service.Alerts.Download.Hud.extracting) hud.show() uncheckedProviderProfile.name.importExternalResources(from: url) { hud.hide() @@ -863,7 +863,7 @@ extension ServiceViewController: UITableViewDataSource, UITableViewDelegate, Tog func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String? { let rows = model.rows(forSection: section) if rows.contains(.providerRefresh), let date = lastInfrastructureUpdate { - return L10n.Core.Service.Sections.ProviderInfrastructure.footer(date.timestamp) + return L10n.Service.Sections.ProviderInfrastructure.footer(date.timestamp) } return model.footer(forSection: section) } @@ -882,7 +882,7 @@ extension ServiceViewController: UITableViewDataSource, UITableViewDelegate, Tog case .useProfile: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) cell.applyAction(.current) - cell.leftText = L10n.Core.Service.Cells.UseProfile.caption + cell.leftText = L10n.Service.Cells.UseProfile.caption return cell case .vpnService: @@ -891,7 +891,7 @@ extension ServiceViewController: UITableViewDataSource, UITableViewDelegate, Tog } let cell = Cells.toggle.dequeue(from: tableView, for: indexPath, tag: row.rawValue, delegate: self) - cell.caption = L10n.Core.Service.Cells.VpnService.caption + cell.caption = L10n.Service.Cells.VpnService.caption cell.isOn = vpn.isEnabled return cell @@ -902,7 +902,7 @@ extension ServiceViewController: UITableViewDataSource, UITableViewDelegate, Tog let cell = Cells.setting.dequeue(from: tableView, for: indexPath) cell.applyVPN(.current, with: vpn.isEnabled ? vpn.status : nil, error: service.vpnLastError) - cell.leftText = L10n.Core.Service.Cells.ConnectionStatus.caption + cell.leftText = L10n.Service.Cells.ConnectionStatus.caption cell.accessoryType = .none cell.isTappable = false return cell @@ -910,7 +910,7 @@ extension ServiceViewController: UITableViewDataSource, UITableViewDelegate, Tog case .reconnect: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) cell.applyAction(.current) - cell.leftText = L10n.Core.Service.Cells.Reconnect.caption + cell.leftText = L10n.Service.Cells.Reconnect.caption cell.accessoryType = .none cell.isTappable = !service.needsCredentials(for: uncheckedProfile) && vpn.isEnabled return cell @@ -919,15 +919,15 @@ extension ServiceViewController: UITableViewDataSource, UITableViewDelegate, Tog case .account: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) - cell.leftText = L10n.Core.Account.title + cell.leftText = L10n.Account.title cell.rightText = profile?.username return cell case .endpoint: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) - cell.leftText = L10n.Core.Endpoint.title + cell.leftText = L10n.Endpoint.title - let V = L10n.Core.Global.Values.self + let V = L10n.Global.Values.self if let provider = profile as? ProviderConnectionProfile { cell.rightText = provider.usesCustomEndpoint ? V.manual : V.automatic } else { @@ -937,27 +937,27 @@ extension ServiceViewController: UITableViewDataSource, UITableViewDelegate, Tog case .networkSettings: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) - cell.leftText = L10n.Core.NetworkSettings.title + cell.leftText = L10n.NetworkSettings.title return cell // provider cells case .providerPool: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) - cell.leftText = L10n.Core.Service.Cells.Provider.Pool.caption + cell.leftText = L10n.Service.Cells.Provider.Pool.caption cell.rightText = uncheckedProviderProfile.pool?.localizedId return cell case .providerPreset: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) - cell.leftText = L10n.Core.Service.Cells.Provider.Preset.caption + cell.leftText = L10n.Service.Cells.Provider.Preset.caption cell.rightText = uncheckedProviderProfile.preset?.name // XXX: localize? return cell case .providerRefresh: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) cell.applyAction(.current) - cell.leftText = L10n.Core.Service.Cells.Provider.Refresh.caption + cell.leftText = L10n.Service.Cells.Provider.Refresh.caption return cell // host cells @@ -965,7 +965,7 @@ extension ServiceViewController: UITableViewDataSource, UITableViewDelegate, Tog case .hostParameters: let parameters = uncheckedHostProfile.parameters let cell = Cells.setting.dequeue(from: tableView, for: indexPath) - cell.leftText = L10n.Core.Service.Cells.Host.Parameters.caption + cell.leftText = L10n.Service.Cells.Host.Parameters.caption if !parameters.sessionConfiguration.fallbackCipher.embedsDigest { cell.rightText = "\(parameters.sessionConfiguration.fallbackCipher.genericName) / \(parameters.sessionConfiguration.fallbackDigest.genericName)" } else { @@ -977,19 +977,19 @@ extension ServiceViewController: UITableViewDataSource, UITableViewDelegate, Tog case .vpnResolvesHostname: let cell = Cells.toggle.dequeue(from: tableView, for: indexPath, tag: row.rawValue, delegate: self) - cell.caption = L10n.Core.Service.Cells.VpnResolvesHostname.caption + cell.caption = L10n.Service.Cells.VpnResolvesHostname.caption cell.isOn = service.preferences.resolvesHostname return cell case .vpnSurvivesSleep: let cell = Cells.toggle.dequeue(from: tableView, for: indexPath, tag: row.rawValue, delegate: self) - cell.caption = L10n.Core.Service.Cells.VpnSurvivesSleep.caption + cell.caption = L10n.Service.Cells.VpnSurvivesSleep.caption cell.isOn = !service.preferences.disconnectsOnSleep return cell case .trustedMobile: let cell = Cells.toggle.dequeue(from: tableView, for: indexPath, tag: row.rawValue, delegate: self) - cell.caption = L10n.Core.Service.Cells.TrustedMobile.caption + cell.caption = L10n.Service.Cells.TrustedMobile.caption cell.isOn = uncheckedProfile.trustedNetworks.includesMobile return cell @@ -1003,12 +1003,12 @@ extension ServiceViewController: UITableViewDataSource, UITableViewDelegate, Tog case .trustedAddCurrentWiFi: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) cell.applyAction(.current) - cell.leftText = L10n.Core.Service.Cells.TrustedAddWifi.caption + cell.leftText = L10n.Service.Cells.TrustedAddWifi.caption return cell case .trustedPolicy: let cell = Cells.toggle.dequeue(from: tableView, for: indexPath, tag: row.rawValue, delegate: self) - cell.caption = L10n.Core.Service.Cells.TrustedPolicy.caption + cell.caption = L10n.Service.Cells.TrustedPolicy.caption cell.isOn = (uncheckedProfile.trustedNetworks.policy == .disconnect) return cell @@ -1016,18 +1016,18 @@ extension ServiceViewController: UITableViewDataSource, UITableViewDelegate, Tog case .testConnectivity: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) - cell.leftText = L10n.Core.Service.Cells.TestConnectivity.caption + cell.leftText = L10n.Service.Cells.TestConnectivity.caption return cell case .dataCount: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) - cell.leftText = L10n.Core.Service.Cells.DataCount.caption + cell.leftText = L10n.Service.Cells.DataCount.caption if let count = currentDataCount, vpn.status == .connected { let down = count.0.dataUnitDescription let up = count.1.dataUnitDescription cell.rightText = "↓\(down) / ↑\(up)" } else { - cell.rightText = L10n.Core.Service.Cells.DataCount.none + cell.rightText = L10n.Service.Cells.DataCount.none } cell.accessoryType = .none cell.isTappable = false @@ -1035,22 +1035,22 @@ extension ServiceViewController: UITableViewDataSource, UITableViewDelegate, Tog case .serverConfiguration: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) - cell.leftText = L10n.Core.Service.Cells.ServerConfiguration.caption + cell.leftText = L10n.Service.Cells.ServerConfiguration.caption return cell case .serverNetwork: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) - cell.leftText = L10n.Core.Service.Cells.ServerNetwork.caption + cell.leftText = L10n.Service.Cells.ServerNetwork.caption return cell case .debugLog: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) - cell.leftText = L10n.Core.Service.Cells.DebugLog.caption + cell.leftText = L10n.Service.Cells.DebugLog.caption return cell case .masksPrivateData: let cell = Cells.toggle.dequeue(from: tableView, for: indexPath, tag: row.rawValue, delegate: self) - cell.caption = L10n.Core.Service.Cells.MasksPrivateData.caption + cell.caption = L10n.Service.Cells.MasksPrivateData.caption cell.isOn = TransientStore.masksPrivateData return cell @@ -1058,12 +1058,12 @@ extension ServiceViewController: UITableViewDataSource, UITableViewDelegate, Tog case .faq: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) - cell.leftText = L10n.Core.About.Cells.Faq.caption + cell.leftText = L10n.About.Cells.Faq.caption return cell case .reportIssue: let cell = Cells.setting.dequeue(from: tableView, for: indexPath) - cell.leftText = L10n.Core.Service.Cells.ReportIssue.caption + cell.leftText = L10n.Service.Cells.ReportIssue.caption return cell } } @@ -1238,31 +1238,31 @@ extension ServiceViewController: UITableViewDataSource, UITableViewDelegate, Tog } // headers - model.setHeader(L10n.Core.Service.Sections.Vpn.header, forSection: .vpn) + model.setHeader(L10n.Service.Sections.Vpn.header, forSection: .vpn) if isProvider { - model.setHeader(L10n.Core.Service.Sections.Configuration.header, forSection: .authentication) + model.setHeader(L10n.Service.Sections.Configuration.header, forSection: .authentication) } else { - model.setHeader(L10n.Core.Service.Sections.Configuration.header, forSection: .configuration) + model.setHeader(L10n.Service.Sections.Configuration.header, forSection: .configuration) } if isActiveProfile { if isProvider { model.setHeader("", forSection: .vpnResolvesHostname) model.setHeader("", forSection: .vpnSurvivesSleep) } - model.setHeader(L10n.Core.Service.Sections.Trusted.header, forSection: .trusted) - model.setHeader(L10n.Core.Service.Sections.Diagnostics.header, forSection: .diagnostics) - model.setHeader(L10n.Core.Organizer.Sections.Feedback.header, forSection: .feedback) + model.setHeader(L10n.Service.Sections.Trusted.header, forSection: .trusted) + model.setHeader(L10n.Service.Sections.Diagnostics.header, forSection: .diagnostics) + model.setHeader(L10n.Organizer.Sections.Feedback.header, forSection: .feedback) } // footers if isActiveProfile { - model.setFooter(L10n.Core.Service.Sections.Vpn.footer, forSection: .vpn) + model.setFooter(L10n.Service.Sections.Vpn.footer, forSection: .vpn) if isProvider { - model.setFooter(L10n.Core.Service.Sections.VpnResolvesHostname.footer, forSection: .vpnResolvesHostname) + model.setFooter(L10n.Service.Sections.VpnResolvesHostname.footer, forSection: .vpnResolvesHostname) } - model.setFooter(L10n.Core.Service.Sections.VpnSurvivesSleep.footer, forSection: .vpnSurvivesSleep) - model.setFooter(L10n.Core.Service.Sections.Trusted.footer, forSection: .trustedPolicy) - model.setFooter(L10n.Core.Service.Sections.Diagnostics.footer, forSection: .diagnostics) + model.setFooter(L10n.Service.Sections.VpnSurvivesSleep.footer, forSection: .vpnSurvivesSleep) + model.setFooter(L10n.Service.Sections.Trusted.footer, forSection: .trustedPolicy) + model.setFooter(L10n.Service.Sections.Diagnostics.footer, forSection: .diagnostics) } // rows diff --git a/Passepartout/App/iOS/Scenes/Shortcuts/ShortcutsAddViewController.swift b/Passepartout/App/iOS/Scenes/Shortcuts/ShortcutsAddViewController.swift index c59f7aa5..d54c4f9b 100644 --- a/Passepartout/App/iOS/Scenes/Shortcuts/ShortcutsAddViewController.swift +++ b/Passepartout/App/iOS/Scenes/Shortcuts/ShortcutsAddViewController.swift @@ -42,9 +42,9 @@ class ShortcutsAddViewController: UITableViewController, StrongTableHost { model.set([.connect, .enableVPN, .disableVPN], forSection: .vpn) model.set([.trustCurrentWiFi, .untrustCurrentWiFi], forSection: .wifi) model.set([.trustCellular, .untrustCellular], forSection: .cellular) - model.setHeader(L10n.Core.Shortcuts.Add.Sections.Vpn.header, forSection: .vpn) - model.setHeader(L10n.Core.Shortcuts.Add.Sections.Wifi.header, forSection: .wifi) - model.setHeader(L10n.Core.Shortcuts.Add.Sections.Cellular.header, forSection: .cellular) + model.setHeader(L10n.Shortcuts.Add.Sections.Vpn.header, forSection: .vpn) + model.setHeader(L10n.Shortcuts.Add.Sections.Wifi.header, forSection: .wifi) + model.setHeader(L10n.Shortcuts.Add.Sections.Cellular.header, forSection: .cellular) return model }() @@ -56,7 +56,7 @@ class ShortcutsAddViewController: UITableViewController, StrongTableHost { override func viewDidLoad() { super.viewDidLoad() - title = L10n.Core.Shortcuts.Add.title + title = L10n.Shortcuts.Add.title } // MARK: UITableViewController @@ -101,25 +101,25 @@ class ShortcutsAddViewController: UITableViewController, StrongTableHost { let cell = Cells.setting.dequeue(from: tableView, for: indexPath) switch model.row(at: indexPath) { case .connect: - cell.leftText = L10n.Core.Shortcuts.Add.Cells.Connect.caption + cell.leftText = L10n.Shortcuts.Add.Cells.Connect.caption case .enableVPN: - cell.leftText = L10n.Core.Shortcuts.Add.Cells.EnableVpn.caption + cell.leftText = L10n.Shortcuts.Add.Cells.EnableVpn.caption case .disableVPN: - cell.leftText = L10n.Core.Shortcuts.Add.Cells.DisableVpn.caption + cell.leftText = L10n.Shortcuts.Add.Cells.DisableVpn.caption case .trustCurrentWiFi: - cell.leftText = L10n.Core.Shortcuts.Add.Cells.TrustCurrentWifi.caption + cell.leftText = L10n.Shortcuts.Add.Cells.TrustCurrentWifi.caption case .untrustCurrentWiFi: - cell.leftText = L10n.Core.Shortcuts.Add.Cells.UntrustCurrentWifi.caption + cell.leftText = L10n.Shortcuts.Add.Cells.UntrustCurrentWifi.caption case .trustCellular: - cell.leftText = L10n.Core.Shortcuts.Add.Cells.TrustCellular.caption + cell.leftText = L10n.Shortcuts.Add.Cells.TrustCellular.caption case .untrustCellular: - cell.leftText = L10n.Core.Shortcuts.Add.Cells.UntrustCellular.caption + cell.leftText = L10n.Shortcuts.Add.Cells.UntrustCellular.caption } return cell } @@ -160,10 +160,10 @@ class ShortcutsAddViewController: UITableViewController, StrongTableHost { private func addConnect() { guard TransientStore.shared.service.hasProfiles() else { let alert = UIAlertController.asAlert( - L10n.Core.Shortcuts.Add.Cells.Connect.caption, - L10n.Core.Shortcuts.Add.Alerts.NoProfiles.message + L10n.Shortcuts.Add.Cells.Connect.caption, + L10n.Shortcuts.Add.Alerts.NoProfiles.message ) - alert.addAction(L10n.Core.Global.ok) { + alert.addAction(L10n.Global.ok) { if let ip = self.tableView.indexPathForSelectedRow { self.tableView.deselectRow(at: ip, animated: true) } diff --git a/Passepartout/App/iOS/Scenes/Shortcuts/ShortcutsConnectToViewController.swift b/Passepartout/App/iOS/Scenes/Shortcuts/ShortcutsConnectToViewController.swift index 8844cc33..22aadfe8 100644 --- a/Passepartout/App/iOS/Scenes/Shortcuts/ShortcutsConnectToViewController.swift +++ b/Passepartout/App/iOS/Scenes/Shortcuts/ShortcutsConnectToViewController.swift @@ -45,8 +45,8 @@ class ShortcutsConnectToViewController: UITableViewController, ProviderPoolViewC let model: StrongTableModel = { let model: StrongTableModel = StrongTableModel() - model.setHeader(L10n.Core.Organizer.Sections.Providers.header, forSection: .providers) - model.setHeader(L10n.Core.Organizer.Sections.Hosts.header, forSection: .hosts) + model.setHeader(L10n.Organizer.Sections.Providers.header, forSection: .providers) + model.setHeader(L10n.Organizer.Sections.Hosts.header, forSection: .hosts) return model }() @@ -69,7 +69,7 @@ class ShortcutsConnectToViewController: UITableViewController, ProviderPoolViewC override func viewDidLoad() { super.viewDidLoad() - title = L10n.Core.Shortcuts.Add.Cells.Connect.caption + title = L10n.Shortcuts.Add.Cells.Connect.caption reloadModel() } diff --git a/Passepartout/App/iOS/Scenes/Shortcuts/ShortcutsViewController.swift b/Passepartout/App/iOS/Scenes/Shortcuts/ShortcutsViewController.swift index 4577947d..71bebd34 100644 --- a/Passepartout/App/iOS/Scenes/Shortcuts/ShortcutsViewController.swift +++ b/Passepartout/App/iOS/Scenes/Shortcuts/ShortcutsViewController.swift @@ -76,7 +76,7 @@ class ShortcutsViewController: UITableViewController, INUIAddVoiceShortcutViewCo let model: StrongTableModel = { let model: StrongTableModel = StrongTableModel() model.add(.all) - model.setHeader(L10n.Core.Shortcuts.Edit.Sections.All.header, forSection: .all) + model.setHeader(L10n.Shortcuts.Edit.Sections.All.header, forSection: .all) model.set([], forSection: .all) return model }() @@ -92,7 +92,7 @@ class ShortcutsViewController: UITableViewController, INUIAddVoiceShortcutViewCo override func viewDidLoad() { super.viewDidLoad() - title = L10n.Core.Organizer.Cells.SiriShortcuts.caption + title = L10n.Organizer.Cells.SiriShortcuts.caption INVoiceShortcutCenter.shared.getAllVoiceShortcuts { [weak self] (shortcuts, error) in DispatchQueue.main.async { @@ -122,9 +122,9 @@ class ShortcutsViewController: UITableViewController, INUIAddVoiceShortcutViewCo // TODO: really show it? // let alert = UIAlertController.asAlert( // title, -// L10n.Core.Shortcuts.Edit.message(error?.localizedDescription ?? "") +// L10n.Shortcuts.Edit.message(error?.localizedDescription ?? "") // ) -// alert.addCancelAction(L10n.Core.Global.ok) { +// alert.addCancelAction(L10n.Global.ok) { // self.close() // } // present(alert, animated: true, completion: nil) @@ -192,7 +192,7 @@ class ShortcutsViewController: UITableViewController, INUIAddVoiceShortcutViewCo case .addShortcut: cell.applyAction(.current) - cell.leftText = L10n.Core.Shortcuts.Edit.Cells.AddShortcut.caption + cell.leftText = L10n.Shortcuts.Edit.Cells.AddShortcut.caption cell.accessoryType = .none cell.isTappable = true } diff --git a/Passepartout/App/iOS/de.lproj/App.strings b/Passepartout/App/iOS/de.lproj/App.strings deleted file mode 100644 index 81dbcd5e..00000000 --- a/Passepartout/App/iOS/de.lproj/App.strings +++ /dev/null @@ -1,65 +0,0 @@ -// -// App.strings -// Passepartout -// -// Created by Davide De Rosa on 4/23/19. -// Copyright (c) 2021 Davide De Rosa. All rights reserved. -// -// https://github.com/passepartoutvpn -// -// This file is part of Passepartout. -// -// Passepartout is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Passepartout is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Passepartout. If not, see . -// - -"organizer.cells.add_provider.caption" = "Neuen Anbieter hinzufügen"; -"organizer.cells.add_host.caption" = "Aus Dateien hinzufügen"; -"organizer.cells.import_host.caption" = "Vom Import hinzufügen"; - -"wizards.host.cells.title_input.caption" = "Titel"; -"wizards.host.sections.existing.header" = "Bestehende Profile"; - -"imported_hosts.title" = "Importierte Hosts"; - -"service.sections.vpn.header" = "VPN"; -"service.sections.status.header" = "Verbindung"; -"service.sections.configuration.header" = "Konfiguration"; - -"service.cells.vpn_service.caption" = "Aktiviert"; -"service.cells.provider.refresh.caption" = "Infrastruktur neu laden"; -"service.cells.host.parameters.caption" = "Parameter"; -"service.cells.trusted_add_wifi.caption" = "WLAN hinzufügen"; -"service.alerts.location.message.denied" = "Sie müssen den Standortzugriff zulassen, um diesem Wi-Fi-Netzwerk vertrauen zu können. Gehen Sie zu den iOS-Einstellungen und überprüfen Sie Ihre Standortberechtigungen für Passepartout."; -"service.alerts.location.button.settings" = "Einstellungen"; - -"account.sections.credentials.header" = "Zugangsdaten"; - -"endpoint.sections.location_addresses.header" = "Adressen"; -"endpoint.sections.location_protocols.header" = "Protokolle"; - -"provider.pool.actions.favorite" = "Favorit hinzuzufügen"; -"provider.pool.actions.unfavorite" = "Favorit entfernen"; -"provider.pool.sections.empty_favorites.footer" = "Wische nach Links um einen Standort zu den Favoriten hinzuzufügen oder zu entfernen."; - -"provider.preset.cells.tech_details.caption" = "Technische Details"; - -"network_settings.cells.add_dns_server.caption" = "Adresse hinzufügen"; -"network_settings.cells.add_dns_domain.caption" = "Domäne hinzufügen"; -"network_settings.cells.proxy_bypass.caption" = "Domäne umgehen"; -"network_settings.cells.add_proxy_bypass.caption" = "Zu umgehende Domäne hinzufügen"; - -"shortcuts.add.title" = "Füge Kurzbefehl hinzu"; - -"shortcuts.edit.title" = "Kurzbefehle bearbeiten"; -"shortcuts.edit.cells.add_shortcut.caption" = "Kurzbefehl hinzufügen"; diff --git a/Passepartout/App/iOS/el.lproj/App.strings b/Passepartout/App/iOS/el.lproj/App.strings deleted file mode 100644 index 85b2188d..00000000 --- a/Passepartout/App/iOS/el.lproj/App.strings +++ /dev/null @@ -1,65 +0,0 @@ -// -// App.strings -// Passepartout -// -// Created by Davide De Rosa on 6/13/18. -// Copyright (c) 2021 Davide De Rosa. All rights reserved. -// -// https://github.com/passepartoutvpn -// -// This file is part of Passepartout. -// -// Passepartout is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Passepartout is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Passepartout. If not, see . -// - -"organizer.cells.add_provider.caption" = "Προσθήκη νέου παρόχου"; -"organizer.cells.add_host.caption" = "Προσθήκη από αρχεία"; -"organizer.cells.import_host.caption" = "Προσθήκη από εισαγωγή"; - -"wizards.host.cells.title_input.caption" = "Τίτλος"; -"wizards.host.sections.existing.header" = "Υπάρχον Προφίλ"; - -"imported_hosts.title" = "Εισαγόμενοι διακομιστές"; - -"service.sections.vpn.header" = "VPN"; -"service.sections.status.header" = "Σύνδεση"; -"service.sections.configuration.header" = "Ρύθμιση"; - -"service.cells.vpn_service.caption" = "Ενεργοποιήθηκε"; -"service.cells.provider.refresh.caption" = "Ανανέωση της υποδομής"; -"service.cells.host.parameters.caption" = "Παράμετροι"; -"service.cells.trusted_add_wifi.caption" = "Προσθέστε Wi-Fi"; -"service.alerts.location.message.denied" = "Πρέπει να επιτρέψετε τη πρόσβαση τοποθεσίας για να εμπιστευτείτε το Wi-Fi δίκτυο. Μεταβείτε στις ρυθμίσεις του iOS και επιθεωρείστε τις ρυθμίσεις για το Passepartout."; -"service.alerts.location.button.settings" = "Ρυθμίσεις"; - -"account.sections.credentials.header" = "Διαπιστευτήρια"; - -"endpoint.sections.location_addresses.header" = "Διεθύνσεις"; -"endpoint.sections.location_protocols.header" = "Πρωτόκολλα"; - -"provider.pool.actions.favorite" = "Αγαπημένο"; -"provider.pool.actions.unfavorite" = "Δεν προτιμάται"; -"provider.pool.sections.empty_favorites.footer" = "Σείρετε αριστερά για να προσθέσετε ή να αφαιρέσεται από τα αγαπημένα."; - -"provider.preset.cells.tech_details.caption" = "Τεχνικές Λεπτομέρειες"; - -"network_settings.cells.add_dns_server.caption" = "Προσθήκη Διεύθυνσης"; -"network_settings.cells.add_dns_domain.caption" = "Προσθήκη τομέα αναζήτησης"; -"network_settings.cells.proxy_bypass.caption" = "Παράκαμψη Τομέα"; -"network_settings.cells.add_proxy_bypass.caption" = "Προσθήκη τομέα παράκαμψης"; - -"shortcuts.add.title" = "Προσθήκη Συντόμευσης"; - -"shortcuts.edit.title" = "Διαχείριση συντομεύσεων"; -"shortcuts.edit.cells.add_shortcut.caption" = "Προσθήκη Συντόμευσης"; diff --git a/Passepartout/App/iOS/en.lproj/App.strings b/Passepartout/App/iOS/en.lproj/App.strings deleted file mode 100644 index 9fee1cf5..00000000 --- a/Passepartout/App/iOS/en.lproj/App.strings +++ /dev/null @@ -1,24 +0,0 @@ -// -// App.strings -// Passepartout -// -// Created by Davide De Rosa on 6/21/19. -// Copyright (c) 2021 Davide De Rosa. All rights reserved. -// -// https://github.com/passepartoutvpn -// -// This file is part of Passepartout. -// -// Passepartout is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Passepartout is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Passepartout. If not, see . -// diff --git a/Passepartout/App/iOS/es.lproj/App.strings b/Passepartout/App/iOS/es.lproj/App.strings deleted file mode 100644 index dd62070a..00000000 --- a/Passepartout/App/iOS/es.lproj/App.strings +++ /dev/null @@ -1,65 +0,0 @@ -// -// App.strings -// Passepartout -// -// Created by Davide De Rosa on 6/13/18. -// Copyright (c) 2021 Davide De Rosa. All rights reserved. -// -// https://github.com/passepartoutvpn -// -// This file is part of Passepartout. -// -// Passepartout is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Passepartout is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Passepartout. If not, see . -// - -"organizer.cells.add_provider.caption" = "Añadir proveedor"; -"organizer.cells.add_host.caption" = "Añadir desde Ficheros"; -"organizer.cells.import_host.caption" = "Añadir desde importados"; - -"wizards.host.cells.title_input.caption" = "Título"; -"wizards.host.sections.existing.header" = "Perfiles existentes"; - -"imported_hosts.title" = "Hosts importados"; - -"service.sections.vpn.header" = "VPN"; -"service.sections.status.header" = "Conexión"; -"service.sections.configuration.header" = "Configuración"; - -"service.cells.vpn_service.caption" = "Habilitado"; -"service.cells.provider.refresh.caption" = "Refrescar infraestructura"; -"service.cells.host.parameters.caption" = "Parámetros"; -"service.cells.trusted_add_wifi.caption" = "Añadir Wi-Fi"; -"service.alerts.location.message.denied" = "Debes dar acceso a tu posición para añadir esta red Wi-Fi a las redes de confianza. Mira los ajustes iOS y revisa los permisos de posición para Passepartout."; -"service.alerts.location.button.settings" = "Ajustes"; - -"account.sections.credentials.header" = "Credenciales"; - -"endpoint.sections.location_addresses.header" = "Direcciones"; -"endpoint.sections.location_protocols.header" = "Protocolos"; - -"provider.pool.actions.favorite" = "Favorita"; -"provider.pool.actions.unfavorite" = "No favorita"; -"provider.pool.sections.empty_favorites.footer" = "Desliza a la izquierda de una ubicación para agregarla o quitarla de los Favoritos."; - -"provider.preset.cells.tech_details.caption" = "Detalles técnicos"; - -"network_settings.cells.add_dns_server.caption" = "Añadir dirección"; -"network_settings.cells.add_dns_domain.caption" = "Añadir dominio"; -"network_settings.cells.proxy_bypass.caption" = "Dominio ignorado"; -"network_settings.cells.add_proxy_bypass.caption" = "Añadir dominio ignorado"; - -"shortcuts.add.title" = "Añadir atajo"; - -"shortcuts.edit.title" = "Gestionar atajos"; -"shortcuts.edit.cells.add_shortcut.caption" = "Añadir atajo"; diff --git a/Passepartout/App/iOS/fr.lproj/App.strings b/Passepartout/App/iOS/fr.lproj/App.strings deleted file mode 100644 index bf7bb2e6..00000000 --- a/Passepartout/App/iOS/fr.lproj/App.strings +++ /dev/null @@ -1,65 +0,0 @@ -// -// App.strings -// Passepartout -// -// Created by Davide De Rosa on 6/13/18. -// Copyright (c) 2021 Davide De Rosa. All rights reserved. -// -// https://github.com/passepartoutvpn -// -// This file is part of Passepartout. -// -// Passepartout is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Passepartout is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Passepartout. If not, see . -// - -"organizer.cells.add_provider.caption" = "Ajouter un nouveau fournisseur"; -"organizer.cells.add_host.caption" = "Ajouter de Fichiers"; -"organizer.cells.import_host.caption" = "Ajouter depuis importé"; - -"wizards.host.cells.title_input.caption" = "Titre"; -"wizards.host.sections.existing.header" = "Profiles existants"; - -"imported_hosts.title" = "Hôtes importés"; - -"service.sections.vpn.header" = "VPN"; -"service.sections.status.header" = "Connection"; -"service.sections.configuration.header" = "Configuration"; - -"service.cells.vpn_service.caption" = "Activer"; -"service.cells.provider.refresh.caption" = "Rafraîchir l'infrastructure"; -"service.cells.host.parameters.caption" = "Paramètres"; -"service.cells.trusted_add_wifi.caption" = "Ajouter Wi-Fi"; -"service.alerts.location.message.denied" = "Vous devez autoriser la localisation pour faire confiance à ce réseau WiFi. Acceptez les permissions de localisation pour Passepartout dans les réglages."; -"service.alerts.location.button.settings" = "Réglages"; - -"account.sections.credentials.header" = "Indetifiants"; - -"endpoint.sections.location_addresses.header" = "Adresses"; -"endpoint.sections.location_protocols.header" = "Protocols"; - -"provider.pool.actions.favorite" = "Favoris"; -"provider.pool.actions.unfavorite" = "Retirer des Favoris"; -"provider.pool.sections.empty_favorites.footer" = "Glissez vers la gauche d'un item pour l'ajouter ou le retirer des Favoris."; - -"provider.preset.cells.tech_details.caption" = "Détails techniques"; - -"network_settings.cells.add_dns_server.caption" = "Ajouter une adresse"; -"network_settings.cells.add_dns_domain.caption" = "Ajouter un domaine"; -"network_settings.cells.proxy_bypass.caption" = "Outrepasser le domaine"; -"network_settings.cells.add_proxy_bypass.caption" = "Ajouter outrepasser le domaine"; - -"shortcuts.add.title" = "Ajouter un raccourcis"; - -"shortcuts.edit.title" = "Gérer les raccourcis"; -"shortcuts.edit.cells.add_shortcut.caption" = "Ajouter un raccourcis"; diff --git a/Passepartout/App/iOS/it.lproj/App.strings b/Passepartout/App/iOS/it.lproj/App.strings deleted file mode 100644 index 4eb0b419..00000000 --- a/Passepartout/App/iOS/it.lproj/App.strings +++ /dev/null @@ -1,65 +0,0 @@ -// -// App.strings -// Passepartout -// -// Created by Davide De Rosa on 6/13/18. -// Copyright (c) 2021 Davide De Rosa. All rights reserved. -// -// https://github.com/passepartoutvpn -// -// This file is part of Passepartout. -// -// Passepartout is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Passepartout is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Passepartout. If not, see . -// - -"organizer.cells.add_provider.caption" = "Aggiungi provider"; -"organizer.cells.add_host.caption" = "Aggiungi da Files"; -"organizer.cells.import_host.caption" = "Aggiungi da importati"; - -"wizards.host.cells.title_input.caption" = "Titolo"; -"wizards.host.sections.existing.header" = "Profili esistenti"; - -"imported_hosts.title" = "Host importati"; - -"service.sections.vpn.header" = "VPN"; -"service.sections.status.header" = "Connessione"; -"service.sections.configuration.header" = "Configurazione"; - -"service.cells.vpn_service.caption" = "Abilitato"; -"service.cells.provider.refresh.caption" = "Aggiorna infrastruttura"; -"service.cells.host.parameters.caption" = "Parametri"; -"service.cells.trusted_add_wifi.caption" = "Aggiungi Wi-Fi"; -"service.alerts.location.message.denied" = "Devi dare accesso alla tua posizione per aggiungere questa rete Wi-Fi alle reti sicure. Vai alle impostazioni iOS e verifica i permessi sulla posizione per Passepartout."; -"service.alerts.location.button.settings" = "Impostazioni"; - -"account.sections.credentials.header" = "Credenziali"; - -"endpoint.sections.location_addresses.header" = "Indirizzi"; -"endpoint.sections.location_protocols.header" = "Protocolli"; - -"provider.pool.actions.favorite" = "Preferita"; -"provider.pool.actions.unfavorite" = "Non preferita"; -"provider.pool.sections.empty_favorites.footer" = "Scorri a sinistra su una regione per aggiungerla o rimuoverla dai Preferiti."; - -"provider.preset.cells.tech_details.caption" = "Dettagli tecnici"; - -"network_settings.cells.add_dns_server.caption" = "Aggiungi indirizzo"; -"network_settings.cells.add_dns_domain.caption" = "Aggiungi dominio"; -"network_settings.cells.proxy_bypass.caption" = "Dominio ignorato"; -"network_settings.cells.add_proxy_bypass.caption" = "Aggiungi dominio ignorato"; - -"shortcuts.add.title" = "Aggiungi comando rapido"; - -"shortcuts.edit.title" = "Gestisci comandi rapidi"; -"shortcuts.edit.cells.add_shortcut.caption" = "Aggiungi comando rapido"; diff --git a/Passepartout/App/iOS/nl.lproj/App.strings b/Passepartout/App/iOS/nl.lproj/App.strings deleted file mode 100644 index e0f0dafb..00000000 --- a/Passepartout/App/iOS/nl.lproj/App.strings +++ /dev/null @@ -1,65 +0,0 @@ -// -// App.strings -// Passepartout -// -// Created by Davide De Rosa on 6/13/18. -// Copyright (c) 2021 Davide De Rosa. All rights reserved. -// -// https://github.com/passepartoutvpn -// -// This file is part of Passepartout. -// -// Passepartout is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Passepartout is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Passepartout. If not, see . -// - -"organizer.cells.add_provider.caption" = "Voeg nieuwe aanbieder toe"; -"organizer.cells.add_host.caption" = "Toevoegen vanuit Bestanden"; -"organizer.cells.import_host.caption" = "Toevoegen vanuit geïmporteerd"; - -"wizards.host.cells.title_input.caption" = "Titel"; -"wizards.host.sections.existing.header" = "Bestaande profielen"; - -"imported_hosts.title" = "Geïmporteerde hosts"; - -"service.sections.vpn.header" = "VPN"; -"service.sections.status.header" = "Verbinding"; -"service.sections.configuration.header" = "Configuratie"; - -"service.cells.vpn_service.caption" = "Ingeschakeld"; -"service.cells.provider.refresh.caption" = "Vernieuw de infrastructuur"; -"service.cells.host.parameters.caption" = "Parameters"; -"service.cells.trusted_add_wifi.caption" = "Wi-Fi toevoegen"; -"service.alerts.location.message.denied" = "Om dit Wi-Fi netwerk te vertrouwen is toestemming tot locatie gegevens nodig. Ga naar Instellingen -> Privacy -> Locatievoorzieningen en check de locatie bevoegdheden voor Passepartout."; -"service.alerts.location.button.settings" = "Instellingen"; - -"account.sections.credentials.header" = "Inloggegevens"; - -"endpoint.sections.location_addresses.header" = "Adressen"; -"endpoint.sections.location_protocols.header" = "Protocollen"; - -"provider.pool.actions.favorite" = "Favoriet"; -"provider.pool.actions.unfavorite" = "Geen favoriet"; -"provider.pool.sections.empty_favorites.footer" = "Veeg naar links op een locatie om deze toe te voegen of te verwijderen aan Favorieten."; - -"provider.preset.cells.tech_details.caption" = "Technische details"; - -"network_settings.cells.add_dns_server.caption" = "Voeg adress toe"; -"network_settings.cells.add_dns_domain.caption" = "Zoekdomein toevoegen"; -"network_settings.cells.proxy_bypass.caption" = "Omzeil domein"; -"network_settings.cells.add_proxy_bypass.caption" = "Voeg omzeil optie voor domein toe"; - -"shortcuts.add.title" = "Voeg snelkoppeling toe"; - -"shortcuts.edit.title" = "Beheer snelkoppelingen"; -"shortcuts.edit.cells.add_shortcut.caption" = "Voeg snelkoppeling toe"; diff --git a/Passepartout/App/iOS/pl.lproj/App.strings b/Passepartout/App/iOS/pl.lproj/App.strings deleted file mode 100644 index 9265080c..00000000 --- a/Passepartout/App/iOS/pl.lproj/App.strings +++ /dev/null @@ -1,65 +0,0 @@ -// -// App.strings -// Passepartout -// -// Created by Davide De Rosa on 6/21/19. -// Copyright (c) 2021 Davide De Rosa. All rights reserved. -// -// https://github.com/passepartoutvpn -// -// This file is part of Passepartout. -// -// Passepartout is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Passepartout is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Passepartout. If not, see . -// - -"organizer.cells.add_provider.caption" = "Dodaj nowego usługodawcę"; -"organizer.cells.add_host.caption" = "Dodaj z Plików"; -"organizer.cells.import_host.caption" = "Dodaj z zaimportowanych"; - -"wizards.host.cells.title_input.caption" = "Tytuł"; -"wizards.host.sections.existing.header" = "Istniejące profile"; - -"imported_hosts.title" = "Zaimportowane hosty"; - -"service.sections.vpn.header" = "VPN"; -"service.sections.status.header" = "Połączenie"; -"service.sections.configuration.header" = "Konfiguracja"; - -"service.cells.vpn_service.caption" = "Włączone"; -"service.cells.provider.refresh.caption" = "Odśwież infrastrukturę"; -"service.cells.host.parameters.caption" = "Parametry"; -"service.cells.trusted_add_wifi.caption" = "Dodaj Wi-Fi"; -"service.alerts.location.message.denied" = "Musisz pozwolić na dostęp do lokalizacji żeby zaufać tej sieci Wi-Fi. Przejdź do ustawień prywatności i pozwól Passepartout na wykorzystywanie usług lokalizacji."; -"service.alerts.location.button.settings" = "Ustawienia"; - -"account.sections.credentials.header" = "Dane logowania"; - -"endpoint.sections.location_addresses.header" = "Adresy"; -"endpoint.sections.location_protocols.header" = "Protokoły"; - -"provider.pool.actions.favorite" = "Dodaj do ulubionych"; -"provider.pool.actions.unfavorite" = "Usuń z ulubionych"; -"provider.pool.sections.empty_favorites.footer" = "Aby usunąć zakładkę, przesuń w lewo."; - -"provider.preset.cells.tech_details.caption" = "Dane techniczne"; - -"network_settings.cells.add_dns_server.caption" = "Dodaj adres"; -"network_settings.cells.proxy_bypass.caption" = "Pomiń domenę"; -"network_settings.cells.add_proxy_bypass.caption" = "Dodaj domenę"; -"network_settings.cells.add_dns_domain.caption" = "Dodaj domenę wyszukiwania"; - -"shortcuts.add.title" = "Dodaj skrót"; - -"shortcuts.edit.title" = "Zarządzaj skrótami"; -"shortcuts.edit.cells.add_shortcut.caption" = "Dodaj skrót"; diff --git a/Passepartout/App/iOS/pt.lproj/App.strings b/Passepartout/App/iOS/pt.lproj/App.strings deleted file mode 100644 index bdf6f32f..00000000 --- a/Passepartout/App/iOS/pt.lproj/App.strings +++ /dev/null @@ -1,65 +0,0 @@ -// -// App.strings -// Passepartout -// -// Created by Davide De Rosa on 6/13/18. -// Copyright (c) 2021 Davide De Rosa. All rights reserved. -// -// https://github.com/passepartoutvpn -// -// This file is part of Passepartout. -// -// Passepartout is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Passepartout is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Passepartout. If not, see . -// - -"organizer.cells.add_provider.caption" = "Adicionar novo perfil"; -"organizer.cells.add_host.caption" = "Adicionar dos Arquivos"; -"organizer.cells.import_host.caption" = "Adicionar dos importados"; - -"wizards.host.cells.title_input.caption" = "Título"; -"wizards.host.sections.existing.header" = "Perfis existentes"; - -"imported_hosts.title" = "Hosts importados"; - -"service.sections.vpn.header" = "VPN"; -"service.sections.status.header" = "Conexão"; -"service.sections.configuration.header" = "Configuração"; - -"service.cells.vpn_service.caption" = "Ativado"; -"service.cells.provider.refresh.caption" = "Atualizar infraestrutura"; -"service.cells.host.parameters.caption" = "Parâmetros"; -"service.cells.trusted_add_wifi.caption" = "Adicionar Wi-Fi"; -"service.alerts.location.message.denied" = "Você precisa autorizar o compartilhamento de localização. Acesse ajustes do iOS e verifique permissões de localização do Passepartout."; -"service.alerts.location.button.settings" = "Ajustes"; - -"account.sections.credentials.header" = "Credenciais"; - -"endpoint.sections.location_addresses.header" = "Endereços"; -"endpoint.sections.location_protocols.header" = "Protocolos"; - -"provider.pool.actions.favorite" = "Favorito"; -"provider.pool.actions.unfavorite" = "Não favorito"; -"provider.pool.sections.empty_favorites.footer" = "Deslize para a esquerda em um local para adicioná-lo ou removê-lo dos Favoritos."; - -"provider.preset.cells.tech_details.caption" = "Detalhes técnicos"; - -"network_settings.cells.add_dns_server.caption" = "Adicionar endereço"; -"network_settings.cells.add_dns_domain.caption" = "Adicionar domínio"; -"network_settings.cells.proxy_bypass.caption" = "Domínio ignorado"; -"network_settings.cells.add_proxy_bypass.caption" = "Adicionar domínio ignorado"; - -"shortcuts.add.title" = "Adicionar atalho"; - -"shortcuts.edit.title" = "Configuração de atalhos"; -"shortcuts.edit.cells.add_shortcut.caption" = "Adicionar atalho"; diff --git a/Passepartout/App/iOS/ru.lproj/App.strings b/Passepartout/App/iOS/ru.lproj/App.strings deleted file mode 100644 index 7b4326b0..00000000 --- a/Passepartout/App/iOS/ru.lproj/App.strings +++ /dev/null @@ -1,65 +0,0 @@ -// -// App.strings -// Passepartout -// -// Created by Davide De Rosa on 4/23/19. -// Copyright (c) 2021 Davide De Rosa. All rights reserved. -// -// https://github.com/passepartoutvpn -// -// This file is part of Passepartout. -// -// Passepartout is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Passepartout is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Passepartout. If not, see . -// - -"organizer.cells.add_provider.caption" = "Добавить нового провайдера"; -"organizer.cells.add_host.caption" = "Добавить из файлов"; -"organizer.cells.import_host.caption" = "Добавить из импортированных"; - -"wizards.host.cells.title_input.caption" = "Название"; -"wizards.host.sections.existing.header" = "Существующие профили"; - -"imported_hosts.title" = "Импортированные хост профили"; - -"service.sections.vpn.header" = "VPN"; -"service.sections.status.header" = "Соединение"; -"service.sections.configuration.header" = "Конфигурация"; - -"service.cells.vpn_service.caption" = "Включен"; -"service.cells.provider.refresh.caption" = "Обновить инфраструктуру"; -"service.cells.host.parameters.caption" = "Параметры"; -"service.cells.trusted_add_wifi.caption" = "Добавить Wi-Fi"; -"service.alerts.location.message.denied" = "Вам нужно разрешить использование геопозиции для добавления этой Wi-Fi сети в доверенные. Перейдите в настройки iOS, и измените разрешения геолокации для Passepartout."; -"service.alerts.location.button.settings" = "Настройки"; - -"account.sections.credentials.header" = "Данные для входа"; - -"endpoint.sections.location_addresses.header" = "Адреса"; -"endpoint.sections.location_protocols.header" = "Протоколы"; - -"provider.pool.actions.favorite" = "Добавить в избранное"; -"provider.pool.actions.unfavorite" = "Убрать из избранного"; -"provider.pool.sections.empty_favorites.footer" = "Свайп в лево на локации, чтобы добавить или убрать из избранного."; - -"provider.preset.cells.tech_details.caption" = "Техническая информация"; - -"network_settings.cells.add_dns_server.caption" = "Добавить адрес"; -"network_settings.cells.add_dns_domain.caption" = "Добавить домен поиска"; -"network_settings.cells.proxy_bypass.caption" = "Обход домена"; -"network_settings.cells.add_proxy_bypass.caption" = "Добавить обходной домен"; - -"shortcuts.add.title" = "Создать команду"; - -"shortcuts.edit.title" = "Управлять командами"; -"shortcuts.edit.cells.add_shortcut.caption" = "Создать команду"; diff --git a/Passepartout/App/iOS/sv.lproj/App.strings b/Passepartout/App/iOS/sv.lproj/App.strings deleted file mode 100644 index ca74c620..00000000 --- a/Passepartout/App/iOS/sv.lproj/App.strings +++ /dev/null @@ -1,65 +0,0 @@ -// -// App.strings -// Passepartout -// -// Created by Davide De Rosa on 6/13/18. -// Copyright (c) 2021 Davide De Rosa. All rights reserved. -// -// https://github.com/passepartoutvpn -// -// This file is part of Passepartout. -// -// Passepartout is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Passepartout is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Passepartout. If not, see . -// - -"organizer.cells.add_provider.caption" = "Lägg till ny leverantör"; -"organizer.cells.add_host.caption" = "Lägg till från Filer"; -"organizer.cells.import_host.caption" = "Lägg till från importerad"; - -"wizards.host.cells.title_input.caption" = "Namn"; -"wizards.host.sections.existing.header" = "Befintliga profiler"; - -"imported_hosts.title" = "Importerade värdar"; - -"service.sections.vpn.header" = "VPN"; -"service.sections.status.header" = "Koppling"; -"service.sections.configuration.header" = "Konfiguration"; - -"service.cells.vpn_service.caption" = "Aktiverad"; -"service.cells.provider.refresh.caption" = "Uppdatera infrastruktur"; -"service.cells.host.parameters.caption" = "Parametrar"; -"service.cells.trusted_add_wifi.caption" = "Lägg till Wi-Fi"; -"service.alerts.location.message.denied" = "Du måste tillåta lägetillgång för att förlita detta nätverk. Öppna iOS inställningar och se över tillstånd för Passepartout."; -"service.alerts.location.button.settings" = "Inställningar"; - -"account.sections.credentials.header" = "Referenser"; - -"endpoint.sections.location_addresses.header" = "Adresser"; -"endpoint.sections.location_protocols.header" = "Protokoll"; - -"provider.pool.actions.favorite" = "Favorit"; -"provider.pool.actions.unfavorite" = "Inte favorit"; -"provider.pool.sections.empty_favorites.footer" = "Dra åt vänster på en plats för att lägga till eller ta bort den från favoriter."; - -"provider.preset.cells.tech_details.caption" = "Tekniska detaljer"; - -"network_settings.cells.add_dns_server.caption" = "Lägg till adress"; -"network_settings.cells.add_dns_domain.caption" = "Lägg till domän"; -"network_settings.cells.proxy_bypass.caption" = "Bypass-domän"; -"network_settings.cells.add_proxy_bypass.caption" = "Add bypass domain"; - -"shortcuts.add.title" = "Lägg till genväg"; - -"shortcuts.edit.title" = "Hantera genvägar"; -"shortcuts.edit.cells.add_shortcut.caption" = "Lägg till genväg"; diff --git a/Passepartout/App/iOS/swiftgen.yml b/Passepartout/App/iOS/swiftgen.yml index bdbfc73f..fb50ec8b 100644 --- a/Passepartout/App/iOS/swiftgen.yml +++ b/Passepartout/App/iOS/swiftgen.yml @@ -1,7 +1,6 @@ strings: inputs: - ../../Core/Resources/en.lproj/Core.strings - - en.lproj/App.strings outputs: - templateName: structured-swift4 output: Global/SwiftGen+Strings.swift diff --git a/Passepartout/App/iOS/zh-Hans.lproj/App.strings b/Passepartout/App/iOS/zh-Hans.lproj/App.strings deleted file mode 100644 index 1459bf59..00000000 --- a/Passepartout/App/iOS/zh-Hans.lproj/App.strings +++ /dev/null @@ -1,65 +0,0 @@ -// -// App.strings -// Passepartout -// -// Created by Davide De Rosa on 6/21/19. -// Copyright (c) 2021 Davide De Rosa. All rights reserved. -// -// https://github.com/passepartoutvpn -// -// This file is part of Passepartout. -// -// Passepartout is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Passepartout is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Passepartout. If not, see . -// - -"organizer.cells.add_provider.caption" = "添加新的提供商配置"; -"organizer.cells.add_host.caption" = "从文件添加"; -"organizer.cells.import_host.caption" = "从导入中添加"; - -"wizards.host.cells.title_input.caption" = "名称"; -"wizards.host.sections.existing.header" = "已存在的配置"; - -"imported_hosts.title" = "导入主机配置"; - -"service.sections.vpn.header" = "VPN"; -"service.sections.status.header" = "连接"; -"service.sections.configuration.header" = "配置"; - -"service.cells.vpn_service.caption" = "已启用"; -"service.cells.provider.refresh.caption" = "刷新基础设置"; -"service.cells.host.parameters.caption" = "参数"; -"service.cells.trusted_add_wifi.caption" = "新增Wi-Fi"; -"service.alerts.location.message.denied" = "你必须允许位置访问以信任此Wi-Fi。请至iOS设置对Passepartout的位置权限。"; -"service.alerts.location.button.settings" = "设置"; - -"account.sections.credentials.header" = "认证方式"; - -"endpoint.sections.location_addresses.header" = "地址"; -"endpoint.sections.location_protocols.header" = "协议"; - -"provider.pool.actions.favorite" = "最喜爱"; -"provider.pool.actions.unfavorite" = "不喜爱"; -"provider.pool.sections.empty_favorites.footer" = "向左轻扫以将其从最喜爱列表中移除或添加。"; - -"provider.preset.cells.tech_details.caption" = "技术细节"; - -"network_settings.cells.add_dns_server.caption" = "添加地址"; -"network_settings.cells.add_dns_domain.caption" = "添加搜索域名"; -"network_settings.cells.proxy_bypass.caption" = "旁路域名"; -"network_settings.cells.add_proxy_bypass.caption" = "添加旁路域名"; - -"shortcuts.add.title" = "添加捷径"; - -"shortcuts.edit.title" = "管理捷径"; -"shortcuts.edit.cells.add_shortcut.caption" = "添加捷径"; diff --git a/Passepartout/App/macOS/AppDelegate.swift b/Passepartout/App/macOS/AppDelegate.swift index 8cee63a3..7e599681 100644 --- a/Passepartout/App/macOS/AppDelegate.swift +++ b/Passepartout/App/macOS/AppDelegate.swift @@ -74,8 +74,8 @@ class AppDelegate: NSObject, NSApplicationDelegate { } if !TransientStore.didHandleSubreddit { - let alert = Macros.warning(L10n.Core.Reddit.title, L10n.Core.Reddit.message) - alert.present(in: nil, withOK: L10n.Core.Reddit.Buttons.subscribe, cancel: L10n.Core.Reddit.Buttons.never, dummy: L10n.Core.Reddit.Buttons.remind, handler: { + let alert = Macros.warning(L10n.Reddit.title, L10n.Reddit.message) + alert.present(in: nil, withOK: L10n.Reddit.Buttons.subscribe, cancel: L10n.Reddit.Buttons.never, dummy: L10n.Reddit.Buttons.remind, handler: { TransientStore.didHandleSubreddit = true self.subscribeSubreddit() }, cancelHandler: { @@ -90,10 +90,10 @@ class AppDelegate: NSObject, NSApplicationDelegate { return .terminateNow } let alert = Macros.warning( - L10n.Core.Menu.Quit.title(GroupConstants.App.name), - L10n.Core.Menu.Quit.Messages.confirm + L10n.Menu.Quit.title(GroupConstants.App.name), + L10n.Menu.Quit.Messages.confirm ) - switch alert.presentModallyEx(withOK: L10n.Core.Global.ok, other1: L10n.Core.Global.cancel, other2: L10n.Core.Reddit.Buttons.never) { + switch alert.presentModallyEx(withOK: L10n.Global.ok, other1: L10n.Global.cancel, other2: L10n.Reddit.Buttons.never) { case .alertSecondButtonReturn: return .terminateCancel diff --git a/Passepartout/App/macOS/Global/HostImporter.swift b/Passepartout/App/macOS/Global/HostImporter.swift index a7af06c2..0a1b8ad6 100644 --- a/Passepartout/App/macOS/Global/HostImporter.swift +++ b/Passepartout/App/macOS/Global/HostImporter.swift @@ -66,21 +66,21 @@ class HostImporter { default: let message = HostImporter.localizedMessage(forError: e) let alert = Macros.warning(configurationURL.normalizedFilename, message) - _ = alert.presentModally(withOK: L10n.Core.Global.ok, cancel: nil) + _ = alert.presentModally(withOK: L10n.Global.ok, cancel: nil) } return } catch let e { let message = HostImporter.localizedMessage(forError: e) let alert = Macros.warning(configurationURL.normalizedFilename, message) - _ = alert.presentModally(withOK: L10n.Core.Global.ok, cancel: nil) + _ = alert.presentModally(withOK: L10n.Global.ok, cancel: nil) return } if let warning = result.warning { let message = HostImporter.localizedDetailsMessage(forWarning: warning) - let alert = Macros.warning(configurationURL.normalizedFilename, L10n.Core.ParsedFile.Alerts.PotentiallyUnsupported.message(message)) + let alert = Macros.warning(configurationURL.normalizedFilename, L10n.ParsedFile.Alerts.PotentiallyUnsupported.message(message)) - if alert.presentModally(withOK: L10n.Core.Global.ok, cancel: L10n.Core.Global.cancel) { + if alert.presentModally(withOK: L10n.Global.ok, cancel: L10n.Global.cancel) { enterProfileName(forHostWithResult: result) } @@ -92,7 +92,7 @@ class HostImporter { private func enterPassphraseForHost(at url: URL) { let vc = StoryboardScene.Main.textInputViewController.instantiate() - vc.caption = L10n.Core.ParsedFile.Alerts.EncryptionPassphrase.message + vc.caption = L10n.ParsedFile.Alerts.EncryptionPassphrase.message vc.isSecure = true vc.object = url vc.delegate = self @@ -105,12 +105,12 @@ class HostImporter { } let vc = StoryboardScene.Main.textInputViewController.instantiate() - vc.caption = L10n.Core.Service.Alerts.Rename.title.asCaption + vc.caption = L10n.Service.Alerts.Rename.title.asCaption let profile = HostConnectionProfile(hostname: hostname) let builder = OpenVPNTunnelProvider.ConfigurationBuilder(sessionConfiguration: result.configuration) profile.parameters = builder.build() vc.text = title - vc.placeholder = L10n.Core.Global.Host.TitleInput.placeholder + vc.placeholder = L10n.Global.Host.TitleInput.placeholder vc.object = profile vc.delegate = self present(vc) @@ -139,22 +139,22 @@ class HostImporter { switch appError { case .malformed(let option): log.error("Could not parse configuration URL: malformed option, \(option)") - return L10n.Core.ParsedFile.Alerts.Malformed.message(option) + return L10n.ParsedFile.Alerts.Malformed.message(option) case .missingConfiguration(let option): log.error("Could not parse configuration URL: missing configuration, \(option)") - return L10n.Core.ParsedFile.Alerts.Missing.message(option) + return L10n.ParsedFile.Alerts.Missing.message(option) case .unsupportedConfiguration(let option): log.error("Could not parse configuration URL: unsupported configuration, \(option)") - return L10n.Core.ParsedFile.Alerts.Unsupported.message(option) + return L10n.ParsedFile.Alerts.Unsupported.message(option) default: break } } log.error("Could not parse configuration URL: \(error)") - return L10n.Core.ParsedFile.Alerts.Parsing.message(error.localizedDescription) + return L10n.ParsedFile.Alerts.Parsing.message(error.localizedDescription) } // XXX: copy/paste from iOS @@ -196,8 +196,8 @@ extension HostImporter: TextInputViewControllerDelegate { if let existingHostId = service.existingHostId(withTitle: text) { dismiss(textInputController) - let alert = Macros.warning(text, L10n.Core.Wizards.Host.Alerts.Existing.message) - if alert.presentModally(withOK: L10n.Core.Global.ok, cancel: L10n.Core.Global.cancel) { + let alert = Macros.warning(text, L10n.Wizards.Host.Alerts.Existing.message) + if alert.presentModally(withOK: L10n.Global.ok, cancel: L10n.Global.cancel) { guard let existingProfile = service.profile(withContext: profile.context, id: existingHostId) else { fatalError("ConnectionService.existingHostId() returned a non-existing host profile?") } diff --git a/Passepartout/App/macOS/Global/IssueReporter.swift b/Passepartout/App/macOS/Global/IssueReporter.swift index 54ab1981..c9e06946 100644 --- a/Passepartout/App/macOS/Global/IssueReporter.swift +++ b/Passepartout/App/macOS/Global/IssueReporter.swift @@ -36,8 +36,8 @@ class IssueReporter: NSObject { func present(withIssue issue: Issue) { if issue.debugLog { - let alert = Macros.warning(L10n.Core.IssueReporter.title, L10n.Core.IssueReporter.message) - alert.present(in: nil, withOK: L10n.Core.IssueReporter.Buttons.accept, cancel: L10n.Core.Global.cancel, handler: { + let alert = Macros.warning(L10n.IssueReporter.title, L10n.IssueReporter.message) + alert.present(in: nil, withOK: L10n.IssueReporter.Buttons.accept, cancel: L10n.Global.cancel, handler: { VPN.shared.requestDebugLog(fallback: AppConstants.Log.debugSnapshot) { self.composeEmail(withDebugLog: $0, issue: issue) } diff --git a/Passepartout/App/macOS/Global/SwiftGen+Strings.swift b/Passepartout/App/macOS/Global/SwiftGen+Strings.swift index fd1bad74..89db1ec4 100644 --- a/Passepartout/App/macOS/Global/SwiftGen+Strings.swift +++ b/Passepartout/App/macOS/Global/SwiftGen+Strings.swift @@ -10,1230 +10,1255 @@ import Foundation // swiftlint:disable explicit_type_interface function_parameter_count identifier_name line_length // swiftlint:disable nesting type_body_length type_name vertical_whitespace_opening_braces internal enum L10n { - internal enum App { + + internal enum About { + /// About + internal static let title = L10n.tr("Core", "about.title") + internal enum Cells { + internal enum Credits { + /// Credits + internal static let caption = L10n.tr("Core", "about.cells.credits.caption") + } + internal enum Disclaimer { + /// Disclaimer + internal static let caption = L10n.tr("Core", "about.cells.disclaimer.caption") + } + internal enum Faq { + /// FAQ + internal static let caption = L10n.tr("Core", "about.cells.faq.caption") + } + internal enum PrivacyPolicy { + /// Privacy policy + internal static let caption = L10n.tr("Core", "about.cells.privacy_policy.caption") + } + internal enum ShareGeneric { + /// Invite a friend + internal static let caption = L10n.tr("Core", "about.cells.share_generic.caption") + } + internal enum ShareTwitter { + /// Tweet about it! + internal static let caption = L10n.tr("Core", "about.cells.share_twitter.caption") + } + internal enum Website { + /// Home page + internal static let caption = L10n.tr("Core", "about.cells.website.caption") + } + } + internal enum Sections { + internal enum Share { + /// Share + internal static let header = L10n.tr("Core", "about.sections.share.header") + } + internal enum Web { + /// Web + internal static let header = L10n.tr("Core", "about.sections.web.header") + } + } } - internal enum Core { - internal enum About { - /// About - internal static let title = L10n.tr("Core", "about.title") - internal enum Cells { - internal enum Credits { - /// Credits - internal static let caption = L10n.tr("Core", "about.cells.credits.caption") - } - internal enum Disclaimer { - /// Disclaimer - internal static let caption = L10n.tr("Core", "about.cells.disclaimer.caption") - } - internal enum Faq { - /// FAQ - internal static let caption = L10n.tr("Core", "about.cells.faq.caption") - } - internal enum PrivacyPolicy { - /// Privacy policy - internal static let caption = L10n.tr("Core", "about.cells.privacy_policy.caption") - } - internal enum ShareGeneric { - /// Invite a friend - internal static let caption = L10n.tr("Core", "about.cells.share_generic.caption") - } - internal enum ShareTwitter { - /// Tweet about it! - internal static let caption = L10n.tr("Core", "about.cells.share_twitter.caption") - } - internal enum Website { - /// Home page - internal static let caption = L10n.tr("Core", "about.cells.website.caption") + + internal enum Account { + /// Account + internal static let title = L10n.tr("Core", "account.title") + internal enum Cells { + internal enum OpenGuide { + /// See your credentials + internal static let caption = L10n.tr("Core", "account.cells.open_guide.caption") + } + internal enum Password { + /// Password + internal static let caption = L10n.tr("Core", "account.cells.password.caption") + /// secret + internal static let placeholder = L10n.tr("Core", "account.cells.password.placeholder") + } + internal enum Signup { + /// Register with %@ + internal static func caption(_ p1: Any) -> String { + return L10n.tr("Core", "account.cells.signup.caption", String(describing: p1)) } } - internal enum Sections { - internal enum Share { - /// Share - internal static let header = L10n.tr("Core", "about.sections.share.header") - } - internal enum Web { - /// Web - internal static let header = L10n.tr("Core", "about.sections.web.header") - } + internal enum Username { + /// Username + internal static let caption = L10n.tr("Core", "account.cells.username.caption") + /// username + internal static let placeholder = L10n.tr("Core", "account.cells.username.placeholder") } } - internal enum Account { - /// Account - internal static let title = L10n.tr("Core", "account.title") - internal enum Cells { - internal enum OpenGuide { - /// See your credentials - internal static let caption = L10n.tr("Core", "account.cells.open_guide.caption") - } - internal enum Password { - /// Password - internal static let caption = L10n.tr("Core", "account.cells.password.caption") - /// secret - internal static let placeholder = L10n.tr("Core", "account.cells.password.placeholder") - } - internal enum Signup { - /// Register with %@ - internal static func caption(_ p1: Any) -> String { - return L10n.tr("Core", "account.cells.signup.caption", String(describing: p1)) - } - } - internal enum Username { - /// Username - internal static let caption = L10n.tr("Core", "account.cells.username.caption") - /// username - internal static let placeholder = L10n.tr("Core", "account.cells.username.placeholder") - } + internal enum Sections { + internal enum Credentials { + /// Credentials + internal static let header = L10n.tr("Core", "account.sections.credentials.header") } - internal enum Sections { - internal enum Credentials { - /// Credentials - internal static let header = L10n.tr("Core", "account.sections.credentials.header") - } - internal enum Guidance { - internal enum Footer { - internal enum Infrastructure { - /// Use your %@ website credentials. Your username is usually numeric (without spaces). - internal static func mullvad(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.mullvad", String(describing: p1)) + internal enum Guidance { + internal enum Footer { + internal enum Infrastructure { + /// Use your %@ website credentials. Your username is usually numeric (without spaces). + internal static func mullvad(_ p1: Any) -> String { + return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.mullvad", String(describing: p1)) + } + /// Use your %@ website credentials. Your username is usually your e-mail. + internal static func nordvpn(_ p1: Any) -> String { + return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.nordvpn", String(describing: p1)) + } + /// Use your %@ website credentials. Your username is usually numeric with a "p" prefix. + internal static func pia(_ p1: Any) -> String { + return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.pia", String(describing: p1)) + } + /// Find your %@ credentials in the "Account > OpenVPN / IKEv2 Username" section of the website. + internal static func protonvpn(_ p1: Any) -> String { + return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.protonvpn", String(describing: p1)) + } + /// Use your %@ website credentials. Your username is usually your e-mail. + internal static func tunnelbear(_ p1: Any) -> String { + return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.tunnelbear", String(describing: p1)) + } + /// Use your %@ website credentials. Your username is usually your e-mail. + internal static func vyprvpn(_ p1: Any) -> String { + return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.vyprvpn", String(describing: p1)) + } + /// Find your %@ credentials in the OpenVPN Config Generator on the website. + internal static func windscribe(_ p1: Any) -> String { + return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.windscribe", String(describing: p1)) + } + internal enum Default { + /// Use your %@ service credentials, which may differ from website credentials. + internal static func specific(_ p1: Any) -> String { + return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.default.specific", String(describing: p1)) } - /// Use your %@ website credentials. Your username is usually your e-mail. - internal static func nordvpn(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.nordvpn", String(describing: p1)) - } - /// Use your %@ website credentials. Your username is usually numeric with a "p" prefix. - internal static func pia(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.pia", String(describing: p1)) - } - /// Find your %@ credentials in the "Account > OpenVPN / IKEv2 Username" section of the website. - internal static func protonvpn(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.protonvpn", String(describing: p1)) - } - /// Use your %@ website credentials. Your username is usually your e-mail. - internal static func tunnelbear(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.tunnelbear", String(describing: p1)) - } - /// Use your %@ website credentials. Your username is usually your e-mail. - internal static func vyprvpn(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.vyprvpn", String(describing: p1)) - } - /// Find your %@ credentials in the OpenVPN Config Generator on the website. - internal static func windscribe(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.windscribe", String(describing: p1)) - } - internal enum Default { - /// Use your %@ service credentials, which may differ from website credentials. - internal static func specific(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.default.specific", String(describing: p1)) - } - /// Use your %@ website credentials. - internal static func web(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.default.web", String(describing: p1)) - } + /// Use your %@ website credentials. + internal static func web(_ p1: Any) -> String { + return L10n.tr("Core", "account.sections.guidance.footer.infrastructure.default.web", String(describing: p1)) } } } } - internal enum Registration { - /// Go get an account on the %@ website. - internal static func footer(_ p1: Any) -> String { - return L10n.tr("Core", "account.sections.registration.footer", String(describing: p1)) - } + } + internal enum Registration { + /// Go get an account on the %@ website. + internal static func footer(_ p1: Any) -> String { + return L10n.tr("Core", "account.sections.registration.footer", String(describing: p1)) } } } - internal enum Configuration { - /// Configuration - internal static let title = L10n.tr("Core", "configuration.title") - internal enum Alerts { - internal enum Commit { - /// New parameters will not be effective until you reconnect manually. Changes in trusted networks will apply immediately. - internal static let message = L10n.tr("Core", "configuration.alerts.commit.message") - internal enum Buttons { - /// Reconnect now - internal static let reconnect = L10n.tr("Core", "configuration.alerts.commit.buttons.reconnect") - /// Skip - internal static let skip = L10n.tr("Core", "configuration.alerts.commit.buttons.skip") + } + + internal enum Configuration { + /// Configuration + internal static let title = L10n.tr("Core", "configuration.title") + internal enum Alerts { + internal enum Commit { + /// New parameters will not be effective until you reconnect manually. Changes in trusted networks will apply immediately. + internal static let message = L10n.tr("Core", "configuration.alerts.commit.message") + internal enum Buttons { + /// Reconnect now + internal static let reconnect = L10n.tr("Core", "configuration.alerts.commit.buttons.reconnect") + /// Skip + internal static let skip = L10n.tr("Core", "configuration.alerts.commit.buttons.skip") + } + } + } + internal enum Cells { + internal enum Cipher { + /// Cipher + internal static let caption = L10n.tr("Core", "configuration.cells.cipher.caption") + } + internal enum Client { + /// Client certificate + internal static let caption = L10n.tr("Core", "configuration.cells.client.caption") + internal enum Value { + /// Not verified + internal static let disabled = L10n.tr("Core", "configuration.cells.client.value.disabled") + /// Verified + internal static let enabled = L10n.tr("Core", "configuration.cells.client.value.enabled") + } + } + internal enum CompressionAlgorithm { + /// Algorithm + internal static let caption = L10n.tr("Core", "configuration.cells.compression_algorithm.caption") + internal enum Value { + /// LZO + internal static let lzo = L10n.tr("Core", "configuration.cells.compression_algorithm.value.lzo") + /// Unsupported + internal static let other = L10n.tr("Core", "configuration.cells.compression_algorithm.value.other") + } + } + internal enum CompressionFraming { + /// Framing + internal static let caption = L10n.tr("Core", "configuration.cells.compression_framing.caption") + internal enum Value { + /// --compress + internal static let compress = L10n.tr("Core", "configuration.cells.compression_framing.value.compress") + /// --comp-lzo + internal static let lzo = L10n.tr("Core", "configuration.cells.compression_framing.value.lzo") + } + } + internal enum Digest { + /// Authentication + internal static let caption = L10n.tr("Core", "configuration.cells.digest.caption") + internal enum Value { + /// Embedded + internal static let embedded = L10n.tr("Core", "configuration.cells.digest.value.embedded") + } + } + internal enum Eku { + /// Extended verification + internal static let caption = L10n.tr("Core", "configuration.cells.eku.caption") + } + internal enum KeepAlive { + /// Keep-alive + internal static let caption = L10n.tr("Core", "configuration.cells.keep_alive.caption") + internal enum Value { + /// %d seconds + internal static func seconds(_ p1: Int) -> String { + return L10n.tr("Core", "configuration.cells.keep_alive.value.seconds", p1) } } } - internal enum Cells { - internal enum Cipher { - /// Cipher - internal static let caption = L10n.tr("Core", "configuration.cells.cipher.caption") - } - internal enum Client { - /// Client certificate - internal static let caption = L10n.tr("Core", "configuration.cells.client.caption") - internal enum Value { - /// Not verified - internal static let disabled = L10n.tr("Core", "configuration.cells.client.value.disabled") - /// Verified - internal static let enabled = L10n.tr("Core", "configuration.cells.client.value.enabled") + internal enum RandomEndpoint { + /// Randomize endpoint + internal static let caption = L10n.tr("Core", "configuration.cells.random_endpoint.caption") + } + internal enum RenegotiationSeconds { + /// Renegotiation + internal static let caption = L10n.tr("Core", "configuration.cells.renegotiation_seconds.caption") + internal enum Value { + /// after %@ + internal static func after(_ p1: Any) -> String { + return L10n.tr("Core", "configuration.cells.renegotiation_seconds.value.after", String(describing: p1)) } } - internal enum CompressionAlgorithm { - /// Algorithm - internal static let caption = L10n.tr("Core", "configuration.cells.compression_algorithm.caption") - internal enum Value { - /// LZO - internal static let lzo = L10n.tr("Core", "configuration.cells.compression_algorithm.value.lzo") - /// Unsupported - internal static let other = L10n.tr("Core", "configuration.cells.compression_algorithm.value.other") - } - } - internal enum CompressionFraming { - /// Framing - internal static let caption = L10n.tr("Core", "configuration.cells.compression_framing.caption") - internal enum Value { - /// --compress - internal static let compress = L10n.tr("Core", "configuration.cells.compression_framing.value.compress") - /// --comp-lzo - internal static let lzo = L10n.tr("Core", "configuration.cells.compression_framing.value.lzo") - } - } - internal enum Digest { + } + internal enum ResetOriginal { + /// Reset configuration + internal static let caption = L10n.tr("Core", "configuration.cells.reset_original.caption") + } + internal enum TlsWrapping { + /// Wrapping + internal static let caption = L10n.tr("Core", "configuration.cells.tls_wrapping.caption") + internal enum Value { /// Authentication - internal static let caption = L10n.tr("Core", "configuration.cells.digest.caption") - internal enum Value { - /// Embedded - internal static let embedded = L10n.tr("Core", "configuration.cells.digest.value.embedded") - } - } - internal enum Eku { - /// Extended verification - internal static let caption = L10n.tr("Core", "configuration.cells.eku.caption") - } - internal enum KeepAlive { - /// Keep-alive - internal static let caption = L10n.tr("Core", "configuration.cells.keep_alive.caption") - internal enum Value { - /// %d seconds - internal static func seconds(_ p1: Int) -> String { - return L10n.tr("Core", "configuration.cells.keep_alive.value.seconds", p1) - } - } - } - internal enum RandomEndpoint { - /// Randomize endpoint - internal static let caption = L10n.tr("Core", "configuration.cells.random_endpoint.caption") - } - internal enum RenegotiationSeconds { - /// Renegotiation - internal static let caption = L10n.tr("Core", "configuration.cells.renegotiation_seconds.caption") - internal enum Value { - /// after %@ - internal static func after(_ p1: Any) -> String { - return L10n.tr("Core", "configuration.cells.renegotiation_seconds.value.after", String(describing: p1)) - } - } - } - internal enum ResetOriginal { - /// Reset configuration - internal static let caption = L10n.tr("Core", "configuration.cells.reset_original.caption") - } - internal enum TlsWrapping { - /// Wrapping - internal static let caption = L10n.tr("Core", "configuration.cells.tls_wrapping.caption") - internal enum Value { - /// Authentication - internal static let auth = L10n.tr("Core", "configuration.cells.tls_wrapping.value.auth") - /// Encryption - internal static let crypt = L10n.tr("Core", "configuration.cells.tls_wrapping.value.crypt") - } - } - } - internal enum Sections { - internal enum Communication { - /// Communication - internal static let header = L10n.tr("Core", "configuration.sections.communication.header") - } - internal enum Compression { - /// Compression - internal static let header = L10n.tr("Core", "configuration.sections.compression.header") - } - internal enum Network { - /// Network - internal static let header = L10n.tr("Core", "configuration.sections.network.header") - } - internal enum Other { - /// Other - internal static let header = L10n.tr("Core", "configuration.sections.other.header") - } - internal enum Reset { - /// If you ended up with broken connectivity after changing the communication parameters, tap to revert to the original configuration. - internal static let footer = L10n.tr("Core", "configuration.sections.reset.footer") - } - internal enum Tls { - /// TLS - internal static let header = L10n.tr("Core", "configuration.sections.tls.header") + internal static let auth = L10n.tr("Core", "configuration.cells.tls_wrapping.value.auth") + /// Encryption + internal static let crypt = L10n.tr("Core", "configuration.cells.tls_wrapping.value.crypt") } } } - internal enum Credits { - /// Credits - internal static let title = L10n.tr("Core", "credits.title") - internal enum Sections { - internal enum Licenses { - /// Licenses - internal static let header = L10n.tr("Core", "credits.sections.licenses.header") - } - internal enum Notices { - /// Notices - internal static let header = L10n.tr("Core", "credits.sections.notices.header") - } - internal enum Translations { - /// Translations - internal static let header = L10n.tr("Core", "credits.sections.translations.header") - } + internal enum Sections { + internal enum Communication { + /// Communication + internal static let header = L10n.tr("Core", "configuration.sections.communication.header") + } + internal enum Compression { + /// Compression + internal static let header = L10n.tr("Core", "configuration.sections.compression.header") + } + internal enum Network { + /// Network + internal static let header = L10n.tr("Core", "configuration.sections.network.header") + } + internal enum Other { + /// Other + internal static let header = L10n.tr("Core", "configuration.sections.other.header") + } + internal enum Reset { + /// If you ended up with broken connectivity after changing the communication parameters, tap to revert to the original configuration. + internal static let footer = L10n.tr("Core", "configuration.sections.reset.footer") + } + internal enum Tls { + /// TLS + internal static let header = L10n.tr("Core", "configuration.sections.tls.header") } } - internal enum DebugLog { - internal enum Alerts { - internal enum EmptyLog { - /// The debug log is empty. - internal static let message = L10n.tr("Core", "debug_log.alerts.empty_log.message") - } + } + + internal enum Credits { + /// Credits + internal static let title = L10n.tr("Core", "credits.title") + internal enum Sections { + internal enum Licenses { + /// Licenses + internal static let header = L10n.tr("Core", "credits.sections.licenses.header") } - internal enum Buttons { - /// Copy - internal static let copy = L10n.tr("Core", "debug_log.buttons.copy") - /// Next - internal static let next = L10n.tr("Core", "debug_log.buttons.next") - /// Previous - internal static let previous = L10n.tr("Core", "debug_log.buttons.previous") + internal enum Notices { + /// Notices + internal static let header = L10n.tr("Core", "credits.sections.notices.header") + } + internal enum Translations { + /// Translations + internal static let header = L10n.tr("Core", "credits.sections.translations.header") } } - internal enum Donation { - /// Donate - internal static let title = L10n.tr("Core", "donation.title") - internal enum Alerts { - internal enum Purchase { - internal enum Failure { - /// Unable to perform the donation. %@ - internal static func message(_ p1: Any) -> String { - return L10n.tr("Core", "donation.alerts.purchase.failure.message", String(describing: p1)) - } - } - internal enum Success { - /// This means a lot to me and I really hope you keep using and promoting this app. - internal static let message = L10n.tr("Core", "donation.alerts.purchase.success.message") - /// Thank you - internal static let title = L10n.tr("Core", "donation.alerts.purchase.success.title") - } - } - } - internal enum Cells { - internal enum Loading { - /// Loading donations - internal static let caption = L10n.tr("Core", "donation.cells.loading.caption") - } - internal enum Purchasing { - /// Performing donation - internal static let caption = L10n.tr("Core", "donation.cells.purchasing.caption") - } - } - internal enum Sections { - internal enum OneTime { - /// If you want to display gratitude for my free work, here are a couple amounts you can donate instantly.\n\nYou will only be charged once per donation, and you can donate multiple times. - internal static let footer = L10n.tr("Core", "donation.sections.one_time.footer") - /// One time - internal static let header = L10n.tr("Core", "donation.sections.one_time.header") - } + } + + internal enum DebugLog { + internal enum Alerts { + internal enum EmptyLog { + /// The debug log is empty. + internal static let message = L10n.tr("Core", "debug_log.alerts.empty_log.message") } } - internal enum Endpoint { - /// Endpoint - internal static let title = L10n.tr("Core", "endpoint.title") - internal enum Cells { - /// Address - internal static let address = L10n.tr("Core", "endpoint.cells.address") - /// Protocol - internal static let `protocol` = L10n.tr("Core", "endpoint.cells.protocol") - internal enum AnyAddress { - /// Automatic - internal static let caption = L10n.tr("Core", "endpoint.cells.any_address.caption") - } - internal enum AnyProtocol { - /// Automatic - internal static let caption = L10n.tr("Core", "endpoint.cells.any_protocol.caption") - } - } - internal enum Sections { - internal enum LocationAddresses { - /// Addresses - internal static let header = L10n.tr("Core", "endpoint.sections.location_addresses.header") - } - internal enum LocationProtocols { - /// Protocols - internal static let header = L10n.tr("Core", "endpoint.sections.location_protocols.header") - } - } - } - internal enum Global { - /// Cancel - internal static let cancel = L10n.tr("Core", "global.cancel") - /// Close - internal static let close = L10n.tr("Core", "global.close") - /// No e-mail account is configured. - internal static let emailNotConfigured = L10n.tr("Core", "global.email_not_configured") + internal enum Buttons { + /// Copy + internal static let copy = L10n.tr("Core", "debug_log.buttons.copy") /// Next - internal static let next = L10n.tr("Core", "global.next") - /// OK - internal static let ok = L10n.tr("Core", "global.ok") - internal enum Captions { - /// Address - internal static let address = L10n.tr("Core", "global.captions.address") - /// Port - internal static let port = L10n.tr("Core", "global.captions.port") - /// Protocol - internal static let `protocol` = L10n.tr("Core", "global.captions.protocol") - } - internal enum Host { - internal enum TitleInput { - /// Acceptable characters are alphanumerics plus dash "-", underscore "_" and dot ".". - internal static let message = L10n.tr("Core", "global.host.title_input.message") - /// My profile - internal static let placeholder = L10n.tr("Core", "global.host.title_input.placeholder") + internal static let next = L10n.tr("Core", "debug_log.buttons.next") + /// Previous + internal static let previous = L10n.tr("Core", "debug_log.buttons.previous") + } + } + + internal enum Donation { + /// Donate + internal static let title = L10n.tr("Core", "donation.title") + internal enum Alerts { + internal enum Purchase { + internal enum Failure { + /// Unable to perform the donation. %@ + internal static func message(_ p1: Any) -> String { + return L10n.tr("Core", "donation.alerts.purchase.failure.message", String(describing: p1)) + } + } + internal enum Success { + /// This means a lot to me and I really hope you keep using and promoting this app. + internal static let message = L10n.tr("Core", "donation.alerts.purchase.success.message") + /// Thank you + internal static let title = L10n.tr("Core", "donation.alerts.purchase.success.title") } } - internal enum Values { + } + internal enum Cells { + internal enum Loading { + /// Loading donations + internal static let caption = L10n.tr("Core", "donation.cells.loading.caption") + } + internal enum Purchasing { + /// Performing donation + internal static let caption = L10n.tr("Core", "donation.cells.purchasing.caption") + } + } + internal enum Sections { + internal enum OneTime { + /// If you want to display gratitude for my free work, here are a couple amounts you can donate instantly.\n\nYou will only be charged once per donation, and you can donate multiple times. + internal static let footer = L10n.tr("Core", "donation.sections.one_time.footer") + /// One time + internal static let header = L10n.tr("Core", "donation.sections.one_time.header") + } + } + } + + internal enum Endpoint { + /// Endpoint + internal static let title = L10n.tr("Core", "endpoint.title") + internal enum Cells { + /// Address + internal static let address = L10n.tr("Core", "endpoint.cells.address") + /// Protocol + internal static let `protocol` = L10n.tr("Core", "endpoint.cells.protocol") + internal enum AnyAddress { /// Automatic - internal static let automatic = L10n.tr("Core", "global.values.automatic") - /// Default - internal static let `default` = L10n.tr("Core", "global.values.default") - /// Disabled - internal static let disabled = L10n.tr("Core", "global.values.disabled") - /// Enabled - internal static let enabled = L10n.tr("Core", "global.values.enabled") - /// Manual - internal static let manual = L10n.tr("Core", "global.values.manual") - /// None - internal static let `none` = L10n.tr("Core", "global.values.none") + internal static let caption = L10n.tr("Core", "endpoint.cells.any_address.caption") + } + internal enum AnyProtocol { + /// Automatic + internal static let caption = L10n.tr("Core", "endpoint.cells.any_protocol.caption") } } - internal enum ImportedHosts { - /// Imported hosts - internal static let title = L10n.tr("Core", "imported_hosts.title") - } - internal enum IssueReporter { - /// The debug log of your latest connections is crucial to resolve your connectivity issues and is completely anonymous.\n\nThe .ovpn configuration file, if any, is attached stripped of any sensitive data.\n\nPlease double check the e-mail attachments if unsure. - internal static let message = L10n.tr("Core", "issue_reporter.message") - /// Report issue - internal static let title = L10n.tr("Core", "issue_reporter.title") - internal enum Buttons { - /// I understand - internal static let accept = L10n.tr("Core", "issue_reporter.buttons.accept") + internal enum Sections { + internal enum LocationAddresses { + /// Addresses + internal static let header = L10n.tr("Core", "endpoint.sections.location_addresses.header") + } + internal enum LocationProtocols { + /// Protocols + internal static let header = L10n.tr("Core", "endpoint.sections.location_protocols.header") } } - internal enum Label { - internal enum License { - /// Unable to download full license content. - internal static let error = L10n.tr("Core", "label.license.error") + } + + internal enum Global { + /// Cancel + internal static let cancel = L10n.tr("Core", "global.cancel") + /// Close + internal static let close = L10n.tr("Core", "global.close") + /// No e-mail account is configured. + internal static let emailNotConfigured = L10n.tr("Core", "global.email_not_configured") + /// Next + internal static let next = L10n.tr("Core", "global.next") + /// OK + internal static let ok = L10n.tr("Core", "global.ok") + internal enum Captions { + /// Address + internal static let address = L10n.tr("Core", "global.captions.address") + /// Port + internal static let port = L10n.tr("Core", "global.captions.port") + /// Protocol + internal static let `protocol` = L10n.tr("Core", "global.captions.protocol") + } + internal enum Host { + internal enum TitleInput { + /// Acceptable characters are alphanumerics plus dash "-", underscore "_" and dot ".". + internal static let message = L10n.tr("Core", "global.host.title_input.message") + /// My profile + internal static let placeholder = L10n.tr("Core", "global.host.title_input.placeholder") } } - internal enum Menu { - internal enum ActiveProfile { - internal enum Items { - internal enum Customize { - /// Customize... - internal static let title = L10n.tr("Core", "menu.active_profile.items.customize.title") - } - } - internal enum Messages { - /// No account configured - internal static let missingCredentials = L10n.tr("Core", "menu.active_profile.messages.missing_credentials") - } - internal enum Title { - /// No active profile - internal static let `none` = L10n.tr("Core", "menu.active_profile.title.none") - } - } - internal enum Organizer { - /// Organizer - internal static let title = L10n.tr("Core", "menu.organizer.title") - } - internal enum Preferences { - /// Preferences - internal static let title = L10n.tr("Core", "menu.preferences.title") - } - internal enum Quit { - /// Quit %@ - internal static func title(_ p1: Any) -> String { - return L10n.tr("Core", "menu.quit.title", String(describing: p1)) - } - internal enum Messages { - /// The VPN, if enabled, will still run in the background. Do you want to quit? - internal static let confirm = L10n.tr("Core", "menu.quit.messages.confirm") - } - } - internal enum Show { - /// Show - internal static let title = L10n.tr("Core", "menu.show.title") - } - internal enum Support { - /// Support - internal static let title = L10n.tr("Core", "menu.support.title") - } - internal enum SwitchProfile { - /// Active profile - internal static let title = L10n.tr("Core", "menu.switch_profile.title") - } + internal enum Values { + /// Automatic + internal static let automatic = L10n.tr("Core", "global.values.automatic") + /// Default + internal static let `default` = L10n.tr("Core", "global.values.default") + /// Disabled + internal static let disabled = L10n.tr("Core", "global.values.disabled") + /// Enabled + internal static let enabled = L10n.tr("Core", "global.values.enabled") + /// Manual + internal static let manual = L10n.tr("Core", "global.values.manual") + /// None + internal static let `none` = L10n.tr("Core", "global.values.none") } - internal enum NetworkChoice { - /// Read .ovpn - internal static let client = L10n.tr("Core", "network_choice.client") - /// Pull from server - internal static let server = L10n.tr("Core", "network_choice.server") + } + + internal enum ImportedHosts { + /// Imported hosts + internal static let title = L10n.tr("Core", "imported_hosts.title") + } + + internal enum IssueReporter { + /// The debug log of your latest connections is crucial to resolve your connectivity issues and is completely anonymous.\n\nThe .ovpn configuration file, if any, is attached stripped of any sensitive data.\n\nPlease double check the e-mail attachments if unsure. + internal static let message = L10n.tr("Core", "issue_reporter.message") + /// Report issue + internal static let title = L10n.tr("Core", "issue_reporter.title") + internal enum Buttons { + /// I understand + internal static let accept = L10n.tr("Core", "issue_reporter.buttons.accept") } - internal enum NetworkSettings { - /// Network settings - internal static let title = L10n.tr("Core", "network_settings.title") - internal enum Cells { - internal enum AddDnsDomain { - /// Add search domain - internal static let caption = L10n.tr("Core", "network_settings.cells.add_dns_domain.caption") - } - internal enum AddDnsServer { - /// Add address - internal static let caption = L10n.tr("Core", "network_settings.cells.add_dns_server.caption") - } - internal enum AddProxyBypass { - /// Add bypass domain - internal static let caption = L10n.tr("Core", "network_settings.cells.add_proxy_bypass.caption") - } - internal enum ProxyBypass { - /// Bypass domain - internal static let caption = L10n.tr("Core", "network_settings.cells.proxy_bypass.caption") + } + + internal enum Label { + internal enum License { + /// Unable to download full license content. + internal static let error = L10n.tr("Core", "label.license.error") + } + } + + internal enum Menu { + internal enum ActiveProfile { + internal enum Items { + internal enum Customize { + /// Customize... + internal static let title = L10n.tr("Core", "menu.active_profile.items.customize.title") } } - internal enum Dns { - /// DNS - internal static let title = L10n.tr("Core", "network_settings.dns.title") - internal enum Cells { - internal enum Addresses { - /// Servers - internal static let title = L10n.tr("Core", "network_settings.dns.cells.addresses.title") - } - internal enum Domain { - /// Domain - internal static let caption = L10n.tr("Core", "network_settings.dns.cells.domain.caption") - } - internal enum Domains { - /// Domains - internal static let title = L10n.tr("Core", "network_settings.dns.cells.domains.title") - } - } + internal enum Messages { + /// No account configured + internal static let missingCredentials = L10n.tr("Core", "menu.active_profile.messages.missing_credentials") } - internal enum Gateway { - /// Default gateway - internal static let title = L10n.tr("Core", "network_settings.gateway.title") - } - internal enum Mtu { - /// MTU - internal static let title = L10n.tr("Core", "network_settings.mtu.title") - internal enum Cells { - internal enum Bytes { - /// Bytes - internal static let caption = L10n.tr("Core", "network_settings.mtu.cells.bytes.caption") - } - } - } - internal enum Proxy { - /// Proxy - internal static let title = L10n.tr("Core", "network_settings.proxy.title") - internal enum Cells { - internal enum BypassDomains { - /// Bypass domains - internal static let title = L10n.tr("Core", "network_settings.proxy.cells.bypass_domains.title") - } - } + internal enum Title { + /// No active profile + internal static let `none` = L10n.tr("Core", "menu.active_profile.title.none") } } internal enum Organizer { - /// %@ - internal static func title(_ p1: Any) -> String { - return L10n.tr("Core", "organizer.title", String(describing: p1)) - } - internal enum Alerts { - internal enum AddHost { - /// Open an URL to an .ovpn configuration file from Safari, Mail or another app to set up a host profile.\n\nYou can also import an .ovpn with iTunes File Sharing. - internal static let message = L10n.tr("Core", "organizer.alerts.add_host.message") - } - internal enum CannotDonate { - /// There is no payment method configured on this device. - internal static let message = L10n.tr("Core", "organizer.alerts.cannot_donate.message") - } - internal enum DeleteVpnProfile { - /// Do you really want to erase the VPN configuration from your device settings? This may fix some broken VPN states and will not affect your provider and host profiles. - internal static let message = L10n.tr("Core", "organizer.alerts.delete_vpn_profile.message") - } - internal enum ExhaustedProviders { - /// You have created profiles for any available provider. - internal static let message = L10n.tr("Core", "organizer.alerts.exhausted_providers.message") - } - internal enum OpenHostFile { - /// Select an .ovpn file - internal static let title = L10n.tr("Core", "organizer.alerts.open_host_file.title") - } - internal enum RemoveProfile { - /// Are you sure you want to delete profile %@? - internal static func message(_ p1: Any) -> String { - return L10n.tr("Core", "organizer.alerts.remove_profile.message", String(describing: p1)) - } - /// Remove profile - internal static let title = L10n.tr("Core", "organizer.alerts.remove_profile.title") - } - } - internal enum Cells { - internal enum About { - /// About %@ - internal static func caption(_ p1: Any) -> String { - return L10n.tr("Core", "organizer.cells.about.caption", String(describing: p1)) - } - } - internal enum AddHost { - /// Add from Files - internal static let caption = L10n.tr("Core", "organizer.cells.add_host.caption") - } - internal enum AddProvider { - /// Add new provider - internal static let caption = L10n.tr("Core", "organizer.cells.add_provider.caption") - } - internal enum Donate { - /// Make a donation - internal static let caption = L10n.tr("Core", "organizer.cells.donate.caption") - } - internal enum FollowTwitch { - /// Watch Passepartout on Twitch - internal static let caption = L10n.tr("Core", "organizer.cells.follow_twitch.caption") - } - internal enum GithubSponsors { - /// Support me on GitHub - internal static let caption = L10n.tr("Core", "organizer.cells.github_sponsors.caption") - } - internal enum ImportHost { - /// Add from imported - internal static let caption = L10n.tr("Core", "organizer.cells.import_host.caption") - } - internal enum JoinCommunity { - /// Join community - internal static let caption = L10n.tr("Core", "organizer.cells.join_community.caption") - } - internal enum Profile { - internal enum Value { - /// In use - internal static let current = L10n.tr("Core", "organizer.cells.profile.value.current") - } - } - internal enum SiriShortcuts { - /// Manage shortcuts - internal static let caption = L10n.tr("Core", "organizer.cells.siri_shortcuts.caption") - } - internal enum Translate { - /// Offer to translate - internal static let caption = L10n.tr("Core", "organizer.cells.translate.caption") - } - internal enum Uninstall { - /// Remove VPN configuration - internal static let caption = L10n.tr("Core", "organizer.cells.uninstall.caption") - } - internal enum WriteReview { - /// Write a review - internal static let caption = L10n.tr("Core", "organizer.cells.write_review.caption") - } - } - internal enum Menus { - /// Host - internal static let host = L10n.tr("Core", "organizer.menus.host") - /// Provider - internal static let provider = L10n.tr("Core", "organizer.menus.provider") - internal enum Provider { - /// No providers left - internal static let unavailable = L10n.tr("Core", "organizer.menus.provider.unavailable") - } - } - internal enum Sections { - internal enum Feedback { - /// Feedback - internal static let header = L10n.tr("Core", "organizer.sections.feedback.header") - } - internal enum Hosts { - /// Import hosts from raw .ovpn configuration files. - internal static let footer = L10n.tr("Core", "organizer.sections.hosts.footer") - /// Hosts - internal static let header = L10n.tr("Core", "organizer.sections.hosts.header") - } - internal enum Providers { - /// Here you find a few providers with preset configuration profiles. - internal static let footer = L10n.tr("Core", "organizer.sections.providers.footer") - /// Providers - internal static let header = L10n.tr("Core", "organizer.sections.providers.header") - } - internal enum Siri { - /// Get help from Siri to speed up your most common interactions with the app. - internal static let footer = L10n.tr("Core", "organizer.sections.siri.footer") - /// Siri - internal static let header = L10n.tr("Core", "organizer.sections.siri.header") - } - internal enum Support { - /// Support - internal static let header = L10n.tr("Core", "organizer.sections.support.header") - } - internal enum Twitch { - /// Come watch me make Passepartout live on Twitch, join the chat to interact and contribute! - internal static let footer = L10n.tr("Core", "organizer.sections.twitch.footer") - /// Twitch - internal static let header = L10n.tr("Core", "organizer.sections.twitch.header") - } - } - } - internal enum ParsedFile { - internal enum Alerts { - internal enum Buttons { - /// Report an issue - internal static let report = L10n.tr("Core", "parsed_file.alerts.buttons.report") - } - internal enum Decryption { - /// The configuration contains an encrypted private key and it could not be decrypted. Double check your entered passphrase. - internal static let message = L10n.tr("Core", "parsed_file.alerts.decryption.message") - } - internal enum EncryptionPassphrase { - /// Please enter the encryption passphrase. - internal static let message = L10n.tr("Core", "parsed_file.alerts.encryption_passphrase.message") - } - internal enum Malformed { - /// The configuration file contains a malformed option (%@). - internal static func message(_ p1: Any) -> String { - return L10n.tr("Core", "parsed_file.alerts.malformed.message", String(describing: p1)) - } - } - internal enum Missing { - /// The configuration file lacks a required option (%@). - internal static func message(_ p1: Any) -> String { - return L10n.tr("Core", "parsed_file.alerts.missing.message", String(describing: p1)) - } - } - internal enum Parsing { - /// Unable to parse the provided configuration file (%@). - internal static func message(_ p1: Any) -> String { - return L10n.tr("Core", "parsed_file.alerts.parsing.message", String(describing: p1)) - } - } - internal enum PotentiallyUnsupported { - /// The configuration file is correct but contains a potentially unsupported option (%@).\n\nConnectivity may break depending on server settings. - internal static func message(_ p1: Any) -> String { - return L10n.tr("Core", "parsed_file.alerts.potentially_unsupported.message", String(describing: p1)) - } - } - internal enum Unsupported { - /// The configuration file contains an unsupported option (%@). - internal static func message(_ p1: Any) -> String { - return L10n.tr("Core", "parsed_file.alerts.unsupported.message", String(describing: p1)) - } - } - } + /// Organizer + internal static let title = L10n.tr("Core", "menu.organizer.title") } internal enum Preferences { /// Preferences - internal static let title = L10n.tr("Core", "preferences.title") + internal static let title = L10n.tr("Core", "menu.preferences.title") + } + internal enum Quit { + /// Quit %@ + internal static func title(_ p1: Any) -> String { + return L10n.tr("Core", "menu.quit.title", String(describing: p1)) + } + internal enum Messages { + /// The VPN, if enabled, will still run in the background. Do you want to quit? + internal static let confirm = L10n.tr("Core", "menu.quit.messages.confirm") + } + } + internal enum Show { + /// Show + internal static let title = L10n.tr("Core", "menu.show.title") + } + internal enum Support { + /// Support + internal static let title = L10n.tr("Core", "menu.support.title") + } + internal enum SwitchProfile { + /// Active profile + internal static let title = L10n.tr("Core", "menu.switch_profile.title") + } + } + + internal enum NetworkChoice { + /// Read .ovpn + internal static let client = L10n.tr("Core", "network_choice.client") + /// Pull from server + internal static let server = L10n.tr("Core", "network_choice.server") + } + + internal enum NetworkSettings { + /// Network settings + internal static let title = L10n.tr("Core", "network_settings.title") + internal enum Cells { + internal enum AddDnsDomain { + /// Add search domain + internal static let caption = L10n.tr("Core", "network_settings.cells.add_dns_domain.caption") + } + internal enum AddDnsServer { + /// Add address + internal static let caption = L10n.tr("Core", "network_settings.cells.add_dns_server.caption") + } + internal enum AddProxyBypass { + /// Add bypass domain + internal static let caption = L10n.tr("Core", "network_settings.cells.add_proxy_bypass.caption") + } + internal enum ProxyBypass { + /// Bypass domain + internal static let caption = L10n.tr("Core", "network_settings.cells.proxy_bypass.caption") + } + } + internal enum Dns { + /// DNS + internal static let title = L10n.tr("Core", "network_settings.dns.title") internal enum Cells { - internal enum ConfirmQuit { - /// Confirm quit - internal static let caption = L10n.tr("Core", "preferences.cells.confirm_quit.caption") - /// Check to present a quit confirmation alert. - internal static let footer = L10n.tr("Core", "preferences.cells.confirm_quit.footer") + internal enum Addresses { + /// Servers + internal static let title = L10n.tr("Core", "network_settings.dns.cells.addresses.title") } - internal enum LaunchesOnLogin { - /// Launch on login - internal static let caption = L10n.tr("Core", "preferences.cells.launches_on_login.caption") - /// Check to automatically launch the app on boot or login. - internal static let footer = L10n.tr("Core", "preferences.cells.launches_on_login.footer") + internal enum Domain { + /// Domain + internal static let caption = L10n.tr("Core", "network_settings.dns.cells.domain.caption") + } + internal enum Domains { + /// Domains + internal static let title = L10n.tr("Core", "network_settings.dns.cells.domains.title") + } + } + } + internal enum Gateway { + /// Default gateway + internal static let title = L10n.tr("Core", "network_settings.gateway.title") + } + internal enum Mtu { + /// MTU + internal static let title = L10n.tr("Core", "network_settings.mtu.title") + internal enum Cells { + internal enum Bytes { + /// Bytes + internal static let caption = L10n.tr("Core", "network_settings.mtu.cells.bytes.caption") + } + } + } + internal enum Proxy { + /// Proxy + internal static let title = L10n.tr("Core", "network_settings.proxy.title") + internal enum Cells { + internal enum BypassDomains { + /// Bypass domains + internal static let title = L10n.tr("Core", "network_settings.proxy.cells.bypass_domains.title") + } + } + } + } + + internal enum Organizer { + /// %@ + internal static func title(_ p1: Any) -> String { + return L10n.tr("Core", "organizer.title", String(describing: p1)) + } + internal enum Alerts { + internal enum AddHost { + /// Open an URL to an .ovpn configuration file from Safari, Mail or another app to set up a host profile.\n\nYou can also import an .ovpn with iTunes File Sharing. + internal static let message = L10n.tr("Core", "organizer.alerts.add_host.message") + } + internal enum CannotDonate { + /// There is no payment method configured on this device. + internal static let message = L10n.tr("Core", "organizer.alerts.cannot_donate.message") + } + internal enum DeleteVpnProfile { + /// Do you really want to erase the VPN configuration from your device settings? This may fix some broken VPN states and will not affect your provider and host profiles. + internal static let message = L10n.tr("Core", "organizer.alerts.delete_vpn_profile.message") + } + internal enum ExhaustedProviders { + /// You have created profiles for any available provider. + internal static let message = L10n.tr("Core", "organizer.alerts.exhausted_providers.message") + } + internal enum OpenHostFile { + /// Select an .ovpn file + internal static let title = L10n.tr("Core", "organizer.alerts.open_host_file.title") + } + internal enum RemoveProfile { + /// Are you sure you want to delete profile %@? + internal static func message(_ p1: Any) -> String { + return L10n.tr("Core", "organizer.alerts.remove_profile.message", String(describing: p1)) + } + /// Remove profile + internal static let title = L10n.tr("Core", "organizer.alerts.remove_profile.title") + } + } + internal enum Cells { + internal enum About { + /// About %@ + internal static func caption(_ p1: Any) -> String { + return L10n.tr("Core", "organizer.cells.about.caption", String(describing: p1)) + } + } + internal enum AddHost { + /// Add from Files + internal static let caption = L10n.tr("Core", "organizer.cells.add_host.caption") + } + internal enum AddProvider { + /// Add new provider + internal static let caption = L10n.tr("Core", "organizer.cells.add_provider.caption") + } + internal enum Donate { + /// Make a donation + internal static let caption = L10n.tr("Core", "organizer.cells.donate.caption") + } + internal enum FollowTwitch { + /// Watch Passepartout on Twitch + internal static let caption = L10n.tr("Core", "organizer.cells.follow_twitch.caption") + } + internal enum GithubSponsors { + /// Support me on GitHub + internal static let caption = L10n.tr("Core", "organizer.cells.github_sponsors.caption") + } + internal enum ImportHost { + /// Add from imported + internal static let caption = L10n.tr("Core", "organizer.cells.import_host.caption") + } + internal enum JoinCommunity { + /// Join community + internal static let caption = L10n.tr("Core", "organizer.cells.join_community.caption") + } + internal enum Profile { + internal enum Value { + /// In use + internal static let current = L10n.tr("Core", "organizer.cells.profile.value.current") + } + } + internal enum SiriShortcuts { + /// Manage shortcuts + internal static let caption = L10n.tr("Core", "organizer.cells.siri_shortcuts.caption") + } + internal enum Translate { + /// Offer to translate + internal static let caption = L10n.tr("Core", "organizer.cells.translate.caption") + } + internal enum Uninstall { + /// Remove VPN configuration + internal static let caption = L10n.tr("Core", "organizer.cells.uninstall.caption") + } + internal enum WriteReview { + /// Write a review + internal static let caption = L10n.tr("Core", "organizer.cells.write_review.caption") + } + } + internal enum Menus { + /// Host + internal static let host = L10n.tr("Core", "organizer.menus.host") + /// Provider + internal static let provider = L10n.tr("Core", "organizer.menus.provider") + internal enum Provider { + /// No providers left + internal static let unavailable = L10n.tr("Core", "organizer.menus.provider.unavailable") + } + } + internal enum Sections { + internal enum Feedback { + /// Feedback + internal static let header = L10n.tr("Core", "organizer.sections.feedback.header") + } + internal enum Hosts { + /// Import hosts from raw .ovpn configuration files. + internal static let footer = L10n.tr("Core", "organizer.sections.hosts.footer") + /// Hosts + internal static let header = L10n.tr("Core", "organizer.sections.hosts.header") + } + internal enum Providers { + /// Here you find a few providers with preset configuration profiles. + internal static let footer = L10n.tr("Core", "organizer.sections.providers.footer") + /// Providers + internal static let header = L10n.tr("Core", "organizer.sections.providers.header") + } + internal enum Siri { + /// Get help from Siri to speed up your most common interactions with the app. + internal static let footer = L10n.tr("Core", "organizer.sections.siri.footer") + /// Siri + internal static let header = L10n.tr("Core", "organizer.sections.siri.header") + } + internal enum Support { + /// Support + internal static let header = L10n.tr("Core", "organizer.sections.support.header") + } + internal enum Twitch { + /// Come watch me make Passepartout live on Twitch, join the chat to interact and contribute! + internal static let footer = L10n.tr("Core", "organizer.sections.twitch.footer") + /// Twitch + internal static let header = L10n.tr("Core", "organizer.sections.twitch.header") + } + } + } + + internal enum ParsedFile { + internal enum Alerts { + internal enum Buttons { + /// Report an issue + internal static let report = L10n.tr("Core", "parsed_file.alerts.buttons.report") + } + internal enum Decryption { + /// The configuration contains an encrypted private key and it could not be decrypted. Double check your entered passphrase. + internal static let message = L10n.tr("Core", "parsed_file.alerts.decryption.message") + } + internal enum EncryptionPassphrase { + /// Please enter the encryption passphrase. + internal static let message = L10n.tr("Core", "parsed_file.alerts.encryption_passphrase.message") + } + internal enum Malformed { + /// The configuration file contains a malformed option (%@). + internal static func message(_ p1: Any) -> String { + return L10n.tr("Core", "parsed_file.alerts.malformed.message", String(describing: p1)) + } + } + internal enum Missing { + /// The configuration file lacks a required option (%@). + internal static func message(_ p1: Any) -> String { + return L10n.tr("Core", "parsed_file.alerts.missing.message", String(describing: p1)) + } + } + internal enum Parsing { + /// Unable to parse the provided configuration file (%@). + internal static func message(_ p1: Any) -> String { + return L10n.tr("Core", "parsed_file.alerts.parsing.message", String(describing: p1)) + } + } + internal enum PotentiallyUnsupported { + /// The configuration file is correct but contains a potentially unsupported option (%@).\n\nConnectivity may break depending on server settings. + internal static func message(_ p1: Any) -> String { + return L10n.tr("Core", "parsed_file.alerts.potentially_unsupported.message", String(describing: p1)) + } + } + internal enum Unsupported { + /// The configuration file contains an unsupported option (%@). + internal static func message(_ p1: Any) -> String { + return L10n.tr("Core", "parsed_file.alerts.unsupported.message", String(describing: p1)) + } + } + } + } + + internal enum Preferences { + /// Preferences + internal static let title = L10n.tr("Core", "preferences.title") + internal enum Cells { + internal enum ConfirmQuit { + /// Confirm quit + internal static let caption = L10n.tr("Core", "preferences.cells.confirm_quit.caption") + /// Check to present a quit confirmation alert. + internal static let footer = L10n.tr("Core", "preferences.cells.confirm_quit.footer") + } + internal enum LaunchesOnLogin { + /// Launch on login + internal static let caption = L10n.tr("Core", "preferences.cells.launches_on_login.caption") + /// Check to automatically launch the app on boot or login. + internal static let footer = L10n.tr("Core", "preferences.cells.launches_on_login.footer") + } + } + internal enum Sections { + internal enum General { + /// General + internal static let header = L10n.tr("Core", "preferences.sections.general.header") + } + } + } + + internal enum Provider { + internal enum Pool { + internal enum Actions { + /// Favorite + internal static let favorite = L10n.tr("Core", "provider.pool.actions.favorite") + /// Unfavorite + internal static let unfavorite = L10n.tr("Core", "provider.pool.actions.unfavorite") + } + internal enum Sections { + internal enum EmptyFavorites { + /// Swipe left on a location to add or remove it from Favorites. + internal static let footer = L10n.tr("Core", "provider.pool.sections.empty_favorites.footer") + } + } + } + internal enum Preset { + internal enum Cells { + internal enum TechDetails { + /// Technical details + internal static let caption = L10n.tr("Core", "provider.preset.cells.tech_details.caption") + } + } + } + } + + internal enum Purchase { + /// Purchase + internal static let title = L10n.tr("Core", "purchase.title") + internal enum Cells { + internal enum FullVersion { + /// All providers (including future ones)\n%@ + internal static func extraDescription(_ p1: Any) -> String { + return L10n.tr("Core", "purchase.cells.full_version.extra_description", String(describing: p1)) + } + } + internal enum Restore { + /// If you bought this app or feature in the past, you can restore your purchases and this screen won't show again. + internal static let description = L10n.tr("Core", "purchase.cells.restore.description") + /// Restore purchases + internal static let title = L10n.tr("Core", "purchase.cells.restore.title") + } + } + internal enum Sections { + internal enum Products { + /// Every product is a one-time purchase. Provider purchases do not include a VPN subscription. + internal static let footer = L10n.tr("Core", "purchase.sections.products.footer") + } + } + } + + internal enum Reddit { + /// Did you know that Passepartout has a subreddit? Subscribe for updates or to discuss issues, features, new platforms or whatever you like.\n\nIt's also a great way to show you care about this project. + internal static let message = L10n.tr("Core", "reddit.message") + /// Reddit + internal static let title = L10n.tr("Core", "reddit.title") + internal enum Buttons { + /// Don't ask again + internal static let never = L10n.tr("Core", "reddit.buttons.never") + /// Remind me later + internal static let remind = L10n.tr("Core", "reddit.buttons.remind") + /// Subscribe now! + internal static let subscribe = L10n.tr("Core", "reddit.buttons.subscribe") + } + } + + internal enum ServerNetwork { + internal enum Cells { + internal enum Route { + /// Route + internal static let caption = L10n.tr("Core", "server_network.cells.route.caption") + } + } + } + + internal enum Service { + internal enum Alerts { + internal enum Buttons { + /// Reconnect + internal static let reconnect = L10n.tr("Core", "service.alerts.buttons.reconnect") + } + internal enum Configuration { + /// Configuration unavailable, make sure you are connected to the VPN. + internal static let disconnected = L10n.tr("Core", "service.alerts.configuration.disconnected") + } + internal enum CredentialsNeeded { + /// You need to enter account credentials first. + internal static let message = L10n.tr("Core", "service.alerts.credentials_needed.message") + } + internal enum Download { + /// Failed to download configuration files. %@ + internal static func failed(_ p1: Any) -> String { + return L10n.tr("Core", "service.alerts.download.failed", String(describing: p1)) + } + /// %@ requires the download of additional configuration files.\n\nConfirm to start the download. + internal static func message(_ p1: Any) -> String { + return L10n.tr("Core", "service.alerts.download.message", String(describing: p1)) + } + /// Download required + internal static let title = L10n.tr("Core", "service.alerts.download.title") + internal enum Hud { + /// Extracting files, please be patient... + internal static let extracting = L10n.tr("Core", "service.alerts.download.hud.extracting") + } + } + internal enum Location { + internal enum Button { + /// Settings + internal static let settings = L10n.tr("Core", "service.alerts.location.button.settings") + } + internal enum Message { + /// You must allow location access to trust this Wi-Fi network. Go to iOS settings and review your location permissions for Passepartout. + internal static let denied = L10n.tr("Core", "service.alerts.location.message.denied") + } + } + internal enum MasksPrivateData { + internal enum Messages { + /// In order to safely reset the current debug log and apply the new masking preference, you must reconnect to the VPN now. + internal static let mustReconnect = L10n.tr("Core", "service.alerts.masks_private_data.messages.must_reconnect") + } + } + internal enum ReconnectVpn { + /// Do you want to reconnect to the VPN? + internal static let message = L10n.tr("Core", "service.alerts.reconnect_vpn.message") + } + internal enum Rename { + /// Rename profile + internal static let title = L10n.tr("Core", "service.alerts.rename.title") + } + internal enum TestConnectivity { + /// Connectivity + internal static let title = L10n.tr("Core", "service.alerts.test_connectivity.title") + internal enum Messages { + /// Your device has no Internet connectivity, please review your profile parameters. + internal static let failure = L10n.tr("Core", "service.alerts.test_connectivity.messages.failure") + /// Your device is connected to the Internet! + internal static let success = L10n.tr("Core", "service.alerts.test_connectivity.messages.success") + } + } + internal enum Trusted { + internal enum NoNetwork { + /// You are not connected to any Wi-Fi network. + internal static let message = L10n.tr("Core", "service.alerts.trusted.no_network.message") + } + internal enum WillDisconnectPolicy { + /// By changing the trust policy, the VPN may be disconnected. Continue? + internal static let message = L10n.tr("Core", "service.alerts.trusted.will_disconnect_policy.message") + } + internal enum WillDisconnectTrusted { + /// By trusting this network, the VPN may be disconnected. Continue? + internal static let message = L10n.tr("Core", "service.alerts.trusted.will_disconnect_trusted.message") + } + } + } + internal enum Cells { + internal enum Addresses { + /// Addresses + internal static let caption = L10n.tr("Core", "service.cells.addresses.caption") + } + internal enum Category { + /// Category + internal static let caption = L10n.tr("Core", "service.cells.category.caption") + } + internal enum ConnectionStatus { + /// Status + internal static let caption = L10n.tr("Core", "service.cells.connection_status.caption") + } + internal enum DataCount { + /// Exchanged data + internal static let caption = L10n.tr("Core", "service.cells.data_count.caption") + /// Unavailable + internal static let `none` = L10n.tr("Core", "service.cells.data_count.none") + } + internal enum DebugLog { + /// Debug log + internal static let caption = L10n.tr("Core", "service.cells.debug_log.caption") + } + internal enum Host { + internal enum Parameters { + /// Parameters + internal static let caption = L10n.tr("Core", "service.cells.host.parameters.caption") + } + } + internal enum MasksPrivateData { + /// Mask network data + internal static let caption = L10n.tr("Core", "service.cells.masks_private_data.caption") + } + internal enum OnlyShowsFavorites { + /// Only show favorite locations + internal static let caption = L10n.tr("Core", "service.cells.only_shows_favorites.caption") + } + internal enum Provider { + internal enum Pool { + /// Location + internal static let caption = L10n.tr("Core", "service.cells.provider.pool.caption") + } + internal enum Preset { + /// Preset + internal static let caption = L10n.tr("Core", "service.cells.provider.preset.caption") + } + internal enum Refresh { + /// Refresh infrastructure + internal static let caption = L10n.tr("Core", "service.cells.provider.refresh.caption") + } + } + internal enum Reconnect { + /// Reconnect + internal static let caption = L10n.tr("Core", "service.cells.reconnect.caption") + } + internal enum ReportIssue { + /// Report connectivity issue + internal static let caption = L10n.tr("Core", "service.cells.report_issue.caption") + } + internal enum ServerConfiguration { + /// Server configuration + internal static let caption = L10n.tr("Core", "service.cells.server_configuration.caption") + } + internal enum ServerNetwork { + /// Server network + internal static let caption = L10n.tr("Core", "service.cells.server_network.caption") + } + internal enum TestConnectivity { + /// Test connectivity + internal static let caption = L10n.tr("Core", "service.cells.test_connectivity.caption") + } + internal enum TrustedAddWifi { + /// Add Wi-Fi + internal static let caption = L10n.tr("Core", "service.cells.trusted_add_wifi.caption") + } + internal enum TrustedMobile { + /// Cellular network + internal static let caption = L10n.tr("Core", "service.cells.trusted_mobile.caption") + } + internal enum TrustedPolicy { + /// Trust disables VPN + internal static let caption = L10n.tr("Core", "service.cells.trusted_policy.caption") + } + internal enum UseProfile { + /// Use this profile + internal static let caption = L10n.tr("Core", "service.cells.use_profile.caption") + } + internal enum Vpn { + internal enum TurnOff { + /// Disable VPN + internal static let caption = L10n.tr("Core", "service.cells.vpn.turn_off.caption") + } + internal enum TurnOn { + /// Enable VPN + internal static let caption = L10n.tr("Core", "service.cells.vpn.turn_on.caption") + } + } + internal enum VpnResolvesHostname { + /// Resolve provider hostname + internal static let caption = L10n.tr("Core", "service.cells.vpn_resolves_hostname.caption") + } + internal enum VpnService { + /// Enabled + internal static let caption = L10n.tr("Core", "service.cells.vpn_service.caption") + } + internal enum VpnSurvivesSleep { + /// Keep alive on sleep + internal static let caption = L10n.tr("Core", "service.cells.vpn_survives_sleep.caption") + } + } + internal enum Sections { + internal enum Configuration { + /// Configuration + internal static let header = L10n.tr("Core", "service.sections.configuration.header") + } + internal enum Diagnostics { + /// Masking status will be effective after reconnecting. Network data are hostnames, IP addresses, routing, SSID. Credentials and private keys are not logged regardless. + internal static let footer = L10n.tr("Core", "service.sections.diagnostics.footer") + /// Diagnostics + internal static let header = L10n.tr("Core", "service.sections.diagnostics.header") + } + internal enum ProviderInfrastructure { + /// Last updated on %@. + internal static func footer(_ p1: Any) -> String { + return L10n.tr("Core", "service.sections.provider_infrastructure.footer", String(describing: p1)) + } + } + internal enum Status { + /// Connection + internal static let header = L10n.tr("Core", "service.sections.status.header") + } + internal enum Trusted { + /// When entering a trusted network, the VPN is normally shut down and kept disconnected. Disable this option to not enforce such behavior. + internal static let footer = L10n.tr("Core", "service.sections.trusted.footer") + /// Trusted networks + internal static let header = L10n.tr("Core", "service.sections.trusted.header") + } + internal enum Vpn { + /// The connection will be established whenever necessary. + internal static let footer = L10n.tr("Core", "service.sections.vpn.footer") + /// VPN + internal static let header = L10n.tr("Core", "service.sections.vpn.header") + } + internal enum VpnResolvesHostname { + /// Preferred in most networks and required in some IPv6 networks. Disable where DNS is blocked, or to speed up negotiation when DNS is slow to respond. + internal static let footer = L10n.tr("Core", "service.sections.vpn_resolves_hostname.footer") + } + internal enum VpnSurvivesSleep { + /// Disable to improve battery usage, at the expense of occasional slowdowns due to wake-up reconnections. + internal static let footer = L10n.tr("Core", "service.sections.vpn_survives_sleep.footer") + } + } + internal enum Welcome { + /// Welcome to Passepartout!\n\nUse the organizer to add a new profile. + internal static let message = L10n.tr("Core", "service.welcome.message") + } + } + + internal enum Share { + /// Passepartout is an user-friendly, open source OpenVPN client for iOS and macOS + internal static let message = L10n.tr("Core", "share.message") + } + + internal enum Shortcuts { + internal enum Add { + /// Add shortcut + internal static let title = L10n.tr("Core", "shortcuts.add.title") + internal enum Alerts { + internal enum NoProfiles { + /// There is no profile to connect to. + internal static let message = L10n.tr("Core", "shortcuts.add.alerts.no_profiles.message") + } + } + internal enum Cells { + internal enum Connect { + /// Connect to + internal static let caption = L10n.tr("Core", "shortcuts.add.cells.connect.caption") + } + internal enum DisableVpn { + /// Disable VPN + internal static let caption = L10n.tr("Core", "shortcuts.add.cells.disable_vpn.caption") + } + internal enum EnableVpn { + /// Enable VPN + internal static let caption = L10n.tr("Core", "shortcuts.add.cells.enable_vpn.caption") + } + internal enum TrustCellular { + /// Trust cellular network + internal static let caption = L10n.tr("Core", "shortcuts.add.cells.trust_cellular.caption") + } + internal enum TrustCurrentWifi { + /// Trust current Wi-Fi + internal static let caption = L10n.tr("Core", "shortcuts.add.cells.trust_current_wifi.caption") + } + internal enum UntrustCellular { + /// Untrust cellular network + internal static let caption = L10n.tr("Core", "shortcuts.add.cells.untrust_cellular.caption") + } + internal enum UntrustCurrentWifi { + /// Untrust current Wi-Fi + internal static let caption = L10n.tr("Core", "shortcuts.add.cells.untrust_current_wifi.caption") } } internal enum Sections { - internal enum General { - /// General - internal static let header = L10n.tr("Core", "preferences.sections.general.header") + internal enum Cellular { + /// Cellular + internal static let header = L10n.tr("Core", "shortcuts.add.sections.cellular.header") + } + internal enum Vpn { + /// VPN + internal static let header = L10n.tr("Core", "shortcuts.add.sections.vpn.header") + } + internal enum Wifi { + /// Wi-Fi + internal static let header = L10n.tr("Core", "shortcuts.add.sections.wifi.header") + } + } + } + internal enum Edit { + /// Manage shortcuts + internal static let title = L10n.tr("Core", "shortcuts.edit.title") + internal enum Cells { + internal enum AddShortcut { + /// Add shortcut + internal static let caption = L10n.tr("Core", "shortcuts.edit.cells.add_shortcut.caption") + } + } + internal enum Sections { + internal enum All { + /// Existing shortcuts + internal static let header = L10n.tr("Core", "shortcuts.edit.sections.all.header") + } + } + } + } + + internal enum Translations { + /// Translations + internal static let title = L10n.tr("Core", "translations.title") + } + + internal enum Trusted { + internal enum Columns { + internal enum Trust { + /// Trust + internal static let title = L10n.tr("Core", "trusted.columns.trust.title") + } + } + internal enum Ethernet { + /// Check to trust any wired cable connection. + internal static let description = L10n.tr("Core", "trusted.ethernet.description") + /// Trust wired connections + internal static let title = L10n.tr("Core", "trusted.ethernet.title") + } + } + + internal enum Version { + /// Version + internal static let title = L10n.tr("Core", "version.title") + internal enum Labels { + /// Passepartout and TunnelKit are written and maintained by Davide De Rosa (keeshux).\n\nSource code for Passepartout and TunnelKit is publicly available on GitHub under the GPLv3, you can find links in the home page.\n\nPassepartout is a non-official client and is in no way affiliated with OpenVPN Inc. + internal static let intro = L10n.tr("Core", "version.labels.intro") + } + } + + internal enum Vpn { + /// Active + internal static let active = L10n.tr("Core", "vpn.active") + /// Connecting + internal static let connecting = L10n.tr("Core", "vpn.connecting") + /// Disabled + internal static let disabled = L10n.tr("Core", "vpn.disabled") + /// Disconnecting + internal static let disconnecting = L10n.tr("Core", "vpn.disconnecting") + /// Inactive + internal static let inactive = L10n.tr("Core", "vpn.inactive") + /// Off + internal static let unused = L10n.tr("Core", "vpn.unused") + internal enum Errors { + /// Auth failed + internal static let auth = L10n.tr("Core", "vpn.errors.auth") + /// Compression unsupported + internal static let compression = L10n.tr("Core", "vpn.errors.compression") + /// DNS failed + internal static let dns = L10n.tr("Core", "vpn.errors.dns") + /// Encryption failed + internal static let encryption = L10n.tr("Core", "vpn.errors.encryption") + /// No gateway + internal static let gateway = L10n.tr("Core", "vpn.errors.gateway") + /// Network changed + internal static let network = L10n.tr("Core", "vpn.errors.network") + /// Missing routing + internal static let routing = L10n.tr("Core", "vpn.errors.routing") + /// Server shutdown + internal static let shutdown = L10n.tr("Core", "vpn.errors.shutdown") + /// Timeout + internal static let timeout = L10n.tr("Core", "vpn.errors.timeout") + /// TLS failed + internal static let tls = L10n.tr("Core", "vpn.errors.tls") + } + } + + internal enum Wizards { + internal enum Host { + internal enum Alerts { + internal enum Existing { + /// A host profile with the same title already exists. Replace it? + internal static let message = L10n.tr("Core", "wizards.host.alerts.existing.message") + } + } + internal enum Cells { + internal enum TitleInput { + /// Title + internal static let caption = L10n.tr("Core", "wizards.host.cells.title_input.caption") + } + } + internal enum Sections { + internal enum Existing { + /// Existing profiles + internal static let header = L10n.tr("Core", "wizards.host.sections.existing.header") } } } internal enum Provider { - internal enum Pool { - internal enum Actions { - /// Favorite - internal static let favorite = L10n.tr("Core", "provider.pool.actions.favorite") - /// Unfavorite - internal static let unfavorite = L10n.tr("Core", "provider.pool.actions.unfavorite") - } - internal enum Sections { - internal enum EmptyFavorites { - /// Swipe left on a location to add or remove it from Favorites. - internal static let footer = L10n.tr("Core", "provider.pool.sections.empty_favorites.footer") - } - } - } - internal enum Preset { - internal enum Cells { - internal enum TechDetails { - /// Technical details - internal static let caption = L10n.tr("Core", "provider.preset.cells.tech_details.caption") - } - } - } - } - internal enum Purchase { - /// Purchase - internal static let title = L10n.tr("Core", "purchase.title") - internal enum Cells { - internal enum FullVersion { - /// All providers (including future ones)\n%@ - internal static func extraDescription(_ p1: Any) -> String { - return L10n.tr("Core", "purchase.cells.full_version.extra_description", String(describing: p1)) - } - } - internal enum Restore { - /// If you bought this app or feature in the past, you can restore your purchases and this screen won't show again. - internal static let description = L10n.tr("Core", "purchase.cells.restore.description") - /// Restore purchases - internal static let title = L10n.tr("Core", "purchase.cells.restore.title") - } - } - internal enum Sections { - internal enum Products { - /// Every product is a one-time purchase. Provider purchases do not include a VPN subscription. - internal static let footer = L10n.tr("Core", "purchase.sections.products.footer") - } - } - } - internal enum Reddit { - /// Did you know that Passepartout has a subreddit? Subscribe for updates or to discuss issues, features, new platforms or whatever you like.\n\nIt's also a great way to show you care about this project. - internal static let message = L10n.tr("Core", "reddit.message") - /// Reddit - internal static let title = L10n.tr("Core", "reddit.title") - internal enum Buttons { - /// Don't ask again - internal static let never = L10n.tr("Core", "reddit.buttons.never") - /// Remind me later - internal static let remind = L10n.tr("Core", "reddit.buttons.remind") - /// Subscribe now! - internal static let subscribe = L10n.tr("Core", "reddit.buttons.subscribe") - } - } - internal enum ServerNetwork { - internal enum Cells { - internal enum Route { - /// Route - internal static let caption = L10n.tr("Core", "server_network.cells.route.caption") - } - } - } - internal enum Service { internal enum Alerts { - internal enum Buttons { - /// Reconnect - internal static let reconnect = L10n.tr("Core", "service.alerts.buttons.reconnect") - } - internal enum Configuration { - /// Configuration unavailable, make sure you are connected to the VPN. - internal static let disconnected = L10n.tr("Core", "service.alerts.configuration.disconnected") - } - internal enum CredentialsNeeded { - /// You need to enter account credentials first. - internal static let message = L10n.tr("Core", "service.alerts.credentials_needed.message") - } - internal enum Download { - /// Failed to download configuration files. %@ - internal static func failed(_ p1: Any) -> String { - return L10n.tr("Core", "service.alerts.download.failed", String(describing: p1)) - } - /// %@ requires the download of additional configuration files.\n\nConfirm to start the download. - internal static func message(_ p1: Any) -> String { - return L10n.tr("Core", "service.alerts.download.message", String(describing: p1)) - } - /// Download required - internal static let title = L10n.tr("Core", "service.alerts.download.title") - internal enum Hud { - /// Extracting files, please be patient... - internal static let extracting = L10n.tr("Core", "service.alerts.download.hud.extracting") - } - } - internal enum Location { - internal enum Button { - /// Settings - internal static let settings = L10n.tr("Core", "service.alerts.location.button.settings") - } - internal enum Message { - /// You must allow location access to trust this Wi-Fi network. Go to iOS settings and review your location permissions for Passepartout. - internal static let denied = L10n.tr("Core", "service.alerts.location.message.denied") - } - } - internal enum MasksPrivateData { - internal enum Messages { - /// In order to safely reset the current debug log and apply the new masking preference, you must reconnect to the VPN now. - internal static let mustReconnect = L10n.tr("Core", "service.alerts.masks_private_data.messages.must_reconnect") - } - } - internal enum ReconnectVpn { - /// Do you want to reconnect to the VPN? - internal static let message = L10n.tr("Core", "service.alerts.reconnect_vpn.message") - } - internal enum Rename { - /// Rename profile - internal static let title = L10n.tr("Core", "service.alerts.rename.title") - } - internal enum TestConnectivity { - /// Connectivity - internal static let title = L10n.tr("Core", "service.alerts.test_connectivity.title") - internal enum Messages { - /// Your device has no Internet connectivity, please review your profile parameters. - internal static let failure = L10n.tr("Core", "service.alerts.test_connectivity.messages.failure") - /// Your device is connected to the Internet! - internal static let success = L10n.tr("Core", "service.alerts.test_connectivity.messages.success") - } - } - internal enum Trusted { - internal enum NoNetwork { - /// You are not connected to any Wi-Fi network. - internal static let message = L10n.tr("Core", "service.alerts.trusted.no_network.message") - } - internal enum WillDisconnectPolicy { - /// By changing the trust policy, the VPN may be disconnected. Continue? - internal static let message = L10n.tr("Core", "service.alerts.trusted.will_disconnect_policy.message") - } - internal enum WillDisconnectTrusted { - /// By trusting this network, the VPN may be disconnected. Continue? - internal static let message = L10n.tr("Core", "service.alerts.trusted.will_disconnect_trusted.message") - } + internal enum Unavailable { + /// Could not download provider infrastructure, please retry later. + internal static let message = L10n.tr("Core", "wizards.provider.alerts.unavailable.message") } } internal enum Cells { - internal enum Addresses { - /// Addresses - internal static let caption = L10n.tr("Core", "service.cells.addresses.caption") - } - internal enum Category { - /// Category - internal static let caption = L10n.tr("Core", "service.cells.category.caption") - } - internal enum ConnectionStatus { - /// Status - internal static let caption = L10n.tr("Core", "service.cells.connection_status.caption") - } - internal enum DataCount { - /// Exchanged data - internal static let caption = L10n.tr("Core", "service.cells.data_count.caption") - /// Unavailable - internal static let `none` = L10n.tr("Core", "service.cells.data_count.none") - } - internal enum DebugLog { - /// Debug log - internal static let caption = L10n.tr("Core", "service.cells.debug_log.caption") - } - internal enum Host { - internal enum Parameters { - /// Parameters - internal static let caption = L10n.tr("Core", "service.cells.host.parameters.caption") - } - } - internal enum MasksPrivateData { - /// Mask network data - internal static let caption = L10n.tr("Core", "service.cells.masks_private_data.caption") - } - internal enum OnlyShowsFavorites { - /// Only show favorite locations - internal static let caption = L10n.tr("Core", "service.cells.only_shows_favorites.caption") - } - internal enum Provider { - internal enum Pool { - /// Location - internal static let caption = L10n.tr("Core", "service.cells.provider.pool.caption") - } - internal enum Preset { - /// Preset - internal static let caption = L10n.tr("Core", "service.cells.provider.preset.caption") - } - internal enum Refresh { - /// Refresh infrastructure - internal static let caption = L10n.tr("Core", "service.cells.provider.refresh.caption") - } - } - internal enum Reconnect { - /// Reconnect - internal static let caption = L10n.tr("Core", "service.cells.reconnect.caption") - } - internal enum ReportIssue { - /// Report connectivity issue - internal static let caption = L10n.tr("Core", "service.cells.report_issue.caption") - } - internal enum ServerConfiguration { - /// Server configuration - internal static let caption = L10n.tr("Core", "service.cells.server_configuration.caption") - } - internal enum ServerNetwork { - /// Server network - internal static let caption = L10n.tr("Core", "service.cells.server_network.caption") - } - internal enum TestConnectivity { - /// Test connectivity - internal static let caption = L10n.tr("Core", "service.cells.test_connectivity.caption") - } - internal enum TrustedAddWifi { - /// Add Wi-Fi - internal static let caption = L10n.tr("Core", "service.cells.trusted_add_wifi.caption") - } - internal enum TrustedMobile { - /// Cellular network - internal static let caption = L10n.tr("Core", "service.cells.trusted_mobile.caption") - } - internal enum TrustedPolicy { - /// Trust disables VPN - internal static let caption = L10n.tr("Core", "service.cells.trusted_policy.caption") - } - internal enum UseProfile { - /// Use this profile - internal static let caption = L10n.tr("Core", "service.cells.use_profile.caption") - } - internal enum Vpn { - internal enum TurnOff { - /// Disable VPN - internal static let caption = L10n.tr("Core", "service.cells.vpn.turn_off.caption") - } - internal enum TurnOn { - /// Enable VPN - internal static let caption = L10n.tr("Core", "service.cells.vpn.turn_on.caption") - } - } - internal enum VpnResolvesHostname { - /// Resolve provider hostname - internal static let caption = L10n.tr("Core", "service.cells.vpn_resolves_hostname.caption") - } - internal enum VpnService { - /// Enabled - internal static let caption = L10n.tr("Core", "service.cells.vpn_service.caption") - } - internal enum VpnSurvivesSleep { - /// Keep alive on sleep - internal static let caption = L10n.tr("Core", "service.cells.vpn_survives_sleep.caption") - } - } - internal enum Sections { - internal enum Configuration { - /// Configuration - internal static let header = L10n.tr("Core", "service.sections.configuration.header") - } - internal enum Diagnostics { - /// Masking status will be effective after reconnecting. Network data are hostnames, IP addresses, routing, SSID. Credentials and private keys are not logged regardless. - internal static let footer = L10n.tr("Core", "service.sections.diagnostics.footer") - /// Diagnostics - internal static let header = L10n.tr("Core", "service.sections.diagnostics.header") - } - internal enum ProviderInfrastructure { - /// Last updated on %@. - internal static func footer(_ p1: Any) -> String { - return L10n.tr("Core", "service.sections.provider_infrastructure.footer", String(describing: p1)) - } - } - internal enum Status { - /// Connection - internal static let header = L10n.tr("Core", "service.sections.status.header") - } - internal enum Trusted { - /// When entering a trusted network, the VPN is normally shut down and kept disconnected. Disable this option to not enforce such behavior. - internal static let footer = L10n.tr("Core", "service.sections.trusted.footer") - /// Trusted networks - internal static let header = L10n.tr("Core", "service.sections.trusted.header") - } - internal enum Vpn { - /// The connection will be established whenever necessary. - internal static let footer = L10n.tr("Core", "service.sections.vpn.footer") - /// VPN - internal static let header = L10n.tr("Core", "service.sections.vpn.header") - } - internal enum VpnResolvesHostname { - /// Preferred in most networks and required in some IPv6 networks. Disable where DNS is blocked, or to speed up negotiation when DNS is slow to respond. - internal static let footer = L10n.tr("Core", "service.sections.vpn_resolves_hostname.footer") - } - internal enum VpnSurvivesSleep { - /// Disable to improve battery usage, at the expense of occasional slowdowns due to wake-up reconnections. - internal static let footer = L10n.tr("Core", "service.sections.vpn_survives_sleep.footer") - } - } - internal enum Welcome { - /// Welcome to Passepartout!\n\nUse the organizer to add a new profile. - internal static let message = L10n.tr("Core", "service.welcome.message") - } - } - internal enum Share { - /// Passepartout is an user-friendly, open source OpenVPN client for iOS and macOS - internal static let message = L10n.tr("Core", "share.message") - } - internal enum Shortcuts { - internal enum Add { - /// Add shortcut - internal static let title = L10n.tr("Core", "shortcuts.add.title") - internal enum Alerts { - internal enum NoProfiles { - /// There is no profile to connect to. - internal static let message = L10n.tr("Core", "shortcuts.add.alerts.no_profiles.message") - } - } - internal enum Cells { - internal enum Connect { - /// Connect to - internal static let caption = L10n.tr("Core", "shortcuts.add.cells.connect.caption") - } - internal enum DisableVpn { - /// Disable VPN - internal static let caption = L10n.tr("Core", "shortcuts.add.cells.disable_vpn.caption") - } - internal enum EnableVpn { - /// Enable VPN - internal static let caption = L10n.tr("Core", "shortcuts.add.cells.enable_vpn.caption") - } - internal enum TrustCellular { - /// Trust cellular network - internal static let caption = L10n.tr("Core", "shortcuts.add.cells.trust_cellular.caption") - } - internal enum TrustCurrentWifi { - /// Trust current Wi-Fi - internal static let caption = L10n.tr("Core", "shortcuts.add.cells.trust_current_wifi.caption") - } - internal enum UntrustCellular { - /// Untrust cellular network - internal static let caption = L10n.tr("Core", "shortcuts.add.cells.untrust_cellular.caption") - } - internal enum UntrustCurrentWifi { - /// Untrust current Wi-Fi - internal static let caption = L10n.tr("Core", "shortcuts.add.cells.untrust_current_wifi.caption") - } - } - internal enum Sections { - internal enum Cellular { - /// Cellular - internal static let header = L10n.tr("Core", "shortcuts.add.sections.cellular.header") - } - internal enum Vpn { - /// VPN - internal static let header = L10n.tr("Core", "shortcuts.add.sections.vpn.header") - } - internal enum Wifi { - /// Wi-Fi - internal static let header = L10n.tr("Core", "shortcuts.add.sections.wifi.header") - } - } - } - internal enum Edit { - /// Manage shortcuts - internal static let title = L10n.tr("Core", "shortcuts.edit.title") - internal enum Cells { - internal enum AddShortcut { - /// Add shortcut - internal static let caption = L10n.tr("Core", "shortcuts.edit.cells.add_shortcut.caption") - } - } - internal enum Sections { - internal enum All { - /// Existing shortcuts - internal static let header = L10n.tr("Core", "shortcuts.edit.sections.all.header") - } - } - } - } - internal enum Translations { - /// Translations - internal static let title = L10n.tr("Core", "translations.title") - } - internal enum Trusted { - internal enum Columns { - internal enum Trust { - /// Trust - internal static let title = L10n.tr("Core", "trusted.columns.trust.title") - } - } - internal enum Ethernet { - /// Check to trust any wired cable connection. - internal static let description = L10n.tr("Core", "trusted.ethernet.description") - /// Trust wired connections - internal static let title = L10n.tr("Core", "trusted.ethernet.title") - } - } - internal enum Version { - /// Version - internal static let title = L10n.tr("Core", "version.title") - internal enum Labels { - /// Passepartout and TunnelKit are written and maintained by Davide De Rosa (keeshux).\n\nSource code for Passepartout and TunnelKit is publicly available on GitHub under the GPLv3, you can find links in the home page.\n\nPassepartout is a non-official client and is in no way affiliated with OpenVPN Inc. - internal static let intro = L10n.tr("Core", "version.labels.intro") - } - } - internal enum Vpn { - /// Active - internal static let active = L10n.tr("Core", "vpn.active") - /// Connecting - internal static let connecting = L10n.tr("Core", "vpn.connecting") - /// Disabled - internal static let disabled = L10n.tr("Core", "vpn.disabled") - /// Disconnecting - internal static let disconnecting = L10n.tr("Core", "vpn.disconnecting") - /// Inactive - internal static let inactive = L10n.tr("Core", "vpn.inactive") - /// Off - internal static let unused = L10n.tr("Core", "vpn.unused") - internal enum Errors { - /// Auth failed - internal static let auth = L10n.tr("Core", "vpn.errors.auth") - /// Compression unsupported - internal static let compression = L10n.tr("Core", "vpn.errors.compression") - /// DNS failed - internal static let dns = L10n.tr("Core", "vpn.errors.dns") - /// Encryption failed - internal static let encryption = L10n.tr("Core", "vpn.errors.encryption") - /// No gateway - internal static let gateway = L10n.tr("Core", "vpn.errors.gateway") - /// Network changed - internal static let network = L10n.tr("Core", "vpn.errors.network") - /// Missing routing - internal static let routing = L10n.tr("Core", "vpn.errors.routing") - /// Server shutdown - internal static let shutdown = L10n.tr("Core", "vpn.errors.shutdown") - /// Timeout - internal static let timeout = L10n.tr("Core", "vpn.errors.timeout") - /// TLS failed - internal static let tls = L10n.tr("Core", "vpn.errors.tls") - } - } - internal enum Wizards { - internal enum Host { - internal enum Alerts { - internal enum Existing { - /// A host profile with the same title already exists. Replace it? - internal static let message = L10n.tr("Core", "wizards.host.alerts.existing.message") - } - } - internal enum Cells { - internal enum TitleInput { - /// Title - internal static let caption = L10n.tr("Core", "wizards.host.cells.title_input.caption") - } - } - internal enum Sections { - internal enum Existing { - /// Existing profiles - internal static let header = L10n.tr("Core", "wizards.host.sections.existing.header") - } - } - } - internal enum Provider { - internal enum Alerts { - internal enum Unavailable { - /// Could not download provider infrastructure, please retry later. - internal static let message = L10n.tr("Core", "wizards.provider.alerts.unavailable.message") - } - } - internal enum Cells { - internal enum UpdateList { - /// Update list - internal static let caption = L10n.tr("Core", "wizards.provider.cells.update_list.caption") - } + internal enum UpdateList { + /// Update list + internal static let caption = L10n.tr("Core", "wizards.provider.cells.update_list.caption") } } } diff --git a/Passepartout/App/macOS/Global/TextInputViewController.swift b/Passepartout/App/macOS/Global/TextInputViewController.swift index afa4cd7a..3a7f1b55 100644 --- a/Passepartout/App/macOS/Global/TextInputViewController.swift +++ b/Passepartout/App/macOS/Global/TextInputViewController.swift @@ -68,8 +68,8 @@ class TextInputViewController: NSViewController { labelTextCaption.stringValue = caption textField.stringValue = text textField.placeholderString = placeholder - buttonOK.title = L10n.Core.Global.ok - buttonCancel.title = L10n.Core.Global.cancel + buttonOK.title = L10n.Global.ok + buttonCancel.title = L10n.Global.cancel textPlain.isHidden = isSecure textSecure.isHidden = !isSecure diff --git a/Passepartout/App/macOS/Global/Theme+Views.swift b/Passepartout/App/macOS/Global/Theme+Views.swift index b7348780..5eab68e2 100644 --- a/Passepartout/App/macOS/Global/Theme+Views.swift +++ b/Passepartout/App/macOS/Global/Theme+Views.swift @@ -30,31 +30,31 @@ import TunnelKit extension NSTextField { func applyVPN(_ theme: Theme, isActive: Bool, with vpnStatus: VPNStatus?, error: OpenVPNTunnelProvider.ProviderError?) { guard isActive else { - stringValue = L10n.Core.Vpn.unused + stringValue = L10n.Vpn.unused textColor = theme.palette.colorSecondaryText return } guard let vpnStatus = vpnStatus else { - stringValue = L10n.Core.Vpn.disabled + stringValue = L10n.Vpn.disabled textColor = theme.palette.colorSecondaryText return } switch vpnStatus { case .connecting: - stringValue = L10n.Core.Vpn.connecting + stringValue = L10n.Vpn.connecting textColor = theme.palette.colorIndeterminate case .connected: - stringValue = L10n.Core.Vpn.active + stringValue = L10n.Vpn.active textColor = theme.palette.colorOn case .disconnecting: - stringValue = disconnectionReason(for: error) ?? L10n.Core.Vpn.disconnecting + stringValue = disconnectionReason(for: error) ?? L10n.Vpn.disconnecting textColor = theme.palette.colorIndeterminate case .disconnected: - stringValue = disconnectionReason(for: error) ?? L10n.Core.Vpn.inactive + stringValue = disconnectionReason(for: error) ?? L10n.Vpn.inactive textColor = theme.palette.colorOff } } @@ -63,7 +63,7 @@ extension NSTextField { guard let error = error else { return nil } - let V = L10n.Core.Vpn.Errors.self + let V = L10n.Vpn.Errors.self switch error { case .socketActivity, .timeout: return V.timeout diff --git a/Passepartout/App/macOS/Global/WindowManager.swift b/Passepartout/App/macOS/Global/WindowManager.swift index 44522002..a5114b21 100644 --- a/Passepartout/App/macOS/Global/WindowManager.swift +++ b/Passepartout/App/macOS/Global/WindowManager.swift @@ -44,7 +44,7 @@ class WindowManager: NSObject { @discardableResult func showPreferences() -> NSWindowController? { preferences = presentWindowController(StoryboardScene.Preferences.preferencesWindowController, existing: preferences) - preferences?.window?.title = L10n.Core.Preferences.title + preferences?.window?.title = L10n.Preferences.title return preferences } diff --git a/Passepartout/App/macOS/Menu/StatusMenu.swift b/Passepartout/App/macOS/Menu/StatusMenu.swift index 71020ceb..4b418df8 100644 --- a/Passepartout/App/macOS/Menu/StatusMenu.swift +++ b/Passepartout/App/macOS/Menu/StatusMenu.swift @@ -67,7 +67,7 @@ class StatusMenu: NSObject { private let menuAllProfiles = NSMenu() - private lazy var itemSwitchProfile = NSMenuItem(title: L10n.Core.Menu.SwitchProfile.title, action: nil, keyEquivalent: "") + private lazy var itemSwitchProfile = NSMenuItem(title: L10n.Menu.SwitchProfile.title, action: nil, keyEquivalent: "") private var itemsAllProfiles: [NSMenuItem] = [] @@ -77,9 +77,9 @@ class StatusMenu: NSObject { private lazy var itemPool = NSMenuItem(title: "", action: nil, keyEquivalent: "") - private lazy var itemToggleVPN = NSMenuItem(title: L10n.Core.Service.Cells.Vpn.TurnOn.caption, action: nil, keyEquivalent: "") + private lazy var itemToggleVPN = NSMenuItem(title: L10n.Service.Cells.Vpn.TurnOn.caption, action: nil, keyEquivalent: "") - private lazy var itemReconnectVPN = NSMenuItem(title: L10n.Core.Service.Cells.Reconnect.caption, action: #selector(reconnectVPN), keyEquivalent: "") + private lazy var itemReconnectVPN = NSMenuItem(title: L10n.Service.Cells.Reconnect.caption, action: #selector(reconnectVPN), keyEquivalent: "") private override init() { super.init() @@ -111,8 +111,8 @@ class StatusMenu: NSObject { // main actions - let itemShow = NSMenuItem(title: L10n.Core.Menu.Show.title, action: #selector(showOrganizer), keyEquivalent: "") - let itemPreferences = NSMenuItem(title: L10n.Core.Menu.Preferences.title.asContinuation, action: #selector(showPreferences), keyEquivalent: ",") + let itemShow = NSMenuItem(title: L10n.Menu.Show.title, action: #selector(showOrganizer), keyEquivalent: "") + let itemPreferences = NSMenuItem(title: L10n.Menu.Preferences.title.asContinuation, action: #selector(showPreferences), keyEquivalent: ",") itemShow.target = self itemPreferences.target = self menu.addItem(itemShow) @@ -130,11 +130,11 @@ class StatusMenu: NSObject { // support let menuSupport = NSMenu() - let itemCommunity = NSMenuItem(title: L10n.Core.Organizer.Cells.JoinCommunity.caption.asContinuation, action: #selector(joinCommunity), keyEquivalent: "") -// let itemDonate = NSMenuItem(title: L10n.Core.Organizer.Cells.Donate.caption.asContinuation, action: #selector(showDonations), keyEquivalent: "") -// let itemGitHubSponsors = NSMenuItem(title: L10n.Core.Organizer.Cells.GithubSponsors.caption.asContinuation, action: #selector(seeGitHubSponsors), keyEquivalent: "") -// let itemTranslate = NSMenuItem(title: L10n.Core.Organizer.Cells.Translate.caption.asContinuation, action: #selector(offerToTranslate), keyEquivalent: "") - let itemFAQ = NSMenuItem(title: L10n.Core.About.Cells.Faq.caption.asContinuation, action: #selector(visitFAQ), keyEquivalent: "") + let itemCommunity = NSMenuItem(title: L10n.Organizer.Cells.JoinCommunity.caption.asContinuation, action: #selector(joinCommunity), keyEquivalent: "") +// let itemDonate = NSMenuItem(title: L10n.Organizer.Cells.Donate.caption.asContinuation, action: #selector(showDonations), keyEquivalent: "") +// let itemGitHubSponsors = NSMenuItem(title: L10n.Organizer.Cells.GithubSponsors.caption.asContinuation, action: #selector(seeGitHubSponsors), keyEquivalent: "") +// let itemTranslate = NSMenuItem(title: L10n.Organizer.Cells.Translate.caption.asContinuation, action: #selector(offerToTranslate), keyEquivalent: "") + let itemFAQ = NSMenuItem(title: L10n.About.Cells.Faq.caption.asContinuation, action: #selector(visitFAQ), keyEquivalent: "") itemCommunity.target = self // itemDonate.target = self // itemGitHubSponsors.target = self @@ -146,26 +146,26 @@ class StatusMenu: NSObject { // menuSupport.addItem(itemGitHubSponsors) // menuSupport.addItem(itemTranslate) if ProductManager.shared.isEligibleForFeedback() { - let itemReview = NSMenuItem(title: L10n.Core.Organizer.Cells.WriteReview.caption.asContinuation, action: #selector(writeReview), keyEquivalent: "") + let itemReview = NSMenuItem(title: L10n.Organizer.Cells.WriteReview.caption.asContinuation, action: #selector(writeReview), keyEquivalent: "") itemReview.target = self menuSupport.addItem(itemReview) } menuSupport.addItem(.separator()) menuSupport.addItem(itemFAQ) if ProductManager.shared.isEligibleForFeedback() { - let itemReport = NSMenuItem(title: L10n.Core.Service.Cells.ReportIssue.caption.asContinuation, action: #selector(reportConnectivityIssue), keyEquivalent: "") + let itemReport = NSMenuItem(title: L10n.Service.Cells.ReportIssue.caption.asContinuation, action: #selector(reportConnectivityIssue), keyEquivalent: "") itemReport.target = self menuSupport.addItem(itemReport) } - let itemSupport = NSMenuItem(title: L10n.Core.Menu.Support.title, action: nil, keyEquivalent: "") + let itemSupport = NSMenuItem(title: L10n.Menu.Support.title, action: nil, keyEquivalent: "") menu.setSubmenu(menuSupport, for: itemSupport) menu.addItem(itemSupport) // share let menuShare = NSMenu() - let itemTweet = NSMenuItem(title: L10n.Core.About.Cells.ShareTwitter.caption, action: #selector(shareTwitter), keyEquivalent: "") - let itemInvite = NSMenuItem(title: L10n.Core.About.Cells.ShareGeneric.caption.asContinuation, action: #selector(shareGeneric), keyEquivalent: "") + let itemTweet = NSMenuItem(title: L10n.About.Cells.ShareTwitter.caption, action: #selector(shareTwitter), keyEquivalent: "") + let itemInvite = NSMenuItem(title: L10n.About.Cells.ShareGeneric.caption.asContinuation, action: #selector(shareGeneric), keyEquivalent: "") let itemAlternativeTo = NSMenuItem(title: "AlternativeTo".asContinuation, action: #selector(visitAlternativeTo), keyEquivalent: "") itemTweet.target = self itemInvite.target = self @@ -173,15 +173,15 @@ class StatusMenu: NSObject { menuShare.addItem(itemTweet) menuShare.addItem(itemInvite) menuShare.addItem(itemAlternativeTo) - let itemShare = NSMenuItem(title: L10n.Core.About.Sections.Share.header, action: nil, keyEquivalent: "") + let itemShare = NSMenuItem(title: L10n.About.Sections.Share.header, action: nil, keyEquivalent: "") menu.setSubmenu(menuShare, for: itemShare) menu.addItem(itemShare) menu.addItem(.separator()) // secondary - let itemAbout = NSMenuItem(title: L10n.Core.Organizer.Cells.About.caption(GroupConstants.App.name), action: #selector(showAbout), keyEquivalent: "") - let itemQuit = NSMenuItem(title: L10n.Core.Menu.Quit.title(GroupConstants.App.name), action: #selector(quit), keyEquivalent: "q") + let itemAbout = NSMenuItem(title: L10n.Organizer.Cells.About.caption(GroupConstants.App.name), action: #selector(showAbout), keyEquivalent: "") + let itemQuit = NSMenuItem(title: L10n.Menu.Quit.title(GroupConstants.App.name), action: #selector(quit), keyEquivalent: "q") itemAbout.target = self itemQuit.target = self menu.addItem(itemAbout) @@ -224,7 +224,7 @@ class StatusMenu: NSObject { itemsProfile.removeAll() guard let profile = profile else { - itemProfileName.title = L10n.Core.Menu.ActiveProfile.Title.none + itemProfileName.title = L10n.Menu.ActiveProfile.Title.none // itemProfileName.image = nil statusItem.button?.image = imageStatusInactive statusItem.button?.toolTip = nil @@ -248,7 +248,7 @@ class StatusMenu: NSObject { itemsProfile.append(itemToggleVPN) itemsProfile.append(itemReconnectVPN) } else { - let itemMissingCredentials = NSMenuItem(title: L10n.Core.Menu.ActiveProfile.Messages.missingCredentials, action: nil, keyEquivalent: "") + let itemMissingCredentials = NSMenuItem(title: L10n.Menu.ActiveProfile.Messages.missingCredentials, action: nil, keyEquivalent: "") itemMissingCredentials.indentationLevel = 1 menu.insertItem(itemMissingCredentials, at: i) i += 1 @@ -260,12 +260,12 @@ class StatusMenu: NSObject { if !needsCredentials, let providerProfile = profile as? ProviderConnectionProfile { // endpoint (port only) - let itemEndpoint = NSMenuItem(title: L10n.Core.Endpoint.title, action: nil, keyEquivalent: "") + let itemEndpoint = NSMenuItem(title: L10n.Endpoint.title, action: nil, keyEquivalent: "") itemEndpoint.indentationLevel = 1 let menuEndpoint = NSMenu() // automatic - let itemEndpointAutomatic = NSMenuItem(title: L10n.Core.Endpoint.Cells.AnyProtocol.caption, action: #selector(connectToEndpoint(_:)), keyEquivalent: "") + let itemEndpointAutomatic = NSMenuItem(title: L10n.Endpoint.Cells.AnyProtocol.caption, action: #selector(connectToEndpoint(_:)), keyEquivalent: "") itemEndpointAutomatic.target = self if providerProfile.customProtocol == nil { itemEndpointAutomatic.state = .on @@ -287,7 +287,7 @@ class StatusMenu: NSObject { itemsProfile.append(itemEndpoint) // account - let itemAccount = NSMenuItem(title: L10n.Core.Account.title.asContinuation, action: #selector(editAccountCredentials(_:)), keyEquivalent: "") + let itemAccount = NSMenuItem(title: L10n.Account.title.asContinuation, action: #selector(editAccountCredentials(_:)), keyEquivalent: "") menu.insertItem(itemAccount, at: i) i += 1 itemAccount.target = self @@ -295,7 +295,7 @@ class StatusMenu: NSObject { itemsProfile.append(itemAccount) // customize - let itemCustomize = NSMenuItem(title: L10n.Core.Menu.ActiveProfile.Items.Customize.title, action: #selector(customizeProfile(_:)), keyEquivalent: "") + let itemCustomize = NSMenuItem(title: L10n.Menu.ActiveProfile.Items.Customize.title, action: #selector(customizeProfile(_:)), keyEquivalent: "") menu.insertItem(itemCustomize, at: i) i += 1 itemCustomize.target = self @@ -317,7 +317,7 @@ class StatusMenu: NSObject { let infrastructure = providerProfile.infrastructure for category in infrastructure.categories { - let title = category.name.isEmpty ? L10n.Core.Global.Values.default : category.name.capitalized + let title = category.name.isEmpty ? L10n.Global.Values.default : category.name.capitalized let submenu = NSMenu() let itemCategory = NSMenuItem(title: title, action: nil, keyEquivalent: "") itemCategory.indentationLevel = 1 @@ -332,7 +332,7 @@ class StatusMenu: NSObject { let submenuGroup = NSMenu() for pool in group.pools { - let title = !pool.secondaryId.isEmpty ? pool.secondaryId : L10n.Core.Global.Values.default + let title = !pool.secondaryId.isEmpty ? pool.secondaryId : L10n.Global.Values.default let item = NSMenuItem(title: title, action: #selector(connectToPool(_:)), keyEquivalent: "") if let extraCountry = pool.extraCountries?.first { item.image = extraCountry.image @@ -362,7 +362,7 @@ class StatusMenu: NSObject { } else { // account - let itemAccount = NSMenuItem(title: L10n.Core.Account.title.asContinuation, action: #selector(editAccountCredentials(_:)), keyEquivalent: "") + let itemAccount = NSMenuItem(title: L10n.Account.title.asContinuation, action: #selector(editAccountCredentials(_:)), keyEquivalent: "") menu.insertItem(itemAccount, at: i) i += 1 itemAccount.target = self @@ -370,7 +370,7 @@ class StatusMenu: NSObject { itemsProfile.append(itemAccount) // customize - let itemCustomize = NSMenuItem(title: L10n.Core.Menu.ActiveProfile.Items.Customize.title, action: #selector(customizeProfile(_:)), keyEquivalent: "") + let itemCustomize = NSMenuItem(title: L10n.Menu.ActiveProfile.Items.Customize.title, action: #selector(customizeProfile(_:)), keyEquivalent: "") menu.insertItem(itemCustomize, at: i) i += 1 itemCustomize.target = self @@ -542,14 +542,14 @@ class StatusMenu: NSObject { } @objc private func shareTwitter() { - NSWorkspace.shared.open(AppConstants.URLs.twitterIntent(withMessage: L10n.Core.Share.message)) + NSWorkspace.shared.open(AppConstants.URLs.twitterIntent(withMessage: L10n.Share.message)) } @objc private func shareGeneric() { guard let source = statusItem.button else { return } - let message = "\(L10n.Core.Share.message) \(AppConstants.URLs.website)" + let message = "\(L10n.Share.message) \(AppConstants.URLs.website)" let picker = NSSharingServicePicker(items: [message]) picker.show(relativeTo: source.bounds, of: source, preferredEdge: .minY) } @@ -572,10 +572,10 @@ class StatusMenu: NSObject { private func reloadVpnStatus() { if vpn.isEnabled { - itemToggleVPN.title = L10n.Core.Service.Cells.Vpn.TurnOff.caption + itemToggleVPN.title = L10n.Service.Cells.Vpn.TurnOff.caption itemToggleVPN.action = #selector(disableVPN) } else { - itemToggleVPN.title = L10n.Core.Service.Cells.Vpn.TurnOn.caption + itemToggleVPN.title = L10n.Service.Cells.Vpn.TurnOn.caption itemToggleVPN.action = #selector(enableVPN) } if let profile = service.activeProfile { diff --git a/Passepartout/App/macOS/Scenes/OrganizerViewController.swift b/Passepartout/App/macOS/Scenes/OrganizerViewController.swift index bd4f7b9d..cb5bd5f2 100644 --- a/Passepartout/App/macOS/Scenes/OrganizerViewController.swift +++ b/Passepartout/App/macOS/Scenes/OrganizerViewController.swift @@ -63,7 +63,7 @@ class OrganizerViewController: NSViewController { tableProfiles.rightAnchor.constraint(equalTo: viewProfiles.rightAnchor), ]) - buttonRemoveConfiguration.title = L10n.Core.Organizer.Cells.Uninstall.caption + buttonRemoveConfiguration.title = L10n.Organizer.Cells.Uninstall.caption tableProfiles.selectionBlock = { [weak self] in self?.serviceController?.setProfile($0) @@ -109,7 +109,7 @@ class OrganizerViewController: NSViewController { } private func alertMissingInfrastructure(forMetadata metadata: Infrastructure.Metadata, error: Error?) { - var message = L10n.Core.Wizards.Provider.Alerts.Unavailable.message + var message = L10n.Wizards.Provider.Alerts.Unavailable.message if let error = error { log.error("Unable to download missing \(metadata.description) infrastructure (network error): \(error.localizedDescription)") message.append(" \(error.localizedDescription)") @@ -118,7 +118,7 @@ class OrganizerViewController: NSViewController { } let alert = Macros.warning(metadata.description, message) - _ = alert.presentModally(withOK: L10n.Core.Global.ok, cancel: nil) + _ = alert.presentModally(withOK: L10n.Global.ok, cancel: nil) } private func confirmAddProvider(withMetadata metadata: Infrastructure.Metadata) { @@ -128,7 +128,7 @@ class OrganizerViewController: NSViewController { @objc private func addHost() { let panel = NSOpenPanel() - panel.title = L10n.Core.Organizer.Alerts.OpenHostFile.title + panel.title = L10n.Organizer.Alerts.OpenHostFile.title panel.allowsMultipleSelection = false panel.canChooseDirectories = false panel.canChooseFiles = true @@ -164,10 +164,10 @@ class OrganizerViewController: NSViewController { // rename to existing title -> confirm overwrite existing if let existingProfile = service.hostProfile(withTitle: newTitle) { let alert = Macros.warning( - L10n.Core.Service.Alerts.Rename.title, - L10n.Core.Wizards.Host.Alerts.Existing.message + L10n.Service.Alerts.Rename.title, + L10n.Wizards.Host.Alerts.Existing.message ) - alert.present(in: view.window, withOK: L10n.Core.Global.ok, cancel: L10n.Core.Global.cancel, handler: { + alert.present(in: view.window, withOK: L10n.Global.ok, cancel: L10n.Global.cancel, handler: { self.doReplaceProfile(profile, to: newTitle, existingProfile: existingProfile) }, cancelHandler: nil) return @@ -191,10 +191,10 @@ class OrganizerViewController: NSViewController { @IBAction private func confirmVpnProfileDeletion(_ sender: Any?) { let alert = Macros.warning( - L10n.Core.Organizer.Cells.Uninstall.caption, - L10n.Core.Organizer.Alerts.DeleteVpnProfile.message + L10n.Organizer.Cells.Uninstall.caption, + L10n.Organizer.Alerts.DeleteVpnProfile.message ) - alert.present(in: view.window, withOK: L10n.Core.Global.ok, cancel: L10n.Core.Global.cancel, handler: { + alert.present(in: view.window, withOK: L10n.Global.ok, cancel: L10n.Global.cancel, handler: { VPN.shared.uninstall(completionHandler: nil) }, cancelHandler: nil) } @@ -219,9 +219,9 @@ class OrganizerViewController: NSViewController { } // rename host - vc.caption = L10n.Core.Service.Alerts.Rename.title.asCaption + vc.caption = L10n.Service.Alerts.Rename.title.asCaption vc.text = service.screenTitle(forHostId: profile.id) - vc.placeholder = L10n.Core.Global.Host.TitleInput.placeholder + vc.placeholder = L10n.Global.Host.TitleInput.placeholder vc.object = profile vc.delegate = self } @@ -312,7 +312,7 @@ extension OrganizerViewController: OrganizerProfileTableViewDelegate { let menu = NSMenu() - let itemProvider = NSMenuItem(title: L10n.Core.Organizer.Menus.provider, action: nil, keyEquivalent: "") + let itemProvider = NSMenuItem(title: L10n.Organizer.Menus.provider, action: nil, keyEquivalent: "") let menuProvider = NSMenu() let availableMetadata = service.availableProviders() if !availableMetadata.isEmpty { @@ -323,17 +323,17 @@ extension OrganizerViewController: OrganizerProfileTableViewDelegate { menuProvider.addItem(item) } } else { - let item = NSMenuItem(title: L10n.Core.Organizer.Menus.Provider.unavailable, action: nil, keyEquivalent: "") + let item = NSMenuItem(title: L10n.Organizer.Menus.Provider.unavailable, action: nil, keyEquivalent: "") item.isEnabled = false menuProvider.addItem(item) } menuProvider.addItem(.separator()) - let itemProviderUpdateList = NSMenuItem(title: L10n.Core.Wizards.Provider.Cells.UpdateList.caption, action: #selector(updateProvidersList), keyEquivalent: "") + let itemProviderUpdateList = NSMenuItem(title: L10n.Wizards.Provider.Cells.UpdateList.caption, action: #selector(updateProvidersList), keyEquivalent: "") menuProvider.addItem(itemProviderUpdateList) menu.setSubmenu(menuProvider, for: itemProvider) menu.addItem(itemProvider) - let menuHost = NSMenuItem(title: L10n.Core.Organizer.Menus.host.asContinuation, action: #selector(addHost), keyEquivalent: "") + let menuHost = NSMenuItem(title: L10n.Organizer.Menus.host.asContinuation, action: #selector(addHost), keyEquivalent: "") menu.addItem(menuHost) NSMenu.popUpContextMenu(menu, with: event, for: sender) @@ -343,10 +343,10 @@ extension OrganizerViewController: OrganizerProfileTableViewDelegate { profilePendingRemoval = profile let alert = Macros.warning( - L10n.Core.Organizer.Alerts.RemoveProfile.title, - L10n.Core.Organizer.Alerts.RemoveProfile.message(service.screenTitle(ProfileKey(profile))) + L10n.Organizer.Alerts.RemoveProfile.title, + L10n.Organizer.Alerts.RemoveProfile.message(service.screenTitle(ProfileKey(profile))) ) - alert.present(in: view.window, withOK: L10n.Core.Global.ok, cancel: L10n.Core.Global.cancel, handler: { + alert.present(in: view.window, withOK: L10n.Global.ok, cancel: L10n.Global.cancel, handler: { self.removePendingProfile() }, cancelHandler: nil) } diff --git a/Passepartout/App/macOS/Scenes/Preferences/DebugLogViewController.swift b/Passepartout/App/macOS/Scenes/Preferences/DebugLogViewController.swift index f2a3f5c9..8c108a66 100644 --- a/Passepartout/App/macOS/Scenes/Preferences/DebugLogViewController.swift +++ b/Passepartout/App/macOS/Scenes/Preferences/DebugLogViewController.swift @@ -61,14 +61,14 @@ class DebugLogViewController: NSViewController { override func viewDidLoad() { super.viewDidLoad() - title = L10n.Core.Service.Cells.DebugLog.caption + title = L10n.Service.Cells.DebugLog.caption - checkMasking.title = L10n.Core.Service.Cells.MasksPrivateData.caption + checkMasking.title = L10n.Service.Cells.MasksPrivateData.caption checkMasking.state = (TransientStore.masksPrivateData ? .on : .off) - labelExchangedCaption.stringValue = L10n.Core.Service.Cells.DataCount.caption.asCaption - labelLog.stringValue = L10n.Core.Service.Cells.DebugLog.caption.asCaption - buttonCopy.title = L10n.Core.DebugLog.Buttons.copy + labelExchangedCaption.stringValue = L10n.Service.Cells.DataCount.caption.asCaption + labelLog.stringValue = L10n.Service.Cells.DebugLog.caption.asCaption + buttonCopy.title = L10n.DebugLog.Buttons.copy buttonPrevious.image = NSImage(named: NSImage.touchBarRewindTemplateName) buttonNext.image = NSImage(named: NSImage.touchBarFastForwardTemplateName) buttonShare.image = NSImage(named: NSImage.shareTemplateName) @@ -93,10 +93,10 @@ class DebugLogViewController: NSViewController { guard vpn.status == .disconnected else { let alert = Macros.warning( - L10n.Core.Service.Cells.MasksPrivateData.caption, - L10n.Core.Service.Alerts.MasksPrivateData.Messages.mustReconnect + L10n.Service.Cells.MasksPrivateData.caption, + L10n.Service.Alerts.MasksPrivateData.Messages.mustReconnect ) - alert.present(in: view.window, withOK: L10n.Core.Service.Alerts.Buttons.reconnect, cancel: L10n.Core.Global.cancel, handler: { + alert.present(in: view.window, withOK: L10n.Service.Alerts.Buttons.reconnect, cancel: L10n.Global.cancel, handler: { handler() self.shouldDeleteLogOnDisconnection = true @@ -132,10 +132,10 @@ class DebugLogViewController: NSViewController { let text = logLines.joined(separator: "\n") guard !text.isEmpty else { let alert = Macros.warning( - L10n.Core.Service.Cells.DebugLog.caption, - L10n.Core.DebugLog.Alerts.EmptyLog.message + L10n.Service.Cells.DebugLog.caption, + L10n.DebugLog.Alerts.EmptyLog.message ) - alert.present(in: view.window, withOK: L10n.Core.Global.ok, handler: nil) + alert.present(in: view.window, withOK: L10n.Global.ok, handler: nil) return } let log = DebugLog(raw: text) @@ -249,7 +249,7 @@ class DebugLogViewController: NSViewController { let up = count.1.dataUnitDescription labelExchanged.stringValue = "↓\(down) / ↑\(up)" } else { - labelExchanged.stringValue = L10n.Core.Service.Cells.DataCount.none + labelExchanged.stringValue = L10n.Service.Cells.DataCount.none } } } diff --git a/Passepartout/App/macOS/Scenes/Preferences/PreferencesGeneralViewController.swift b/Passepartout/App/macOS/Scenes/Preferences/PreferencesGeneralViewController.swift index 85f701ef..bc39e095 100644 --- a/Passepartout/App/macOS/Scenes/Preferences/PreferencesGeneralViewController.swift +++ b/Passepartout/App/macOS/Scenes/Preferences/PreferencesGeneralViewController.swift @@ -45,12 +45,12 @@ class PreferencesGeneralViewController: NSViewController { override func viewDidLoad() { super.viewDidLoad() - checkLaunchOnLogin.title = L10n.Core.Preferences.Cells.LaunchesOnLogin.caption - labelLaunchOnLogin.stringValue = L10n.Core.Preferences.Cells.LaunchesOnLogin.footer - checkConfirmQuit.title = L10n.Core.Preferences.Cells.ConfirmQuit.caption - labelConfirmQuit.stringValue = L10n.Core.Preferences.Cells.ConfirmQuit.footer - checkResolveHostname.title = L10n.Core.Service.Cells.VpnResolvesHostname.caption - labelResolveHostname.stringValue = L10n.Core.Service.Sections.VpnResolvesHostname.footer + checkLaunchOnLogin.title = L10n.Preferences.Cells.LaunchesOnLogin.caption + labelLaunchOnLogin.stringValue = L10n.Preferences.Cells.LaunchesOnLogin.footer + checkConfirmQuit.title = L10n.Preferences.Cells.ConfirmQuit.caption + labelConfirmQuit.stringValue = L10n.Preferences.Cells.ConfirmQuit.footer + checkResolveHostname.title = L10n.Service.Cells.VpnResolvesHostname.caption + labelResolveHostname.stringValue = L10n.Service.Sections.VpnResolvesHostname.footer checkLaunchOnLogin.state = (service.preferences.launchesOnLogin ?? true) ? .on : .off checkConfirmQuit.state = (service.preferences.confirmsQuit ?? true) ? .on : .off diff --git a/Passepartout/App/macOS/Scenes/Preferences/PreferencesViewController.swift b/Passepartout/App/macOS/Scenes/Preferences/PreferencesViewController.swift index a5cb05bb..6e685601 100644 --- a/Passepartout/App/macOS/Scenes/Preferences/PreferencesViewController.swift +++ b/Passepartout/App/macOS/Scenes/Preferences/PreferencesViewController.swift @@ -33,8 +33,8 @@ class PreferencesViewController: NSViewController { super.viewDidLoad() let labels = [ - L10n.Core.Preferences.Sections.General.header, - L10n.Core.Service.Sections.Diagnostics.header + L10n.Preferences.Sections.General.header, + L10n.Service.Sections.Diagnostics.header ] tabView.tabViewItems.enumerated().forEach { $1.label = labels[$0] diff --git a/Passepartout/App/macOS/Scenes/Purchase/PurchaseViewController.swift b/Passepartout/App/macOS/Scenes/Purchase/PurchaseViewController.swift index 55a48fa3..fd62acac 100644 --- a/Passepartout/App/macOS/Scenes/Purchase/PurchaseViewController.swift +++ b/Passepartout/App/macOS/Scenes/Purchase/PurchaseViewController.swift @@ -100,11 +100,11 @@ class PurchaseViewController: NSViewController { override func viewDidLoad() { super.viewDidLoad() - title = L10n.Core.Purchase.title - labelFooter.stringValue = L10n.Core.Purchase.Sections.Products.footer - labelRestore.stringValue = L10n.Core.Purchase.Cells.Restore.description - buttonPurchase.title = L10n.Core.Purchase.title - buttonRestore.title = L10n.Core.Purchase.Cells.Restore.title + title = L10n.Purchase.title + labelFooter.stringValue = L10n.Purchase.Sections.Products.footer + labelRestore.stringValue = L10n.Purchase.Cells.Restore.description + buttonPurchase.title = L10n.Purchase.title + buttonRestore.title = L10n.Purchase.Cells.Restore.title tableView.usesAutomaticRowHeights = true tableView.reloadData() @@ -202,7 +202,7 @@ class PurchaseViewController: NSViewController { log.error("Unable to purchase \(product): \(error)") let alert = Macros.warning(product.localizedTitle, error.localizedDescription) - _ = alert.presentModally(withOK: L10n.Core.Global.ok, cancel: nil) + _ = alert.presentModally(withOK: L10n.Global.ok, cancel: nil) } @objc private func close() { diff --git a/Passepartout/App/macOS/Scenes/Service/AccountViewController.swift b/Passepartout/App/macOS/Scenes/Service/AccountViewController.swift index 6ea9dfdd..2d083ebb 100644 --- a/Passepartout/App/macOS/Scenes/Service/AccountViewController.swift +++ b/Passepartout/App/macOS/Scenes/Service/AccountViewController.swift @@ -63,17 +63,17 @@ class AccountViewController: NSViewController { assert(profile != nil, "Profile not set") - labelUsernameCaption.stringValue = L10n.Core.Account.Cells.Username.caption.asCaption + labelUsernameCaption.stringValue = L10n.Account.Cells.Username.caption.asCaption if let providerProfile = profile as? ProviderConnectionProfile { textUsername.placeholderString = providerProfile.infrastructure.defaults.username } else { - textUsername.placeholderString = L10n.Core.Account.Cells.Username.placeholder + textUsername.placeholderString = L10n.Account.Cells.Username.placeholder } - labelPasswordCaption.stringValue = L10n.Core.Account.Cells.Password.caption.asCaption - textPassword.placeholderString = L10n.Core.Account.Cells.Password.placeholder - buttonGuidance.title = L10n.Core.Account.Cells.OpenGuide.caption - buttonOK.title = L10n.Core.Global.ok - buttonCancel.title = L10n.Core.Global.cancel + labelPasswordCaption.stringValue = L10n.Account.Cells.Password.caption.asCaption + textPassword.placeholderString = L10n.Account.Cells.Password.placeholder + buttonGuidance.title = L10n.Account.Cells.OpenGuide.caption + buttonOK.title = L10n.Global.ok + buttonCancel.title = L10n.Global.cancel let credentials = service.credentials(for: profile) textUsername.stringValue = credentials?.username ?? "" diff --git a/Passepartout/App/macOS/Scenes/Service/Customization/ConfigurationViewController.swift b/Passepartout/App/macOS/Scenes/Service/Customization/ConfigurationViewController.swift index 00aeb90c..5219afbe 100644 --- a/Passepartout/App/macOS/Scenes/Service/Customization/ConfigurationViewController.swift +++ b/Passepartout/App/macOS/Scenes/Service/Customization/ConfigurationViewController.swift @@ -94,14 +94,14 @@ class ConfigurationViewController: NSViewController, ProfileCustomization { override func viewDidLoad() { super.viewDidLoad() - labelPresetCaption.stringValue = L10n.Core.Service.Cells.Provider.Preset.caption.asCaption + labelPresetCaption.stringValue = L10n.Service.Cells.Provider.Preset.caption.asCaption popupPreset.removeAllItems() if !allPresets.isEmpty { for preset in allPresets { popupPreset.addItem(withTitle: preset.name) } } else { - popupPreset.addItem(withTitle: L10n.Core.Global.Values.default) + popupPreset.addItem(withTitle: L10n.Global.Values.default) popupPreset.isEnabled = false } @@ -194,7 +194,7 @@ extension ConfigurationViewController: NSTableViewDataSource, NSTableViewDelegat } func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? { - let V = L10n.Core.Configuration.Cells.self + let V = L10n.Configuration.Cells.self let rowObject = rows[row] switch tableColumn?.identifier { diff --git a/Passepartout/App/macOS/Scenes/Service/Customization/DNSViewController.swift b/Passepartout/App/macOS/Scenes/Service/Customization/DNSViewController.swift index bee4d241..1f2c5f28 100644 --- a/Passepartout/App/macOS/Scenes/Service/Customization/DNSViewController.swift +++ b/Passepartout/App/macOS/Scenes/Service/Customization/DNSViewController.swift @@ -65,9 +65,9 @@ class DNSViewController: NSViewController, ProfileCustomization { override func viewDidLoad() { super.viewDidLoad() - labelDNSProtocol.stringValue = L10n.Core.Global.Captions.protocol.asCaption + labelDNSProtocol.stringValue = L10n.Global.Captions.protocol.asCaption - tableDNSAddresses.title = L10n.Core.NetworkSettings.Dns.Cells.Addresses.title.asCaption + tableDNSAddresses.title = L10n.NetworkSettings.Dns.Cells.Addresses.title.asCaption viewDNSAddresses.addSubview(tableDNSAddresses) tableDNSAddresses.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ @@ -77,7 +77,7 @@ class DNSViewController: NSViewController, ProfileCustomization { tableDNSAddresses.rightAnchor.constraint(equalTo: viewDNSAddresses.rightAnchor), ]) - tableDNSDomains.title = L10n.Core.NetworkSettings.Dns.Cells.Domains.title.asCaption + tableDNSDomains.title = L10n.NetworkSettings.Dns.Cells.Domains.title.asCaption viewDNSDomains.addSubview(tableDNSDomains) tableDNSDomains.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ diff --git a/Passepartout/App/macOS/Scenes/Service/Customization/EndpointViewController.swift b/Passepartout/App/macOS/Scenes/Service/Customization/EndpointViewController.swift index 8cbb147a..73511c85 100644 --- a/Passepartout/App/macOS/Scenes/Service/Customization/EndpointViewController.swift +++ b/Passepartout/App/macOS/Scenes/Service/Customization/EndpointViewController.swift @@ -52,8 +52,8 @@ class EndpointViewController: NSViewController, ProfileCustomization { override func viewDidLoad() { super.viewDidLoad() - labelAddressCaption.stringValue = L10n.Core.Endpoint.Cells.address.asCaption - labelProtocolCaption.stringValue = L10n.Core.Global.Captions.protocol.asCaption + labelAddressCaption.stringValue = L10n.Endpoint.Cells.address.asCaption + labelProtocolCaption.stringValue = L10n.Global.Captions.protocol.asCaption reloadEndpoints() } @@ -75,8 +75,8 @@ class EndpointViewController: NSViewController, ProfileCustomization { } if dataSource.canCustomizeEndpoint { - popupAddress.insertItem(withTitle: L10n.Core.Endpoint.Cells.AnyAddress.caption, at: 0) - popupProtocol.insertItem(withTitle: L10n.Core.Endpoint.Cells.AnyProtocol.caption, at: 0) + popupAddress.insertItem(withTitle: L10n.Endpoint.Cells.AnyAddress.caption, at: 0) + popupProtocol.insertItem(withTitle: L10n.Endpoint.Cells.AnyProtocol.caption, at: 0) if dataSource.customAddress == nil { popupAddress.selectItem(at: 0) diff --git a/Passepartout/App/macOS/Scenes/Service/Customization/MTUViewController.swift b/Passepartout/App/macOS/Scenes/Service/Customization/MTUViewController.swift index 353e8ccc..bfd6a06a 100644 --- a/Passepartout/App/macOS/Scenes/Service/Customization/MTUViewController.swift +++ b/Passepartout/App/macOS/Scenes/Service/Customization/MTUViewController.swift @@ -64,10 +64,10 @@ class MTUViewController: NSViewController, ProfileCustomization { popupChoice.selectItem(at: popupChoice.numberOfItems - 1) } } - labelMTUCaption.stringValue = L10n.Core.NetworkSettings.Mtu.Cells.Bytes.caption.asCaption + labelMTUCaption.stringValue = L10n.NetworkSettings.Mtu.Cells.Bytes.caption.asCaption popupMTU.removeAllItems() for opt in ProfileNetworkSettings.mtuOptions { - popupMTU.addItem(withTitle: (opt != 0) ? opt.description : L10n.Core.Global.Values.default) + popupMTU.addItem(withTitle: (opt != 0) ? opt.description : L10n.Global.Values.default) } loadSettings(from: currentChoice ?? ProfileNetworkChoices.defaultChoice) } @@ -115,7 +115,7 @@ class MTUViewController: NSViewController, ProfileCustomization { popupMTU.isEnabled = (currentChoice == .manual) for (i, opt) in popupMTU.itemTitles.enumerated() { - if opt == L10n.Core.Global.Values.default { + if opt == L10n.Global.Values.default { if bytes == nil { popupMTU.selectItem(at: i) break diff --git a/Passepartout/App/macOS/Scenes/Service/Customization/ProfileCustomizationViewController.swift b/Passepartout/App/macOS/Scenes/Service/Customization/ProfileCustomizationViewController.swift index fd2b477e..a285bbd8 100644 --- a/Passepartout/App/macOS/Scenes/Service/Customization/ProfileCustomizationViewController.swift +++ b/Passepartout/App/macOS/Scenes/Service/Customization/ProfileCustomizationViewController.swift @@ -89,8 +89,8 @@ class ProfileCustomizationContainerViewController: NSViewController { override func viewDidLoad() { super.viewDidLoad() - buttonOK.title = L10n.Core.Global.ok - buttonCancel.title = L10n.Core.Global.cancel + buttonOK.title = L10n.Global.ok + buttonCancel.title = L10n.Global.cancel pendingAddress = (profile as? ProviderConnectionProfile)?.customAddress pendingProtocol = (profile as? ProviderConnectionProfile)?.customProtocol @@ -153,12 +153,12 @@ class ProfileCustomizationContainerViewController: NSViewController { switch vpn.status { case .connected, .connecting: let alert = Macros.warning( - L10n.Core.Configuration.title, - L10n.Core.Configuration.Alerts.Commit.message + L10n.Configuration.title, + L10n.Configuration.Alerts.Commit.message ) if alert.presentModally( - withOK: L10n.Core.Configuration.Alerts.Commit.Buttons.reconnect, - cancel: L10n.Core.Configuration.Alerts.Commit.Buttons.skip) { + withOK: L10n.Configuration.Alerts.Commit.Buttons.reconnect, + cancel: L10n.Configuration.Alerts.Commit.Buttons.skip) { vpn.reconnect(completionHandler: nil) } else { @@ -258,12 +258,12 @@ class ProfileCustomizationViewController: NSTabViewController { let expectedTabs = 7 assert(tabViewItems.count == expectedTabs, "Customization tabs misconfigured (expected \(expectedTabs))") - tabViewItems[0].label = L10n.Core.Endpoint.title - tabViewItems[1].label = L10n.Core.Configuration.title - tabViewItems[2].label = L10n.Core.Service.Sections.Trusted.header - tabViewItems[3].label = L10n.Core.NetworkSettings.Gateway.title - tabViewItems[4].label = L10n.Core.NetworkSettings.Dns.title - tabViewItems[5].label = L10n.Core.NetworkSettings.Proxy.title - tabViewItems[6].label = L10n.Core.NetworkSettings.Mtu.title + tabViewItems[0].label = L10n.Endpoint.title + tabViewItems[1].label = L10n.Configuration.title + tabViewItems[2].label = L10n.Service.Sections.Trusted.header + tabViewItems[3].label = L10n.NetworkSettings.Gateway.title + tabViewItems[4].label = L10n.NetworkSettings.Dns.title + tabViewItems[5].label = L10n.NetworkSettings.Proxy.title + tabViewItems[6].label = L10n.NetworkSettings.Mtu.title } } diff --git a/Passepartout/App/macOS/Scenes/Service/Customization/ProxyViewController.swift b/Passepartout/App/macOS/Scenes/Service/Customization/ProxyViewController.swift index 6be2ecfe..c794890e 100644 --- a/Passepartout/App/macOS/Scenes/Service/Customization/ProxyViewController.swift +++ b/Passepartout/App/macOS/Scenes/Service/Customization/ProxyViewController.swift @@ -70,13 +70,13 @@ class ProxyViewController: NSViewController, ProfileCustomization { override func viewDidLoad() { super.viewDidLoad() - labelProxyCaption.stringValue = L10n.Core.Global.Captions.address.asCaption - textProxyAddress.placeholderString = L10n.Core.Global.Values.none - textProxyPort.placeholderString = L10n.Core.Global.Values.none + labelProxyCaption.stringValue = L10n.Global.Captions.address.asCaption + textProxyAddress.placeholderString = L10n.Global.Values.none + textProxyPort.placeholderString = L10n.Global.Values.none labelPACCaption.stringValue = "PAC".asCaption - textPAC.placeholderString = L10n.Core.Global.Values.none + textPAC.placeholderString = L10n.Global.Values.none - tableProxyBypass.title = L10n.Core.NetworkSettings.Proxy.Cells.BypassDomains.title.asCaption + tableProxyBypass.title = L10n.NetworkSettings.Proxy.Cells.BypassDomains.title.asCaption viewProxyBypass.addSubview(tableProxyBypass) tableProxyBypass.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ diff --git a/Passepartout/App/macOS/Scenes/Service/Customization/TrustedNetworksAddViewController.swift b/Passepartout/App/macOS/Scenes/Service/Customization/TrustedNetworksAddViewController.swift index 787e792f..a2f0d032 100644 --- a/Passepartout/App/macOS/Scenes/Service/Customization/TrustedNetworksAddViewController.swift +++ b/Passepartout/App/macOS/Scenes/Service/Customization/TrustedNetworksAddViewController.swift @@ -42,8 +42,8 @@ class TrustedNetworksAddViewController: NSViewController { override func viewDidLoad() { super.viewDidLoad() - buttonOK.title = L10n.Core.Global.ok - buttonCancel.title = L10n.Core.Global.cancel + buttonOK.title = L10n.Global.ok + buttonCancel.title = L10n.Global.cancel textSSID.stringValue = Utils.currentWifiNetworkName() ?? "" } diff --git a/Passepartout/App/macOS/Scenes/Service/Customization/TrustedNetworksViewController.swift b/Passepartout/App/macOS/Scenes/Service/Customization/TrustedNetworksViewController.swift index a6844793..e6eaf909 100644 --- a/Passepartout/App/macOS/Scenes/Service/Customization/TrustedNetworksViewController.swift +++ b/Passepartout/App/macOS/Scenes/Service/Customization/TrustedNetworksViewController.swift @@ -64,13 +64,13 @@ class TrustedNetworksViewController: NSViewController, ProfileCustomization { override func viewDidLoad() { super.viewDidLoad() - labelTitle.stringValue = L10n.Core.Service.Sections.Trusted.header.asCaption + labelTitle.stringValue = L10n.Service.Sections.Trusted.header.asCaption buttonAdd.image = NSImage(named: NSImage.addTemplateName) buttonRemove.image = NSImage(named: NSImage.removeTemplateName) - checkTrustEthernet.title = L10n.Core.Trusted.Ethernet.title - labelTrustEthernetDescription.stringValue = L10n.Core.Trusted.Ethernet.description - checkDisableConnection.title = L10n.Core.Service.Cells.TrustedPolicy.caption - labelDisableConnectionDescription.stringValue = L10n.Core.Service.Sections.Trusted.footer + checkTrustEthernet.title = L10n.Trusted.Ethernet.title + labelTrustEthernetDescription.stringValue = L10n.Trusted.Ethernet.description + checkDisableConnection.title = L10n.Service.Cells.TrustedPolicy.caption + labelDisableConnectionDescription.stringValue = L10n.Service.Sections.Trusted.footer checkTrustEthernet.state = trustedNetworks.includesEthernet ? .on : .off checkDisableConnection.state = (trustedNetworks.policy == .disconnect) ? .on : .off @@ -86,7 +86,7 @@ class TrustedNetworksViewController: NSViewController, ProfileCustomization { column.isEditable = false case Columns.trust: - column.title = L10n.Core.Trusted.Columns.Trust.title + column.title = L10n.Trusted.Columns.Trust.title default: break @@ -218,10 +218,10 @@ extension TrustedNetworksViewController: TrustedNetworksUIDelegate { func trustedNetworksShouldConfirmDisconnection(_: TrustedNetworksUI, triggeredAt rowIndex: Int, completionHandler: @escaping () -> Void) { let alert = Macros.warning( - L10n.Core.Service.Sections.Trusted.header, - L10n.Core.Service.Alerts.Trusted.WillDisconnectTrusted.message + L10n.Service.Sections.Trusted.header, + L10n.Service.Alerts.Trusted.WillDisconnectTrusted.message ) - alert.present(in: view.window, withOK: L10n.Core.Global.ok, cancel: L10n.Core.Global.cancel, handler: completionHandler, cancelHandler: nil) + alert.present(in: view.window, withOK: L10n.Global.ok, cancel: L10n.Global.cancel, handler: completionHandler, cancelHandler: nil) } func trustedNetworks(_: TrustedNetworksUI, shouldInsertWifiAt rowIndex: Int) { diff --git a/Passepartout/App/macOS/Scenes/Service/HostServiceView.swift b/Passepartout/App/macOS/Scenes/Service/HostServiceView.swift index 07ab2591..e4ae7978 100644 --- a/Passepartout/App/macOS/Scenes/Service/HostServiceView.swift +++ b/Passepartout/App/macOS/Scenes/Service/HostServiceView.swift @@ -50,7 +50,7 @@ class HostServiceView: NSView { override func viewWillMove(toSuperview newSuperview: NSView?) { super.viewWillMove(toSuperview: newSuperview) - labelAddressesCaption.stringValue = L10n.Core.Service.Cells.Addresses.caption.asCaption + labelAddressesCaption.stringValue = L10n.Service.Cells.Addresses.caption.asCaption } func reloadData() { diff --git a/Passepartout/App/macOS/Scenes/Service/ProviderServiceView.swift b/Passepartout/App/macOS/Scenes/Service/ProviderServiceView.swift index a4512b04..ae68d909 100644 --- a/Passepartout/App/macOS/Scenes/Service/ProviderServiceView.swift +++ b/Passepartout/App/macOS/Scenes/Service/ProviderServiceView.swift @@ -95,9 +95,9 @@ class ProviderServiceView: NSView { override func viewWillMove(toSuperview newSuperview: NSView?) { super.viewWillMove(toSuperview: newSuperview) - labelCategoryCaption.stringValue = L10n.Core.Service.Cells.Category.caption.asCaption - labelLocationCaption.stringValue = L10n.Core.Service.Cells.Provider.Pool.caption.asCaption - checkOnlyShowsFavorites.title = L10n.Core.Service.Cells.OnlyShowsFavorites.caption + labelCategoryCaption.stringValue = L10n.Service.Cells.Category.caption.asCaption + labelLocationCaption.stringValue = L10n.Service.Cells.Provider.Pool.caption.asCaption + checkOnlyShowsFavorites.title = L10n.Service.Cells.OnlyShowsFavorites.caption checkOnlyShowsFavorites.state = .off buttonRefreshInfrastructure.image = NSImage(named: NSImage.refreshTemplateName) buttonFavorite.image = NSImage(named: NSImage.bookmarksTemplateName) @@ -180,7 +180,7 @@ class ProviderServiceView: NSView { let menu = NSMenu() categories.forEach { category in let item = NSMenuItem() - item.title = !category.name.isEmpty ? category.name.capitalized : L10n.Core.Global.Values.default + item.title = !category.name.isEmpty ? category.name.capitalized : L10n.Global.Values.default item.representedObject = category menu.addItem(item) @@ -202,7 +202,7 @@ class ProviderServiceView: NSView { } if let lastInfrastructureUpdate = InfrastructureFactory.shared.modificationDate(forName: profile.name) { - labelLastInfrastructureUpdate.stringValue = L10n.Core.Service.Sections.ProviderInfrastructure.footer(lastInfrastructureUpdate.timestamp) + labelLastInfrastructureUpdate.stringValue = L10n.Service.Sections.ProviderInfrastructure.footer(lastInfrastructureUpdate.timestamp) } checkOnlyShowsFavorites.isEnabled = !(profile.favoriteGroupIds?.isEmpty ?? true) @@ -257,7 +257,7 @@ class ProviderServiceView: NSView { guard !$0.secondaryId.isEmpty || pools.count > 1 else { return } - let title = !$0.secondaryId.isEmpty ? $0.secondaryId : L10n.Core.Global.Values.default + let title = !$0.secondaryId.isEmpty ? $0.secondaryId : L10n.Global.Values.default let item = NSMenuItem(title: title, action: nil, keyEquivalent: "") if let extraCountry = $0.extraCountries?.first { item.image = extraCountry.image diff --git a/Passepartout/App/macOS/Scenes/Service/ServiceViewController.swift b/Passepartout/App/macOS/Scenes/Service/ServiceViewController.swift index eddd73e1..af9f958e 100644 --- a/Passepartout/App/macOS/Scenes/Service/ServiceViewController.swift +++ b/Passepartout/App/macOS/Scenes/Service/ServiceViewController.swift @@ -150,14 +150,14 @@ class ServiceViewController: NSViewController { // enforce on macOS service.preferences.disconnectsOnSleep = true - labelWelcome.stringValue = L10n.Core.Service.Welcome.message - labelStatusCaption.stringValue = L10n.Core.Service.Cells.ConnectionStatus.caption.asCaption - labelServiceDescription.stringValue = L10n.Core.Service.Sections.Vpn.footer - buttonUse.title = L10n.Core.Service.Cells.UseProfile.caption - buttonToggle.title = L10n.Core.Service.Cells.Vpn.TurnOn.caption - buttonReconnect.title = L10n.Core.Service.Cells.Reconnect.caption + labelWelcome.stringValue = L10n.Service.Welcome.message + labelStatusCaption.stringValue = L10n.Service.Cells.ConnectionStatus.caption.asCaption + labelServiceDescription.stringValue = L10n.Service.Sections.Vpn.footer + buttonUse.title = L10n.Service.Cells.UseProfile.caption + buttonToggle.title = L10n.Service.Cells.Vpn.TurnOn.caption + buttonReconnect.title = L10n.Service.Cells.Reconnect.caption buttonCustomize.image = NSImage(named: NSImage.actionTemplateName) - buttonAccount.title = L10n.Core.Account.title.asContinuation + buttonAccount.title = L10n.Account.title.asContinuation let nc = NotificationCenter.default nc.addObserver(self, selector: #selector(vpnDidUpdate), name: VPN.didChangeStatus, object: nil) @@ -216,13 +216,13 @@ class ServiceViewController: NSViewController { // } //// guard vpn.status == .disconnected else { //// let alert = Macros.alert( -//// L10n.Core.Service.Cells.ConnectionStatus.caption, -//// L10n.Core.Service.Alerts.ReconnectVpn.message +//// L10n.Service.Cells.ConnectionStatus.caption, +//// L10n.Service.Alerts.ReconnectVpn.message //// ) -//// alert.addDefaultAction(L10n.Core.Global.ok) { +//// alert.addDefaultAction(L10n.Global.ok) { //// self.vpn.reconnect(configuration: self.currentVpnConfiguration(), completionHandler: nil) //// } -//// alert.addCancelAction(L10n.Core.Global.cancel) +//// alert.addCancelAction(L10n.Global.cancel) //// present(alert, animated: true, completion: nil) //// return //// } @@ -276,14 +276,14 @@ class ServiceViewController: NSViewController { guard isActive && vpn.isEnabled else { labelStatus.applyVPN(Theme.current, isActive: isActive, with: nil, error: nil) activityVPN.stopAnimation(nil) - buttonToggle.title = L10n.Core.Service.Cells.Vpn.TurnOn.caption + buttonToggle.title = L10n.Service.Cells.Vpn.TurnOn.caption buttonToggle.isEnabled = true buttonReconnect.isEnabled = false return } labelStatus.applyVPN(Theme.current, isActive: isActive, with: vpn.status, error: service.vpnLastError) - buttonToggle.title = vpn.isEnabled ? L10n.Core.Service.Cells.Vpn.TurnOff.caption : L10n.Core.Service.Cells.Vpn.TurnOn.caption + buttonToggle.title = vpn.isEnabled ? L10n.Service.Cells.Vpn.TurnOff.caption : L10n.Service.Cells.Vpn.TurnOn.caption buttonReconnect.isEnabled = true // append connected location for providers diff --git a/Passepartout/App/macOS/de.lproj/App.strings b/Passepartout/App/macOS/de.lproj/App.strings deleted file mode 100644 index 5fdac736..00000000 --- a/Passepartout/App/macOS/de.lproj/App.strings +++ /dev/null @@ -1,77 +0,0 @@ -// -// App.strings -// Passepartout -// -// Created by Davide De Rosa on 6/21/19. -// Copyright (c) 2021 Davide De Rosa. All rights reserved. -// -// https://github.com/passepartoutvpn -// -// This file is part of Passepartout. -// -// Passepartout is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Passepartout is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Passepartout. If not, see . -// - -"vpn.unused" = "Aus"; - -"organizer.title" = "%@"; -"organizer.menus.provider" = "Anbieter"; -"organizer.menus.provider.unavailable" = "Keine Anbieter übrig"; -"organizer.menus.host" = "Host"; -"organizer.alerts.remove_profile.title" = "Profil entfernen"; -"organizer.alerts.remove_profile.message" = "Bist du sicher, dass du das Profil %@ löschen möchtest?"; -"organizer.alerts.open_host_file.title" = "Wähle eine .ovpn-Datei."; - -"service.cells.vpn.turn_on.caption" = "Aktiviere VPN"; -"service.cells.vpn.turn_off.caption" = "Deaktiviere VPN"; -"service.cells.category.caption" = "Kategorie"; -"service.cells.addresses.caption" = "Adressen"; -"service.cells.only_shows_favorites.caption" = "Nur favorisierte Standorte anzeigen"; - -"endpoint.cells.address" = "Adresse"; -"endpoint.cells.protocol" = "Protokoll"; - -"configuration.title" = "Konfiguration"; -"configuration.alerts.commit.message" = "Neue Parameter werden erst nach einer manuellen Wiederherstellung der Verbindung wirksam. Änderungen in vertrauenswürdigen Netzwerken werden sofort wirksam."; -"configuration.alerts.commit.buttons.reconnect" = "Jetzt erneut verbinden"; -"configuration.alerts.commit.buttons.skip" = "Überspringen"; - -"network_settings.dns.cells.addresses.title" = "Server"; -"network_settings.dns.cells.domains.title" = "Domänen"; -"network_settings.proxy.cells.bypass_domains.title" = "Domänen umgehen"; - -"preferences.title" = "Einstellungen"; -"preferences.sections.general.header" = "Allgemein"; -"preferences.cells.launches_on_login.caption" = "Bei Anmeldung starten"; -"preferences.cells.launches_on_login.footer" = "Hier ein Häkchen setzen, um die App beim Systemstart oder der Anmeldung automatisch zu starten."; -"preferences.cells.confirm_quit.caption" = "Beenden bestätigen"; -"preferences.cells.confirm_quit.footer" = "Hier ein Häkchen setzen, um einen Hinweis zur Bestätigung des Beendens anzuzeigen."; - -"debug_log.buttons.copy" = "Kopieren"; - -"trusted.columns.trust.title" = "Vertrauen"; -"trusted.ethernet.title" = "Kabelverbindungen vertrauen"; -"trusted.ethernet.description" = "Hier ein Häkchen setzen, um jeder Kabelverbindung zu vertrauen."; - -"menu.show.title" = "Anzeigen"; -"menu.switch_profile.title" = "Aktives Profil"; -"menu.active_profile.title.none" = "Keine aktiven Profile"; -"menu.active_profile.items.customize.title" = "Anpassen..."; -"menu.active_profile.messages.missing_credentials" = "Es wurde keine Konto konfiguriert"; -"menu.organizer.title" = "Organizer"; -"menu.preferences.title" = "Einstellungen"; -"menu.support.title" = "Support"; -"menu.quit.title" = "%@ beenden"; -"menu.quit.messages.confirm" = "Wenn das VPN aktiviert wurde, läuft es weiter im Hintergrund. Möchtest du beenden?"; - diff --git a/Passepartout/App/macOS/el.lproj/App.strings b/Passepartout/App/macOS/el.lproj/App.strings deleted file mode 100644 index 48b487a2..00000000 --- a/Passepartout/App/macOS/el.lproj/App.strings +++ /dev/null @@ -1,77 +0,0 @@ -// -// App.strings -// Passepartout -// -// Created by Davide De Rosa on 6/21/19. -// Copyright (c) 2021 Davide De Rosa. All rights reserved. -// -// https://github.com/passepartoutvpn -// -// This file is part of Passepartout. -// -// Passepartout is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Passepartout is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Passepartout. If not, see . -// - -"vpn.unused" = "Ανενεργό"; - -"organizer.title" = "%@"; -"organizer.menus.provider" = "Πάροχος"; -"organizer.menus.provider.unavailable" = "Δεν απομένουν πάροχοι"; -"organizer.menus.host" = "Εξυπηρετητής"; -"organizer.alerts.remove_profile.title" = "Κατάργηση προφίλ"; -"organizer.alerts.remove_profile.message" = "Είστε βέβαιοι ότι θέλετε να διαγράψετε το προφίλ %@;"; -"organizer.alerts.open_host_file.title" = "Επιλέξτε ένα αρχείο .ovpn"; - -"service.cells.vpn.turn_on.caption" = "Ενεργοποίηση VPN"; -"service.cells.vpn.turn_off.caption" = "Απενεργοποίηση VPN"; -"service.cells.category.caption" = "Κατηγορία"; -"service.cells.addresses.caption" = "Διευθύνσεις"; -"service.cells.only_shows_favorites.caption" = "Προβολή αγαπημένων τοποθεσιών μόνο"; - -"endpoint.cells.address" = "Διεύθυνση"; -"endpoint.cells.protocol" = "Πρωτόκολλο"; - -"configuration.title" = "Ρύθμιση"; -"configuration.alerts.commit.message" = "Οι νέες παράμετροι δεν θα είναι αποτελεσματικές έως ότου επανασυνδεθείτε χειροκίνητα. Οι αλλαγές στα αξιόπιστα δίκτυα θα εφαρμοστούν αμέσως."; -"configuration.alerts.commit.buttons.reconnect" = "Επανασυνδεθείτε τώρα"; -"configuration.alerts.commit.buttons.skip" = "Παράλειψη"; - -"network_settings.dns.cells.addresses.title" = "Διακομιστές"; -"network_settings.dns.cells.domains.title" = "Τομείς"; -"network_settings.proxy.cells.bypass_domains.title" = "Παράκαμψη τομέων"; - -"preferences.title" = "Προτιμήσεις"; -"preferences.sections.general.header" = "Γενικός"; -"preferences.cells.launches_on_login.caption" = "Εκκίνηση κατά τη σύνδεση"; -"preferences.cells.launches_on_login.footer" = "Επιλέξτε για αυτόματη εκκίνηση της εφαρμογής κατά την εκκίνηση ή τη σύνδεση."; -"preferences.cells.confirm_quit.caption" = "Επιβεβαίωση διακοπής"; -"preferences.cells.confirm_quit.footer" = "Επιλέξτε για παρουσίαση ειδοποίησης ότι επιβεβαιώνεται η διακοπή."; - -"debug_log.buttons.copy" = "Αντιγραφή"; - -"trusted.columns.trust.title" = "Εμπιστευθείτε"; -"trusted.ethernet.title" = "Εμπιστευθείτε τις ενσύρματες συνδέσεις"; -"trusted.ethernet.description" = "Επιλέξτε για να εμπιστευθείτε οποιαδήποτε ενσύρματη σύνδεση καλωδίου."; - -"menu.show.title" = "Προβολή"; -"menu.switch_profile.title" = "Ενεργό προφίλ"; -"menu.active_profile.title.none" = "Δεν υπάρχει ενεργό προφίλ"; -"menu.active_profile.items.customize.title" = "Προσαρμογή..."; -"menu.active_profile.messages.missing_credentials" = "Δεν έχει διαμορφωθεί λογαριασμός"; -"menu.organizer.title" = "Διοργανωτής"; -"menu.preferences.title" = "Προτιμήσεις"; -"menu.support.title" = "Υποστήριξη"; -"menu.quit.title" = "Διακοπή %@"; -"menu.quit.messages.confirm" = "Το VPN, αν είναι ενεργοποιημένο, θα εξακολουθεί να εκτελείται στο παρασκήνιο. Θέλετε να το διακόψετε;"; - diff --git a/Passepartout/App/macOS/en.lproj/App.strings b/Passepartout/App/macOS/en.lproj/App.strings deleted file mode 100644 index 9fee1cf5..00000000 --- a/Passepartout/App/macOS/en.lproj/App.strings +++ /dev/null @@ -1,24 +0,0 @@ -// -// App.strings -// Passepartout -// -// Created by Davide De Rosa on 6/21/19. -// Copyright (c) 2021 Davide De Rosa. All rights reserved. -// -// https://github.com/passepartoutvpn -// -// This file is part of Passepartout. -// -// Passepartout is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Passepartout is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Passepartout. If not, see . -// diff --git a/Passepartout/App/macOS/es.lproj/App.strings b/Passepartout/App/macOS/es.lproj/App.strings deleted file mode 100644 index c9a36301..00000000 --- a/Passepartout/App/macOS/es.lproj/App.strings +++ /dev/null @@ -1,77 +0,0 @@ -// -// App.strings -// Passepartout -// -// Created by Davide De Rosa on 6/21/19. -// Copyright (c) 2021 Davide De Rosa. All rights reserved. -// -// https://github.com/passepartoutvpn -// -// This file is part of Passepartout. -// -// Passepartout is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Passepartout is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Passepartout. If not, see . -// - -"vpn.unused" = "Desactivada"; - -"organizer.title" = "%@"; -"organizer.menus.provider" = "Proveedor"; -"organizer.menus.provider.unavailable" = "No quedan proveedores"; -"organizer.menus.host" = "Host"; -"organizer.alerts.remove_profile.title" = "Quitar perfil"; -"organizer.alerts.remove_profile.message" = "¿Seguro que deseas eliminar el perfil %@?"; -"organizer.alerts.open_host_file.title" = "Selecciona un archivo .ovpn"; - -"service.cells.vpn.turn_on.caption" = "Habilitar VPN"; -"service.cells.vpn.turn_off.caption" = "Deshabilitar VPN"; -"service.cells.category.caption" = "Categoría"; -"service.cells.addresses.caption" = "Direcciones"; -"service.cells.only_shows_favorites.caption" = "Mostrar solo ubicaciones favoritas"; - -"endpoint.cells.address" = "Dirección"; -"endpoint.cells.protocol" = "Protocolo"; - -"configuration.title" = "Configuración"; -"configuration.alerts.commit.message" = "Los nuevos parámetros no serán efectivos hasta que te reconectes manualmente. Los cambios en las redes de confianza se aplicarán de inmediato."; -"configuration.alerts.commit.buttons.reconnect" = "Reconectar ahora"; -"configuration.alerts.commit.buttons.skip" = "Omitir"; - -"network_settings.dns.cells.addresses.title" = "Servidores"; -"network_settings.dns.cells.domains.title" = "Dominios"; -"network_settings.proxy.cells.bypass_domains.title" = "Dominios ignorados"; - -"preferences.title" = "Preferencias"; -"preferences.sections.general.header" = "General"; -"preferences.cells.launches_on_login.caption" = "Iniciar al iniciar sesión"; -"preferences.cells.launches_on_login.footer" = "Activa esta opción para que la aplicación se inicie automáticamente al iniciar o al iniciar sesión."; -"preferences.cells.confirm_quit.caption" = "Confirmar salir"; -"preferences.cells.confirm_quit.footer" = "Activa esta opción para que se muestre una alerta de confirmación al salir."; - -"debug_log.buttons.copy" = "Copiar"; - -"trusted.columns.trust.title" = "Confianza"; -"trusted.ethernet.title" = "Confiar en conexiones cableadas"; -"trusted.ethernet.description" = "Activa esta opción para confiar en cualquier conexión cableada."; - -"menu.show.title" = "Mostrar"; -"menu.switch_profile.title" = "Perfil activo"; -"menu.active_profile.title.none" = "Ningún perfil activo"; -"menu.active_profile.items.customize.title" = "Personalizar..."; -"menu.active_profile.messages.missing_credentials" = "Ninguna cuenta configurada"; -"menu.organizer.title" = "Organizador"; -"menu.preferences.title" = "Preferencias"; -"menu.support.title" = "Soporte"; -"menu.quit.title" = "Salir de %@"; -"menu.quit.messages.confirm" = "Si la VPN está habilitada, seguirá funcionando en segundo plano. ¿Deseas salir?"; - diff --git a/Passepartout/App/macOS/fr.lproj/App.strings b/Passepartout/App/macOS/fr.lproj/App.strings deleted file mode 100644 index 7792fe7b..00000000 --- a/Passepartout/App/macOS/fr.lproj/App.strings +++ /dev/null @@ -1,77 +0,0 @@ -// -// App.strings -// Passepartout -// -// Created by Davide De Rosa on 6/21/19. -// Copyright (c) 2021 Davide De Rosa. All rights reserved. -// -// https://github.com/passepartoutvpn -// -// This file is part of Passepartout. -// -// Passepartout is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Passepartout is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Passepartout. If not, see . -// - -"vpn.unused" = "Désactivé"; - -"organizer.title" = "%@"; -"organizer.menus.provider" = "Fournisseur"; -"organizer.menus.provider.unavailable" = "Aucun fournisseur restant"; -"organizer.menus.host" = "Hôte"; -"organizer.alerts.remove_profile.title" = "Supprimer le profil"; -"organizer.alerts.remove_profile.message" = "Voulez-vous vraiment supprimer le profil %@ ?"; -"organizer.alerts.open_host_file.title" = "Sélectionnez un fichier .ovpn"; - -"service.cells.vpn.turn_on.caption" = "Activer VPN"; -"service.cells.vpn.turn_off.caption" = "Désactiver VPN"; -"service.cells.category.caption" = "Catégorie"; -"service.cells.addresses.caption" = "Adresses"; -"service.cells.only_shows_favorites.caption" = "Afficher uniquement les emplacements favoris"; - -"endpoint.cells.address" = "Adresse"; -"endpoint.cells.protocol" = "Protocole"; - -"configuration.title" = "Configuration"; -"configuration.alerts.commit.message" = "Vous devez vous reconnecter manuellement pour confirmer les nouveaux paramètres. Les modifications apportées sur les réseaux de confiance seront immédiatement mises en place."; -"configuration.alerts.commit.buttons.reconnect" = "Se reconnecter"; -"configuration.alerts.commit.buttons.skip" = "Passer"; - -"network_settings.dns.cells.addresses.title" = "Serveurs"; -"network_settings.dns.cells.domains.title" = "Domaines"; -"network_settings.proxy.cells.bypass_domains.title" = "Outrepasser le domaine"; - -"preferences.title" = "Préférences"; -"preferences.sections.general.header" = "Général"; -"preferences.cells.launches_on_login.caption" = "Lancer au démarrage"; -"preferences.cells.launches_on_login.footer" = "Cochez pour lancer automatiquement l'application à la connexion ou au démarrage."; -"preferences.cells.confirm_quit.caption" = "Notification de sortie"; -"preferences.cells.confirm_quit.footer" = "Cochez pour recevoir une demande de confirmation lorsque vous quittez."; - -"debug_log.buttons.copy" = "Copier"; - -"trusted.columns.trust.title" = "Fiables"; -"trusted.ethernet.title" = "Faire confiance aux connexions filaires"; -"trusted.ethernet.description" = "Cochez pour faire confiance à toutes les connexions filaires."; - -"menu.show.title" = "Afficher"; -"menu.switch_profile.title" = "Profil actif"; -"menu.active_profile.title.none" = "Pas de profil actif"; -"menu.active_profile.items.customize.title" = "Personnaliser..."; -"menu.active_profile.messages.missing_credentials" = "Pas de compte configuré"; -"menu.organizer.title" = "Organisateur"; -"menu.preferences.title" = "Préférences"; -"menu.support.title" = "Assistance"; -"menu.quit.title" = "Quitter %@"; -"menu.quit.messages.confirm" = "S'il est activé, le VPN fonctionnera en tâche de fond. Voulez-vous quitter ?"; - diff --git a/Passepartout/App/macOS/it.lproj/App.strings b/Passepartout/App/macOS/it.lproj/App.strings deleted file mode 100644 index fa5e7b47..00000000 --- a/Passepartout/App/macOS/it.lproj/App.strings +++ /dev/null @@ -1,77 +0,0 @@ -// -// App.strings -// Passepartout -// -// Created by Davide De Rosa on 6/21/19. -// Copyright (c) 2021 Davide De Rosa. All rights reserved. -// -// https://github.com/passepartoutvpn -// -// This file is part of Passepartout. -// -// Passepartout is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Passepartout is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Passepartout. If not, see . -// - -"vpn.unused" = "Spento"; - -"organizer.title" = "%@"; -"organizer.menus.provider" = "Provider"; -"organizer.menus.provider.unavailable" = "Nessun altro provider disponibile"; -"organizer.menus.host" = "Host"; -"organizer.alerts.remove_profile.title" = "Cancella profilo"; -"organizer.alerts.remove_profile.message" = "Sei sicuro di voler cancellare il profilo %@?"; -"organizer.alerts.open_host_file.title" = "Seleziona un file .ovpn"; - -"service.cells.vpn.turn_on.caption" = "Abilita VPN"; -"service.cells.vpn.turn_off.caption" = "Disabilita VPN"; -"service.cells.category.caption" = "Categoria"; -"service.cells.addresses.caption" = "Indirizzi"; -"service.cells.only_shows_favorites.caption" = "Mostra solo le posizioni preferite"; - -"endpoint.cells.address" = "Indirizzo"; -"endpoint.cells.protocol" = "Protocollo"; - -"configuration.title" = "Configurazione"; -"configuration.alerts.commit.message" = "I nuovi parametri non saranno effettivi finché non ti riconnetti manualmente. I cambi nelle reti sicure saranno applicati immediatamente."; -"configuration.alerts.commit.buttons.reconnect" = "Riconnetti adesso"; -"configuration.alerts.commit.buttons.skip" = "Ignora"; - -"network_settings.dns.cells.addresses.title" = "Server"; -"network_settings.dns.cells.domains.title" = "Dominii"; -"network_settings.proxy.cells.bypass_domains.title" = "Dominii ignorati"; - -"preferences.title" = "Preferenze"; -"preferences.sections.general.header" = "Generale"; -"preferences.cells.launches_on_login.caption" = "Apri al login"; -"preferences.cells.launches_on_login.footer" = "Seleziona per aprire automaticamente l'app all'avvio o al login."; -"preferences.cells.confirm_quit.caption" = "Conferma uscita"; -"preferences.cells.confirm_quit.footer" = "Seleziona per confermare l'uscita dall'applicazione."; - -"debug_log.buttons.copy" = "Copia"; - -"trusted.columns.trust.title" = "Sicura"; -"trusted.ethernet.title" = "Connessioni cablate sicure"; -"trusted.ethernet.description" = "Seleziona per considerare sicura qualsiasi rete cablata."; - -"menu.show.title" = "Mostra"; -"menu.switch_profile.title" = "Profilo attivo"; -"menu.active_profile.title.none" = "Nessun profilo attivo"; -"menu.active_profile.items.customize.title" = "Personalizza..."; -"menu.active_profile.messages.missing_credentials" = "Nessun account configurato"; -"menu.organizer.title" = "Organizer"; -"menu.preferences.title" = "Preferenze"; -"menu.support.title" = "Supporto"; -"menu.quit.title" = "Esci da %@"; -"menu.quit.messages.confirm" = "La VPN, se abilitata, continuerà ad essere attiva in background. Vuoi comunque uscire?"; - diff --git a/Passepartout/App/macOS/nl.lproj/App.strings b/Passepartout/App/macOS/nl.lproj/App.strings deleted file mode 100644 index e4ab3f04..00000000 --- a/Passepartout/App/macOS/nl.lproj/App.strings +++ /dev/null @@ -1,77 +0,0 @@ -// -// App.strings -// Passepartout -// -// Created by Davide De Rosa on 6/21/19. -// Copyright (c) 2021 Davide De Rosa. All rights reserved. -// -// https://github.com/passepartoutvpn -// -// This file is part of Passepartout. -// -// Passepartout is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Passepartout is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Passepartout. If not, see . -// - -"vpn.unused" = "Uit"; - -"organizer.title" = "%@"; -"organizer.menus.provider" = "Aanbieder"; -"organizer.menus.provider.unavailable" = "Geen aanbieders meer"; -"organizer.menus.host" = "Host"; -"organizer.alerts.remove_profile.title" = "Profiel verwijderen"; -"organizer.alerts.remove_profile.message" = "Weet u zeker dat u profiel %@ wilt verwijderen?"; -"organizer.alerts.open_host_file.title" = "Selecteer een .ovpn-bestand"; - -"service.cells.vpn.turn_on.caption" = "VPN activeren"; -"service.cells.vpn.turn_off.caption" = "VPN deactiveren"; -"service.cells.category.caption" = "Categorie"; -"service.cells.addresses.caption" = "Adressen"; -"service.cells.only_shows_favorites.caption" = "Alleen favoriete locaties weergeven"; - -"endpoint.cells.address" = "Adres"; -"endpoint.cells.protocol" = "Protocol"; - -"configuration.title" = "Configuratie"; -"configuration.alerts.commit.message" = "Nieuwe parameters worden pas van kracht als u handmatig opnieuw verbinding maakt. Wijzigingen in vertrouwde netwerken zijn direct van toepassing."; -"configuration.alerts.commit.buttons.reconnect" = "Opnieuw verbinden"; -"configuration.alerts.commit.buttons.skip" = "Overslaan"; - -"network_settings.dns.cells.addresses.title" = "Servers"; -"network_settings.dns.cells.domains.title" = "Domeinen"; -"network_settings.proxy.cells.bypass_domains.title" = "Domeinen omzeilen"; - -"preferences.title" = "Voorkeuren"; -"preferences.sections.general.header" = "Algemeen"; -"preferences.cells.launches_on_login.caption" = "Lanceren bij aanmelden"; -"preferences.cells.launches_on_login.footer" = "Vink aan als u wilt dat de app automatisch wordt gelanceerd bij opstarten of aanmelden."; -"preferences.cells.confirm_quit.caption" = "Sluiten bevestigen"; -"preferences.cells.confirm_quit.footer" = "Vink aan om een bevestigingsmelding te sluiten."; - -"debug_log.buttons.copy" = "Kopiëren"; - -"trusted.columns.trust.title" = "Vertrouwen"; -"trusted.ethernet.title" = "Bekabelde verbindingen vertrouwen"; -"trusted.ethernet.description" = "Vink aan om alle bekabelde verbindingen te vertrouwen."; - -"menu.show.title" = "Weergeven"; -"menu.switch_profile.title" = "Actief profiel"; -"menu.active_profile.title.none" = "Geen actief profiel"; -"menu.active_profile.items.customize.title" = "Aanpassen..."; -"menu.active_profile.messages.missing_credentials" = "Geen account geconfigureerd"; -"menu.organizer.title" = "Organisator"; -"menu.preferences.title" = "Voorkeuren"; -"menu.support.title" = "Ondersteuning"; -"menu.quit.title" = "%@ afsluiten"; -"menu.quit.messages.confirm" = "De VPN zal, indien geactiveerd, op de achtergrond blijven draaien. Wilt u sluiten?"; - diff --git a/Passepartout/App/macOS/pl.lproj/App.strings b/Passepartout/App/macOS/pl.lproj/App.strings deleted file mode 100644 index 5037ac5f..00000000 --- a/Passepartout/App/macOS/pl.lproj/App.strings +++ /dev/null @@ -1,77 +0,0 @@ -// -// App.strings -// Passepartout -// -// Created by Davide De Rosa on 6/21/19. -// Copyright (c) 2021 Davide De Rosa. All rights reserved. -// -// https://github.com/passepartoutvpn -// -// This file is part of Passepartout. -// -// Passepartout is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Passepartout is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Passepartout. If not, see . -// - -"vpn.unused" = "Wył"; - -"organizer.title" = "%@"; -"organizer.menus.provider" = "Dostawca"; -"organizer.menus.provider.unavailable" = "Brak dostawców"; -"organizer.menus.host" = "Host"; -"organizer.alerts.remove_profile.title" = "Usuń profil"; -"organizer.alerts.remove_profile.message" = "Na pewno chcesz usunąć profil %@?"; -"organizer.alerts.open_host_file.title" = "Wybierz plik .ovpn"; - -"service.cells.vpn.turn_on.caption" = "Włącz VPN"; -"service.cells.vpn.turn_off.caption" = "Wyłącz VPN"; -"service.cells.category.caption" = "Kategoria"; -"service.cells.addresses.caption" = "Adresy"; -"service.cells.only_shows_favorites.caption" = "Pokazuj tylko ulubione lokalizacje"; - -"endpoint.cells.address" = "Adres"; -"endpoint.cells.protocol" = "Protokół"; - -"configuration.title" = "Konfiguracja"; -"configuration.alerts.commit.message" = "Nowe parametry zaczną obowiązywać dopiero po ponownym ręcznym połączeniu. Zmiany w sieciach zaufanych zostaną zastosowane natychmiast."; -"configuration.alerts.commit.buttons.reconnect" = "Połącz ponownie teraz"; -"configuration.alerts.commit.buttons.skip" = "Pomiń"; - -"network_settings.dns.cells.addresses.title" = "Serwery"; -"network_settings.dns.cells.domains.title" = "Domeny"; -"network_settings.proxy.cells.bypass_domains.title" = "Pomiń domeny"; - -"preferences.title" = "Preferencje"; -"preferences.sections.general.header" = "Ogólne"; -"preferences.cells.launches_on_login.caption" = "Uruchom po zalogowaniu"; -"preferences.cells.launches_on_login.footer" = "Zaznacz, aby automatycznie uruchamiać aplikację przy restarcie systemu lub logowaniu."; -"preferences.cells.confirm_quit.caption" = "Potwierdź zakończenie pracy"; -"preferences.cells.confirm_quit.footer" = "Zaznacz, aby wyświetlić monit o potwierdzeniu zakończenia."; - -"debug_log.buttons.copy" = "Kopiuj"; - -"trusted.columns.trust.title" = "Ufaj"; -"trusted.ethernet.title" = "Ufaj połączeniom przewodowym"; -"trusted.ethernet.description" = "Zaznacz, aby traktować każde przewodowe połączenie kablowe jako zaufane."; - -"menu.show.title" = "Pokaż"; -"menu.switch_profile.title" = "Aktywny profil"; -"menu.active_profile.title.none" = "Brak aktywnych profili"; -"menu.active_profile.items.customize.title" = "Personalizuj"; -"menu.active_profile.messages.missing_credentials" = "Brak skonfigurowanych kont"; -"menu.organizer.title" = "Organzator"; -"menu.preferences.title" = "Preferencje"; -"menu.support.title" = "Obsługa techniczna"; -"menu.quit.title" = "Zakończ %@"; -"menu.quit.messages.confirm" = "Jeśli sieć VPN, jest włączona, będzie nadal działać w tle. Chcesz zakończyć?"; - diff --git a/Passepartout/App/macOS/pt.lproj/App.strings b/Passepartout/App/macOS/pt.lproj/App.strings deleted file mode 100644 index 83433478..00000000 --- a/Passepartout/App/macOS/pt.lproj/App.strings +++ /dev/null @@ -1,77 +0,0 @@ -// -// App.strings -// Passepartout -// -// Created by Davide De Rosa on 6/21/19. -// Copyright (c) 2021 Davide De Rosa. All rights reserved. -// -// https://github.com/passepartoutvpn -// -// This file is part of Passepartout. -// -// Passepartout is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Passepartout is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Passepartout. If not, see . -// - -"vpn.unused" = "Desativado"; - -"organizer.title" = "%@"; -"organizer.menus.provider" = "Fornecedor"; -"organizer.menus.provider.unavailable" = "Não restam fornecedores"; -"organizer.menus.host" = "Anfitreão"; -"organizer.alerts.remove_profile.title" = "Remover perfil"; -"organizer.alerts.remove_profile.message" = "Tem a certeza de que pretende eliminar o perfil %@?"; -"organizer.alerts.open_host_file.title" = "Selecionar um ficheiro .ovpn"; - -"service.cells.vpn.turn_on.caption" = "Ativar VPN"; -"service.cells.vpn.turn_off.caption" = "Desativar VPN"; -"service.cells.category.caption" = "Categoria"; -"service.cells.addresses.caption" = "Endereços"; -"service.cells.only_shows_favorites.caption" = "Mostrar apenas os locais preferidos"; - -"endpoint.cells.address" = "Endereço"; -"endpoint.cells.protocol" = "Protocolo"; - -"configuration.title" = "Configuração"; -"configuration.alerts.commit.message" = "Os novos parâmetros não serão efetivos até que se volte a ligar manualmente. As alterações às redes de confiança serão aplicadas de imediato."; -"configuration.alerts.commit.buttons.reconnect" = "Voltar a ligar agora"; -"configuration.alerts.commit.buttons.skip" = "Ignorar"; - -"network_settings.dns.cells.addresses.title" = "Servidores"; -"network_settings.dns.cells.domains.title" = "Domínios"; -"network_settings.proxy.cells.bypass_domains.title" = "Fazer um bypass aos domínios"; - -"preferences.title" = "Preferências"; -"preferences.sections.general.header" = "Geral"; -"preferences.cells.launches_on_login.caption" = "Iniciar ao iniciar a sessão"; -"preferences.cells.launches_on_login.footer" = "Assinale para executar automaticamente a aplicação ao arrancar ou com o início de sessão."; -"preferences.cells.confirm_quit.caption" = "Confirmar a saída"; -"preferences.cells.confirm_quit.footer" = "Assinale para apresentar um alerta de confirmação da saída."; - -"debug_log.buttons.copy" = "Copiar"; - -"trusted.columns.trust.title" = "Confiar"; -"trusted.ethernet.title" = "Confiar em ligações com fios"; -"trusted.ethernet.description" = "Assinale para confiar em qualquer ligação com cabo."; - -"menu.show.title" = "Mostrar"; -"menu.switch_profile.title" = "Perfil ativo"; -"menu.active_profile.title.none" = "Sem perfil ativo"; -"menu.active_profile.items.customize.title" = "Personalizar..."; -"menu.active_profile.messages.missing_credentials" = "Não há uma conta configurada"; -"menu.organizer.title" = "Organizador"; -"menu.preferences.title" = "Preferências"; -"menu.support.title" = "Apoio"; -"menu.quit.title" = "Sair %@"; -"menu.quit.messages.confirm" = "A VPN, se ativa, ainda vai ser executada em segundo plano. Quer sair?"; - diff --git a/Passepartout/App/macOS/ru.lproj/App.strings b/Passepartout/App/macOS/ru.lproj/App.strings deleted file mode 100644 index 7af4b558..00000000 --- a/Passepartout/App/macOS/ru.lproj/App.strings +++ /dev/null @@ -1,77 +0,0 @@ -// -// App.strings -// Passepartout -// -// Created by Davide De Rosa on 6/21/19. -// Copyright (c) 2021 Davide De Rosa. All rights reserved. -// -// https://github.com/passepartoutvpn -// -// This file is part of Passepartout. -// -// Passepartout is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Passepartout is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Passepartout. If not, see . -// - -"vpn.unused" = "Выкл"; - -"organizer.title" = "%@"; -"organizer.menus.provider" = "Провайдер"; -"organizer.menus.provider.unavailable" = "Не осталось провайдеров"; -"organizer.menus.host" = "Хост"; -"organizer.alerts.remove_profile.title" = "Удалить профиль"; -"organizer.alerts.remove_profile.message" = "Вы точно хотите удалить профиль %@?"; -"organizer.alerts.open_host_file.title" = "Выберите файл .ovpn"; - -"service.cells.vpn.turn_on.caption" = "Включить VPN"; -"service.cells.vpn.turn_off.caption" = "Отключить VPN"; -"service.cells.category.caption" = "Категория"; -"service.cells.addresses.caption" = "Адреса"; -"service.cells.only_shows_favorites.caption" = "Показывать только места из избранного"; - -"endpoint.cells.address" = "Адрес"; -"endpoint.cells.protocol" = "Протокол"; - -"configuration.title" = "Конфигурация"; -"configuration.alerts.commit.message" = "Новые параметры не вступят в силу до ручного переподключения. Изменения в доверенных сетях вступят в силу сразу."; -"configuration.alerts.commit.buttons.reconnect" = "Переподключиться"; -"configuration.alerts.commit.buttons.skip" = "Пропустить"; - -"network_settings.dns.cells.addresses.title" = "Серверы"; -"network_settings.dns.cells.domains.title" = "Домены"; -"network_settings.proxy.cells.bypass_domains.title" = "Обходные домены"; - -"preferences.title" = "Настройки"; -"preferences.sections.general.header" = "Общие"; -"preferences.cells.launches_on_login.caption" = "Запускать при входе"; -"preferences.cells.launches_on_login.footer" = "Включите, чтобы приложение автоматически запускалось при загрузке или входе."; -"preferences.cells.confirm_quit.caption" = "Подтверждать выход"; -"preferences.cells.confirm_quit.footer" = "Включите, чтобы выход надо было подтверждать."; - -"debug_log.buttons.copy" = "Копировать"; - -"trusted.columns.trust.title" = "Доверенные"; -"trusted.ethernet.title" = "Доверенные проводные подключения"; -"trusted.ethernet.description" = "Включите, чтобы добавить в доверенные проводное подключение."; - -"menu.show.title" = "Показать"; -"menu.switch_profile.title" = "Активный профиль"; -"menu.active_profile.title.none" = "Нет активных профилей"; -"menu.active_profile.items.customize.title" = "Настроить..."; -"menu.active_profile.messages.missing_credentials" = "Нет настроенных аккаунтов"; -"menu.organizer.title" = "Организатор"; -"menu.preferences.title" = "Настройки"; -"menu.support.title" = "Поддержка"; -"menu.quit.title" = "Выйти из %@"; -"menu.quit.messages.confirm" = "Если включить VPN, он всё равно будет работать в фоновом режиме. Вы точно хотите выйти?"; - diff --git a/Passepartout/App/macOS/sv.lproj/App.strings b/Passepartout/App/macOS/sv.lproj/App.strings deleted file mode 100644 index bec025e8..00000000 --- a/Passepartout/App/macOS/sv.lproj/App.strings +++ /dev/null @@ -1,77 +0,0 @@ -// -// App.strings -// Passepartout -// -// Created by Davide De Rosa on 6/21/19. -// Copyright (c) 2021 Davide De Rosa. All rights reserved. -// -// https://github.com/passepartoutvpn -// -// This file is part of Passepartout. -// -// Passepartout is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Passepartout is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Passepartout. If not, see . -// - -"vpn.unused" = "Av"; - -"organizer.title" = "%@"; -"organizer.menus.provider" = "Leverantör"; -"organizer.menus.provider.unavailable" = "Inga leverantörer kvar"; -"organizer.menus.host" = "Värd"; -"organizer.alerts.remove_profile.title" = "Ta bort profil"; -"organizer.alerts.remove_profile.message" = "Är det säkert att du vill ta bort profilen %@?"; -"organizer.alerts.open_host_file.title" = "Välj en .ovpn-fil"; - -"service.cells.vpn.turn_on.caption" = "Aktivera VPN"; -"service.cells.vpn.turn_off.caption" = "Inaktivera VPN"; -"service.cells.category.caption" = "Kategori"; -"service.cells.addresses.caption" = "Adresser"; -"service.cells.only_shows_favorites.caption" = "Visa endast favoritplatser"; - -"endpoint.cells.address" = "Adress"; -"endpoint.cells.protocol" = "Protokoll"; - -"configuration.title" = "Konfiguration"; -"configuration.alerts.commit.message" = "Nya parametrar kommer inte att införas förrän du återansluter manuellt. Ändringar i betrodda nätverk kommer att införas omedelbart."; -"configuration.alerts.commit.buttons.reconnect" = "Återanslut nu"; -"configuration.alerts.commit.buttons.skip" = "Hoppa över"; - -"network_settings.dns.cells.addresses.title" = "Servrar"; -"network_settings.dns.cells.domains.title" = "Domäner"; -"network_settings.proxy.cells.bypass_domains.title" = "Kringgå domäner"; - -"preferences.title" = "Inställningar"; -"preferences.sections.general.header" = "Allmänt"; -"preferences.cells.launches_on_login.caption" = "Öppna vid inloggning"; -"preferences.cells.launches_on_login.footer" = "Markera för att starta appen automatiskt efter omstart eller vid inloggning."; -"preferences.cells.confirm_quit.caption" = "Bekräfta lämna"; -"preferences.cells.confirm_quit.footer" = "Markera för att visa en uppmaning att bekräfta att man vill lämna appen."; - -"debug_log.buttons.copy" = "Kopiera"; - -"trusted.columns.trust.title" = "Betrodda"; -"trusted.ethernet.title" = "Lita på kabelanslutna uppkopplingar"; -"trusted.ethernet.description" = "Markera för att lita på alla kabelanslutna uppkopplingar."; - -"menu.show.title" = "Visa"; -"menu.switch_profile.title" = "Aktiv profil"; -"menu.active_profile.title.none" = "Ingen aktiv profil"; -"menu.active_profile.items.customize.title" = "Anpassa"; -"menu.active_profile.messages.missing_credentials" = "Inget konto har konfigurerats"; -"menu.organizer.title" = "Organisatör"; -"menu.preferences.title" = "Inställningar"; -"menu.support.title" = "Support"; -"menu.quit.title" = "Lämna %@"; -"menu.quit.messages.confirm" = "Om ett VPN är aktiverat kommer detta fortfarande att köra i bakgrunden. Vill du lämna?"; - diff --git a/Passepartout/App/macOS/swiftgen.yml b/Passepartout/App/macOS/swiftgen.yml index 723df7fb..69094b21 100644 --- a/Passepartout/App/macOS/swiftgen.yml +++ b/Passepartout/App/macOS/swiftgen.yml @@ -1,7 +1,6 @@ strings: inputs: - ../../Core/Resources/en.lproj/Core.strings - - en.lproj/App.strings outputs: - templateName: structured-swift4 output: Global/SwiftGen+Strings.swift diff --git a/Passepartout/App/macOS/zh-Hans.lproj/App.strings b/Passepartout/App/macOS/zh-Hans.lproj/App.strings deleted file mode 100644 index 7f7f1b5f..00000000 --- a/Passepartout/App/macOS/zh-Hans.lproj/App.strings +++ /dev/null @@ -1,77 +0,0 @@ -// -// App.strings -// Passepartout -// -// Created by Davide De Rosa on 6/21/19. -// Copyright (c) 2021 Davide De Rosa. All rights reserved. -// -// https://github.com/passepartoutvpn -// -// This file is part of Passepartout. -// -// Passepartout is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Passepartout is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Passepartout. If not, see . -// - -"vpn.unused" = "关"; - -"organizer.title" = "%@"; -"organizer.menus.provider" = "提供商"; -"organizer.menus.provider.unavailable" = "没有提供商了"; -"organizer.menus.host" = "主机"; -"organizer.alerts.remove_profile.title" = "删除配置"; -"organizer.alerts.remove_profile.message" = "确定要删除配置%@吗?"; -"organizer.alerts.open_host_file.title" = "选择.ovpn文件"; - -"service.cells.vpn.turn_on.caption" = "启用VPN"; -"service.cells.vpn.turn_off.caption" = "禁用VPN"; -"service.cells.category.caption" = "类别"; -"service.cells.addresses.caption" = "地址"; -"service.cells.only_shows_favorites.caption" = "仅显示收藏的地点"; - -"endpoint.cells.address" = "地址"; -"endpoint.cells.protocol" = "协议"; - -"configuration.title" = "配置"; -"configuration.alerts.commit.message" = "除非手动重新连接,否则新参数将无效。受信任的网络中的更改将立即生效。"; -"configuration.alerts.commit.buttons.reconnect" = "立即重新连接"; -"configuration.alerts.commit.buttons.skip" = "跳过"; - -"network_settings.dns.cells.addresses.title" = "服务器"; -"network_settings.dns.cells.domains.title" = "域"; -"network_settings.proxy.cells.bypass_domains.title" = "旁路域"; - -"preferences.title" = "偏好设置"; -"preferences.sections.general.header" = "一般"; -"preferences.cells.launches_on_login.caption" = "登录时启动"; -"preferences.cells.launches_on_login.footer" = "选中以在启动或登录时自动启动应用。"; -"preferences.cells.confirm_quit.caption" = "确认退出"; -"preferences.cells.confirm_quit.footer" = "选中以显示退出确认提醒。"; - -"debug_log.buttons.copy" = "复制"; - -"trusted.columns.trust.title" = "信任"; -"trusted.ethernet.title" = "信任有线连接"; -"trusted.ethernet.description" = "选中以信任所有有线连接。"; - -"menu.show.title" = "显示"; -"menu.switch_profile.title" = "有效配置"; -"menu.active_profile.title.none" = "无有效配置"; -"menu.active_profile.items.customize.title" = "自定义......"; -"menu.active_profile.messages.missing_credentials" = "未配置账户"; -"menu.organizer.title" = "分类页面"; -"menu.preferences.title" = "偏好设置"; -"menu.support.title" = "支持"; -"menu.quit.title" = "退出%@"; -"menu.quit.messages.confirm" = "VPN(如果启用)仍将在后台运行。您要退出吗?"; -