Merge macOS strings into Core

This commit is contained in:
Davide De Rosa 2021-08-07 12:23:17 +02:00
parent cda9bdcc3f
commit 23c497968f
19 changed files with 379 additions and 296 deletions

View File

@ -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:

View File

@ -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 {

View File

@ -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
}

View File

@ -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
}

View File

@ -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 {

View File

@ -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()

View File

@ -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)

View File

@ -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

View File

@ -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 {

View File

@ -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([

View File

@ -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()

View File

@ -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

View File

@ -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([

View File

@ -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

View File

@ -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() {

View File

@ -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)

View File

@ -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

View File

@ -22,55 +22,3 @@
// You should have received a copy of the GNU General Public License
// along with Passepartout. If not, see <http://www.gnu.org/licenses/>.
//
"vpn.unused" = "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?";

View File

@ -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";