From d34cf384b097c3a27645b91a37c1aa5ebe77d849 Mon Sep 17 00:00:00 2001 From: Istvan T <37590873+waydabber@users.noreply.github.com> Date: Fri, 22 Oct 2021 10:50:58 +0200 Subject: [PATCH 001/101] Multiple attempts to write last DDC settings after wake when 'Apply last saved settings' is enabled (#734) --- MonitorControl/Info.plist | 2 +- MonitorControl/Model/OtherDisplay.swift | 80 +++++++++++---------- MonitorControl/Support/AppDelegate.swift | 18 +++++ MonitorControl/Support/DisplayManager.swift | 15 ++-- MonitorControl/main.swift | 1 + MonitorControlHelper/Info.plist | 2 +- 6 files changed, 72 insertions(+), 46 deletions(-) diff --git a/MonitorControl/Info.plist b/MonitorControl/Info.plist index 01577f66..ace4cda0 100644 --- a/MonitorControl/Info.plist +++ b/MonitorControl/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 6767 + 6795 LSApplicationCategoryType public.app-category.utilities LSMinimumSystemVersion diff --git a/MonitorControl/Model/OtherDisplay.swift b/MonitorControl/Model/OtherDisplay.swift index 5b7a1d2f..2eebc69e 100644 --- a/MonitorControl/Model/OtherDisplay.swift +++ b/MonitorControl/Model/OtherDisplay.swift @@ -5,13 +5,10 @@ import IOKit import os.log class OtherDisplay: Display { - var volumeSliderHandler: SliderHandler? - var contrastSliderHandler: SliderHandler? var ddc: IntelDDC? var arm64ddc: Bool = false var arm64avService: IOAVService? var isDiscouraged: Bool = false - let DDC_MAX_DETECT_LIMIT: Int = 100 var pollingCount: Int { get { switch self.readPrefAsInt(key: .pollingMode) { @@ -33,8 +30,8 @@ class OtherDisplay: Display { } } - func processCurrentDDCValue(read: Bool, command: Command, firstrun: Bool, currentDDCValue: UInt16) { - if read { + func processCurrentDDCValue(isReadFromDisplay: Bool, command: Command, firstrun: Bool, currentDDCValue: UInt16) { + if isReadFromDisplay { var currentValue = self.convDDCToValue(for: command, from: currentDDCValue) if !prefs.bool(forKey: PrefKey.disableCombinedBrightness.rawValue), command == .brightness { os_log("- Combined brightness mapping on DDC data.", type: .info) @@ -71,17 +68,34 @@ class OtherDisplay: Display { } } + func getDDCValueFromPrefs(_ command: Command) -> UInt16 { + return self.convValueToDDC(for: command, from: (!prefs.bool(forKey: PrefKey.disableCombinedBrightness.rawValue) && command == .brightness) ? max(0, self.readPrefAsFloat(for: command) - self.combinedBrightnessSwitchingValue()) * (1 / (1 - self.combinedBrightnessSwitchingValue())) : self.readPrefAsFloat(for: command)) + } + + func restoreDDCSettingsToDisplay(command: Command) { + if !self.smoothBrightnessRunning, !self.isSw(), !self.readPrefAsBool(key: .unavailableDDC, for: command), self.readPrefAsBool(key: .isTouched, for: command), prefs.integer(forKey: PrefKey.startupAction.rawValue) == StartupAction.write.rawValue, !app.safeMode { + let restoreValue = self.getDDCValueFromPrefs(command) + os_log("Restoring %{public}@ DDC value %{public}@ for %{public}@", type: .info, String(reflecting: command), String(restoreValue), self.name) + _ = self.writeDDCValues(command: command, value: restoreValue) + if command == .audioSpeakerVolume, self.readPrefAsBool(key: .enableMuteUnmute) { + let currentMuteValue = self.readPrefAsInt(for: .audioMuteScreenBlank) == 0 ? 2 : self.readPrefAsInt(for: .audioMuteScreenBlank) + os_log("- Writing last saved DDC value for Mute: %{public}@", type: .info, String(currentMuteValue)) + _ = self.writeDDCValues(command: .audioMuteScreenBlank, value: UInt16(currentMuteValue)) + } + } + } + func setupCurrentAndMaxValues(command: Command, firstrun: Bool = false) { var ddcValues: (UInt16, UInt16)? var maxDDCValue = UInt16(DDC_MAX_DETECT_LIMIT) var currentDDCValue: UInt16 switch command { - case .audioSpeakerVolume: currentDDCValue = UInt16(Float(self.DDC_MAX_DETECT_LIMIT) * 0.125) - case .contrast: currentDDCValue = UInt16(Float(self.DDC_MAX_DETECT_LIMIT) * 0.750) - default: currentDDCValue = UInt16(Float(self.DDC_MAX_DETECT_LIMIT) * 1.000) + case .audioSpeakerVolume: currentDDCValue = UInt16(Float(DDC_MAX_DETECT_LIMIT) * 0.125) + case .contrast: currentDDCValue = UInt16(Float(DDC_MAX_DETECT_LIMIT) * 0.750) + default: currentDDCValue = UInt16(Float(DDC_MAX_DETECT_LIMIT) * 1.000) } if command == .audioSpeakerVolume { - currentDDCValue = UInt16(Float(self.DDC_MAX_DETECT_LIMIT) * 0.125) // lower default audio value as high volume might rattle the user. + currentDDCValue = UInt16(Float(DDC_MAX_DETECT_LIMIT) * 0.125) // lower default audio value as high volume might rattle the user. } os_log("Setting up display %{public}@ for %{public}@", type: .info, String(self.identifier), String(reflecting: command)) if !self.isSw() { @@ -91,7 +105,7 @@ class OtherDisplay: Display { ddcValues = self.readDDCValues(for: command, tries: UInt(self.pollingCount), minReplyDelay: delay) if ddcValues != nil { (currentDDCValue, maxDDCValue) = ddcValues ?? (currentDDCValue, maxDDCValue) - self.processCurrentDDCValue(read: true, command: command, firstrun: firstrun, currentDDCValue: currentDDCValue) + self.processCurrentDDCValue(isReadFromDisplay: true, command: command, firstrun: firstrun, currentDDCValue: currentDDCValue) os_log("- DDC read successful.", type: .info) } else { os_log("- DDC read failed.", type: .info) @@ -102,21 +116,21 @@ class OtherDisplay: Display { if self.readPrefAsInt(key: .maxDDCOverride, for: command) > self.readPrefAsInt(key: .minDDCOverride, for: command) { self.savePref(self.readPrefAsInt(key: .maxDDCOverride, for: command), key: .maxDDC, for: command) } else { - self.savePref(min(Int(maxDDCValue), self.DDC_MAX_DETECT_LIMIT), key: .maxDDC, for: command) + self.savePref(min(Int(maxDDCValue), DDC_MAX_DETECT_LIMIT), key: .maxDDC, for: command) } if ddcValues == nil { - self.processCurrentDDCValue(read: false, command: command, firstrun: firstrun, currentDDCValue: currentDDCValue) - currentDDCValue = self.convValueToDDC(for: command, from: (!prefs.bool(forKey: PrefKey.disableCombinedBrightness.rawValue) && command == .brightness) ? max(0, self.readPrefAsFloat(for: command) - self.combinedBrightnessSwitchingValue()) * (1 / (1 - self.combinedBrightnessSwitchingValue())) : self.readPrefAsFloat(for: command)) + self.processCurrentDDCValue(isReadFromDisplay: false, command: command, firstrun: firstrun, currentDDCValue: currentDDCValue) + currentDDCValue = self.getDDCValueFromPrefs(command) } os_log("- Current DDC value: %{public}@", type: .info, String(currentDDCValue)) os_log("- Minimum DDC value: %{public}@ (overrides 0)", type: .info, String(self.readPrefAsInt(key: .minDDCOverride, for: command))) os_log("- Maximum DDC value: %{public}@ (overrides %{public}@)", type: .info, String(self.readPrefAsInt(key: .maxDDC, for: command)), String(maxDDCValue)) os_log("- Current internal value: %{public}@", type: .info, String(self.readPrefAsFloat(for: command))) os_log("- Command status: %{public}@", type: .info, self.readPrefAsBool(key: .isTouched, for: command) ? "Touched" : "Untouched") - if self.readPrefAsBool(key: .isTouched, for: command), prefs.integer(forKey: PrefKey.startupAction.rawValue) == StartupAction.write.rawValue, !app.safeMode { - os_log("- Writing last saved DDC values.", type: .info, self.name, String(reflecting: command)) - _ = self.writeDDCValues(command: command, value: currentDDCValue) + if command == .audioSpeakerVolume { + self.setupMuteUnMute() } + self.restoreDDCSettingsToDisplay(command: command) } else { self.savePref(self.prefExists(for: command) ? self.readPrefAsFloat(for: command) : Float(1), for: command) self.savePref(self.readPrefAsFloat(for: command), key: .SwBrightness) @@ -124,36 +138,24 @@ class OtherDisplay: Display { self.smoothBrightnessTransient = self.readPrefAsFloat(for: command) os_log("- Software controlled display current internal value: %{public}@", type: .info, String(self.readPrefAsFloat(for: command))) } - if command == .audioSpeakerVolume { - self.setupMuteUnMute() - } } func setupMuteUnMute() { - guard !self.readPrefAsBool(key: .unavailableDDC, for: .audioSpeakerVolume) else { + guard !self.isSw(), !self.readPrefAsBool(key: .unavailableDDC, for: .audioSpeakerVolume), self.readPrefAsBool(key: .enableMuteUnmute) else { return } - var currentMuteValue = self.readPrefAsInt(for: .audioMuteScreenBlank) - currentMuteValue = currentMuteValue == 0 ? 2 : currentMuteValue - var muteValues: (current: UInt16, max: UInt16)? - if self.readPrefAsBool(key: .enableMuteUnmute) { - if self.pollingCount != 0, !app.safeMode, prefs.integer(forKey: PrefKey.startupAction.rawValue) == StartupAction.read.rawValue { - os_log("Reading DDC from display %{public}@ times for Mute", type: .info, String(self.pollingCount)) - let delay = self.readPrefAsBool(key: .longerDelay) ? UInt64(40 * kMillisecondScale) : nil - muteValues = self.readDDCValues(for: .audioMuteScreenBlank, tries: UInt(self.pollingCount), minReplyDelay: delay) - if let muteValues = muteValues { - os_log("Success, current Mute setting: %{public}@", type: .info, String(muteValues.current)) - currentMuteValue = Int(muteValues.current) - } else { - os_log("Mute read failed", type: .info) - } - } - if self.readPrefAsBool(key: .isTouched, for: .audioSpeakerVolume), prefs.integer(forKey: PrefKey.startupAction.rawValue) == StartupAction.write.rawValue, !app.safeMode { - os_log("Writing last saved DDC value for Mute: %{public}@", type: .info, String(currentMuteValue)) - _ = self.writeDDCValues(command: .audioMuteScreenBlank, value: UInt16(currentMuteValue)) + var currentMuteValue = self.readPrefAsInt(for: .audioMuteScreenBlank) == 0 ? 2 : self.readPrefAsInt(for: .audioMuteScreenBlank) + if self.pollingCount != 0, !app.safeMode, prefs.integer(forKey: PrefKey.startupAction.rawValue) == StartupAction.read.rawValue { + os_log("- Reading DDC from display %{public}@ times for Mute", type: .info, String(self.pollingCount)) + let delay = self.readPrefAsBool(key: .longerDelay) ? UInt64(40 * kMillisecondScale) : nil + if let muteValues: (current: UInt16, max: UInt16) = self.readDDCValues(for: .audioMuteScreenBlank, tries: UInt(self.pollingCount), minReplyDelay: delay) { + os_log("- Success, current Mute setting: %{public}@", type: .info, String(muteValues.current)) + currentMuteValue = Int(muteValues.current) + } else { + os_log("- Mute read failed", type: .info) } - self.savePref(Int(currentMuteValue), for: .audioMuteScreenBlank) } + self.savePref(Int(currentMuteValue), for: .audioMuteScreenBlank) } func setupSliderCurrentValue(command: Command) -> Float { diff --git a/MonitorControl/Support/AppDelegate.swift b/MonitorControl/Support/AppDelegate.swift index ad44e97b..c2969191 100644 --- a/MonitorControl/Support/AppDelegate.swift +++ b/MonitorControl/Support/AppDelegate.swift @@ -20,6 +20,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { var sleepID: Int = 0 // sleep event ID var safeMode = false var jobRunning = false + var startupActionWriteCounter: Int = 0 var audioPlayer: AVAudioPlayer? let updaterController = SPUStandardUpdaterController(startingUpdater: false, updaterDelegate: UpdaterDelegate(), userDriverDelegate: nil) @@ -201,6 +202,23 @@ class AppDelegate: NSObject, NSApplicationDelegate { DisplayManager.shared.updateArm64AVServices() self.job(start: true) } + self.startupActionWriteRepeatAfterSober() + } + } + + private func startupActionWriteRepeatAfterSober(dispatchedCounter: Int = 0) { + let counter = dispatchedCounter == 0 ? 10 : dispatchedCounter + self.startupActionWriteCounter = dispatchedCounter == 0 ? counter : self.startupActionWriteCounter + guard prefs.integer(forKey: PrefKey.startupAction.rawValue) == StartupAction.write.rawValue, self.startupActionWriteCounter == counter else { + return + } + os_log("Sober write action repeat for DDC - %{public}@", type: .info, String(counter)) + DisplayManager.shared.restoreOtherDisplays() + self.startupActionWriteCounter = counter - 1 + if counter > 1 { + DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { + self.startupActionWriteRepeatAfterSober(dispatchedCounter: counter - 1) + } } } diff --git a/MonitorControl/Support/DisplayManager.swift b/MonitorControl/Support/DisplayManager.swift index aa24214e..27b35ee1 100644 --- a/MonitorControl/Support/DisplayManager.swift +++ b/MonitorControl/Support/DisplayManager.swift @@ -179,11 +179,8 @@ class DisplayManager { func setupOtherDisplays(firstrun: Bool = false) { for otherDisplay in self.getOtherDisplays() { - if !otherDisplay.isSw(), !otherDisplay.readPrefAsBool(key: .unavailableDDC, for: .audioSpeakerVolume) { - otherDisplay.setupCurrentAndMaxValues(command: .audioSpeakerVolume, firstrun: firstrun) - } - if !otherDisplay.isSw(), !otherDisplay.readPrefAsBool(key: .unavailableDDC, for: .contrast) { - otherDisplay.setupCurrentAndMaxValues(command: .contrast, firstrun: firstrun) + for command in [Command.audioSpeakerVolume, Command.contrast] where !otherDisplay.readPrefAsBool(key: .unavailableDDC, for: command) && !otherDisplay.isSw() { + otherDisplay.setupCurrentAndMaxValues(command: command, firstrun: firstrun) } if (!otherDisplay.isSw() && !otherDisplay.readPrefAsBool(key: .unavailableDDC, for: .brightness)) || otherDisplay.isSw() { otherDisplay.setupCurrentAndMaxValues(command: .brightness, firstrun: firstrun) @@ -192,6 +189,14 @@ class DisplayManager { } } + func restoreOtherDisplays() { + for otherDisplay in self.getDdcCapableDisplays() { + for command in [Command.contrast, Command.brightness] where !otherDisplay.readPrefAsBool(key: .unavailableDDC, for: command) { + otherDisplay.restoreDDCSettingsToDisplay(command: command) + } + } + } + func normalizedName(_ name: String) -> String { var normalizedName = name.replacingOccurrences(of: "(", with: "") normalizedName = normalizedName.replacingOccurrences(of: ")", with: "") diff --git a/MonitorControl/main.swift b/MonitorControl/main.swift index 538ff863..dccb5395 100644 --- a/MonitorControl/main.swift +++ b/MonitorControl/main.swift @@ -7,6 +7,7 @@ let DEBUG_SW = false let DEBUG_VIRTUAL = false let DEBUG_MACOS10 = false let DEBUG_GAMMA_ENFORCER = false +let DDC_MAX_DETECT_LIMIT: Int = 100 let MIN_PREVIOUS_BUILD_NUMBER = 6262 diff --git a/MonitorControlHelper/Info.plist b/MonitorControlHelper/Info.plist index d8bbb6a1..b52b1b91 100644 --- a/MonitorControlHelper/Info.plist +++ b/MonitorControlHelper/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 6767 + 6795 LSApplicationCategoryType public.app-category.utilities LSBackgroundOnly From 9b1795d769ef990f2fad29ef5d8a6eb7f5527004 Mon Sep 17 00:00:00 2001 From: Istvan T <37590873+waydabber@users.noreply.github.com> Date: Sun, 24 Oct 2021 12:01:17 +0200 Subject: [PATCH 002/101] Various fixes and improvements for 4.0.0 (#736) - Small change of wording under Displays to reflect the fact that software dimming is not always gamma now - Fixed an unneeded box control title leaking into localization files. - Updated Italian Localization - thanks to @picov - Fix: virtual displays are now properly ignored in gamma interference detection. - Fix for too long display names looking bad in menu - Fix for log errors about unneeded missing outlet connection errors - Improved reset for virtual and Apple displays. - Fixed menu showing blank space for display with no controls. - Made brightness availability changeable for built-in and virtual displays. - Updated french localization - thanks to @the0neyouseek --- MonitorControl/Info.plist | 2 +- MonitorControl/InternetAccessPolicy.plist | 28 +++++++++++++++ MonitorControl/Model/Display.swift | 5 ++- MonitorControl/Support/AppDelegate.swift | 2 +- MonitorControl/Support/MenuHandler.swift | 19 +++++----- MonitorControl/UI/Base.lproj/Main.storyboard | 19 ++++------ .../UI/de.lproj/Localizable.strings | 4 +-- MonitorControl/UI/de.lproj/Main.strings | 10 ++---- .../UI/en.lproj/Localizable.strings | 4 +-- MonitorControl/UI/en.lproj/Main.strings | 10 ++---- .../UI/fr.lproj/Localizable.strings | 18 +++++----- MonitorControl/UI/fr.lproj/Main.strings | 34 ++++++++---------- .../UI/hu.lproj/Localizable.strings | 4 +-- MonitorControl/UI/hu.lproj/Main.strings | 10 ++---- .../UI/it.lproj/Localizable.strings | 16 ++++----- MonitorControl/UI/it.lproj/Main.strings | 36 ++++++++----------- .../UI/ko.lproj/Localizable.strings | 4 +-- MonitorControl/UI/ko.lproj/Main.strings | 10 ++---- .../UI/nl.lproj/Localizable.strings | 4 +-- MonitorControl/UI/nl.lproj/Main.strings | 10 ++---- .../UI/tr.lproj/Localizable.strings | 4 +-- MonitorControl/UI/tr.lproj/Main.strings | 10 ++---- .../UI/zh-Hans.lproj/Localizable.strings | 4 +-- MonitorControl/UI/zh-Hans.lproj/Main.strings | 10 ++---- .../UI/zh-Hant-TW.lproj/Localizable.strings | 4 +-- .../UI/zh-Hant-TW.lproj/Main.strings | 10 ++---- .../DisplaysPrefsCellView.swift | 20 +++++------ .../DisplaysPrefsViewController.swift | 5 +-- MonitorControlHelper/Info.plist | 2 +- 29 files changed, 139 insertions(+), 179 deletions(-) diff --git a/MonitorControl/Info.plist b/MonitorControl/Info.plist index ace4cda0..05c4621c 100644 --- a/MonitorControl/Info.plist +++ b/MonitorControl/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 6795 + 6828 LSApplicationCategoryType public.app-category.utilities LSMinimumSystemVersion diff --git a/MonitorControl/InternetAccessPolicy.plist b/MonitorControl/InternetAccessPolicy.plist index efb7b82d..5f9afa2b 100644 --- a/MonitorControl/InternetAccessPolicy.plist +++ b/MonitorControl/InternetAccessPolicy.plist @@ -24,6 +24,34 @@ DenyConsequences SoftwareUpdateDenyConsequences + + IsIncoming + + Host + github.com + NetworkProtocol + TCP + Port + 443 + Purpose + SoftwareUpdatePurpose + DenyConsequences + SoftwareUpdateDenyConsequences + + + IsIncoming + + Host + githubusercontent.com + NetworkProtocol + TCP + Port + 443 + Purpose + SoftwareUpdatePurpose + DenyConsequences + SoftwareUpdateDenyConsequences + diff --git a/MonitorControl/Model/Display.swift b/MonitorControl/Model/Display.swift index f10ad566..a3b30f7b 100644 --- a/MonitorControl/Model/Display.swift +++ b/MonitorControl/Model/Display.swift @@ -91,6 +91,9 @@ class Display: Equatable { } func stepBrightness(isUp: Bool, isSmallIncrement: Bool) { + guard !self.readPrefAsBool(key: .unavailableDDC, for: .brightness) else { + return + } let value = self.calcNewBrightness(isUp: isUp, isSmallIncrement: isSmallIncrement) if self.setBrightness(value) { OSDUtils.showOsd(displayID: self.identifier, command: .brightness, value: value * 64, maxValue: 64) @@ -271,7 +274,7 @@ class Display: Equatable { func checkGammaInterference() { let currentSwBrightness = self.getSwBrightness() - guard !DisplayManager.shared.gammaInterferenceWarningShown, !(prefs.bool(forKey: PrefKey.disableCombinedBrightness.rawValue)), !self.readPrefAsBool(key: .avoidGamma), !self.smoothBrightnessRunning, self.prefExists(key: .SwBrightness), abs(currentSwBrightness - self.readPrefAsFloat(key: .SwBrightness)) > 0.02 else { + guard !DisplayManager.shared.gammaInterferenceWarningShown, !(prefs.bool(forKey: PrefKey.disableCombinedBrightness.rawValue)), !self.readPrefAsBool(key: .avoidGamma), !self.isVirtual, !self.smoothBrightnessRunning, self.prefExists(key: .SwBrightness), abs(currentSwBrightness - self.readPrefAsFloat(key: .SwBrightness)) > 0.02 else { return } DisplayManager.shared.gammaInterferenceCounter += 1 diff --git a/MonitorControl/Support/AppDelegate.swift b/MonitorControl/Support/AppDelegate.swift index c2969191..24c13831 100644 --- a/MonitorControl/Support/AppDelegate.swift +++ b/MonitorControl/Support/AppDelegate.swift @@ -210,7 +210,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { let counter = dispatchedCounter == 0 ? 10 : dispatchedCounter self.startupActionWriteCounter = dispatchedCounter == 0 ? counter : self.startupActionWriteCounter guard prefs.integer(forKey: PrefKey.startupAction.rawValue) == StartupAction.write.rawValue, self.startupActionWriteCounter == counter else { - return + return } os_log("Sober write action repeat for DDC - %{public}@", type: .info, String(counter)) DisplayManager.shared.restoreOtherDisplays() diff --git a/MonitorControl/Support/MenuHandler.swift b/MonitorControl/Support/MenuHandler.swift index 1cacdf3e..f05d80fc 100644 --- a/MonitorControl/Support/MenuHandler.swift +++ b/MonitorControl/Support/MenuHandler.swift @@ -113,14 +113,15 @@ class MenuHandler: NSMenu, NSMenuDelegate { contentWidth = max(addedSliderHandler.view!.frame.width, contentWidth) contentHeight += addedSliderHandler.view!.frame.height } + let margin = CGFloat(13) var blockNameView: NSTextField? if blockName != "" { contentHeight += 21 let attrs: [NSAttributedString.Key: Any] = [.foregroundColor: NSColor.textColor, .font: NSFont.boldSystemFont(ofSize: 12)] blockNameView = NSTextField(labelWithAttributedString: NSAttributedString(string: blockName, attributes: attrs)) + blockNameView?.frame.size.width = contentWidth - margin * 2 blockNameView?.alphaValue = 0.5 } - let margin = CGFloat(13) let itemView = BlockView(frame: NSRect(x: 0, y: 0, width: contentWidth + margin * 2, height: contentHeight + margin * 2)) var sliderPosition = CGFloat(margin * -1 + 1) for addedSliderHandler in addedSliderHandlers { @@ -134,7 +135,9 @@ class MenuHandler: NSMenu, NSMenuDelegate { } let item = NSMenuItem() item.view = itemView - monitorSubMenu.insertItem(item, at: 0) + if addedSliderHandlers.count != 0 { + monitorSubMenu.insertItem(item, at: 0) + } } else { for addedSliderHandler in addedSliderHandlers { self.addSliderItem(monitorSubMenu: monitorSubMenu, sliderHandler: addedSliderHandler) @@ -220,8 +223,8 @@ class MenuHandler: NSMenu, NSMenuDelegate { preferencesIcon.bezelStyle = .regularSquare preferencesIcon.isBordered = false preferencesIcon.setButtonType(.momentaryChange) - preferencesIcon.image = NSImage(systemSymbolName: "gearshape", accessibilityDescription: NSLocalizedString("Preferences...", comment: "Shown in menu")) - preferencesIcon.alternateImage = NSImage(systemSymbolName: "gearshape.fill", accessibilityDescription: NSLocalizedString("Preferences...", comment: "Shown in menu")) + preferencesIcon.image = NSImage(systemSymbolName: "gearshape", accessibilityDescription: NSLocalizedString("Preferences…", comment: "Shown in menu")) + preferencesIcon.alternateImage = NSImage(systemSymbolName: "gearshape.fill", accessibilityDescription: NSLocalizedString("Preferences…", comment: "Shown in menu")) preferencesIcon.alphaValue = 0.3 preferencesIcon.frame = NSRect(x: menuItemView.frame.maxX - iconSize * 3 - 30 - 16 + compensateForBlock, y: menuItemView.frame.origin.y + 5, width: iconSize, height: iconSize) preferencesIcon.imageScaling = .scaleProportionallyUpOrDown @@ -232,8 +235,8 @@ class MenuHandler: NSMenu, NSMenuDelegate { updateIcon.isBordered = false updateIcon.setButtonType(.momentaryChange) var symbolName = prefs.bool(forKey: PrefKey.showTickMarks.rawValue) ? "arrow.left.arrow.right.square" : "arrow.triangle.2.circlepath.circle" - updateIcon.image = NSImage(systemSymbolName: symbolName, accessibilityDescription: NSLocalizedString("Check for updates...", comment: "Shown in menu")) - updateIcon.alternateImage = NSImage(systemSymbolName: symbolName + ".fill", accessibilityDescription: NSLocalizedString("Check for updates...", comment: "Shown in menu")) + updateIcon.image = NSImage(systemSymbolName: symbolName, accessibilityDescription: NSLocalizedString("Check for updates…", comment: "Shown in menu")) + updateIcon.alternateImage = NSImage(systemSymbolName: symbolName + ".fill", accessibilityDescription: NSLocalizedString("Check for updates…", comment: "Shown in menu")) updateIcon.alphaValue = 0.3 updateIcon.frame = NSRect(x: menuItemView.frame.maxX - iconSize * 2 - 10 - 16 + compensateForBlock, y: menuItemView.frame.origin.y + 5, width: iconSize, height: iconSize) @@ -263,8 +266,8 @@ class MenuHandler: NSMenu, NSMenuDelegate { if app.macOS10() { self.insertItem(NSMenuItem.separator(), at: self.items.count) } - self.insertItem(withTitle: NSLocalizedString("Preferences...", comment: "Shown in menu"), action: #selector(app.prefsClicked), keyEquivalent: "", at: self.items.count) - let updateItem = NSMenuItem(title: NSLocalizedString("Check for updates...", comment: "Shown in menu"), action: #selector(app.updaterController.checkForUpdates(_:)), keyEquivalent: "") + self.insertItem(withTitle: NSLocalizedString("Preferences…", comment: "Shown in menu"), action: #selector(app.prefsClicked), keyEquivalent: "", at: self.items.count) + let updateItem = NSMenuItem(title: NSLocalizedString("Check for updates…", comment: "Shown in menu"), action: #selector(app.updaterController.checkForUpdates(_:)), keyEquivalent: "") updateItem.target = app.updaterController self.insertItem(updateItem, at: self.items.count) self.insertItem(withTitle: NSLocalizedString("Quit", comment: "Shown in menu"), action: #selector(app.quitClicked), keyEquivalent: "q", at: self.items.count) diff --git a/MonitorControl/UI/Base.lproj/Main.storyboard b/MonitorControl/UI/Base.lproj/Main.storyboard index 9b9a5b5e..6e21e43d 100644 --- a/MonitorControl/UI/Base.lproj/Main.storyboard +++ b/MonitorControl/UI/Base.lproj/Main.storyboard @@ -684,16 +684,10 @@ - - - - - - @@ -1195,12 +1189,8 @@ - - - - @@ -1219,7 +1209,7 @@ - + @@ -1348,7 +1338,7 @@ - + @@ -1842,7 +1832,7 @@ - + @@ -2068,6 +2058,9 @@ + + + diff --git a/MonitorControl/UI/de.lproj/Localizable.strings b/MonitorControl/UI/de.lproj/Localizable.strings index 67e0dfd9..bc8b5c09 100644 --- a/MonitorControl/UI/de.lproj/Localizable.strings +++ b/MonitorControl/UI/de.lproj/Localizable.strings @@ -23,7 +23,7 @@ "Built-in Display" = "Integrierter Monitor"; /* Shown in menu */ -"Check for updates..." = "Nach Updates suchen..."; +"Check for updates…" = "Nach Updates suchen…"; /* Shown in menu */ "Contrast" = "Kontrast"; @@ -86,7 +86,7 @@ "Preferences for an incompatible previous app version detected. Default preferences are reloaded." = "Einstellungen für eine inkompatible Vorgängerversion des Programms erkannt. Die Standardeinstellungen werden neu geladen."; /* Shown in menu */ -"Preferences..." = "Einstellungen..."; +"Preferences…" = "Einstellungen…"; /* Shown in menu */ "Quit" = "Beenden"; diff --git a/MonitorControl/UI/de.lproj/Main.strings b/MonitorControl/UI/de.lproj/Main.strings index ac732908..40f576a4 100644 --- a/MonitorControl/UI/de.lproj/Main.strings +++ b/MonitorControl/UI/de.lproj/Main.strings @@ -13,18 +13,12 @@ /* Class = "NSTextFieldCell"; title = "DDC min"; ObjectID = "1zE-fg-xEm"; */ "1zE-fg-xEm.title" = "DDC min"; -/* Class = "NSBox"; title = "Box"; ObjectID = "3a3-In-jeQ"; */ -"3a3-In-jeQ.title" = "Box"; - /* Class = "NSMenuItem"; title = "Show separate controls for each display in menu"; ObjectID = "3eO-bN-ZRl"; */ "3eO-bN-ZRl.title" = "Separate Steuerung für jeden Monitor im Menü anzeigen"; /* Class = "NSMenuItem"; title = "Apply last saved values to the display"; ObjectID = "3Jr-bW-YYq"; */ "3Jr-bW-YYq.title" = "Zuletzt gespeicherte Werte auf den Monitor anwenden"; -/* Class = "NSButtonCell"; title = "https://monitorcontrol.app"; ObjectID = "42n-Zy-AqF"; */ -"42n-Zy-AqF.title" = "https://monitorcontrol.app"; - /* Class = "NSMenuItem"; title = "Custom keyboard shortcuts"; ObjectID = "4CG-0I-anB"; */ "4CG-0I-anB.title" = "Benutzerdefinierte Tastaturkürzel"; @@ -73,8 +67,8 @@ /* Class = "NSTextFieldCell"; title = "Brightness:"; ObjectID = "Bhb-6l-uPQ"; */ "Bhb-6l-uPQ.title" = "Helligkeit:"; -/* Class = "NSTextFieldCell"; title = "(Gamma->DDC)"; ObjectID = "Bid-UL-blc"; */ -"Bid-UL-blc.title" = "(Gamma->DDC)"; +/* Class = "NSTextFieldCell"; title = "(Software->DDC)"; ObjectID = "Bid-UL-blc"; */ +"Bid-UL-blc.title" = "(Software->DDC)"; /* Class = "NSTextFieldCell"; title = "For hardware (DDC) controlled displays only. Results may vary."; ObjectID = "bIe-6O-xEH"; */ "bIe-6O-xEH.title" = "Nur für hardwaregesteuerte (DDC) Monitore. Die Ergebnisse können variieren."; diff --git a/MonitorControl/UI/en.lproj/Localizable.strings b/MonitorControl/UI/en.lproj/Localizable.strings index e1b4db48..c3f87ad7 100644 --- a/MonitorControl/UI/en.lproj/Localizable.strings +++ b/MonitorControl/UI/en.lproj/Localizable.strings @@ -23,7 +23,7 @@ "Built-in Display" = "Built-in Display"; /* Shown in menu */ -"Check for updates..." = "Check for updates..."; +"Check for updates…" = "Check for updates…"; /* Shown in menu */ "Contrast" = "Contrast"; @@ -86,7 +86,7 @@ "Preferences for an incompatible previous app version detected. Default preferences are reloaded." = "Preferences for an incompatible previous app version detected. Default preferences are reloaded."; /* Shown in menu */ -"Preferences..." = "Preferences..."; +"Preferences…" = "Preferences…"; /* Shown in menu */ "Quit" = "Quit"; diff --git a/MonitorControl/UI/en.lproj/Main.strings b/MonitorControl/UI/en.lproj/Main.strings index 7cb5e86a..a05bb849 100644 --- a/MonitorControl/UI/en.lproj/Main.strings +++ b/MonitorControl/UI/en.lproj/Main.strings @@ -13,18 +13,12 @@ /* Class = "NSTextFieldCell"; title = "DDC min"; ObjectID = "1zE-fg-xEm"; */ "1zE-fg-xEm.title" = "DDC min"; -/* Class = "NSBox"; title = "Box"; ObjectID = "3a3-In-jeQ"; */ -"3a3-In-jeQ.title" = "Box"; - /* Class = "NSMenuItem"; title = "Show separate controls for each display in menu"; ObjectID = "3eO-bN-ZRl"; */ "3eO-bN-ZRl.title" = "Show separate controls for each display in menu"; /* Class = "NSMenuItem"; title = "Apply last saved values to the display"; ObjectID = "3Jr-bW-YYq"; */ "3Jr-bW-YYq.title" = "Apply last saved values to the display"; -/* Class = "NSButtonCell"; title = "https://monitorcontrol.app"; ObjectID = "42n-Zy-AqF"; */ -"42n-Zy-AqF.title" = "https://monitorcontrol.app"; - /* Class = "NSMenuItem"; title = "Custom keyboard shortcuts"; ObjectID = "4CG-0I-anB"; */ "4CG-0I-anB.title" = "Custom keyboard shortcuts"; @@ -73,8 +67,8 @@ /* Class = "NSTextFieldCell"; title = "Brightness:"; ObjectID = "Bhb-6l-uPQ"; */ "Bhb-6l-uPQ.title" = "Brightness:"; -/* Class = "NSTextFieldCell"; title = "(Gamma->DDC)"; ObjectID = "Bid-UL-blc"; */ -"Bid-UL-blc.title" = "(Gamma->DDC)"; +/* Class = "NSTextFieldCell"; title = "(Software->DDC)"; ObjectID = "Bid-UL-blc"; */ +"Bid-UL-blc.title" = "(Software->DDC)"; /* Class = "NSTextFieldCell"; title = "For hardware (DDC) controlled displays only. Results may vary."; ObjectID = "bIe-6O-xEH"; */ "bIe-6O-xEH.title" = "For hardware (DDC) controlled displays only. Results may vary."; diff --git a/MonitorControl/UI/fr.lproj/Localizable.strings b/MonitorControl/UI/fr.lproj/Localizable.strings index 3a5dd1d8..0d8e458b 100644 --- a/MonitorControl/UI/fr.lproj/Localizable.strings +++ b/MonitorControl/UI/fr.lproj/Localizable.strings @@ -23,7 +23,7 @@ "Built-in Display" = "Écran intégré"; /* Shown in menu */ -"Check for updates..." = "Vérifier les mises à jour…"; +"Check for updates…" = "Vérifier les mises à jour…"; /* Shown in menu */ "Contrast" = "Contraste"; @@ -35,7 +35,7 @@ "Decrease" = "Diminuer"; /* Shown in the alert dialog */ -"Disable gamma control for my displays" = "Disable gamma control for my displays"; +"Disable gamma control for my displays" = "Désactiver le contrôle gamma pour mes écrans"; /* Shown in the main prefs window */ "Displays" = "Écrans"; @@ -50,13 +50,13 @@ "General" = "Général"; /* Shown in the Display Preferences */ -"Hardware (Apple)" = "Hardware (Apple)"; +"Hardware (Apple)" = "Matériel (Apple)"; /* Shown in the Display Preferences */ "Hardware (DDC)" = "Matériel (DDC)"; /* Shown in the alert dialog */ -"I'll quit the other app" = "I'll quit the other app"; +"I'll quit the other app" = "Je vais quitter l'autre application"; /* Shown in the alert dialog */ "Incompatible previous version" = "Version précédente incompatible"; @@ -65,7 +65,7 @@ "Increase" = "Augmenter"; /* Shown in the alert dialog */ -"Is f.lux or similar running?" = "Is f.lux or similar running?"; +"Is f.lux or similar running?" = "Est-ce que f.lux ou similaire est lancé ?"; /* Shown in the main prefs window */ "Keyboard" = "Clavier"; @@ -77,7 +77,7 @@ "No" = "Non"; /* Shown in the Display Preferences */ -"No Control" = "Aucun control"; +"No Control" = "Aucun contrôle"; /* Shown in the Display Preferences */ "Other Display" = "Autre écran"; @@ -86,7 +86,7 @@ "Preferences for an incompatible previous app version detected. Default preferences are reloaded." = "Préférences pour une version précédente incompatible détéctés. Les préférences par défaut seront rechargées."; /* Shown in menu */ -"Preferences..." = "Préférences..."; +"Preferences…" = "Préférences…"; /* Shown in menu */ "Quit" = "Quitter"; @@ -104,7 +104,7 @@ "Shortcuts not available" = "Raccourcis non disponible"; /* Shown in the Display Preferences */ -"Software (gamma)" = "Logiciel (gamma)"; +"Software (gamma)" = "Logiciel (Gamma)"; /* Shown in the Display Preferences */ "Software (gamma, forced)" = "Logiciel (Gamma, Forcé)"; @@ -113,7 +113,7 @@ "Software (shade)" = "Logiciel (Voile)"; /* Shown in the Display Preferences */ -"Software (shade, forced)" = "Software (shade, forced)"; +"Software (shade, forced)" = "Logiciel (Voile, Forcé)"; /* Shown in the Display Preferences */ "This display allows for software brightness control via gamma table manipulation or shade as it does not support hardware control. Reasons for this might be using the HDMI port of a Mac mini (which blocks hardware DDC control) or having a blacklisted display." = "Cet écran permet un contrôle de la luminosité logiciel via une manipulation des tables gamma car il ne prend pas en charge le contrôle matériel. Cela peut être dû à l'utilisation du port HDMI d'un Mac mini (qui bloque le contrôle DDC matériel) ou à un écran sur liste noire."; diff --git a/MonitorControl/UI/fr.lproj/Main.strings b/MonitorControl/UI/fr.lproj/Main.strings index a3d96a92..96f511db 100644 --- a/MonitorControl/UI/fr.lproj/Main.strings +++ b/MonitorControl/UI/fr.lproj/Main.strings @@ -1,5 +1,5 @@ /* Class = "NSButtonCell"; title = "Sync brightness changes from Built-in and Apple displays"; ObjectID = "0ca-DG-AgB"; */ -"0ca-DG-AgB.title" = "Synchronisez les changements de luminosité à partir des écrans intégrés et Apple"; +"0ca-DG-AgB.title" = "Synchronisez la luminosité à partir des écrans intégrés et Apple"; /* Class = "NSMenuItem"; title = "Assume last saved settings are valid (recommended)"; ObjectID = "1in-79-6qm"; */ "1in-79-6qm.title" = "Supposer que les derniers paramètres enregistrés sont valides (recommandé)"; @@ -13,17 +13,11 @@ /* Class = "NSTextFieldCell"; title = "DDC min"; ObjectID = "1zE-fg-xEm"; */ "1zE-fg-xEm.title" = "min. DDC"; -/* Class = "NSBox"; title = "Box"; ObjectID = "3a3-In-jeQ"; */ -"3a3-In-jeQ.title" = "Box"; - /* Class = "NSMenuItem"; title = "Show separate controls for each display in menu"; ObjectID = "3eO-bN-ZRl"; */ "3eO-bN-ZRl.title" = "Afficher des commandes distinctes pour chaque écran dans le menu"; /* Class = "NSMenuItem"; title = "Apply last saved values to the display"; ObjectID = "3Jr-bW-YYq"; */ -"3Jr-bW-YYq.title" = "Appliquer les dernières valeurs enregistrées à l'écran'"; - -/* Class = "NSButtonCell"; title = "https://monitorcontrol.app"; ObjectID = "42n-Zy-AqF"; */ -"42n-Zy-AqF.title" = "https://monitorcontrol.app"; +"3Jr-bW-YYq.title" = "Appliquer les dernières valeurs enregistrées à l'écran"; /* Class = "NSMenuItem"; title = "Custom keyboard shortcuts"; ObjectID = "4CG-0I-anB"; */ "4CG-0I-anB.title" = "Raccourcis clavier personnalisés"; @@ -38,7 +32,7 @@ "6mo-7S-oOO.title" = "Toujours masquer"; /* Class = "NSTextFieldCell"; title = "Slider behavior:"; ObjectID = "75n-7M-1mS"; */ -"75n-7M-1mS.title" = "Comportement des curseurs:"; +"75n-7M-1mS.title" = "Comportement des curseurs :"; /* Class = "NSButtonCell"; title = "Show slider tick marks"; ObjectID = "7zf-m1-gJO"; */ "7zf-m1-gJO.title" = "Afficher des marques de graduation"; @@ -73,8 +67,8 @@ /* Class = "NSTextFieldCell"; title = "Brightness:"; ObjectID = "Bhb-6l-uPQ"; */ "Bhb-6l-uPQ.title" = "Luminosité:"; -/* Class = "NSTextFieldCell"; title = "(Gamma->DDC)"; ObjectID = "Bid-UL-blc"; */ -"Bid-UL-blc.title" = "(Gamma → DDC)"; +/* Class = "NSTextFieldCell"; title = "(Software->DDC)"; ObjectID = "Bid-UL-blc"; */ +"Bid-UL-blc.title" = "(Logiciel → DDC)"; /* Class = "NSTextFieldCell"; title = "For hardware (DDC) controlled displays only. Results may vary."; ObjectID = "bIe-6O-xEH"; */ "bIe-6O-xEH.title" = "Pour les écrans contrôlés par matériel (DDC) uniquement. Les résultats peuvent varier."; @@ -83,10 +77,10 @@ "bkM-Px-U3b.title" = "Désactiver l'OSD du volume macOS"; /* Class = "NSTextFieldCell"; title = "OSD scale:"; ObjectID = "bP4-GJ-vhJ"; */ -"bP4-GJ-vhJ.title" = "Échelle de l'OSD:"; +"bP4-GJ-vhJ.title" = "Échelle de l'OSD :"; /* Class = "NSTextFieldCell"; title = "OSD scale:"; ObjectID = "Bqc-s3-C0w"; */ -"Bqc-s3-C0w.title" = "Échelle de l'OSD:"; +"Bqc-s3-C0w.title" = "Échelle de l'OSD :"; /* Class = "NSButtonCell"; title = "Reset settings"; ObjectID = "BYS-7Y-bRz"; */ "BYS-7Y-bRz.title" = "Réinitialiser les options"; @@ -122,7 +116,7 @@ "Eq3-z9-yIo.title" = "Minimal"; /* Class = "NSTextFieldCell"; title = "Scale mapping curve"; ObjectID = "Eui-5S-JR6"; */ -"Eui-5S-JR6.title" = "Courbe de mappage d'échelle"; +"Eui-5S-JR6.title" = "Courbe d'échelle"; /* Class = "NSTextFieldCell"; title = "Mute:"; ObjectID = "EvN-FT-vdZ"; */ "EvN-FT-vdZ.title" = "Sourdine :"; @@ -143,7 +137,7 @@ "FER-Ri-4UO.title" = "Volume :"; /* Class = "NSButtonCell"; title = "Allow zero brightness via software or combined dimming"; ObjectID = "FjB-XL-fG5"; */ -"FjB-XL-fG5.title" = "Allow zero brightness via software or combined dimming"; +"FjB-XL-fG5.title" = "Autoriser une luminosité nulle via le contrôle logiciel ou combiné"; /* Class = "NSTextFieldCell"; title = "Apple and built-in displays already have a brightness slider in Control Center."; ObjectID = "fmZ-HI-Mdc"; */ "fmZ-HI-Mdc.title" = "Les écrans Apple et intégrés ont déjà un curseur de luminosité dans le Centre de Contrôle."; @@ -215,7 +209,7 @@ "lA0-tv-qRs.title" = "Utiliser un curseur combiné pour tous les écrans"; /* Class = "NSTextFieldCell"; title = "Brightness and contrast:"; ObjectID = "LO4-4k-gxY"; */ -"LO4-4k-gxY.title" = "Contrôle de la luminosité et du contraste :"; +"LO4-4k-gxY.title" = "Luminosité et contraste :"; /* Class = "NSTextFieldCell"; title = "Display type:"; ObjectID = "lSJ-6w-KJ2"; */ "lSJ-6w-KJ2.title" = "Type d'écran :"; @@ -239,7 +233,7 @@ "MWo-6I-s9L.title" = "Afficher le curseur de luminosité dans le menu"; /* Class = "NSButtonCell"; title = "Avoid gamma table manipulation"; ObjectID = "na6-mS-MPi"; */ -"na6-mS-MPi.title" = "Avoid gamma table manipulation"; +"na6-mS-MPi.title" = "Éviter de manipuler la table gamma"; /* Class = "NSButtonCell"; title = "Separate scales for combined hardware & software dimming"; ObjectID = "O8o-hI-8eR"; */ "O8o-hI-8eR.title" = "Séparer les échelles pour le contrôle matériel et logiciel combiné"; @@ -281,7 +275,7 @@ "qO0-dB-yUs.title" = "Afficher le curseur de contraste dans le menu"; /* Class = "NSTextFieldCell"; title = "Volume control (DDC only):"; ObjectID = "qoh-Gn-f11"; */ -"qoh-Gn-f11.title" = "Contrôle du volume (DDC uniquement) :"; +"qoh-Gn-f11.title" = "Contrôle du volume (DDC) :"; /* Class = "NSTextFieldCell"; title = "Show percentage next to slider for more precision."; ObjectID = "qXy-CL-Wf1"; */ "qXy-CL-Wf1.title" = "Afficher le pourcentage à côté du curseur pour plus de précision."; @@ -323,7 +317,7 @@ "vri-pv-tJ4.title" = "Plusieurs écrans :"; /* Class = "NSTextFieldCell"; title = "DDC read polling mode:"; ObjectID = "vwm-hY-on5"; */ -"vwm-hY-on5.title" = "Mode d'interrogation de lecture DDC:"; +"vwm-hY-on5.title" = "Mode d'interrogation de lecture DDC :"; /* Class = "NSTextFieldCell"; title = "General options:"; ObjectID = "W58-ch-j69"; */ "W58-ch-j69.title" = "Options générales :"; @@ -356,7 +350,7 @@ "YHZ-VL-QJ3.title" = "L'échelle de l'OSD complète sera disponible pour le contrôle de la luminosité matériel et après avoir atteint une luminosité de 0, un contrôle logiciel supplémentaire sera utilisée."; /* Class = "NSTextFieldCell"; title = "Warning! With this option enabled, you might find yourself in a position when you end up with a blank display. This, combined with disabled keyboard controls can be frustrating."; ObjectID = "yi3-e1-wsL"; */ -"yi3-e1-wsL.title" = "Warning! With this option enabled, you might find yourself in a position when you end up with a blank display. This, combined with disabled keyboard controls can be frustrating."; +"yi3-e1-wsL.title" = "Attention ! Avec cette option activée, vous pourriez vous retrouver dans une position où l'écran s'éteint. Ceci, combiné à des commandes de clavier désactivées, peut être frustrant."; /* Class = "NSTextFieldCell"; title = "Identifier:"; ObjectID = "YqZ-LS-YvR"; */ "YqZ-LS-YvR.title" = "Identifiant :"; diff --git a/MonitorControl/UI/hu.lproj/Localizable.strings b/MonitorControl/UI/hu.lproj/Localizable.strings index 2d9ced62..61c9caf7 100644 --- a/MonitorControl/UI/hu.lproj/Localizable.strings +++ b/MonitorControl/UI/hu.lproj/Localizable.strings @@ -23,7 +23,7 @@ "Built-in Display" = "Beépített"; /* Shown in menu */ -"Check for updates..." = "Frissítések ellenőrzése..."; +"Check for updates…" = "Frissítések ellenőrzése…"; /* Shown in menu */ "Contrast" = "Kontraszt"; @@ -86,7 +86,7 @@ "Preferences for an incompatible previous app version detected. Default preferences are reloaded." = "Az előző alkalmazásverzió beállításai nem kompatibilisek ezzel a verzióval. Visszaállítottuk az alapértelmezett beállításokat."; /* Shown in menu */ -"Preferences..." = "Beállítások..."; +"Preferences…" = "Beállítások…"; /* Shown in menu */ "Quit" = "Kilépés"; diff --git a/MonitorControl/UI/hu.lproj/Main.strings b/MonitorControl/UI/hu.lproj/Main.strings index 54ebd009..c7fd1cb8 100644 --- a/MonitorControl/UI/hu.lproj/Main.strings +++ b/MonitorControl/UI/hu.lproj/Main.strings @@ -13,18 +13,12 @@ /* Class = "NSTextFieldCell"; title = "DDC min"; ObjectID = "1zE-fg-xEm"; */ "1zE-fg-xEm.title" = "DDC min"; -/* Class = "NSBox"; title = "Box"; ObjectID = "3a3-In-jeQ"; */ -"3a3-In-jeQ.title" = "Box"; - /* Class = "NSMenuItem"; title = "Show separate controls for each display in menu"; ObjectID = "3eO-bN-ZRl"; */ "3eO-bN-ZRl.title" = "Külön vezérlő minden képernyő számára"; /* Class = "NSMenuItem"; title = "Apply last saved values to the display"; ObjectID = "3Jr-bW-YYq"; */ "3Jr-bW-YYq.title" = "Utolsó mentett értékek elküldése a kijelzőnek"; -/* Class = "NSButtonCell"; title = "https://monitorcontrol.app"; ObjectID = "42n-Zy-AqF"; */ -"42n-Zy-AqF.title" = "https://monitorcontrol.app"; - /* Class = "NSMenuItem"; title = "Custom keyboard shortcuts"; ObjectID = "4CG-0I-anB"; */ "4CG-0I-anB.title" = "Egyéni billentyűkombinációk"; @@ -73,8 +67,8 @@ /* Class = "NSTextFieldCell"; title = "Brightness:"; ObjectID = "Bhb-6l-uPQ"; */ "Bhb-6l-uPQ.title" = "Fényerő:"; -/* Class = "NSTextFieldCell"; title = "(Gamma->DDC)"; ObjectID = "Bid-UL-blc"; */ -"Bid-UL-blc.title" = "(Gamma->DDC)"; +/* Class = "NSTextFieldCell"; title = "(Software->DDC)"; ObjectID = "Bid-UL-blc"; */ +"Bid-UL-blc.title" = "(Szoftver->DDC)"; /* Class = "NSTextFieldCell"; title = "For hardware (DDC) controlled displays only. Results may vary."; ObjectID = "bIe-6O-xEH"; */ "bIe-6O-xEH.title" = "Hardveresen (DDC) vezérelt kijelzők esetén működhet."; diff --git a/MonitorControl/UI/it.lproj/Localizable.strings b/MonitorControl/UI/it.lproj/Localizable.strings index 15fb9497..26fa7590 100644 --- a/MonitorControl/UI/it.lproj/Localizable.strings +++ b/MonitorControl/UI/it.lproj/Localizable.strings @@ -23,7 +23,7 @@ "Built-in Display" = "Monitor Integrato"; /* Shown in menu */ -"Check for updates..." = "Controlla aggiornamneti..."; +"Check for updates…" = "Controlla aggiornamenti…"; /* Shown in menu */ "Contrast" = "Contrasto"; @@ -35,7 +35,7 @@ "Decrease" = "Diminiusci"; /* Shown in the alert dialog */ -"Disable gamma control for my displays" = "Disable gamma control for my displays"; +"Disable gamma control for my displays" = "Disabilita controllo gamma per i miei monitor"; /* Shown in the main prefs window */ "Displays" = "Monitor"; @@ -56,7 +56,7 @@ "Hardware (DDC)" = "Hardware (DDC)"; /* Shown in the alert dialog */ -"I'll quit the other app" = "I'll quit the other app"; +"I'll quit the other app" = "Chiuderò le altre applicazioni"; /* Shown in the alert dialog */ "Incompatible previous version" = "Versione precedente incompatibile"; @@ -65,7 +65,7 @@ "Increase" = "Aumenta"; /* Shown in the alert dialog */ -"Is f.lux or similar running?" = "Is f.lux or similar running?"; +"Is f.lux or similar running?" = "E' attivo f.lux or simile?"; /* Shown in the main prefs window */ "Keyboard" = "Tastiera"; @@ -86,7 +86,7 @@ "Preferences for an incompatible previous app version detected. Default preferences are reloaded." = "Le impostazioni di una versione precedente incompatibile sono state trovate. Verranno caricate le impostazioni di default."; /* Shown in menu */ -"Preferences..." = "Preferenze..."; +"Preferences…" = "Preferenze…"; /* Shown in menu */ "Quit" = "Esci"; @@ -107,13 +107,13 @@ "Software (gamma)" = "Software (gamma)"; /* Shown in the Display Preferences */ -"Software (gamma, forced)" = "Software (Gamma, Forzata)"; +"Software (gamma, forced)" = "Software (gamma, forzata)"; /* Shown in the Display Preferences */ -"Software (shade)" = "Software (Sfumatura)"; +"Software (shade)" = "Software (attenuazione)"; /* Shown in the Display Preferences */ -"Software (shade, forced)" = "Software (shade, forced)"; +"Software (shade, forced)" = "Software (attenuazione, forzata)"; /* Shown in the Display Preferences */ "This display allows for software brightness control via gamma table manipulation or shade as it does not support hardware control. Reasons for this might be using the HDMI port of a Mac mini (which blocks hardware DDC control) or having a blacklisted display." = "Questo monitor permette il controllo software della luminositò attraverso la manipolazione della gammatable e non supporta un controllo hardware. Un motivo potrebbe essere Reasons l'utilizzo della porta HDMI su un Mac Mini (che blocca il controllo hardware DCC) oppure avere un monitor non supportato."; diff --git a/MonitorControl/UI/it.lproj/Main.strings b/MonitorControl/UI/it.lproj/Main.strings index 5ae3e9ac..88e44d57 100644 --- a/MonitorControl/UI/it.lproj/Main.strings +++ b/MonitorControl/UI/it.lproj/Main.strings @@ -13,20 +13,14 @@ /* Class = "NSTextFieldCell"; title = "DDC min"; ObjectID = "1zE-fg-xEm"; */ "1zE-fg-xEm.title" = "Min DDC"; -/* Class = "NSBox"; title = "Box"; ObjectID = "3a3-In-jeQ"; */ -"3a3-In-jeQ.title" = "Box"; - /* Class = "NSMenuItem"; title = "Show separate controls for each display in menu"; ObjectID = "3eO-bN-ZRl"; */ "3eO-bN-ZRl.title" = "Mostra slider separati per ciascun monitor nel menu"; /* Class = "NSMenuItem"; title = "Apply last saved values to the display"; ObjectID = "3Jr-bW-YYq"; */ "3Jr-bW-YYq.title" = "Applica al monitor gli ultimi valori salvati"; -/* Class = "NSButtonCell"; title = "https://monitorcontrol.app"; ObjectID = "42n-Zy-AqF"; */ -"42n-Zy-AqF.title" = "https://monitorcontrol.app"; - /* Class = "NSMenuItem"; title = "Custom keyboard shortcuts"; ObjectID = "4CG-0I-anB"; */ -"4CG-0I-anB.title" = "Abreviazioni da tastiera personalizzate"; +"4CG-0I-anB.title" = "Abbreviazioni da tastiera personalizzate"; /* Class = "NSTextFieldCell"; title = "Using window focus might not work properly with full screen apps."; ObjectID = "4dX-o1-xAc"; */ "4dX-o1-xAc.title" = "L'utilizzo del focus sulla finestra potrebbe non funzionare sulle applicazioni a pieno schermo."; @@ -44,7 +38,7 @@ "7zf-m1-gJO.title" = "Mostra i marcatori nello slider"; /* Class = "NSTextFieldCell"; title = "Slider knob will snap to 0%, 25%, 50%, 75% and 100% when in proximity making setting these values easier. Disable for finer control."; ObjectID = "8Gx-Ya-zhp"; */ -"8Gx-Ya-zhp.title" = "Lo slider scatta nele posizioni 0%, 25%, 50%, 75% e 100% quando si trova in prossimità di questi valori in modo da impostarli più semplicemente."; +"8Gx-Ya-zhp.title" = "Lo slider scatta nelle posizioni 0%, 25%, 50%, 75% e 100% quando si trova in prossimità di questi valori in modo da impostarli più semplicemente."; /* Class = "NSButtonCell"; title = "Use fine OSD scale for brightness and contrast"; ObjectID = "8Q8-57-xnT"; */ "8Q8-57-xnT.title" = "Utilizza la scala fine OSD"; @@ -53,13 +47,13 @@ "95V-M4-2l5.title" = "Ringraziamento speciale ai contributors!"; /* Class = "NSMenuItem"; title = "Custom keyboard shortcuts"; ObjectID = "9eC-PD-FHl"; */ -"9eC-PD-FHl.title" = "Abbreviazioni da tastiera personalizzare"; +"9eC-PD-FHl.title" = "Abbreviazioni da tastiera personalizzate"; /* Class = "NSMenuItem"; title = "Attempt to read display settings"; ObjectID = "9yL-no-aWa"; */ "9yL-no-aWa.title" = "Tenta di leggere le impostazioni del monitor"; /* Class = "NSTextFieldCell"; title = "Show tick marks at 0%, 25%, 50%, 75% and 100% for accuracy."; ObjectID = "A8P-vn-DEJ"; */ -"A8P-vn-DEJ.title" = "Mostra i marcatori a 0%, 25%, 50%, 75% and 100%."; +"A8P-vn-DEJ.title" = "Mostra i marcatori a 0%, 25%, 50%, 75% e 100%."; /* Class = "NSTextFieldCell"; title = "Use brightness, volume and other settings from last time or use defaults. Values will be applied to the display upon first change by the user."; ObjectID = "an7-Aj-3fZ"; */ "an7-Aj-3fZ.title" = "Utilizza la luminisità, il volume ed altre impostazioni dell'ultima volta o utilizza il default. I valori saranno applicati al monitor alla prima modifica dell'utente."; @@ -73,11 +67,11 @@ /* Class = "NSTextFieldCell"; title = "Brightness:"; ObjectID = "Bhb-6l-uPQ"; */ "Bhb-6l-uPQ.title" = "Luminosità:"; -/* Class = "NSTextFieldCell"; title = "(Gamma->DDC)"; ObjectID = "Bid-UL-blc"; */ -"Bid-UL-blc.title" = "(Gamma->DDC)"; +/* Class = "NSTextFieldCell"; title = "(Software->DDC)"; ObjectID = "Bid-UL-blc"; */ +"Bid-UL-blc.title" = "(Software->DDC)"; /* Class = "NSTextFieldCell"; title = "For hardware (DDC) controlled displays only. Results may vary."; ObjectID = "bIe-6O-xEH"; */ -"bIe-6O-xEH.title" = "Solo per i montor con controllo hardware (DDC). I risultati possono variare."; +"bIe-6O-xEH.title" = "Solo per i monitor con controllo hardware (DDC). I risultati possono variare."; /* Class = "NSButtonCell"; title = "Disable macOS volume OSD"; ObjectID = "bkM-Px-U3b"; */ "bkM-Px-U3b.title" = "Disabilita l'OSD del volumme del macOS"; @@ -86,7 +80,7 @@ "bP4-GJ-vhJ.title" = "Scala OSD:"; /* Class = "NSTextFieldCell"; title = "OSD scale:"; ObjectID = "Bqc-s3-C0w"; */ -"Bqc-s3-C0w.title" = "OScala OSD:"; +"Bqc-s3-C0w.title" = "Scala OSD:"; /* Class = "NSButtonCell"; title = "Reset settings"; ObjectID = "BYS-7Y-bRz"; */ "BYS-7Y-bRz.title" = "Reset impostazioni"; @@ -113,10 +107,10 @@ "D9t-vT-gNJ.title" = "Lista VCP"; /* Class = "NSTextFieldCell"; title = "You can override audio device name under Displays (advanced) if needed."; ObjectID = "Dha-Tm-cDM"; */ -"Dha-Tm-cDM.title" = "Puoi sovrascrivere il nome del dispositivo audio dentro Monitor se necessario."; +"Dha-Tm-cDM.title" = "Puoi sovrascrivere il nome del dispositivo audio nella sezione Monitor se necessario."; /* Class = "NSTextFieldCell"; title = "You can disable smooth transitions for a more direct, immediate control."; ObjectID = "ENt-mP-0yH"; */ -"ENt-mP-0yH.title" = "Puoi disabilitare le transizioni modbide per un controllo più diretto ed immediato."; +"ENt-mP-0yH.title" = "Puoi disabilitare le transizioni morbide per un controllo più diretto ed immediato."; /* Class = "NSMenuItem"; title = "Minimal"; ObjectID = "Eq3-z9-yIo"; */ "Eq3-z9-yIo.title" = "Minimalista"; @@ -143,7 +137,7 @@ "FER-Ri-4UO.title" = "Volume:"; /* Class = "NSButtonCell"; title = "Allow zero brightness via software or combined dimming"; ObjectID = "FjB-XL-fG5"; */ -"FjB-XL-fG5.title" = "Allow zero brightness via software or combined dimming"; +"FjB-XL-fG5.title" = "Permetti la luminosità zero cia software o attenuazione combinata"; /* Class = "NSTextFieldCell"; title = "Apple and built-in displays already have a brightness slider in Control Center."; ObjectID = "fmZ-HI-Mdc"; */ "fmZ-HI-Mdc.title" = "I Monitor Apple ed incorporati hanno già lo slider della luminosità nel Centro di Controllo."; @@ -197,7 +191,7 @@ "jSj-HB-T2t.title" = "Modifica per tutti i monitor"; /* Class = "NSButtonCell"; title = "Check for updates"; ObjectID = "jVH-oc-rUi"; */ -"jVH-oc-rUi.title" = "Controlla aggiornamneti"; +"jVH-oc-rUi.title" = "Controlla aggiornamenti"; /* Class = "NSTextFieldCell"; title = "Note: you can press Shift during startup for 'Safe mode' to restore defaults and avoid reading or setting anything."; ObjectID = "Jx2-gO-nq9"; */ "Jx2-gO-nq9.title" = "Nota: puoi premere Maiusc all'avvio per il 'Safe mode' in modo da impostare i valori di default."; @@ -236,10 +230,10 @@ "mue-fa-8z6.title" = "Volume:"; /* Class = "NSButtonCell"; title = "Show brightness slider in menu"; ObjectID = "MWo-6I-s9L"; */ -"MWo-6I-s9L.title" = "Mostra lo slider della luminositò nel menu"; +"MWo-6I-s9L.title" = "Mostra lo slider della luminosità nel menu"; /* Class = "NSButtonCell"; title = "Avoid gamma table manipulation"; ObjectID = "na6-mS-MPi"; */ -"na6-mS-MPi.title" = "Avoid gamma table manipulation"; +"na6-mS-MPi.title" = "Impedisci la manipolazione della tabella di gamma"; /* Class = "NSButtonCell"; title = "Separate scales for combined hardware & software dimming"; ObjectID = "O8o-hI-8eR"; */ "O8o-hI-8eR.title" = "Scale separate per controllo combinato della attenuazione hw/sw"; @@ -356,7 +350,7 @@ "YHZ-VL-QJ3.title" = "L'intera scala OSD sarà disponibile per il controllo hardware della luminosità e una volta raggiunto lo 0, l'attenuazione software verrà utilizata."; /* Class = "NSTextFieldCell"; title = "Warning! With this option enabled, you might find yourself in a position when you end up with a blank display. This, combined with disabled keyboard controls can be frustrating."; ObjectID = "yi3-e1-wsL"; */ -"yi3-e1-wsL.title" = "Warning! With this option enabled, you might find yourself in a position when you end up with a blank display. This, combined with disabled keyboard controls can be frustrating."; +"yi3-e1-wsL.title" = "Attenzione! Con questa opzione attiva, potresti trovarti in con un monitor completamente nero. Questo i combinazione con la disattivazione dei comandi da tastiera potrebbe essere frustrante."; /* Class = "NSTextFieldCell"; title = "Identifier:"; ObjectID = "YqZ-LS-YvR"; */ "YqZ-LS-YvR.title" = "Identificativo:"; diff --git a/MonitorControl/UI/ko.lproj/Localizable.strings b/MonitorControl/UI/ko.lproj/Localizable.strings index dd107688..4f1c1d43 100644 --- a/MonitorControl/UI/ko.lproj/Localizable.strings +++ b/MonitorControl/UI/ko.lproj/Localizable.strings @@ -23,7 +23,7 @@ "Built-in Display" = "내장 디스플레이"; /* Shown in menu */ -"Check for updates..." = "업데이트 확인..."; +"Check for updates…" = "업데이트 확인…"; /* Shown in menu */ "Contrast" = "대비"; @@ -86,7 +86,7 @@ "Preferences for an incompatible previous app version detected. Default preferences are reloaded." = "호환되지 않는 이전 앱 버전에 대한 기본 설정이 감지되었습니다. 기본 환경 설정을 다시 불러옵니다."; /* Shown in menu */ -"Preferences..." = "환경 설정..."; +"Preferences…" = "환경 설정…"; /* Shown in menu */ "Quit" = "종료"; diff --git a/MonitorControl/UI/ko.lproj/Main.strings b/MonitorControl/UI/ko.lproj/Main.strings index 3ab14e4d..d523cbc0 100644 --- a/MonitorControl/UI/ko.lproj/Main.strings +++ b/MonitorControl/UI/ko.lproj/Main.strings @@ -13,18 +13,12 @@ /* Class = "NSTextFieldCell"; title = "DDC min"; ObjectID = "1zE-fg-xEm"; */ "1zE-fg-xEm.title" = "DDC 최솟값"; -/* Class = "NSBox"; title = "Box"; ObjectID = "3a3-In-jeQ"; */ -"3a3-In-jeQ.title" = "Box"; - /* Class = "NSMenuItem"; title = "Show separate controls for each display in menu"; ObjectID = "3eO-bN-ZRl"; */ "3eO-bN-ZRl.title" = "메뉴에서 각 디스플레이에 대해 각각의 컨트롤 표시"; /* Class = "NSMenuItem"; title = "Apply last saved values to the display"; ObjectID = "3Jr-bW-YYq"; */ "3Jr-bW-YYq.title" = "마지막으로 저장된 값을 디스플레이에 적용"; -/* Class = "NSButtonCell"; title = "https://monitorcontrol.app"; ObjectID = "42n-Zy-AqF"; */ -"42n-Zy-AqF.title" = "https://monitorcontrol.app"; - /* Class = "NSMenuItem"; title = "Custom keyboard shortcuts"; ObjectID = "4CG-0I-anB"; */ "4CG-0I-anB.title" = "사용자 정의 키보드 단축키"; @@ -73,8 +67,8 @@ /* Class = "NSTextFieldCell"; title = "Brightness:"; ObjectID = "Bhb-6l-uPQ"; */ "Bhb-6l-uPQ.title" = "밝기:"; -/* Class = "NSTextFieldCell"; title = "(Gamma->DDC)"; ObjectID = "Bid-UL-blc"; */ -"Bid-UL-blc.title" = "(감마->DDC)"; +/* Class = "NSTextFieldCell"; title = "(Software->DDC)"; ObjectID = "Bid-UL-blc"; */ +"Bid-UL-blc.title" = "(소프트웨어->DDC)"; /* Class = "NSTextFieldCell"; title = "For hardware (DDC) controlled displays only. Results may vary."; ObjectID = "bIe-6O-xEH"; */ "bIe-6O-xEH.title" = "하드웨어 (DDC) 제어 디스플레이 전용. 결과는 다를 수 있습니다."; diff --git a/MonitorControl/UI/nl.lproj/Localizable.strings b/MonitorControl/UI/nl.lproj/Localizable.strings index dab1207c..62cac7e6 100644 --- a/MonitorControl/UI/nl.lproj/Localizable.strings +++ b/MonitorControl/UI/nl.lproj/Localizable.strings @@ -23,7 +23,7 @@ "Built-in Display" = "Ingebouwd Scherm"; /* Shown in menu */ -"Check for updates..." = "Controleren op updates..."; +"Check for updates…" = "Controleren op updates…"; /* Shown in menu */ "Contrast" = "Contrast"; @@ -86,7 +86,7 @@ "Preferences for an incompatible previous app version detected. Default preferences are reloaded." = "Voorkeuren voor een incompatibele vorige app-versie gedetecteerd. Standaardvoorkeuren worden opnieuw geladen."; /* Shown in menu */ -"Preferences..." = "Voorkeuren..."; +"Preferences…" = "Voorkeuren…"; /* Shown in menu */ "Quit" = "Afsluiten"; diff --git a/MonitorControl/UI/nl.lproj/Main.strings b/MonitorControl/UI/nl.lproj/Main.strings index 23143c25..f7afffd0 100644 --- a/MonitorControl/UI/nl.lproj/Main.strings +++ b/MonitorControl/UI/nl.lproj/Main.strings @@ -13,18 +13,12 @@ /* Class = "NSTextFieldCell"; title = "DDC min"; ObjectID = "1zE-fg-xEm"; */ "1zE-fg-xEm.title" = "DDC min"; -/* Class = "NSBox"; title = "Box"; ObjectID = "3a3-In-jeQ"; */ -"3a3-In-jeQ.title" = "Box"; - /* Class = "NSMenuItem"; title = "Show separate controls for each display in menu"; ObjectID = "3eO-bN-ZRl"; */ "3eO-bN-ZRl.title" = "Toon afzonderlijke bedieningselementen voor elk scherm in het menu"; /* Class = "NSMenuItem"; title = "Apply last saved values to the display"; ObjectID = "3Jr-bW-YYq"; */ "3Jr-bW-YYq.title" = "Pas laatst opgeslagen waarden toe op het scherm"; -/* Class = "NSButtonCell"; title = "https://monitorcontrol.app"; ObjectID = "42n-Zy-AqF"; */ -"42n-Zy-AqF.title" = "https://monitorcontrol.app"; - /* Class = "NSMenuItem"; title = "Custom keyboard shortcuts"; ObjectID = "4CG-0I-anB"; */ "4CG-0I-anB.title" = "Aangepaste sneltoetsen"; @@ -73,8 +67,8 @@ /* Class = "NSTextFieldCell"; title = "Brightness:"; ObjectID = "Bhb-6l-uPQ"; */ "Bhb-6l-uPQ.title" = "Helderheid:"; -/* Class = "NSTextFieldCell"; title = "(Gamma->DDC)"; ObjectID = "Bid-UL-blc"; */ -"Bid-UL-blc.title" = "(Gamma->DDC)"; +/* Class = "NSTextFieldCell"; title = "(Software->DDC)"; ObjectID = "Bid-UL-blc"; */ +"Bid-UL-blc.title" = "(Software->DDC)"; /* Class = "NSTextFieldCell"; title = "For hardware (DDC) controlled displays only. Results may vary."; ObjectID = "bIe-6O-xEH"; */ "bIe-6O-xEH.title" = "Alleen voor hardware (DDC) gestuurde schermen. Resultaten kunnen verschillen."; diff --git a/MonitorControl/UI/tr.lproj/Localizable.strings b/MonitorControl/UI/tr.lproj/Localizable.strings index cea33ad4..3186619f 100644 --- a/MonitorControl/UI/tr.lproj/Localizable.strings +++ b/MonitorControl/UI/tr.lproj/Localizable.strings @@ -23,7 +23,7 @@ "Built-in Display" = "Dahili Ekran"; /* Shown in menu */ -"Check for updates..." = "Güncellemeleri denetle..."; +"Check for updates…" = "Güncellemeleri denetle…"; /* Shown in menu */ "Contrast" = "Kontrast"; @@ -86,7 +86,7 @@ "Preferences for an incompatible previous app version detected. Default preferences are reloaded." = "Uyumsuz bir önceki uygulama sürümü için tercihler algılandı. Varsayılan tercihler yeniden yüklenir."; /* Shown in menu */ -"Preferences..." = "Tercihler..."; +"Preferences…" = "Tercihler…"; /* Shown in menu */ "Quit" = "Çıkış"; diff --git a/MonitorControl/UI/tr.lproj/Main.strings b/MonitorControl/UI/tr.lproj/Main.strings index 500f6ac6..ad5841c9 100644 --- a/MonitorControl/UI/tr.lproj/Main.strings +++ b/MonitorControl/UI/tr.lproj/Main.strings @@ -13,18 +13,12 @@ /* Class = "NSTextFieldCell"; title = "DDC min"; ObjectID = "1zE-fg-xEm"; */ "1zE-fg-xEm.title" = "DDC min"; -/* Class = "NSBox"; title = "Box"; ObjectID = "3a3-In-jeQ"; */ -"3a3-In-jeQ.title" = "Box"; - /* Class = "NSMenuItem"; title = "Show separate controls for each display in menu"; ObjectID = "3eO-bN-ZRl"; */ "3eO-bN-ZRl.title" = "Menüdeki her ekran için ayrı kontroller göster"; /* Class = "NSMenuItem"; title = "Apply last saved values to the display"; ObjectID = "3Jr-bW-YYq"; */ "3Jr-bW-YYq.title" = "Ekrana son kaydedilen değerleri uygula"; -/* Class = "NSButtonCell"; title = "https://monitorcontrol.app"; ObjectID = "42n-Zy-AqF"; */ -"42n-Zy-AqF.title" = "https://monitorcontrol.app"; - /* Class = "NSMenuItem"; title = "Custom keyboard shortcuts"; ObjectID = "4CG-0I-anB"; */ "4CG-0I-anB.title" = "Özel klavye kısayolu"; @@ -73,8 +67,8 @@ /* Class = "NSTextFieldCell"; title = "Brightness:"; ObjectID = "Bhb-6l-uPQ"; */ "Bhb-6l-uPQ.title" = "Parlaklık:"; -/* Class = "NSTextFieldCell"; title = "(Gamma->DDC)"; ObjectID = "Bid-UL-blc"; */ -"Bid-UL-blc.title" = "(Gama->DDC)"; +/* Class = "NSTextFieldCell"; title = "(Software->DDC)"; ObjectID = "Bid-UL-blc"; */ +"Bid-UL-blc.title" = "(Yazılım->DDC)"; /* Class = "NSTextFieldCell"; title = "For hardware (DDC) controlled displays only. Results may vary."; ObjectID = "bIe-6O-xEH"; */ "bIe-6O-xEH.title" = "Yalnızca donanım (DDC) kontrollü ekranlar için. Sonuçlar değişebilir."; diff --git a/MonitorControl/UI/zh-Hans.lproj/Localizable.strings b/MonitorControl/UI/zh-Hans.lproj/Localizable.strings index 62ebfeb6..1b159bc9 100644 --- a/MonitorControl/UI/zh-Hans.lproj/Localizable.strings +++ b/MonitorControl/UI/zh-Hans.lproj/Localizable.strings @@ -23,7 +23,7 @@ "Built-in Display" = "内置显示器"; /* Shown in menu */ -"Check for updates..." = "检查更新..."; +"Check for updates…" = "检查更新…"; /* Shown in menu */ "Contrast" = "对比度"; @@ -86,7 +86,7 @@ "Preferences for an incompatible previous app version detected. Default preferences are reloaded." = "监测到不兼容的旧版本设置。已重新加载默认设置。"; /* Shown in menu */ -"Preferences..." = "设置..."; +"Preferences…" = "设置…"; /* Shown in menu */ "Quit" = "关闭"; diff --git a/MonitorControl/UI/zh-Hans.lproj/Main.strings b/MonitorControl/UI/zh-Hans.lproj/Main.strings index 565e8714..58457e69 100644 --- a/MonitorControl/UI/zh-Hans.lproj/Main.strings +++ b/MonitorControl/UI/zh-Hans.lproj/Main.strings @@ -13,18 +13,12 @@ /* Class = "NSTextFieldCell"; title = "DDC min"; ObjectID = "1zE-fg-xEm"; */ "1zE-fg-xEm.title" = "DDC最小值"; -/* Class = "NSBox"; title = "Box"; ObjectID = "3a3-In-jeQ"; */ -"3a3-In-jeQ.title" = "Box"; - /* Class = "NSMenuItem"; title = "Show separate controls for each display in menu"; ObjectID = "3eO-bN-ZRl"; */ "3eO-bN-ZRl.title" = "显示各个显示器的控制滑杆"; /* Class = "NSMenuItem"; title = "Apply last saved values to the display"; ObjectID = "3Jr-bW-YYq"; */ "3Jr-bW-YYq.title" = "使用上次储存的设置值至显示器"; -/* Class = "NSButtonCell"; title = "https://monitorcontrol.app"; ObjectID = "42n-Zy-AqF"; */ -"42n-Zy-AqF.title" = "https://monitorcontrol.app"; - /* Class = "NSMenuItem"; title = "Custom keyboard shortcuts"; ObjectID = "4CG-0I-anB"; */ "4CG-0I-anB.title" = "自定义快捷键"; @@ -73,8 +67,8 @@ /* Class = "NSTextFieldCell"; title = "Brightness:"; ObjectID = "Bhb-6l-uPQ"; */ "Bhb-6l-uPQ.title" = "亮度:"; -/* Class = "NSTextFieldCell"; title = "(Gamma->DDC)"; ObjectID = "Bid-UL-blc"; */ -"Bid-UL-blc.title" = "(伽马值->DDC)"; +/* Class = "NSTextFieldCell"; title = "(Software->DDC)"; ObjectID = "Bid-UL-blc"; */ +"Bid-UL-blc.title" = "(软件->DDC)"; /* Class = "NSTextFieldCell"; title = "For hardware (DDC) controlled displays only. Results may vary."; ObjectID = "bIe-6O-xEH"; */ "bIe-6O-xEH.title" = "仅适用于以硬件(DDC)控制的显示器。结果可能会有差异。"; diff --git a/MonitorControl/UI/zh-Hant-TW.lproj/Localizable.strings b/MonitorControl/UI/zh-Hant-TW.lproj/Localizable.strings index 9f5b4dea..ce7ef5c2 100644 --- a/MonitorControl/UI/zh-Hant-TW.lproj/Localizable.strings +++ b/MonitorControl/UI/zh-Hant-TW.lproj/Localizable.strings @@ -23,7 +23,7 @@ "Built-in Display" = "內建螢幕"; /* Shown in menu */ -"Check for updates..." = "檢查更新..."; +"Check for updates…" = "檢查更新…"; /* Shown in menu */ "Contrast" = "對比度"; @@ -86,7 +86,7 @@ "Preferences for an incompatible previous app version detected. Default preferences are reloaded." = "偵測到不相容的先前應用程式版本的設定。原始設定已套用。"; /* Shown in menu */ -"Preferences..." = "設定..."; +"Preferences…" = "設定…"; /* Shown in menu */ "Quit" = "離開"; diff --git a/MonitorControl/UI/zh-Hant-TW.lproj/Main.strings b/MonitorControl/UI/zh-Hant-TW.lproj/Main.strings index e43f6905..1ab14876 100644 --- a/MonitorControl/UI/zh-Hant-TW.lproj/Main.strings +++ b/MonitorControl/UI/zh-Hant-TW.lproj/Main.strings @@ -13,18 +13,12 @@ /* Class = "NSTextFieldCell"; title = "DDC min"; ObjectID = "1zE-fg-xEm"; */ "1zE-fg-xEm.title" = "DDC最小值"; -/* Class = "NSBox"; title = "Box"; ObjectID = "3a3-In-jeQ"; */ -"3a3-In-jeQ.title" = "Box"; - /* Class = "NSMenuItem"; title = "Show separate controls for each display in menu"; ObjectID = "3eO-bN-ZRl"; */ "3eO-bN-ZRl.title" = "顯示各個螢幕的控制滑桿"; /* Class = "NSMenuItem"; title = "Apply last saved values to the display"; ObjectID = "3Jr-bW-YYq"; */ "3Jr-bW-YYq.title" = "套用上次儲存的設定值至螢幕"; -/* Class = "NSButtonCell"; title = "https://monitorcontrol.app"; ObjectID = "42n-Zy-AqF"; */ -"42n-Zy-AqF.title" = "https://monitorcontrol.app"; - /* Class = "NSMenuItem"; title = "Custom keyboard shortcuts"; ObjectID = "4CG-0I-anB"; */ "4CG-0I-anB.title" = "自定義快捷鍵"; @@ -73,8 +67,8 @@ /* Class = "NSTextFieldCell"; title = "Brightness:"; ObjectID = "Bhb-6l-uPQ"; */ "Bhb-6l-uPQ.title" = "亮度:"; -/* Class = "NSTextFieldCell"; title = "(Gamma->DDC)"; ObjectID = "Bid-UL-blc"; */ -"Bid-UL-blc.title" = "(伽碼值->DDC)"; +/* Class = "NSTextFieldCell"; title = "(Software->DDC)"; ObjectID = "Bid-UL-blc"; */ +"Bid-UL-blc.title" = "(軟體->DDC)"; /* Class = "NSTextFieldCell"; title = "For hardware (DDC) controlled displays only. Results may vary."; ObjectID = "bIe-6O-xEH"; */ "bIe-6O-xEH.title" = "僅適用於以硬體(DDC)控制的螢幕。結果可能會有異。"; diff --git a/MonitorControl/View Controllers/DisplaysPrefsCellView.swift b/MonitorControl/View Controllers/DisplaysPrefsCellView.swift index 1658f0f7..7bc4e8df 100644 --- a/MonitorControl/View Controllers/DisplaysPrefsCellView.swift +++ b/MonitorControl/View Controllers/DisplaysPrefsCellView.swift @@ -244,7 +244,7 @@ class DisplaysPrefsCellView: NSTableCellView { @IBAction func unavailableDDC(_ sender: NSButton) { let command = self.tagCommand(sender.tag) let prefKey = PrefKey.unavailableDDC - if let display = display as? OtherDisplay { + if let display = display { switch sender.state { case .on: display.savePref(false, key: prefKey, for: command) @@ -255,8 +255,8 @@ class DisplaysPrefsCellView: NSTableCellView { } _ = display.setDirectBrightness(1) _ = display.setSwBrightness(1) - app.configure() } + app.configure() } @IBAction func minDDCOverride(_ sender: NSTextField) { @@ -360,24 +360,17 @@ class DisplaysPrefsCellView: NSTableCellView { self.ddcButtonToggled(self.ddcButton) self.avoidGamma.state = .off self.ddcButtonToggled(self.avoidGamma) - self.enabledButton.state = .on - self.enabledButtonToggled(self.enabledButton) self.disableVolumeOSDButton.state = .off self.disableVolumeOSDButton(self.disableVolumeOSDButton) self.pollingModeMenu.selectItem(withTag: 2) self.pollingModeValueChanged(self.pollingModeMenu) self.longerDelayButton.state = .off self.longerDelayButtonToggled(self.longerDelayButton) - self.enableMuteButton.state = .off - self.enableMuteButtonToggled(self.enableMuteButton) - self.friendlyName.stringValue = disp.name - self.friendlyNameValueChanged(self.friendlyName) self.combinedBrightnessSwitchingPoint.intValue = 0 self.combinedBrightnessSwitchingPoint(self.combinedBrightnessSwitchingPoint) self.audioDeviceNameOverride.stringValue = "" self.audioDeviceNameOverride(self.audioDeviceNameOverride) - self.unavailableDDCBrightness.state = .on self.unavailableDDCVolume.state = .on self.unavailableDDCContrast.state = .on @@ -401,9 +394,6 @@ class DisplaysPrefsCellView: NSTableCellView { self.remapDDCVolume.stringValue = "" self.remapDDCContrast.stringValue = "" - self.unavailableDDC(self.unavailableDDCBrightness) - - self.unavailableDDC(self.unavailableDDCBrightness) self.unavailableDDC(self.unavailableDDCVolume) self.unavailableDDC(self.unavailableDDCContrast) @@ -427,6 +417,12 @@ class DisplaysPrefsCellView: NSTableCellView { self.remapDDC(self.remapDDCVolume) self.remapDDC(self.remapDDCContrast) } + self.unavailableDDCBrightness.state = .on + self.unavailableDDC(self.unavailableDDCBrightness) + self.friendlyName.stringValue = disp.name + self.friendlyNameValueChanged(self.friendlyName) + self.enabledButton.state = .on + self.enabledButtonToggled(self.enabledButton) } } } diff --git a/MonitorControl/View Controllers/DisplaysPrefsViewController.swift b/MonitorControl/View Controllers/DisplaysPrefsViewController.swift index 8a2e979f..67909de7 100644 --- a/MonitorControl/View Controllers/DisplaysPrefsViewController.swift +++ b/MonitorControl/View Controllers/DisplaysPrefsViewController.swift @@ -186,6 +186,7 @@ class DisplaysPrefsViewController: NSViewController, PreferencePane, NSTableView cell.disableVolumeOSDButton.isEnabled = false } // Advanced settings + cell.unavailableDDCBrightness.state = !display.readPrefAsBool(key: .unavailableDDC, for: .brightness) ? .on : .off if let otherDisplay = display as? OtherDisplay, !otherDisplay.isSwOnly() { cell.pollingModeMenu.isEnabled = true cell.pollingModeMenu.selectItem(withTag: otherDisplay.readPrefAsInt(key: .pollingMode)) @@ -207,10 +208,8 @@ class DisplaysPrefsViewController: NSViewController, PreferencePane, NSTableView cell.audioDeviceNameOverride.stringValue = otherDisplay.readPrefAsString(key: .audioDeviceNameOverride) cell.updateWithCurrentAudioName.isEnabled = true - cell.unavailableDDCBrightness.isEnabled = true cell.unavailableDDCVolume.isEnabled = true cell.unavailableDDCContrast.isEnabled = true - cell.unavailableDDCBrightness.state = !otherDisplay.readPrefAsBool(key: .unavailableDDC, for: .brightness) ? .on : .off cell.unavailableDDCVolume.state = !otherDisplay.readPrefAsBool(key: .unavailableDDC, for: .audioSpeakerVolume) ? .on : .off cell.unavailableDDCContrast.state = !otherDisplay.readPrefAsBool(key: .unavailableDDC, for: .contrast) ? .on : .off @@ -265,10 +264,8 @@ class DisplaysPrefsViewController: NSViewController, PreferencePane, NSTableView cell.audioDeviceNameOverride.stringValue = "" cell.updateWithCurrentAudioName.isEnabled = false - cell.unavailableDDCBrightness.state = .off cell.unavailableDDCVolume.state = .off cell.unavailableDDCContrast.state = .off - cell.unavailableDDCBrightness.isEnabled = false cell.unavailableDDCVolume.isEnabled = false cell.unavailableDDCContrast.isEnabled = false diff --git a/MonitorControlHelper/Info.plist b/MonitorControlHelper/Info.plist index b52b1b91..2b798d77 100644 --- a/MonitorControlHelper/Info.plist +++ b/MonitorControlHelper/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 6795 + 6828 LSApplicationCategoryType public.app-category.utilities LSBackgroundOnly From 5d3d08ddfc3d2e910a5c58b73e99afec87399b88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=96zkan=20=C3=96zcan?= Date: Sun, 24 Oct 2021 13:02:25 +0300 Subject: [PATCH 003/101] Translation of "avoid gamma table manipulation" (#737) --- MonitorControl/UI/tr.lproj/Main.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MonitorControl/UI/tr.lproj/Main.strings b/MonitorControl/UI/tr.lproj/Main.strings index ad5841c9..0ffac8a8 100644 --- a/MonitorControl/UI/tr.lproj/Main.strings +++ b/MonitorControl/UI/tr.lproj/Main.strings @@ -233,7 +233,7 @@ "MWo-6I-s9L.title" = "Menüde parlaklık kaydırıcısını göster"; /* Class = "NSButtonCell"; title = "Avoid gamma table manipulation"; ObjectID = "na6-mS-MPi"; */ -"na6-mS-MPi.title" = "Avoid gamma table manipulation"; +"na6-mS-MPi.title" = "Gama tablosu manipülasyonundan kaçının"; /* Class = "NSButtonCell"; title = "Separate scales for combined hardware & software dimming"; ObjectID = "O8o-hI-8eR"; */ "O8o-hI-8eR.title" = "Birleşik donanım ve yazılım karartması için ayrı dengeler"; From 6248d582ac6691c17a2a67d69b2a50e8c5811da0 Mon Sep 17 00:00:00 2001 From: Istvan T <37590873+waydabber@users.noreply.github.com> Date: Mon, 25 Oct 2021 19:40:52 +0200 Subject: [PATCH 004/101] Some additional fixes (#738) - Fix naming of wakeNotification() - Fix for failing to update Advanced Settings checkbox on Preferences Reset. - Better handling of known dummy displays. --- MonitorControl/Info.plist | 2 +- MonitorControl/Model/AppleDisplay.swift | 16 +++++++++-- MonitorControl/Model/Display.swift | 28 +++++++++++++++---- MonitorControl/Model/OtherDisplay.swift | 6 ++-- MonitorControl/Support/AppDelegate.swift | 6 ++-- MonitorControl/Support/Arm64DDC.swift | 4 +++ MonitorControl/Support/DisplayManager.swift | 17 +++++++---- .../DisplaysPrefsViewController.swift | 14 ++++++---- .../MainPrefsViewController.swift | 1 + MonitorControlHelper/Info.plist | 2 +- 10 files changed, 70 insertions(+), 26 deletions(-) diff --git a/MonitorControl/Info.plist b/MonitorControl/Info.plist index 05c4621c..4b77b24e 100644 --- a/MonitorControl/Info.plist +++ b/MonitorControl/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 6828 + 6850 LSApplicationCategoryType public.app-category.utilities LSMinimumSystemVersion diff --git a/MonitorControl/Model/AppleDisplay.swift b/MonitorControl/Model/AppleDisplay.swift index 6f71d496..68dd948e 100644 --- a/MonitorControl/Model/AppleDisplay.swift +++ b/MonitorControl/Model/AppleDisplay.swift @@ -6,18 +6,24 @@ import os.log class AppleDisplay: Display { private var displayQueue: DispatchQueue - override init(_ identifier: CGDirectDisplayID, name: String, vendorNumber: UInt32?, modelNumber: UInt32?, isVirtual: Bool = false) { + override init(_ identifier: CGDirectDisplayID, name: String, vendorNumber: UInt32?, modelNumber: UInt32?, isVirtual: Bool = false, isDummy: Bool = false) { self.displayQueue = DispatchQueue(label: String("displayQueue-\(identifier)")) - super.init(identifier, name: name, vendorNumber: vendorNumber, modelNumber: modelNumber, isVirtual: isVirtual) + super.init(identifier, name: name, vendorNumber: vendorNumber, modelNumber: modelNumber, isVirtual: isVirtual, isDummy: isDummy) } public func getAppleBrightness() -> Float { + guard !self.isDummy else { + return 1 + } var brightness: Float = 0 DisplayServicesGetBrightness(self.identifier, &brightness) return brightness } public func setAppleBrightness(value: Float) { + guard !self.isDummy else { + return + } self.displayQueue.sync { DisplayServicesSetBrightness(self.identifier, value) DisplayServicesBrightnessChanged(self.identifier, Double(value)) @@ -25,6 +31,9 @@ class AppleDisplay: Display { } override func setDirectBrightness(_ to: Float, transient: Bool = false) -> Bool { + guard !self.isDummy else { + return false + } let value = max(min(to, 1), 0) self.setAppleBrightness(value: value) if !transient { @@ -36,6 +45,9 @@ class AppleDisplay: Display { } override func getBrightness() -> Float { + guard !self.isDummy else { + return 1 + } if self.prefExists(for: .brightness) { return self.readPrefAsFloat(for: .brightness) } else { diff --git a/MonitorControl/Model/Display.swift b/MonitorControl/Model/Display.swift index a3b30f7b..b68e5186 100644 --- a/MonitorControl/Model/Display.swift +++ b/MonitorControl/Model/Display.swift @@ -22,6 +22,7 @@ class Display: Equatable { var sliderHandler: [Command: SliderHandler] = [:] var brightnessSyncSourceValue: Float = 1 var isVirtual: Bool = false + var isDummy: Bool = false var defaultGammaTableRed = [CGGammaValue](repeating: 0, count: 256) var defaultGammaTableGreen = [CGGammaValue](repeating: 0, count: 256) @@ -61,7 +62,7 @@ class Display: Equatable { return (key ?? PrefKey.value).rawValue + (command != nil ? String((command ?? Command.none).rawValue) : "") + self.prefsId } - internal init(_ identifier: CGDirectDisplayID, name: String, vendorNumber: UInt32?, modelNumber: UInt32?, isVirtual: Bool = false) { + internal init(_ identifier: CGDirectDisplayID, name: String, vendorNumber: UInt32?, modelNumber: UInt32?, isVirtual: Bool = false, isDummy: Bool = false) { self.identifier = identifier self.name = name self.vendorNumber = vendorNumber @@ -69,13 +70,14 @@ class Display: Equatable { self.prefsId = "(" + String(name.filter { !$0.isWhitespace }) + String(vendorNumber ?? 0) + String(modelNumber ?? 0) + "@" + String(identifier) + ")" os_log("Display init with prefsIdentifier %{public}@", type: .info, self.prefsId) self.isVirtual = DEBUG_VIRTUAL ? true : isVirtual + self.isDummy = isDummy self.swUpdateDefaultGammaTable() self.smoothBrightnessTransient = self.getBrightness() - if self.isVirtual { - os_log("Creating or updating shade for virtual display %{public}@", type: .info, String(self.identifier)) + if self.isVirtual || self.readPrefAsBool(key: PrefKey.avoidGamma), !self.isDummy { + os_log("Creating or updating shade for display %{public}@", type: .info, String(self.identifier)) _ = DisplayManager.shared.updateShade(displayID: self.identifier) } else { - os_log("Destroying shade (if exists) for real display %{public}@", type: .info, String(self.identifier)) + os_log("Destroying shade (if exists) for display %{public}@", type: .info, String(self.identifier)) _ = DisplayManager.shared.destroyShade(displayID: self.identifier) } self.brightnessSyncSourceValue = self.getBrightness() @@ -187,6 +189,9 @@ class Display: Equatable { } func swUpdateDefaultGammaTable() { + guard !self.isDummy else { + return + } CGGetDisplayTransferByTable(self.identifier, 256, &self.defaultGammaTableRed, &self.defaultGammaTableGreen, &self.defaultGammaTableBlue, &self.defaultGammaTableSampleCount) let redPeak = self.defaultGammaTableRed.max() ?? 0 let greenPeak = self.defaultGammaTableGreen.max() ?? 0 @@ -210,6 +215,10 @@ class Display: Equatable { if !noPrefSave { self.savePref(brightnessValue, key: .SwBrightness) } + guard !self.isDummy else { + self.swBrightnessSemaphore.signal() + return true + } var newValue = brightnessValue currentValue = self.swBrightnessTransform(value: currentValue) newValue = self.swBrightnessTransform(value: newValue) @@ -249,6 +258,13 @@ class Display: Equatable { } func getSwBrightness() -> Float { + guard !self.isDummy else { + if self.prefExists(key: .SwBrightness) { + return self.readPrefAsFloat(key: .SwBrightness) + } else { + return 1 + } + } self.swBrightnessSemaphore.wait() if self.isVirtual || self.readPrefAsBool(key: .avoidGamma) { let rawBrightnessValue = 1 - (DisplayManager.shared.getShadeAlpha(displayID: self.identifier) ?? 1) @@ -274,7 +290,7 @@ class Display: Equatable { func checkGammaInterference() { let currentSwBrightness = self.getSwBrightness() - guard !DisplayManager.shared.gammaInterferenceWarningShown, !(prefs.bool(forKey: PrefKey.disableCombinedBrightness.rawValue)), !self.readPrefAsBool(key: .avoidGamma), !self.isVirtual, !self.smoothBrightnessRunning, self.prefExists(key: .SwBrightness), abs(currentSwBrightness - self.readPrefAsFloat(key: .SwBrightness)) > 0.02 else { + guard !self.isDummy, !DisplayManager.shared.gammaInterferenceWarningShown, !(prefs.bool(forKey: PrefKey.disableCombinedBrightness.rawValue)), !self.readPrefAsBool(key: .avoidGamma), !self.isVirtual, !self.smoothBrightnessRunning, self.prefExists(key: .SwBrightness), abs(currentSwBrightness - self.readPrefAsFloat(key: .SwBrightness)) > 0.02 else { return } DisplayManager.shared.gammaInterferenceCounter += 1 @@ -309,7 +325,7 @@ class Display: Equatable { } func isSwBrightnessNotDefault() -> Bool { - guard !self.isVirtual else { + guard !self.isVirtual, !self.isDummy else { return false } if self.getSwBrightness() < 1 { diff --git a/MonitorControl/Model/OtherDisplay.swift b/MonitorControl/Model/OtherDisplay.swift index 2eebc69e..f95afcc7 100644 --- a/MonitorControl/Model/OtherDisplay.swift +++ b/MonitorControl/Model/OtherDisplay.swift @@ -23,8 +23,8 @@ class OtherDisplay: Display { set { prefs.set(newValue, forKey: PrefKey.pollingCount.rawValue + self.prefsId) } } - override init(_ identifier: CGDirectDisplayID, name: String, vendorNumber: UInt32?, modelNumber: UInt32?, isVirtual: Bool = false) { - super.init(identifier, name: name, vendorNumber: vendorNumber, modelNumber: modelNumber, isVirtual: isVirtual) + override init(_ identifier: CGDirectDisplayID, name: String, vendorNumber: UInt32?, modelNumber: UInt32?, isVirtual: Bool = false, isDummy: Bool = false) { + super.init(identifier, name: name, vendorNumber: vendorNumber, modelNumber: modelNumber, isVirtual: isVirtual, isDummy: isDummy) if !isVirtual, !Arm64DDC.isArm64 { self.ddc = IntelDDC(for: identifier) } @@ -256,7 +256,7 @@ class OtherDisplay: Display { } func isSwOnly() -> Bool { - return (!self.arm64ddc && self.ddc == nil) || self.isVirtual + return (!self.arm64ddc && self.ddc == nil) || self.isVirtual || self.isDummy } func isSw() -> Bool { diff --git a/MonitorControl/Support/AppDelegate.swift b/MonitorControl/Support/AppDelegate.swift index 24c13831..8b777fd6 100644 --- a/MonitorControl/Support/AppDelegate.swift +++ b/MonitorControl/Support/AppDelegate.swift @@ -168,9 +168,9 @@ class AppDelegate: NSObject, NSApplicationDelegate { NotificationCenter.default.addObserver(self, selector: #selector(self.audioDeviceChanged), name: Notification.Name.defaultOutputDeviceChanged, object: nil) // subscribe Audio output detector (SimplyCoreAudio) DistributedNotificationCenter.default.addObserver(self, selector: #selector(self.displayReconfigured), name: NSNotification.Name(rawValue: kColorSyncDisplayDeviceProfilesNotification.takeRetainedValue() as String), object: nil) // ColorSync change NSWorkspace.shared.notificationCenter.addObserver(self, selector: #selector(self.sleepNotification), name: NSWorkspace.screensDidSleepNotification, object: nil) // sleep and wake listeners - NSWorkspace.shared.notificationCenter.addObserver(self, selector: #selector(self.wakeNotofication), name: NSWorkspace.screensDidWakeNotification, object: nil) + NSWorkspace.shared.notificationCenter.addObserver(self, selector: #selector(self.wakeNotification), name: NSWorkspace.screensDidWakeNotification, object: nil) NSWorkspace.shared.notificationCenter.addObserver(self, selector: #selector(self.sleepNotification), name: NSWorkspace.willSleepNotification, object: nil) - NSWorkspace.shared.notificationCenter.addObserver(self, selector: #selector(self.wakeNotofication), name: NSWorkspace.didWakeNotification, object: nil) + NSWorkspace.shared.notificationCenter.addObserver(self, selector: #selector(self.wakeNotification), name: NSWorkspace.didWakeNotification, object: nil) _ = DistributedNotificationCenter.default().addObserver(forName: NSNotification.Name(rawValue: NSNotification.Name.accessibilityApi.rawValue), object: nil, queue: nil) { _ in DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { self.updateMediaKeyTap() } } // listen for accessibility status changes } @@ -179,7 +179,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { os_log("Sleeping with sleep %{public}@", type: .info, String(self.sleepID)) } - @objc private func wakeNotofication() { + @objc private func wakeNotification() { if self.sleepID != 0 { os_log("Waking up from sleep %{public}@", type: .info, String(self.sleepID)) let dispatchedSleepID = self.sleepID diff --git a/MonitorControl/Support/Arm64DDC.swift b/MonitorControl/Support/Arm64DDC.swift index be78bf1d..c08ae7f9 100644 --- a/MonitorControl/Support/Arm64DDC.swift +++ b/MonitorControl/Support/Arm64DDC.swift @@ -271,6 +271,10 @@ class Arm64DDC: NSObject { if ioregService.manufacturerID == "AOC", ioregService.productName == "28E850" { return true } + // If the display contains the string "Dummy", then it is highly suspicious + if ioregService.productName.contains("Dummy") || ioregService.productName.contains("dummy") { + return true + } // First service location of Mac Mini HDMI is broken for DDC communication if ioregService.transportDownstream == "HDMI", ioregService.serviceLocation == 1, modelIdentifier == "Macmini9,1" { return true diff --git a/MonitorControl/Support/DisplayManager.swift b/MonitorControl/Support/DisplayManager.swift index 27b35ee1..c98c4762 100644 --- a/MonitorControl/Support/DisplayManager.swift +++ b/MonitorControl/Support/DisplayManager.swift @@ -151,27 +151,34 @@ class DisplayManager { return } for onlineDisplayID in onlineDisplayIDs where onlineDisplayID != 0 { + let rawName = DisplayManager.getDisplayRawNameByID(displayID: onlineDisplayID) let name = DisplayManager.getDisplayNameByID(displayID: onlineDisplayID) let id = onlineDisplayID let vendorNumber = CGDisplayVendorNumber(onlineDisplayID) let modelNumber = CGDisplayModelNumber(onlineDisplayID) + var isDummy: Bool = false var isVirtual: Bool = false + if rawName == "28E850" || rawName.lowercased().contains("dummy") { + os_log("NOTE: Display is a dummy!", type: .info) + isDummy = true + } if !DEBUG_MACOS10, #available(macOS 11.0, *) { if let dictionary = ((CoreDisplay_DisplayCreateInfoDictionary(onlineDisplayID))?.takeRetainedValue() as NSDictionary?) { let isVirtualDevice = dictionary["kCGDisplayIsVirtualDevice"] as? Bool let displayIsAirplay = dictionary["kCGDisplayIsAirPlay"] as? Bool if isVirtualDevice ?? displayIsAirplay ?? false { + os_log("NOTE: Display is virtual!", type: .info) isVirtual = true } } } if !DEBUG_SW, DisplayManager.isAppleDisplay(displayID: onlineDisplayID) { // MARK: (point of interest for testing) - let appleDisplay = AppleDisplay(id, name: name, vendorNumber: vendorNumber, modelNumber: modelNumber, isVirtual: isVirtual) - os_log("Apple display found - %{public}@", type: .info, "ID: \(appleDisplay.identifier) Name: \(appleDisplay.name) (Vendor: \(appleDisplay.vendorNumber ?? 0), Model: \(appleDisplay.modelNumber ?? 0))") + let appleDisplay = AppleDisplay(id, name: name, vendorNumber: vendorNumber, modelNumber: modelNumber, isVirtual: isVirtual, isDummy: isDummy) + os_log("Apple display found - %{public}@", type: .info, "ID: \(appleDisplay.identifier), Name: \(appleDisplay.name) (Vendor: \(appleDisplay.vendorNumber ?? 0), Model: \(appleDisplay.modelNumber ?? 0))") self.addDisplay(display: appleDisplay) } else { - let otherDisplay = OtherDisplay(id, name: name, vendorNumber: vendorNumber, modelNumber: modelNumber, isVirtual: isVirtual) - os_log("Other display found - %{public}@", type: .info, "ID: \(otherDisplay.identifier) Name: \(otherDisplay.name) (Vendor: \(otherDisplay.vendorNumber ?? 0), Model: \(otherDisplay.modelNumber ?? 0))") + let otherDisplay = OtherDisplay(id, name: name, vendorNumber: vendorNumber, modelNumber: modelNumber, isVirtual: isVirtual, isDummy: isDummy) + os_log("Other display found - %{public}@", type: .info, "ID: \(otherDisplay.identifier), Name: \(otherDisplay.name) (Vendor: \(otherDisplay.vendorNumber ?? 0), Model: \(otherDisplay.modelNumber ?? 0))") self.addDisplay(display: otherDisplay) } } @@ -351,7 +358,7 @@ class DisplayManager { } } - func getAffectedDisplays(isBrightness: Bool = false, isVolume: Bool = false, isContrast _: Bool = false) -> [Display]? { + func getAffectedDisplays(isBrightness: Bool = false, isVolume: Bool = false) -> [Display]? { var affectedDisplays: [Display] let allDisplays = self.getAllDisplays() var currentDisplay: Display? diff --git a/MonitorControl/View Controllers/DisplaysPrefsViewController.swift b/MonitorControl/View Controllers/DisplaysPrefsViewController.swift index 67909de7..6bfcf26e 100644 --- a/MonitorControl/View Controllers/DisplaysPrefsViewController.swift +++ b/MonitorControl/View Controllers/DisplaysPrefsViewController.swift @@ -25,9 +25,13 @@ class DisplaysPrefsViewController: NSViewController, PreferencePane, NSTableView override func viewDidLoad() { super.viewDidLoad() - self.showAdvancedDisplays.state = prefs.bool(forKey: PrefKey.showAdvancedSettings.rawValue) ? .on : .off - self.loadDisplayList() self.displayScrollView.scrollerStyle = .legacy + self.populateSettings() + self.loadDisplayList() + } + + func populateSettings() { + self.showAdvancedDisplays.state = prefs.bool(forKey: PrefKey.showAdvancedSettings.rawValue) ? .on : .off } override func viewWillAppear() { @@ -88,12 +92,12 @@ class DisplaysPrefsViewController: NSViewController, PreferencePane, NSTableView var displayImage = "display.trianglebadge.exclamationmark" var controlMethod = NSLocalizedString("No Control", comment: "Shown in the Display Preferences") + " ⚠️" var controlStatus = NSLocalizedString("This display has an unspecified control status.", comment: "Shown in the Display Preferences") - if display.isVirtual { + if display.isVirtual, !display.isDummy { displayType = NSLocalizedString("Virtual Display", comment: "Shown in the Display Preferences") displayImage = "tv.and.mediabox" controlMethod = NSLocalizedString("Software (shade)", comment: "Shown in the Display Preferences") + " ⚠️" controlStatus = NSLocalizedString("This is a virtual display (examples: AirPlay, Sidecar, display connected via a DisplayLink Dock or similar) which does not allow hardware or software gammatable control. Shading is used as a substitute but only in non-mirror scenarios. Mouse cursor will be unaffected and artifacts may appear when entering/leaving full screen mode.", comment: "Shown in the Display Preferences") - } else if display is OtherDisplay { + } else if display is OtherDisplay, !display.isDummy { displayType = NSLocalizedString("External Display", comment: "Shown in the Display Preferences") displayImage = "display" if let otherDisplay: OtherDisplay = display as? OtherDisplay { @@ -119,7 +123,7 @@ class DisplaysPrefsViewController: NSViewController, PreferencePane, NSTableView } } } - } else if let appleDisplay: AppleDisplay = display as? AppleDisplay { + } else if !display.isDummy, let appleDisplay: AppleDisplay = display as? AppleDisplay { if appleDisplay.isBuiltIn() { displayType = NSLocalizedString("Built-in Display", comment: "Shown in the Display Preferences") if self.isImac() { diff --git a/MonitorControl/View Controllers/MainPrefsViewController.swift b/MonitorControl/View Controllers/MainPrefsViewController.swift index 52e9373e..1f48f690 100644 --- a/MonitorControl/View Controllers/MainPrefsViewController.swift +++ b/MonitorControl/View Controllers/MainPrefsViewController.swift @@ -152,6 +152,7 @@ class MainPrefsViewController: NSViewController, PreferencePane { self.populateSettings() menuslidersPrefsVc?.populateSettings() keyboardPrefsVc?.populateSettings() + displaysPrefsVc?.populateSettings() } } diff --git a/MonitorControlHelper/Info.plist b/MonitorControlHelper/Info.plist index 2b798d77..5bfa29f3 100644 --- a/MonitorControlHelper/Info.plist +++ b/MonitorControlHelper/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 6828 + 6850 LSApplicationCategoryType public.app-category.utilities LSBackgroundOnly From 6a22d8d1c7ddcfaf55a606d1f0b29c9ca95e2444 Mon Sep 17 00:00:00 2001 From: jajoho Date: Wed, 27 Oct 2021 12:02:13 +0200 Subject: [PATCH 005/101] Update german translation (#742) --- MonitorControl/UI/de.lproj/Main.strings | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MonitorControl/UI/de.lproj/Main.strings b/MonitorControl/UI/de.lproj/Main.strings index 40f576a4..b61cf2f8 100644 --- a/MonitorControl/UI/de.lproj/Main.strings +++ b/MonitorControl/UI/de.lproj/Main.strings @@ -188,7 +188,7 @@ "j72-NF-zsW.title" = "Bei Anmeldung starten"; /* Class = "NSMenuItem"; title = "Change for all screens"; ObjectID = "jSj-HB-T2t"; */ -"jSj-HB-T2t.title" = "Change for all screens"; +"jSj-HB-T2t.title" = "Für alle Monitore ändern"; /* Class = "NSButtonCell"; title = "Check for updates"; ObjectID = "jVH-oc-rUi"; */ "jVH-oc-rUi.title" = "Nach Updates suchen"; @@ -341,7 +341,7 @@ "xQJ-aJ-VhH.title" = "Sowohl Standard- als auch benutzerdefinierte Tastenkombinationen"; /* Class = "NSTextFieldCell"; title = "Works best with various syncing and 'control all' keyboard settings enabled."; ObjectID = "XU4-Bn-bwH"; */ -"XU4-Bn-bwH.title" = "Funktioniert am bestenm mit variabler Synchronisierung und 'Steuerung aller' Tastatureinstellung aktiviert. "; +"XU4-Bn-bwH.title" = "Funktioniert mit variabler Synchronisierung und 'Steuerung aller'-Tastatureinstellung am besten."; /* Class = "NSTextFieldCell"; title = "Available"; ObjectID = "yBJ-5d-I7e"; */ "yBJ-5d-I7e.title" = "Verfügbar"; From c7d5d02a97f335b98513b53d916b9824b109c5c4 Mon Sep 17 00:00:00 2001 From: Istvan T <37590873+waydabber@users.noreply.github.com> Date: Thu, 28 Oct 2021 08:41:12 +0200 Subject: [PATCH 006/101] Fixed note wraps, bumped version number to 4.0.1 (#746) --- MonitorControl.xcodeproj/project.pbxproj | 4 ++-- MonitorControl/Info.plist | 2 +- MonitorControl/UI/Base.lproj/Main.storyboard | 10 +++++----- MonitorControlHelper/Info.plist | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/MonitorControl.xcodeproj/project.pbxproj b/MonitorControl.xcodeproj/project.pbxproj index 578baf4f..cdc9cba7 100644 --- a/MonitorControl.xcodeproj/project.pbxproj +++ b/MonitorControl.xcodeproj/project.pbxproj @@ -822,7 +822,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 4.0.0; + MARKETING_VERSION = 4.0.1; PRODUCT_BUNDLE_IDENTIFIER = me.guillaumeb.MonitorControlHelper; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -851,7 +851,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 4.0.0; + MARKETING_VERSION = 4.0.1; PRODUCT_BUNDLE_IDENTIFIER = me.guillaumeb.MonitorControlHelper; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; diff --git a/MonitorControl/Info.plist b/MonitorControl/Info.plist index 4b77b24e..1c3560c6 100644 --- a/MonitorControl/Info.plist +++ b/MonitorControl/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 6850 + 6851 LSApplicationCategoryType public.app-category.utilities LSMinimumSystemVersion diff --git a/MonitorControl/UI/Base.lproj/Main.storyboard b/MonitorControl/UI/Base.lproj/Main.storyboard index 6e21e43d..a209a081 100644 --- a/MonitorControl/UI/Base.lproj/Main.storyboard +++ b/MonitorControl/UI/Base.lproj/Main.storyboard @@ -1,8 +1,8 @@ - + - + @@ -531,7 +531,7 @@ - + @@ -571,7 +571,7 @@ - + @@ -1249,7 +1249,7 @@ - + diff --git a/MonitorControlHelper/Info.plist b/MonitorControlHelper/Info.plist index 5bfa29f3..a30473e1 100644 --- a/MonitorControlHelper/Info.plist +++ b/MonitorControlHelper/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 6850 + 6851 LSApplicationCategoryType public.app-category.utilities LSBackgroundOnly From 274fff45f813738ffe71a52095fb1f06513243be Mon Sep 17 00:00:00 2001 From: marcofucito Date: Fri, 29 Oct 2021 08:37:14 +0200 Subject: [PATCH 007/101] small fix on the Italian translation (#749) --- MonitorControl/UI/it.lproj/Main.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MonitorControl/UI/it.lproj/Main.strings b/MonitorControl/UI/it.lproj/Main.strings index 88e44d57..62a3bb83 100644 --- a/MonitorControl/UI/it.lproj/Main.strings +++ b/MonitorControl/UI/it.lproj/Main.strings @@ -137,7 +137,7 @@ "FER-Ri-4UO.title" = "Volume:"; /* Class = "NSButtonCell"; title = "Allow zero brightness via software or combined dimming"; ObjectID = "FjB-XL-fG5"; */ -"FjB-XL-fG5.title" = "Permetti la luminosità zero cia software o attenuazione combinata"; +"FjB-XL-fG5.title" = "Permetti la luminosità zero via software o attenuazione combinata"; /* Class = "NSTextFieldCell"; title = "Apple and built-in displays already have a brightness slider in Control Center."; ObjectID = "fmZ-HI-Mdc"; */ "fmZ-HI-Mdc.title" = "I Monitor Apple ed incorporati hanno già lo slider della luminosità nel Centro di Controllo."; From 6580da15d3c7f4ac09bf8a6ba8d5af7edf36fdce Mon Sep 17 00:00:00 2001 From: Takuro Ito Date: Sun, 31 Oct 2021 21:53:15 +0900 Subject: [PATCH 008/101] =?UTF-8?q?Add=20=E2=8C=98=20+=20,=20keyboard=20sh?= =?UTF-8?q?ortcut=20to=20"Preferences..."=20(#753)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MonitorControl/Support/MenuHandler.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MonitorControl/Support/MenuHandler.swift b/MonitorControl/Support/MenuHandler.swift index f05d80fc..2a61c19c 100644 --- a/MonitorControl/Support/MenuHandler.swift +++ b/MonitorControl/Support/MenuHandler.swift @@ -266,7 +266,7 @@ class MenuHandler: NSMenu, NSMenuDelegate { if app.macOS10() { self.insertItem(NSMenuItem.separator(), at: self.items.count) } - self.insertItem(withTitle: NSLocalizedString("Preferences…", comment: "Shown in menu"), action: #selector(app.prefsClicked), keyEquivalent: "", at: self.items.count) + self.insertItem(withTitle: NSLocalizedString("Preferences…", comment: "Shown in menu"), action: #selector(app.prefsClicked), keyEquivalent: ",", at: self.items.count) let updateItem = NSMenuItem(title: NSLocalizedString("Check for updates…", comment: "Shown in menu"), action: #selector(app.updaterController.checkForUpdates(_:)), keyEquivalent: "") updateItem.target = app.updaterController self.insertItem(updateItem, at: self.items.count) From 9f938409950e4db2019a8a65a026c73934f47ad6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dar=C3=ADo=20Here=C3=B1=C3=BA?= Date: Sun, 31 Oct 2021 13:18:41 -0300 Subject: [PATCH 009/101] Minor fixes (lines 60, 62) (#755) --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ffd93ac1..80793604 100644 --- a/README.md +++ b/README.md @@ -57,9 +57,9 @@ Go to [Releases](https://github.com/MonitorControl/MonitorControl/releases) and - Allows dimming to full black (advanced feature). - Support for custom keyboard shortcuts as well as standard brightness and media keys on Apple keyboards. - Dozens of customization options to tweak the inner workings of the app to suit your hardware and needs (don't forget to enable `Show advanced settings` in app Preferences). -- Modern, stylish and highgly customizable menulet reflecting the design of Control Control introduced in Big Sur. +- Modern, stylish and highly customizable menulet reflecting the design of Control Control introduced in Big Sur. - Simple, unobstrusive UI to blend in to the general aesthetics of macOS (even the menu icon can be hidden). -- Supports automatic updates for a hassle-free expereince. +- Supports automatic updates for a hassle-free experience. - The best app of its kind, completely FREE (donations accepted) with the source code transparently available! ## How to install and use the app From cfc77d53d6aea9863cec0f9db409c4154b5d976b Mon Sep 17 00:00:00 2001 From: Istvan T <37590873+waydabber@users.noreply.github.com> Date: Thu, 4 Nov 2021 17:56:23 +0100 Subject: [PATCH 010/101] Various fixes and improvements for v4.0.1 (#769) - Fixed: display properties reset turns off hardware DDC - Fixed: brief black screen upon changing space when using shade dimming - Asynchronous thread-safe debouncing DDC write for smoother sliders - Improved support for [BetterDummy](https://github.com/waydabber/BetterDummy) - Better support for common physical dummies identifying as 28E850 - Inert dummy menu sliders are now hidden - Improved support for nongamma->nongamma mirroring scenarios - Compiled to run 10.14 (needed some minor changes) - compatibility is unofficial! - Updated README - Bumped version number to 4.0.1 (service release) --- .swiftlint.yml | 2 +- MonitorControl.xcodeproj/project.pbxproj | 12 +-- MonitorControl/Info.plist | 2 +- MonitorControl/Model/Display.swift | 6 +- MonitorControl/Model/OtherDisplay.swift | 70 ++++++++++------ MonitorControl/Support/DisplayManager.swift | 82 +++++++++++++------ MonitorControl/Support/MenuHandler.swift | 4 +- MonitorControl/Support/SliderHandler.swift | 4 +- .../DisplaysPrefsCellView.swift | 2 +- MonitorControlHelper/Info.plist | 2 +- README.md | 45 +++++----- 11 files changed, 142 insertions(+), 89 deletions(-) diff --git a/.swiftlint.yml b/.swiftlint.yml index 92526482..7cc44deb 100644 --- a/.swiftlint.yml +++ b/.swiftlint.yml @@ -4,7 +4,7 @@ disabled_rules: - identifier_name - trailing_comma type_body_length: 500 -file_length: 500 +file_length: 750 cyclomatic_complexity: ignores_case_statements: true opening_brace: diff --git a/MonitorControl.xcodeproj/project.pbxproj b/MonitorControl.xcodeproj/project.pbxproj index cdc9cba7..95fc229d 100644 --- a/MonitorControl.xcodeproj/project.pbxproj +++ b/MonitorControl.xcodeproj/project.pbxproj @@ -751,8 +751,8 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 4.0.0; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MARKETING_VERSION = 4.0.1; PRODUCT_BUNDLE_IDENTIFIER = me.guillaumeb.MonitorControl; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -786,8 +786,8 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 4.0.0; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MARKETING_VERSION = 4.0.1; PRODUCT_BUNDLE_IDENTIFIER = me.guillaumeb.MonitorControl; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -821,7 +821,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.15; + MACOSX_DEPLOYMENT_TARGET = 10.14; MARKETING_VERSION = 4.0.1; PRODUCT_BUNDLE_IDENTIFIER = me.guillaumeb.MonitorControlHelper; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -850,7 +850,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.15; + MACOSX_DEPLOYMENT_TARGET = 10.14; MARKETING_VERSION = 4.0.1; PRODUCT_BUNDLE_IDENTIFIER = me.guillaumeb.MonitorControlHelper; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/MonitorControl/Info.plist b/MonitorControl/Info.plist index 1c3560c6..1b6ff213 100644 --- a/MonitorControl/Info.plist +++ b/MonitorControl/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 6851 + 6941 LSApplicationCategoryType public.app-category.utilities LSMinimumSystemVersion diff --git a/MonitorControl/Model/Display.swift b/MonitorControl/Model/Display.swift index b68e5186..0563b501 100644 --- a/MonitorControl/Model/Display.swift +++ b/MonitorControl/Model/Display.swift @@ -230,7 +230,7 @@ class Display: Equatable { return } if self.isVirtual || self.readPrefAsBool(key: .avoidGamma) { - _ = DisplayManager.shared.setShadeAlpha(value: 1 - transientValue, displayID: self.identifier) + _ = DisplayManager.shared.setShadeAlpha(value: 1 - transientValue, displayID: DisplayManager.resolveEffectiveDisplayID(self.identifier)) } else { let gammaTableRed = self.defaultGammaTableRed.map { $0 * transientValue } let gammaTableGreen = self.defaultGammaTableGreen.map { $0 * transientValue } @@ -243,7 +243,7 @@ class Display: Equatable { } else { if self.isVirtual || self.readPrefAsBool(key: .avoidGamma) { self.swBrightnessSemaphore.signal() - return DisplayManager.shared.setShadeAlpha(value: 1 - newValue, displayID: self.identifier) + return DisplayManager.shared.setShadeAlpha(value: 1 - newValue, displayID: DisplayManager.resolveEffectiveDisplayID(self.identifier)) } else { let gammaTableRed = self.defaultGammaTableRed.map { $0 * newValue } let gammaTableGreen = self.defaultGammaTableGreen.map { $0 * newValue } @@ -267,7 +267,7 @@ class Display: Equatable { } self.swBrightnessSemaphore.wait() if self.isVirtual || self.readPrefAsBool(key: .avoidGamma) { - let rawBrightnessValue = 1 - (DisplayManager.shared.getShadeAlpha(displayID: self.identifier) ?? 1) + let rawBrightnessValue = 1 - (DisplayManager.shared.getShadeAlpha(displayID: DisplayManager.resolveEffectiveDisplayID(self.identifier)) ?? 1) self.swBrightnessSemaphore.signal() return self.swBrightnessTransform(value: rawBrightnessValue, reverse: true) } diff --git a/MonitorControl/Model/OtherDisplay.swift b/MonitorControl/Model/OtherDisplay.swift index f95afcc7..9c95cb58 100644 --- a/MonitorControl/Model/OtherDisplay.swift +++ b/MonitorControl/Model/OtherDisplay.swift @@ -9,6 +9,9 @@ class OtherDisplay: Display { var arm64ddc: Bool = false var arm64avService: IOAVService? var isDiscouraged: Bool = false + let writeDDCQueue = DispatchQueue(label: "Local write DDC queue") + var writeDDCNextValue: [Command: UInt16] = [:] + var writeDDCLastSavedValue: [Command: UInt16] = [:] var pollingCount: Int { get { switch self.readPrefAsInt(key: .pollingMode) { @@ -76,11 +79,11 @@ class OtherDisplay: Display { if !self.smoothBrightnessRunning, !self.isSw(), !self.readPrefAsBool(key: .unavailableDDC, for: command), self.readPrefAsBool(key: .isTouched, for: command), prefs.integer(forKey: PrefKey.startupAction.rawValue) == StartupAction.write.rawValue, !app.safeMode { let restoreValue = self.getDDCValueFromPrefs(command) os_log("Restoring %{public}@ DDC value %{public}@ for %{public}@", type: .info, String(reflecting: command), String(restoreValue), self.name) - _ = self.writeDDCValues(command: command, value: restoreValue) + self.writeDDCValues(command: command, value: restoreValue) if command == .audioSpeakerVolume, self.readPrefAsBool(key: .enableMuteUnmute) { let currentMuteValue = self.readPrefAsInt(for: .audioMuteScreenBlank) == 0 ? 2 : self.readPrefAsInt(for: .audioMuteScreenBlank) os_log("- Writing last saved DDC value for Mute: %{public}@", type: .info, String(currentMuteValue)) - _ = self.writeDDCValues(command: .audioMuteScreenBlank, value: UInt16(currentMuteValue)) + self.writeDDCValues(command: .audioMuteScreenBlank, value: UInt16(currentMuteValue)) } } } @@ -178,13 +181,11 @@ class OtherDisplay: Display { let isAlreadySet = volumeOSDValue == self.readPrefAsFloat(for: .audioSpeakerVolume) if !isAlreadySet { if let muteValue = muteValue, self.readPrefAsBool(key: .enableMuteUnmute) { - guard self.writeDDCValues(command: .audioMuteScreenBlank, value: UInt16(muteValue)) == true else { - return - } + self.writeDDCValues(command: .audioMuteScreenBlank, value: UInt16(muteValue)) self.savePref(muteValue, for: .audioMuteScreenBlank) } if !self.readPrefAsBool(key: .enableMuteUnmute) || volumeOSDValue != 0 { - _ = self.writeDDCValues(command: .audioSpeakerVolume, value: self.convValueToDDC(for: .audioSpeakerVolume, from: volumeOSDValue)) + self.writeDDCValues(command: .audioSpeakerVolume, value: self.convValueToDDC(for: .audioSpeakerVolume, from: volumeOSDValue)) } } if !self.readPrefAsBool(key: .hideOsd) { @@ -206,7 +207,7 @@ class OtherDisplay: Display { let contrastOSDValue = self.calcNewValue(currentValue: currentValue, isUp: isUp, isSmallIncrement: isSmallIncrement) let isAlreadySet = contrastOSDValue == self.readPrefAsFloat(for: .contrast) if !isAlreadySet { - _ = self.writeDDCValues(command: .contrast, value: self.convValueToDDC(for: .contrast, from: contrastOSDValue)) + self.writeDDCValues(command: .contrast, value: self.convValueToDDC(for: .contrast, from: contrastOSDValue)) } OSDUtils.showOsd(displayID: self.identifier, command: .contrast, value: contrastOSDValue, roundChiclet: !isSmallIncrement) if !isAlreadySet { @@ -237,13 +238,11 @@ class OtherDisplay: Display { } } if self.readPrefAsBool(key: .enableMuteUnmute) { - guard self.writeDDCValues(command: .audioMuteScreenBlank, value: UInt16(muteValue)) == true else { - return - } + self.writeDDCValues(command: .audioMuteScreenBlank, value: UInt16(muteValue)) } self.savePref(muteValue, for: .audioMuteScreenBlank) if !self.readPrefAsBool(key: .enableMuteUnmute) || volumeOSDValue > 0 { - _ = self.writeDDCValues(command: .audioSpeakerVolume, value: self.convValueToDDC(for: .audioSpeakerVolume, from: volumeOSDValue)) + self.writeDDCValues(command: .audioSpeakerVolume, value: self.convValueToDDC(for: .audioSpeakerVolume, from: volumeOSDValue)) } if !fromVolumeSlider { if !self.readPrefAsBool(key: .hideOsd) { @@ -345,12 +344,12 @@ class OtherDisplay: Display { brightnessValue = 0 brightnessSwValue = (value / self.combinedBrightnessSwitchingValue()) } - _ = self.writeDDCValues(command: .brightness, value: self.convValueToDDC(for: .brightness, from: brightnessValue)) + self.writeDDCValues(command: .brightness, value: self.convValueToDDC(for: .brightness, from: brightnessValue)) if self.readPrefAsFloat(key: .SwBrightness) != brightnessSwValue { _ = self.setSwBrightness(brightnessSwValue) } } else { - _ = self.writeDDCValues(command: .brightness, value: self.convValueToDDC(for: .brightness, from: value)) + self.writeDDCValues(command: .brightness, value: self.convValueToDDC(for: .brightness, from: value)) } if !transient { self.savePref(value, for: .brightness) @@ -378,28 +377,45 @@ class OtherDisplay: Display { return intCodes } - public func writeDDCValues(command: Command, value: UInt16, errorRecoveryWaitTime _: UInt32? = nil) -> Bool? { + public func writeDDCValues(command: Command, value: UInt16) { guard app.sleepID == 0, app.reconfigureID == 0, !self.readPrefAsBool(key: .forceSw), !self.readPrefAsBool(key: .unavailableDDC, for: command) else { - return false + return + } + self.writeDDCQueue.async(flags: .barrier) { + self.writeDDCNextValue[command] = value + } + DisplayManager.shared.globalDDCQueue.async(flags: .barrier) { + self.asyncPerformWriteDDCValues(command: command) + } + } + + func asyncPerformWriteDDCValues(command: Command) { + var value = UInt16.max + var lastValue = UInt16.max + self.writeDDCQueue.sync { + value = self.writeDDCNextValue[command] ?? UInt16.max + lastValue = self.writeDDCLastSavedValue[command] ?? UInt16.max + } + guard value != UInt16.max, value != lastValue else { + return + } + self.writeDDCQueue.async(flags: .barrier) { + self.writeDDCLastSavedValue[command] = value + self.savePref(true, key: PrefKey.isTouched, for: command) } - var success: Bool = false var controlCodes = self.getRemapControlCodes(command: command) if controlCodes.count == 0 { controlCodes.append(command.rawValue) } for controlCode in controlCodes { - DisplayManager.shared.ddcQueue.sync { - if Arm64DDC.isArm64 { - if self.arm64ddc { - success = Arm64DDC.write(service: self.arm64avService, command: controlCode, value: value) - } - } else { - success = self.ddc?.write(command: command.rawValue, value: value, errorRecoveryWaitTime: 2000) ?? false + if Arm64DDC.isArm64 { + if self.arm64ddc { + _ = Arm64DDC.write(service: self.arm64avService, command: controlCode, value: value) } - self.savePref(true, key: PrefKey.isTouched, for: command) // We deliberatly consider the value tuched no matter if the call succeeded + } else { + _ = self.ddc?.write(command: controlCode, value: value, errorRecoveryWaitTime: 2000) ?? false } } - return success } func readDDCValues(for command: Command, tries: UInt, minReplyDelay delay: UInt64?) -> (current: UInt16, max: UInt16)? { @@ -413,7 +429,7 @@ class OtherDisplay: Display { guard self.arm64ddc else { return nil } - DisplayManager.shared.ddcQueue.sync { + DisplayManager.shared.globalDDCQueue.sync { if let unwrappedDelay = delay { values = Arm64DDC.read(service: self.arm64avService, command: controlCode, tries: UInt8(min(tries, 255)), minReplyDelay: UInt32(unwrappedDelay / 1000)) } else { @@ -421,7 +437,7 @@ class OtherDisplay: Display { } } } else { - DisplayManager.shared.ddcQueue.sync { + DisplayManager.shared.globalDDCQueue.sync { values = self.ddc?.read(command: controlCode, tries: tries, minReplyDelay: delay) } } diff --git a/MonitorControl/Support/DisplayManager.swift b/MonitorControl/Support/DisplayManager.swift index c98c4762..f4269721 100644 --- a/MonitorControl/Support/DisplayManager.swift +++ b/MonitorControl/Support/DisplayManager.swift @@ -9,7 +9,7 @@ class DisplayManager { var displays: [Display] = [] var audioControlTargetDisplays: [OtherDisplay] = [] - let ddcQueue = DispatchQueue(label: "DDC queue") + let globalDDCQueue = DispatchQueue(label: "Global DDC queue") let gammaActivityEnforcer = NSWindow(contentRect: .init(origin: NSPoint(x: 0, y: 0), size: .init(width: DEBUG_GAMMA_ENFORCER ? 15 : 1, height: DEBUG_GAMMA_ENFORCER ? 15 : 1)), styleMask: [], backing: .buffered, defer: false) var gammaInterferenceCounter = 0 var gammaInterferenceWarningShown = false @@ -43,8 +43,22 @@ class DisplayManager { internal var shades: [CGDirectDisplayID: NSWindow] = [:] internal var shadeGrave: [NSWindow] = [] - func isDisqualifiedFromShade(_ displayID: CGDirectDisplayID) -> Bool { // We ban mirror members from shade control as it might lead to double control - return (CGDisplayIsInHWMirrorSet(displayID) != 0 || CGDisplayIsInMirrorSet(displayID) != 0) ? true : false + func isDisqualifiedFromShade(_ displayID: CGDirectDisplayID) -> Bool { + if CGDisplayIsInHWMirrorSet(displayID) != 0 || CGDisplayIsInMirrorSet(displayID) != 0 { + if displayID == DisplayManager.resolveEffectiveDisplayID(displayID), DisplayManager.isVirtual(displayID: displayID) || DisplayManager.isDummy(displayID: displayID) { + var displayIDs = [CGDirectDisplayID](repeating: 0, count: 16) + var displayCount: UInt32 = 0 + guard CGGetOnlineDisplayList(16, &displayIDs, &displayCount) == .success else { + return true + } + for displayId in displayIDs where CGDisplayMirrorsDisplay(displayId) == displayID && !DisplayManager.isVirtual(displayID: displayID) { + return true + } + return false + } + return true + } + return false } internal func createShadeOnDisplay(displayID: CGDirectDisplayID) -> NSWindow? { @@ -52,13 +66,16 @@ class DisplayManager { let shade = NSWindow(contentRect: .init(origin: NSPoint(x: 0, y: 0), size: .init(width: 10, height: 1)), styleMask: [], backing: .buffered, defer: false) shade.title = "Monitor Control Window Shade for Display " + String(displayID) shade.isMovableByWindowBackground = false - shade.backgroundColor = .black + shade.backgroundColor = .clear shade.ignoresMouseEvents = true shade.level = NSWindow.Level(rawValue: Int(CGShieldingWindowLevel())) - shade.alphaValue = 0 shade.orderFrontRegardless() shade.collectionBehavior = [.stationary, .canJoinAllSpaces, .ignoresCycle] shade.setFrame(screen.frame, display: true) + shade.contentView?.wantsLayer = true + shade.contentView?.alphaValue = 0.0 + shade.contentView?.layer?.backgroundColor = .black + shade.contentView?.setNeedsDisplay(shade.frame) os_log("Window shade created for display %{public}@", type: .info, String(displayID)) return shade } @@ -125,7 +142,7 @@ class DisplayManager { return 1 } if let shade = getShade(displayID: displayID) { - return Float(shade.alphaValue) + return Float(shade.contentView?.alphaValue ?? 1) } else { return 1 } @@ -136,7 +153,7 @@ class DisplayManager { return false } if let shade = getShade(displayID: displayID) { - shade.alphaValue = CGFloat(value) + shade.contentView?.alphaValue = CGFloat(value) return true } return false @@ -151,27 +168,12 @@ class DisplayManager { return } for onlineDisplayID in onlineDisplayIDs where onlineDisplayID != 0 { - let rawName = DisplayManager.getDisplayRawNameByID(displayID: onlineDisplayID) let name = DisplayManager.getDisplayNameByID(displayID: onlineDisplayID) let id = onlineDisplayID let vendorNumber = CGDisplayVendorNumber(onlineDisplayID) let modelNumber = CGDisplayModelNumber(onlineDisplayID) - var isDummy: Bool = false - var isVirtual: Bool = false - if rawName == "28E850" || rawName.lowercased().contains("dummy") { - os_log("NOTE: Display is a dummy!", type: .info) - isDummy = true - } - if !DEBUG_MACOS10, #available(macOS 11.0, *) { - if let dictionary = ((CoreDisplay_DisplayCreateInfoDictionary(onlineDisplayID))?.takeRetainedValue() as NSDictionary?) { - let isVirtualDevice = dictionary["kCGDisplayIsVirtualDevice"] as? Bool - let displayIsAirplay = dictionary["kCGDisplayIsAirPlay"] as? Bool - if isVirtualDevice ?? displayIsAirplay ?? false { - os_log("NOTE: Display is virtual!", type: .info) - isVirtual = true - } - } - } + let isDummy: Bool = DisplayManager.isDummy(displayID: onlineDisplayID) + let isVirtual: Bool = DisplayManager.isVirtual(displayID: onlineDisplayID) if !DEBUG_SW, DisplayManager.isAppleDisplay(displayID: onlineDisplayID) { // MARK: (point of interest for testing) let appleDisplay = AppleDisplay(id, name: name, vendorNumber: vendorNumber, modelNumber: modelNumber, isVirtual: isVirtual, isDummy: isDummy) os_log("Apple display found - %{public}@", type: .info, "ID: \(appleDisplay.identifier), Name: \(appleDisplay.name) (Vendor: \(appleDisplay.vendorNumber ?? 0), Model: \(appleDisplay.modelNumber ?? 0))") @@ -391,6 +393,30 @@ class DisplayManager { return affectedDisplays } + static func isDummy(displayID: CGDirectDisplayID) -> Bool { + let rawName = DisplayManager.getDisplayRawNameByID(displayID: displayID) + var isDummy: Bool = false + if rawName == "28E850" || rawName.lowercased().contains("dummy") { + os_log("NOTE: Display is a dummy!", type: .info) + isDummy = true + } + return isDummy + } + + static func isVirtual(displayID: CGDirectDisplayID) -> Bool { + var isVirtual: Bool = false + if !DEBUG_MACOS10, #available(macOS 11.0, *) { + if let dictionary = ((CoreDisplay_DisplayCreateInfoDictionary(displayID))?.takeRetainedValue() as NSDictionary?) { + let isVirtualDevice = dictionary["kCGDisplayIsVirtualDevice"] as? Bool + let displayIsAirplay = dictionary["kCGDisplayIsAirPlay"] as? Bool + if isVirtualDevice ?? displayIsAirplay ?? false { + isVirtual = true + } + } + } + return isVirtual + } + static func engageMirror() -> Bool { var onlineDisplayIDs = [CGDirectDisplayID](repeating: 0, count: 16) var displayCount: UInt32 = 0 @@ -478,14 +504,18 @@ class DisplayManager { if CGDisplayIsInHWMirrorSet(displayID) != 0 || CGDisplayIsInMirrorSet(displayID) != 0 { let mirroredDisplayID = CGDisplayMirrorsDisplay(displayID) if mirroredDisplayID != 0, let dictionary = ((CoreDisplay_DisplayCreateInfoDictionary(mirroredDisplayID))?.takeRetainedValue() as NSDictionary?), let nameList = dictionary["DisplayProductName"] as? [String: String], let mirroredName = nameList[Locale.current.identifier] ?? nameList["en_US"] ?? nameList.first?.value { - name.append("~" + mirroredName) + name.append(" | " + mirroredName) } } return name } } if let screen = getByDisplayID(displayID: displayID) { // MARK: This, and NSScreen+Extension.swift will not be needed when we drop MacOS 10 support. - return screen.localizedName + if #available(macOS 10.15, *) { + return screen.localizedName + } else { + return screen.displayName ?? defaultName + } } return defaultName } diff --git a/MonitorControl/Support/MenuHandler.swift b/MonitorControl/Support/MenuHandler.swift index 2a61c19c..34615a7f 100644 --- a/MonitorControl/Support/MenuHandler.swift +++ b/MonitorControl/Support/MenuHandler.swift @@ -39,11 +39,11 @@ class MenuHandler: NSMenu, NSMenuDelegate { displays.append(contentsOf: DisplayManager.shared.getOtherDisplays()) let relevant = prefs.integer(forKey: PrefKey.multiSliders.rawValue) == MultiSliders.relevant.rawValue let combine = prefs.integer(forKey: PrefKey.multiSliders.rawValue) == MultiSliders.combine.rawValue - let numOfDisplays = displays.count + let numOfDisplays = displays.filter { !$0.isDummy }.count if numOfDisplays != 0 { let asSubMenu: Bool = (displays.count > 3 && !relevant && !combine && app.macOS10()) ? true : false var iterator = 0 - for display in displays where !relevant || display == currentDisplay { + for display in displays where (!relevant || DisplayManager.resolveEffectiveDisplayID(display.identifier) == DisplayManager.resolveEffectiveDisplayID(currentDisplay!.identifier)) && !display.isDummy { iterator += 1 if !relevant, !combine, iterator != 1, app.macOS10() { self.insertItem(NSMenuItem.separator(), at: 0) diff --git a/MonitorControl/Support/SliderHandler.swift b/MonitorControl/Support/SliderHandler.swift index 51fcb09f..a1c2cc4e 100644 --- a/MonitorControl/Support/SliderHandler.swift +++ b/MonitorControl/Support/SliderHandler.swift @@ -295,10 +295,10 @@ class SliderHandler { } else if !otherDisplay.isSw() { if self.command == Command.audioSpeakerVolume { if !otherDisplay.readPrefAsBool(key: .enableMuteUnmute) || value != 0 { - _ = otherDisplay.writeDDCValues(command: self.command, value: otherDisplay.convValueToDDC(for: self.command, from: value)) + otherDisplay.writeDDCValues(command: self.command, value: otherDisplay.convValueToDDC(for: self.command, from: value)) } } else { - _ = otherDisplay.writeDDCValues(command: self.command, value: otherDisplay.convValueToDDC(for: self.command, from: value)) + otherDisplay.writeDDCValues(command: self.command, value: otherDisplay.convValueToDDC(for: self.command, from: value)) } otherDisplay.savePref(value, for: self.command) } diff --git a/MonitorControl/View Controllers/DisplaysPrefsCellView.swift b/MonitorControl/View Controllers/DisplaysPrefsCellView.swift index 7bc4e8df..ccb0d9ec 100644 --- a/MonitorControl/View Controllers/DisplaysPrefsCellView.swift +++ b/MonitorControl/View Controllers/DisplaysPrefsCellView.swift @@ -359,7 +359,7 @@ class DisplaysPrefsCellView: NSTableCellView { self.ddcButton.state = .on self.ddcButtonToggled(self.ddcButton) self.avoidGamma.state = .off - self.ddcButtonToggled(self.avoidGamma) + self.avoidGamma(self.avoidGamma) self.disableVolumeOSDButton.state = .off self.disableVolumeOSDButton(self.disableVolumeOSDButton) self.pollingModeMenu.selectItem(withTag: 2) diff --git a/MonitorControlHelper/Info.plist b/MonitorControlHelper/Info.plist index a30473e1..955c2f9d 100644 --- a/MonitorControlHelper/Info.plist +++ b/MonitorControlHelper/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 6851 + 6941 LSApplicationCategoryType public.app-category.utilities LSBackgroundOnly diff --git a/README.md b/README.md index 80793604..f7d3e01c 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@

MonitorControl - for Apple Silicon and Intel

-

Controls your external display brightness and volume and shows native OSD.
+

Controls your external display brightness and volume and shows native OSD. Use menulet sliders or the keyboard, including native Apple keys!

Download for macOS
@@ -60,7 +60,7 @@ Go to [Releases](https://github.com/MonitorControl/MonitorControl/releases) and - Modern, stylish and highly customizable menulet reflecting the design of Control Control introduced in Big Sur. - Simple, unobstrusive UI to blend in to the general aesthetics of macOS (even the menu icon can be hidden). - Supports automatic updates for a hassle-free experience. -- The best app of its kind, completely FREE (donations accepted) with the source code transparently available! +- The best app of its kind, completely FREE ([donations welcome](https://opencollective.com/monitorcontrol)) with the source code transparently available! ## How to install and use the app @@ -76,13 +76,13 @@ Go to [Releases](https://github.com/MonitorControl/MonitorControl/releases) and ## Screenshots (Preferences)
-Screenshot -Screenshot
-Screenshot -Screenshot
+Screenshot +Screenshot +Screenshot +Screenshot
-## Compatibility +## macOS compatibility | MonitorControl version | macOS version | | ---------------------- | ----------------- | @@ -92,25 +92,32 @@ Go to [Releases](https://github.com/MonitorControl/MonitorControl/releases) and _* With some limitations - full functionality available on macOS 11 Big Sur or newer._ -Note to f.lux users: the app is now compatible with [f.lux](https://justgetflux.com) as well - please activate `Avoid gamma table manipulation` under `Preferences` » `Displays`! This step is not needed if you use Night Shift. +## Supported displays -## Supported hardware +- Most modern LCD displays from all major manufacturers supported implemented DDC/CI protocol via DisplayPort, HDMI, USB-C or VGA to allow for hardware backlight control. +- Apple (and LG-Apple) displays and built-in displays are supported using native protocol. +- LCD and LED Televisions usually do not implement DDC, these are supported using software alternatives to dim the image (some higher-end sets are able to translate this into hardware backlight dimming). +- OLED or mini/micro-LED displays and televisions are fully supported using gamma table manipulation (this is a no-compromise solution for this class of displays). +- DisplayLink, Airplay and Sidecar are supported using shade (dark overlay) control. -* Most modern LCD displays from all major manufacturers supported implemented DDC/CI protocol via DisplayPort, HDMI, USB-C or VGA to allow for hardware backlight control. -* Apple (and LG-Apple) displays and built-in displays are supported using native protocol. -* LCD and LED Televisions usually do not implement DDC, these are supported using software alternatives to dim the image (some higher-end sets are able to translate this into hardware backlight dimming). -* OLED or mini/micro-LED displays and televisions are fully supported using gamma table manipulation (this is a no-compromise solution for this class of displays). -* DisplayLink, Airplay and Sidecar are supported using shade (dark overlay) control. +Dummy compatibility: -Notable exceptions for hardware control: +- The app is compatible with [BetterDummy](https://github.com/waydabber/BetterDummy) mirrored sets. +- The app is compatible with mirrored sets that include a dummy dongle identifying as `28E850` -* Some displays (notably EIZO) use MCCS over USB or an entirely custom protocol for control. These displays are supported with software dimming only. -* The HDMI port of the 2018 Intel Mac mini and 2020 M1 Mac mini prohibit DDC communication. Software control is still available. We recommend connecting the display via the USB-C port (USB-C to HDMI dongles usually work). -* DisplayLink docks and dongles do not allow for DDC control on Macs, only software dimming is available for these connections. +Notable exceptions for hardware control compatibility: + +- Some displays (notably EIZO) use MCCS over USB or an entirely custom protocol for control. These displays are supported with software dimming only. +- The HDMI port of the 2018 Intel Mac mini and 2020 M1 Mac mini prohibit DDC communication. Software control is still available. We recommend connecting the display via the USB-C port (USB-C to HDMI dongles usually work). +- DisplayLink docks and dongles do not allow for DDC control on Macs, only software dimming is available for these connections. + +Note to f.lux users - please activate `Avoid gamma table manipulation` under `Preferences` » `Displays`! This step is not needed if you use Night Shift. ## How to help -Open [issues](https://github.com/MonitorControl/MonitorControl/issues) if you have a question, an enhancement to suggest or a bug you've found. If you want, you can fork the code yourself and submit a pull request to improve the app. +- You can greatly help out [by financing the project with your donation or by being a Sponsor](https://opencollective.com/monitorcontrol)! +- Open [issues](https://github.com/MonitorControl/MonitorControl/issues) if you have a question, an enhancement to suggest or a bug you've found. +- If you want, you can fork the code yourself and submit a pull request to improve the app (Note: accepting a PR is solely in the collective hands of the maintainers). ## Localizations From 2e05ce1d5ce4279fb7c92d67e1d3bbbd8702da53 Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 12 Nov 2021 16:40:46 +0100 Subject: [PATCH 011/101] Added Spanish language. (#784) --- MonitorControl.xcodeproj/project.pbxproj | 7 + .../UI/es.lproj/InternetAccessPolicy.strings | 8 + .../UI/es.lproj/Localizable.strings | 152 +++++++ MonitorControl/UI/es.lproj/Main.strings | 405 ++++++++++++++++++ 4 files changed, 572 insertions(+) create mode 100644 MonitorControl/UI/es.lproj/InternetAccessPolicy.strings create mode 100644 MonitorControl/UI/es.lproj/Localizable.strings create mode 100644 MonitorControl/UI/es.lproj/Main.strings diff --git a/MonitorControl.xcodeproj/project.pbxproj b/MonitorControl.xcodeproj/project.pbxproj index 95fc229d..e678429c 100644 --- a/MonitorControl.xcodeproj/project.pbxproj +++ b/MonitorControl.xcodeproj/project.pbxproj @@ -67,6 +67,9 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 17DE48C4273E9DC500A1779F /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Main.strings; sourceTree = ""; }; + 17DE48C5273E9DC500A1779F /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/InternetAccessPolicy.strings; sourceTree = ""; }; + 17DE48C6273E9DC500A1779F /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; }; 28D1DDF1227FBE71004CB494 /* NSScreen+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSScreen+Extension.swift"; sourceTree = ""; }; 56754EAB1D9A4016007BCDC5 /* MonitorControl.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MonitorControl.app; sourceTree = BUILT_PRODUCTS_DIR; }; 56754EAE1D9A4016007BCDC5 /* main.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = main.swift; sourceTree = ""; }; @@ -384,6 +387,7 @@ tr, "zh-Hans", "zh-Hant-TW", + es, ); mainGroup = 56754EA21D9A4016007BCDC5; packageReferences = ( @@ -575,6 +579,7 @@ AA9CB63B2704C1900086DC0E /* tr */, AA9CB63F2704C1A40086DC0E /* zh-Hans */, AA9CB6412704C1B80086DC0E /* zh-Hant-TW */, + 17DE48C4273E9DC500A1779F /* es */, ); name = Main.storyboard; sourceTree = ""; @@ -592,6 +597,7 @@ 8C1741912707B92900E88D53 /* it */, 8C1741932707B92A00E88D53 /* ko */, 8C1741972707B92E00E88D53 /* tr */, + 17DE48C5273E9DC500A1779F /* es */, ); name = InternetAccessPolicy.strings; sourceTree = ""; @@ -609,6 +615,7 @@ AA9CB63C2704C1900086DC0E /* tr */, AA9CB6402704C1A40086DC0E /* zh-Hans */, AA9CB6422704C1B80086DC0E /* zh-Hant-TW */, + 17DE48C6273E9DC500A1779F /* es */, ); name = Localizable.strings; sourceTree = ""; diff --git a/MonitorControl/UI/es.lproj/InternetAccessPolicy.strings b/MonitorControl/UI/es.lproj/InternetAccessPolicy.strings new file mode 100644 index 00000000..1bacbcd7 --- /dev/null +++ b/MonitorControl/UI/es.lproj/InternetAccessPolicy.strings @@ -0,0 +1,8 @@ +/* General application description */ +"ApplicationDescription" = "MonitorControl te permite controlar el brillo y el volumen de pantallas externas"; + +/* Sofware update deny consequences */ +"SoftwareUpdateDenyConsequences" = "Si rechazas estas conexiones, no serás notificado cuando haya nuevas versiones o actualizaciones de seguridad. Las actualizaciones de seguridad son importantes para protegerte contra ataques de malware."; + +/* Software update purpose */ +"SoftwareUpdatePurpose" = "MonitorControl comprueba si hay nuevas versiones o actualizaciones de seguridad."; diff --git a/MonitorControl/UI/es.lproj/Localizable.strings b/MonitorControl/UI/es.lproj/Localizable.strings new file mode 100644 index 00000000..5b2e3c23 --- /dev/null +++ b/MonitorControl/UI/es.lproj/Localizable.strings @@ -0,0 +1,152 @@ +/* Shown in the main prefs window */ +"About" = "Acerca de MonitorControl"; + +/* Shown in the alert dialog */ +"An other app seems to change the brightness or colors which causes issues.\n\nTo solve this, you need to quit the other app or disable gamma control for your displays in MonitorControl!" = "Otra aplicación parece estar cambiando el brillo o el color, lo cual está causando problemas.\n\nPara arreglarlo, necesitas cerrar dicha aplicación o deshabilitar el control de gamma para tus pantallas en MonitorControl!"; + +/* Shown in the main prefs window */ +"App menu" = "Menú de la App"; + +/* Shown in the alert dialog */ +"Are you sure you want to enable a longer delay? Doing so may freeze your system and require a restart. Start at login will be disabled as a safety measure." = "¿Estás seguro de querer habilitar un retraso más largo? Haciendo esto puedes congelar tu sistema y requiere reiniciar el sistema. La aplicación no se iniciará desde que arrancas el sistema operativo como medida de seguridad."; + +/* Shown in the alert dialog */ +"Are you sure you want to reset all preferences?" = "¿Estás seguro de querer restablecer todas las preferencias?"; + +/* Shown in menu */ +"Brightness" = "Brillo"; + +/* Build */ +"Build" = "Compilación"; + +/* Shown in the Display Preferences */ +"Built-in Display" = "Pantalla Incorporada"; + +/* Shown in menu */ +"Check for updates…" = "Comprobar actualizaciones…"; + +/* Shown in menu */ +"Contrast" = "Contraste"; + +/* Version */ +"Copyright Ⓒ MonitorControl, " = "Copyright Ⓒ MonitorControl, "; + +/* Shown in record shortcut box */ +"Decrease" = "Reducir"; + +/* Shown in the alert dialog */ +"Disable gamma control for my displays" = "Deshabilitar el control de gamma para mis pantallas"; + +/* Shown in the main prefs window */ +"Displays" = "Pantallas"; + +/* Shown in the alert dialog */ +"Enable Longer Delay?" = "¿Habilitar retraso más largo?"; + +/* Shown in the Display Preferences */ +"External Display" = "Pantalla Externa"; + +/* Shown in the main prefs window */ +"General" = "General"; + +/* Shown in the Display Preferences */ +"Hardware (Apple)" = "Hardware (Apple)"; + +/* Shown in the Display Preferences */ +"Hardware (DDC)" = "Hardware (DDC)"; + +/* Shown in the alert dialog */ +"I'll quit the other app" = "Cerraré la otra app"; + +/* Shown in the alert dialog */ +"Incompatible previous version" = "Versión previa incompatible"; + +/* Shown in record shortcut box */ +"Increase" = "Aumentar"; + +/* Shown in the alert dialog */ +"Is f.lux or similar running?" = "¿Está f.lux o similar ejecutándose?"; + +/* Shown in the main prefs window */ +"Keyboard" = "Teclado"; + +/* Shown in record shortcut box */ +"Mute" = "Silenciar"; + +/* Shown in the alert dialog */ +"No" = "No"; + +/* Shown in the Display Preferences */ +"No Control" = "Sin Control"; + +/* Shown in the Display Preferences */ +"Other Display" = "Otra Pantalla"; + +/* Shown in the alert dialog */ +"Preferences for an incompatible previous app version detected. Default preferences are reloaded." = "Detectadas preferencias de una versión previa incompatibles. Se cargarán las preferencias por defecto."; + +/* Shown in menu */ +"Preferences…" = "Preferencias…"; + +/* Shown in menu */ +"Quit" = "Cerrar"; + +/* Shown in the alert dialog */ +"Reset Preferences?" = "¿Restablecer Preferencias?"; + +/* Shown in the alert dialog */ +"Safe Mode Activated" = "Modo Seguro Activado"; + +/* Shown in the alert dialog */ +"Shift was pressed during launch. MonitorControl started in safe mode. Default preferences are reloaded, DDC read is blocked." = "La techa Shift fue presionada durante el lanzamiento. MonitorControl se inició en modo seguro. Se han cargado las preferencias por defecto, la lectura DDC está bloqueada."; + +/* Shown in the alert dialog */ +"Shortcuts not available" = "Atajos no disponibles"; + +/* Shown in the Display Preferences */ +"Software (gamma)" = "Software (gamma)"; + +/* Shown in the Display Preferences */ +"Software (gamma, forced)" = "Software (gamma, forzado)"; + +/* Shown in the Display Preferences */ +"Software (shade)" = "Software (sombreado)"; + +/* Shown in the Display Preferences */ +"Software (shade, forced)" = "Software (sombreado, forzado)"; + +/* Shown in the Display Preferences */ +"This display allows for software brightness control via gamma table manipulation or shade as it does not support hardware control. Reasons for this might be using the HDMI port of a Mac mini (which blocks hardware DDC control) or having a blacklisted display." = "Esta pantalla permite el control del brillo por software a través de la manipulación de la tabla gamma o del sombreado ya que no soporta el control por hardware. Las razones para ello pueden ser usar un puerto HDMI de un Mac mini (el cual bloquea el control DDC por hardware) o tener una pantalla incluida en la lista negra."; + +/* Shown in the Display Preferences */ +"This display has an unspecified control status." = "Esta pantalla tiene un estado para su control desconocido."; + +/* Shown in the Display Preferences */ +"This display is reported to support hardware DDC control but the current settings allow for software control only." = "Esta pantalla soporta el control DDC por hardware pero la configuración actual solo permite el control por software."; + +/* Shown in the Display Preferences */ +"This display is reported to support hardware DDC control. If you encounter issues, you can disable hardware DDC control to force software control." = "Esta pantalla soporta el control DDC por hardware. Si encuentras algún problema, puedes deshabilitar el control DDC por hardware para forzar el control por software."; + +/* Shown in the Display Preferences */ +"This display supports native Apple brightness protocol. This allows macOS to control this display without MonitorControl as well." = "Esta pantalla soporta el protocolo de brillo nativo de Apple. Esto le permite también a macOS controlar la pantalla sin MonitorControl."; + +/* Shown in the Display Preferences */ +"This is a virtual display (examples: AirPlay, Sidecar, display connected via a DisplayLink Dock or similar) which does not allow hardware or software gammatable control. Shading is used as a substitute but only in non-mirror scenarios. Mouse cursor will be unaffected and artifacts may appear when entering/leaving full screen mode." = "Esto es una pantalla virtual (ejemplos: AirPlay, Sidecar, pantalla conectada a través del dock DisplayLink o similar) el cual no permite el control a través de gamma ni por hardware ni por software. El sombreado es usado como sustituto pero solo en escenarios sin espejo. El cursor del ratón no verá afectado pero pueden aparecer objetos extraños cuando se entra/sale del modo pantalla completa."; + +/* Unknown display name */ +"Unknown" = "Desconocido"; + +/* Version */ +"Version" = "Versión"; + +/* Shown in the Display Preferences */ +"Virtual Display" = "Pantalla Virtual"; + +/* Shown in menu */ +"Volume" = "Volumen"; + +/* Shown in the alert dialog */ +"Yes" = "Sí"; + +/* Shown in the alert dialog */ +"You need to enable MonitorControl in System Preferences > Security and Privacy > Accessibility for the keyboard shortcuts to work" = "Necesitas habilitar MonitorControl en Preferencias del Sistema > Seguridad y privacidad > Accesibilidad para permitir los atajos de teclado"; diff --git a/MonitorControl/UI/es.lproj/Main.strings b/MonitorControl/UI/es.lproj/Main.strings new file mode 100644 index 00000000..4f867e49 --- /dev/null +++ b/MonitorControl/UI/es.lproj/Main.strings @@ -0,0 +1,405 @@ + +/* Class = "NSButtonCell"; title = "Sync brightness changes from Built-in and Apple displays"; ObjectID = "0ca-DG-AgB"; */ +"0ca-DG-AgB.title" = "Sincronizar los cambios del brillo de la pantalla incorporada con la pantalla de Apple"; + +/* Class = "NSTextFieldCell"; title = "MonitorControl"; ObjectID = "1PJ-14-Bvn"; */ +"1PJ-14-Bvn.title" = "MonitorControl"; + +/* Class = "NSMenuItem"; title = "Assume last saved settings are valid (recommended)"; ObjectID = "1in-79-6qm"; */ +"1in-79-6qm.title" = "Asumir que la última configuración guardada es válida (recomendado)"; + +/* Class = "NSMenuItem"; title = "Standard keyboard volume and mute keys"; ObjectID = "1sy-Kd-WL5"; */ +"1sy-Kd-WL5.title" = "Teclas por defecto para silenciar y el volumen"; + +/* Class = "NSTextFieldCell"; title = "DDC min"; ObjectID = "1zE-fg-xEm"; */ +"1zE-fg-xEm.title" = "DDC mín"; + +/* Class = "NSMenuItem"; title = "Apply last saved values to the display"; ObjectID = "3Jr-bW-YYq"; */ +"3Jr-bW-YYq.title" = "Aplicar los últimos valores guardados a la pantalla"; + +/* Class = "NSBox"; title = "#bc-ignore!"; ObjectID = "3a3-In-jeQ"; */ +"3a3-In-jeQ.title" = "#bc-ignore!"; + +/* Class = "NSMenuItem"; title = "Show separate controls for each display in menu"; ObjectID = "3eO-bN-ZRl"; */ +"3eO-bN-ZRl.title" = "Mostrar controles separados para cada pantalla en el menú"; + +/* Class = "NSButtonCell"; title = "https://monitorcontrol.app"; ObjectID = "42n-Zy-AqF"; Note = "#bc-ignore!"; */ +"42n-Zy-AqF.title" = "https://monitorcontrol.app"; + +/* Class = "NSMenuItem"; title = "Custom keyboard shortcuts"; ObjectID = "4CG-0I-anB"; */ +"4CG-0I-anB.title" = "Atajos de teclado personalizados"; + +/* Class = "NSTextFieldCell"; title = "Using window focus might not work properly with full screen apps."; ObjectID = "4dX-o1-xAc"; */ +"4dX-o1-xAc.title" = "Usar el enfoque de ventana podría no funcionar en apps a pantalla completa."; + +/* Class = "NSBox"; title = "#bc-ignore!"; ObjectID = "4wn-2u-KRo"; */ +"4wn-2u-KRo.title" = "#bc-ignore!"; + +/* Class = "NSButtonCell"; title = "Reset Preferences"; ObjectID = "5yT-5F-X5R"; */ +"5yT-5F-X5R.title" = "Restablecer Preferencias"; + +/* Class = "NSTextFieldCell"; title = "#bc-ignore!"; ObjectID = "6GJ-6Q-gqz"; */ +"6GJ-6Q-gqz.title" = "#bc-ignore!"; + +/* Class = "NSMenuItem"; title = "Always hide"; ObjectID = "6mo-7S-oOO"; */ +"6mo-7S-oOO.title" = "Siempre oculto"; + +/* Class = "NSTextFieldCell"; title = "Slider behavior:"; ObjectID = "75n-7M-1mS"; */ +"75n-7M-1mS.title" = "Comportamiento del slider:"; + +/* Class = "NSButtonCell"; title = "Show slider tick marks"; ObjectID = "7zf-m1-gJO"; */ +"7zf-m1-gJO.title" = "Mostrar muecas en el slider"; + +/* Class = "NSTextFieldCell"; title = "Slider knob will snap to 0%, 25%, 50%, 75% and 100% when in proximity making setting these values easier. Disable for finer control."; ObjectID = "8Gx-Ya-zhp"; */ +"8Gx-Ya-zhp.title" = "El controlador del Slider se ajustará al 0%, 25%, 50%, 75% y 100% cuando esté próximo a estos valores facilitando su selección. Deshabilítalo para un control más preciso."; + +/* Class = "NSButtonCell"; title = "Use fine OSD scale for brightness and contrast"; ObjectID = "8Q8-57-xnT"; */ +"8Q8-57-xnT.title" = "Usar escala más precisa en OSD para el brillo y el contraste"; + +/* Class = "NSButtonCell"; title = "Special thanks to our contributors!"; ObjectID = "95V-M4-2l5"; */ +"95V-M4-2l5.title" = "Agradecimientos especiales a nuestros colaboradores!"; + +/* Class = "NSBox"; title = "#bc-ignore!"; ObjectID = "9aX-gm-8TS"; */ +"9aX-gm-8TS.title" = "#bc-ignore!"; + +/* Class = "NSMenuItem"; title = "Custom keyboard shortcuts"; ObjectID = "9eC-PD-FHl"; */ +"9eC-PD-FHl.title" = "Atajos de teclado personalizados"; + +/* Class = "NSMenuItem"; title = "Attempt to read display settings"; ObjectID = "9yL-no-aWa"; */ +"9yL-no-aWa.title" = "Intentar leer la configuración de la pantalla"; + +/* Class = "NSTextFieldCell"; title = "Show tick marks at 0%, 25%, 50%, 75% and 100% for accuracy."; ObjectID = "A8P-vn-DEJ"; */ +"A8P-vn-DEJ.title" = "Mostrar muecas en 0%, 25%, 50%, 75% y 100% para una mayor precisión."; + +/* Class = "NSMenuItem"; title = "Use audio device name to determine which display to control"; ObjectID = "AqF-uD-KCY"; */ +"AqF-uD-KCY.title" = "Usar nombre del dispositivo de audio para determinar qué pantalla controlar"; + +/* Class = "NSButtonCell"; title = "Reset settings"; ObjectID = "BYS-7Y-bRz"; */ +"BYS-7Y-bRz.title" = "Restablecer configuración"; + +/* Class = "NSTextFieldCell"; title = "Brightness:"; ObjectID = "Bhb-6l-uPQ"; */ +"Bhb-6l-uPQ.title" = "Brillo:"; + +/* Class = "NSTextFieldCell"; title = "(Software->DDC)"; ObjectID = "Bid-UL-blc"; */ +"Bid-UL-blc.title" = "(Software->DDC)"; + +/* Class = "NSTextFieldCell"; title = "OSD scale:"; ObjectID = "Bqc-s3-C0w"; */ +"Bqc-s3-C0w.title" = "Escala OSD:"; + +/* Class = "NSMenuItem"; title = "Custom"; ObjectID = "Cle-DD-vR7"; */ +"Cle-DD-vR7.title" = "Personalizado"; + +/* Class = "NSTextFieldCell"; title = "⚠️ Warning! Changing some of these settings may cause system freezes or unexpected behavior!"; ObjectID = "Cz1-Mh-llk"; */ +"Cz1-Mh-llk.title" = "⚠️ ¡Atención! ¡Cambiar algunos de estos valores puede causar cuelgues en el sistema o comportamientos anómalos!"; + +/* Class = "NSTextFieldCell"; title = "Alternative keys are the F14/F15 (Scroll Lock and Pause on PC keyboards, brightness keys on some Logitech keyboards)."; ObjectID = "D4H-hU-FLn"; */ +"D4H-hU-FLn.title" = "Las teclas alternativas son F14/F15 (Scroll Lock y Pause en teclados de PC, teclas de brillo en algunos teclados de Logitech)."; + +/* Class = "NSTextFieldCell"; title = "VCP list"; ObjectID = "D9t-vT-gNJ"; */ +"D9t-vT-gNJ.title" = "Lista de VCP"; + +/* Class = "NSTextFieldCell"; title = "You can override audio device name under Displays (advanced) if needed."; ObjectID = "Dha-Tm-cDM"; */ +"Dha-Tm-cDM.title" = "Puedes sobrescribir el nombre del dispositivo de audio bajo Pantallas (avanzado) si lo necesitas."; + +/* Class = "NSTextFieldCell"; title = "You can disable smooth transitions for a more direct, immediate control."; ObjectID = "ENt-mP-0yH"; */ +"ENt-mP-0yH.title" = "Puedes deshabilitar las transiciones suaves para un control más directo e inmediato."; + +/* Class = "NSMenuItem"; title = "Minimal"; ObjectID = "Eq3-z9-yIo"; */ +"Eq3-z9-yIo.title" = "Mínimo"; + +/* Class = "NSTextFieldCell"; title = "Scale mapping curve"; ObjectID = "Eui-5S-JR6"; */ +"Eui-5S-JR6.title" = "Curva del escalado del mapeo"; + +/* Class = "NSTextFieldCell"; title = "Mute:"; ObjectID = "EvN-FT-vdZ"; */ +"EvN-FT-vdZ.title" = "Silencio:"; + +/* Class = "NSTextFieldCell"; title = "Volume:"; ObjectID = "FER-Ri-4UO"; */ +"FER-Ri-4UO.title" = "Volumen:"; + +/* Class = "NSButtonCell"; title = "Automatically check for updates"; ObjectID = "Faf-9L-TXx"; */ +"Faf-9L-TXx.title" = "Comprobar actualizaciones automáticamente"; + +/* Class = "NSButtonCell"; title = "Allow zero brightness via software or combined dimming"; ObjectID = "FjB-XL-fG5"; */ +"FjB-XL-fG5.title" = "Permitir brillo cero vía software u atenuación combinada"; + +/* Class = "NSMenuItem"; title = "None"; ObjectID = "FoA-yh-Yx3"; */ +"FoA-yh-Yx3.title" = "Ninguno"; + +/* Class = "NSTextFieldCell"; title = "Invert"; ObjectID = "G5A-y3-eZz"; */ +"G5A-y3-eZz.title" = "Invertir"; + +/* Class = "NSTextFieldCell"; title = "Override audio device name:"; ObjectID = "H9X-it-sXs"; */ +"H9X-it-sXs.title" = "Sobrescribir nombre del dispositivo de audio:"; + +/* Class = "NSMenuItem"; title = "Hide"; ObjectID = "HUT-Qc-kuu"; */ +"HUT-Qc-kuu.title" = "Esconder"; + +/* Class = "NSTextFieldCell"; title = "Brightness:"; ObjectID = "IJB-mO-e8I"; */ +"IJB-mO-e8I.title" = "Brillo:"; + +/* Class = "NSButtonCell"; title = "Enable smooth brightness transitions"; ObjectID = "IK4-u5-qjf"; */ +"IK4-u5-qjf.title" = "Habilitar transiciones de brillo suaves"; + +/* Class = "NSButtonCell"; title = "Use fine OSD scale for volume"; ObjectID = "J3L-MW-iJL"; */ +"J3L-MW-iJL.title" = "Usar escala OSD de volumen precisa"; + +/* Class = "NSTextFieldCell"; title = "Note: you can press Shift during startup for 'Safe mode' to restore defaults and avoid reading or setting anything."; ObjectID = "Jx2-gO-nq9"; */ +"Jx2-gO-nq9.title" = "Nota: puedes presionar la tecla Shift mientras arrancas la app para entrar en el 'Modo Seguro' para restaurar los valores por defecto y evitar leer o establecer la configuración."; + +/* Class = "NSButtonCell"; title = "Enable for Apple branded and built-in displays as well"; ObjectID = "K6A-4z-1aQ"; */ +"K6A-4z-1aQ.title" = "Habilitar también para pantallas de Apple o incorporadas"; + +/* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "Kfj-WK-aSL"; */ +"Kfj-WK-aSL.title" = "Ventana de control:"; + +/* Class = "NSTextFieldCell"; title = "Brightness and contrast:"; ObjectID = "LO4-4k-gxY"; */ +"LO4-4k-gxY.title" = "Brillo y contraste:"; + +/* Class = "NSMenuItem"; title = "Always show in the menu bar"; ObjectID = "MM0-Lf-VgF"; */ +"MM0-Lf-VgF.title" = "Mostrar siempre en la barra de menú"; + +/* Class = "NSTextFieldCell"; title = "Contrast:"; ObjectID = "MMk-S2-yJN"; */ +"MMk-S2-yJN.title" = "Contraste:"; + +/* Class = "NSButtonCell"; title = "Show brightness slider in menu"; ObjectID = "MWo-6I-s9L"; */ +"MWo-6I-s9L.title" = "Mostrar slider del brillo en el menú"; + +/* Class = "NSButtonCell"; title = "Enable slider snapping"; ObjectID = "MlU-hl-d46"; */ +"MlU-hl-d46.title" = "Habilitar ajuste por slider"; + +/* Class = "NSButtonCell"; title = "Separate scales for combined hardware & software dimming"; ObjectID = "O8o-hI-8eR"; */ +"O8o-hI-8eR.title" = "Separar escalas de atenuación por hardware & software"; + +/* Class = "NSMenuItem"; title = "Standard keyboard brightness keys"; ObjectID = "Oke-bW-cb1"; */ +"Oke-bW-cb1.title" = "Teclas estándar para el brillo"; + +/* Class = "NSTextFieldCell"; title = "count:"; ObjectID = "Orv-yj-Nad"; */ +"Orv-yj-Nad.title" = "conteo:"; + +/* Class = "NSTextFieldCell"; title = "Control method:"; ObjectID = "PaK-1f-DsW"; */ +"PaK-1f-DsW.title" = "Método de control:"; + +/* Class = "NSTextFieldCell"; title = "#bc-ignore!"; ObjectID = "Pqk-VW-JGY"; */ +"Pqk-VW-JGY.title" = "#bc-ignore!"; + +/* Class = "NSTextFieldCell"; title = "Use software dimming after the display reached zero hardware brightness for extended range. Works for DDC controlled displays only."; ObjectID = "PyY-p9-3NP"; */ +"PyY-p9-3NP.title" = "Usar atenuación por software una vez que la pantalla alcanza el brillo 0 para un rango extendido. Funciona sólo para pantallas controladas por DDC."; + +/* Class = "NSMenuItem"; title = "Both standard and custom shortcuts"; ObjectID = "QDG-SA-mRX"; */ +"QDG-SA-mRX.title" = "Ambos, atajos estándar y personalizados"; + +/* Class = "NSMenuItem"; title = "Normal"; ObjectID = "Riq-uM-bTs"; */ +"Riq-uM-bTs.title" = "Normal"; + +/* Class = "NSTextFieldCell"; title = "@the0neyouseek (Guillaume B.)\n@JoniVR (Joni Van Roost)\n@waydabber (István T.)"; ObjectID = "TKd-J8-Iyk"; */ +"TKd-J8-Iyk.title" = "@the0neyouseek (Guillaume B.)\n@JoniVR (Joni Van Roost)\n@waydabber (István T.)"; + +/* Class = "NSButtonCell"; title = "Show advanced settings"; ObjectID = "UBq-Od-SIB"; */ +"UBq-Od-SIB.title" = "Mostrar configuración avanzada"; + +/* Class = "NSButtonCell"; title = "Enable keyboard control for display"; ObjectID = "UqR-WE-jHl"; */ +"UqR-WE-jHl.title" = "Habilitar control por teclado para las pantallas"; + +/* Class = "NSTextFieldCell"; title = "General options:"; ObjectID = "W58-ch-j69"; */ +"W58-ch-j69.title" = "Opciones generales:"; + +/* Class = "NSTextFieldCell"; title = "Works best with various syncing and 'control all' keyboard settings enabled."; ObjectID = "XU4-Bn-bwH"; */ +"XU4-Bn-bwH.title" = "Funciona mejor cuando están habilitadas varias sincronizaciones y la configuración del teclado para 'controlar todo'."; + +/* Class = "NSMenuItem"; title = "Change volume for all screens"; ObjectID = "Xih-P5-NyM"; */ +"Xih-P5-NyM.title" = "Cambiar volumen para todas las pantallas"; + +/* Class = "NSTextFieldCell"; title = "Full OSD scale will be available for hardware brightness control and after reaching 0 brightness, further software dimming will be used."; ObjectID = "YHZ-VL-QJ3"; */ +"YHZ-VL-QJ3.title" = "La escala completa del OSD estará disponible para el control del brillo por hardware y después de alcanzar el brillo 0, será usada la atenuación por software."; + +/* Class = "NSTextFieldCell"; title = "Identifier:"; ObjectID = "YqZ-LS-YvR"; */ +"YqZ-LS-YvR.title" = "Identificador:"; + +/* Class = "NSMenuItem"; title = "Depends on mouse pointer position"; ObjectID = "Ytd-mg-N5E"; */ +"Ytd-mg-N5E.title" = "Depender de la posición del cursor del ratón"; + +/* Class = "NSButtonCell"; title = "Donate"; ObjectID = "ZKk-ve-rS4"; */ +"ZKk-ve-rS4.title" = "Donar"; + +/* Class = "NSButtonCell"; title = "Show percentages"; ObjectID = "ZUu-MR-XwA"; */ +"ZUu-MR-XwA.title" = "Mostrar porcentajes"; + +/* Class = "NSButtonCell"; title = "Use hardware DDC control"; ObjectID = "ZdU-gV-V05"; */ +"ZdU-gV-V05.title" = "Usar control DDC por hardware"; + +/* Class = "NSTextFieldCell"; title = "Use brightness, volume and other settings from last time or use defaults. Values will be applied to the display upon first change by the user."; ObjectID = "an7-Aj-3fZ"; */ +"an7-Aj-3fZ.title" = "Usar el brillo, volumen y otras configuraciones de la última vez o por defecto. Los valores serán aplicados a la pantalla cuando el usuario los cambie por primera vez."; + +/* Class = "NSTextFieldCell"; title = "For hardware (DDC) controlled displays only. Results may vary."; ObjectID = "bIe-6O-xEH"; */ +"bIe-6O-xEH.title" = "Sólo para pantallas controladas por hardware (DDC). Los resultados pueden variar."; + +/* Class = "NSTextFieldCell"; title = "OSD scale:"; ObjectID = "bP4-GJ-vhJ"; */ +"bP4-GJ-vhJ.title" = "Escala OSD:"; + +/* Class = "NSButtonCell"; title = "Enable Mute DDC command"; ObjectID = "bZq-0d-lJa"; */ +"bZq-0d-lJa.title" = "Habilitar comando DDC para silenciar"; + +/* Class = "NSMenuItem"; title = "Show sliders only for the display currently showing the menu"; ObjectID = "bbf-sS-uGv"; */ +"bbf-sS-uGv.title" = "Mostrar sliders solo para las pantallas que actualmente se muestran en el menú"; + +/* Class = "NSButtonCell"; title = "Disable macOS volume OSD"; ObjectID = "bkM-Px-U3b"; */ +"bkM-Px-U3b.title" = "Deshabilitar OSD de macOS para el volumen"; + +/* Class = "NSButtonCell"; title = "Show volume slider in menu"; ObjectID = "c9D-MB-lma"; */ +"c9D-MB-lma.title" = "Mostrar slider de volumen en el menú"; + +/* Class = "NSTextFieldCell"; title = "Upon startup or wake:"; ObjectID = "cNt-Cq-vK4"; */ +"cNt-Cq-vK4.title" = "Al iniciar o arrancar:"; + +/* Class = "NSTextFieldCell"; title = "#bc-ignore!"; ObjectID = "e0q-fb-k7R"; */ +"e0q-fb-k7R.title" = "#bc-ignore!"; + +/* Class = "NSTextFieldCell"; title = "Normally keyboard controls change one OSD chiclet worth of value and Shift+Option allows fine control. This makes fine control default."; ObjectID = "f6J-Ui-uMB"; */ +"f6J-Ui-uMB.title" = "Normalmente, los controles de teclado cambian un valor completo del escalón del OSD y Shift+Option permite un control más preciso. Esto hace el control más preciso por defecto."; + +/* Class = "NSButtonCell"; title = "Reset Name"; ObjectID = "f9g-8s-gdd"; */ +"f9g-8s-gdd.title" = "Restablecer Nombre"; + +/* Class = "NSMenuItem"; title = "Show as icons"; ObjectID = "fR3-kq-cps"; */ +"fR3-kq-cps.title" = "Mostrar como iconos"; + +/* Class = "NSMenuItem"; title = "Show as text"; ObjectID = "fWd-Es-zsy"; */ +"fWd-Es-zsy.title" = "Mostrar como texto"; + +/* Class = "NSTextFieldCell"; title = "Brightness control:"; ObjectID = "fe9-Ia-t9m"; */ +"fe9-Ia-t9m.title" = "Control del brillo:"; + +/* Class = "NSTextFieldCell"; title = "Apple and built-in displays already have a brightness slider in Control Center."; ObjectID = "fmZ-HI-Mdc"; */ +"fmZ-HI-Mdc.title" = "Las pantallas de Apple e incorporadas ya tienen un slider para el brillo en el Centro de Control."; + +/* Class = "NSMenuItem"; title = "Use window focus to determine which display to control"; ObjectID = "gTR-FW-FHc"; */ +"gTR-FW-FHc.title" = "Usar foco de ventana para determinar qué pantalla controlar"; + +/* Class = "NSTextFieldCell"; title = "Brightness slider for hardware or software controlled displays or TVs."; ObjectID = "gXH-HL-ZOL"; */ +"gXH-HL-ZOL.title" = "Slider del brillo para pantallas o TVs controladas por hardware o software."; + +/* Class = "NSTextFieldCell"; title = "Relaunch the app to access Preferences if the menu option is not accessible. Use the button below to quit the app."; ObjectID = "hF7-fM-aKr"; */ +"hF7-fM-aKr.title" = "Reinicia la app para acceder a Preferencias si el menú opción no es accesible. Usa el botón de arriba para cerrar la app."; + +/* Class = "NSButtonCell"; title = "Get current"; ObjectID = "hkC-vq-IcD"; */ +"hkC-vq-IcD.title" = "Obtener actual"; + +/* Class = "NSTextFieldCell"; title = "Additional controls:"; ObjectID = "i5X-M5-Tf5"; */ +"i5X-M5-Tf5.title" = "Controles adicionales:"; + +/* Class = "NSTextFieldCell"; title = "#bc-ignore!"; ObjectID = "ibQ-4u-ClE"; */ +"ibQ-4u-ClE.title" = "#bc-ignore!"; + +/* Class = "NSButtonCell"; title = "Start at Login"; ObjectID = "j72-NF-zsW"; */ +"j72-NF-zsW.title" = "Abrir al Iniciar sesión"; + +/* Class = "NSMenuItem"; title = "Change for all screens"; ObjectID = "jSj-HB-T2t"; */ +"jSj-HB-T2t.title" = "Cambiar para todas las pantallas"; + +/* Class = "NSButtonCell"; title = "Check for updates"; ObjectID = "jVH-oc-rUi"; */ +"jVH-oc-rUi.title" = "Comprobar actualizaciones"; + +/* Class = "NSMenuItem"; title = "Depends on mouse pointer position"; ObjectID = "km4-hK-auM"; */ +"km4-hK-auM.title" = "Depender de la posición del cursor del ratón"; + +/* Class = "NSMenuItem"; title = "Use combined slider for all displays"; ObjectID = "lA0-tv-qRs"; */ +"lA0-tv-qRs.title" = "Usar slider combinado para todas las pantallas"; + +/* Class = "NSTextFieldCell"; title = "Display type:"; ObjectID = "lSJ-6w-KJ2"; */ +"lSJ-6w-KJ2.title" = "Tipo de pantalla:"; + +/* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "ltL-gR-K3Z"; */ +"ltL-gR-K3Z.title" = "Pantalla a controlar:"; + +/* Class = "NSTextFieldCell"; title = "#bc-ignore!"; ObjectID = "mBs-6m-13Q"; */ +"mBs-6m-13Q.title" = "#bc-ignore!"; + +/* Class = "NSTextFieldCell"; title = "Volume:"; ObjectID = "mue-fa-8z6"; */ +"mue-fa-8z6.title" = "Volumen:"; + +/* Class = "NSButtonCell"; title = "Avoid gamma table manipulation"; ObjectID = "na6-mS-MPi"; */ +"na6-mS-MPi.title" = "Evitar manipulación de la tabla gamma"; + +/* Class = "NSMenuItem"; title = "Disable keyboard"; ObjectID = "oHf-Gh-68c"; */ +"oHf-Gh-68c.title" = "Deshabilitar teclado"; + +/* Class = "NSTextFieldCell"; title = "Application:"; ObjectID = "okD-DG-pYa"; */ +"okD-DG-pYa.title" = "Aplicación:"; + +/* Class = "NSButtonCell"; title = "Longer delay during DDC read operations"; ObjectID = "pF5-Sw-7BR"; */ +"pF5-Sw-7BR.title" = "Retraso más largo durante las operaciones DDC de lectura"; + +/* Class = "NSTextFieldCell"; title = "#bc-ignore!"; ObjectID = "pIy-Lk-kkm"; */ +"pIy-Lk-kkm.title" = "#bc-ignore!"; + +/* Class = "NSTextFieldCell"; title = "Use the brightness keys of your Apple keyboard to control brightness. You can hold Control to adjust the built-in display, Control+Command to adjust external displays. Hold Shift+Option for fine control. Control+Option+Command adjusts contrast on DDC compatible displays."; ObjectID = "pa0-Hz-ace"; */ +"pa0-Hz-ace.title" = "Usar las teclas de brillo de tu teclado de Apple para controlar el brillo. Puedes mantener la tecla Control para ajustar la pantalla incorporada, Control+Command para ajustar las pantallas externas. Mantén Shift+Option para un control más preciso. Control+Option+Command ajusta el contraste en pantallas compatibles con DDC."; + +/* Class = "NSTextFieldCell"; title = "DDC max"; ObjectID = "psF-vX-AFB"; */ +"psF-vX-AFB.title" = "DDC máx"; + +/* Class = "NSButtonCell"; title = "Show contrast slider in menu"; ObjectID = "qO0-dB-yUs"; */ +"qO0-dB-yUs.title" = "Mostrar slider de contraste en el menú"; + +/* Class = "NSTextFieldCell"; title = "Show percentage next to slider for more precision."; ObjectID = "qXy-CL-Wf1"; */ +"qXy-CL-Wf1.title" = "Mostrar porcentaje cerca del slider para una mayor precisión."; + +/* Class = "NSButtonCell"; title = "Quit application"; ObjectID = "qlb-wH-qr4"; */ +"qlb-wH-qr4.title" = "Cerrar aplicación"; + +/* Class = "NSTextFieldCell"; title = "Volume control (DDC only):"; ObjectID = "qoh-Gn-f11"; */ +"qoh-Gn-f11.title" = "Control del volumen (sólo DDC):"; + +/* Class = "NSButtonCell"; title = "Combine hardware and software dimming"; ObjectID = "r76-Zc-x09"; */ +"r76-Zc-x09.title" = "Combinar atenuación por hardware y software"; + +/* Class = "NSTextFieldCell"; title = "General menu items style:"; ObjectID = "thh-DG-ecH"; */ +"thh-DG-ecH.title" = "Estilo de los elementos del menú:"; + +/* Class = "NSTextFieldCell"; title = "Menu Icon:"; ObjectID = "u6s-Pb-BCG"; */ +"u6s-Pb-BCG.title" = "Icono del menú:"; + +/* Class = "NSTextFieldCell"; title = "Works if an audio device is selected with no native volume control."; ObjectID = "uF5-a9-Ngz"; */ +"uF5-a9-Ngz.title" = "Funciona si un dispositivo de audio es seleccionado sin control del volumen nativo."; + +/* Class = "NSTextFieldCell"; title = "Contrast (DDC):"; ObjectID = "urd-Rh-aiL"; */ +"urd-Rh-aiL.title" = "Contraste (DDC):"; + +/* Class = "NSButtonCell"; title = "Do not use alternative brightness keys"; ObjectID = "vd2-Lk-neX"; */ +"vd2-Lk-neX.title" = "No usar teclas de brillo alternativas"; + +/* Class = "NSMenuItem"; title = "Heavy"; ObjectID = "vik-vN-bJe"; */ +"vik-vN-bJe.title" = "Pesado"; + +/* Class = "NSTextFieldCell"; title = "Multiple displays:"; ObjectID = "vri-pv-tJ4"; */ +"vri-pv-tJ4.title" = "Múltiples pantallas:"; + +/* Class = "NSTextFieldCell"; title = "DDC read polling mode:"; ObjectID = "vwm-hY-on5"; */ +"vwm-hY-on5.title" = "Modo de sondeo de lectura DDC:"; + +/* Class = "NSTextFieldCell"; title = "Useful when a display tends to reset its settings during sleep."; ObjectID = "w8B-x6-sq5"; */ +"w8B-x6-sq5.title" = "Útil cuando una pantalla tiende a resetear su configuración mientras está en modo stand by."; + +/* Class = "NSTextFieldCell"; title = "Changes that are caused by the Ambient light sensor or made using Touch Bar, Control Center, System Preferences will be replicated to all displays."; ObjectID = "wjv-tq-iUx"; */ +"wjv-tq-iUx.title" = "Los cambios producidos por el sensor de luz ambiental o hechos a través de la Touch Bar, Centro de Control, Preferencias del Sistema serñan replicados a todas las pantallas."; + +/* Class = "NSMenuItem"; title = "Only if at least one slider is present"; ObjectID = "xLa-PN-rsq"; */ +"xLa-PN-rsq.title" = "Sólo si hay presente al menos un slider"; + +/* Class = "NSMenuItem"; title = "Both standard and custom shortcuts"; ObjectID = "xQJ-aJ-VhH"; */ +"xQJ-aJ-VhH.title" = "Ambos, atajos estándar y personalizados"; + +/* Class = "NSTextFieldCell"; title = "Update settings from the display. May not work with some hardware."; ObjectID = "xjq-hs-wWB"; */ +"xjq-hs-wWB.title" = "Actualizar configuración desde la pantalla. Puede no funcionar con algunos hardware."; + +/* Class = "NSTextFieldCell"; title = "Available"; ObjectID = "yBJ-5d-I7e"; */ +"yBJ-5d-I7e.title" = "Disponible"; + +/* Class = "NSTextFieldCell"; title = "Warning! With this option enabled, you might find yourself in a position when you end up with a blank display. This, combined with disabled keyboard controls can be frustrating."; ObjectID = "yi3-e1-wsL"; */ +"yi3-e1-wsL.title" = "¡Atención! Con esta opción habilitada, puedes acabar con la pantalla en blanco. Esto, combinado con los controles por teclado deshabilitados puede ser frustrante."; + +/* Class = "NSMenuItem"; title = "Disable keyboard"; ObjectID = "zHa-xo-XPW"; */ +"zHa-xo-XPW.title" = "Deshabilitar teclado"; + +/* Class = "NSTextFieldCell"; title = "Combined dimming switchover point:"; ObjectID = "zv8-pZ-OPy"; */ +"zv8-pZ-OPy.title" = "Puntos combinados de atenuación:"; From 5c82b996ed46dffa70f98b9a7695e9e8636d7aa7 Mon Sep 17 00:00:00 2001 From: Istvan T <37590873+waydabber@users.noreply.github.com> Date: Sun, 14 Nov 2021 10:43:49 +0100 Subject: [PATCH 012/101] Some minor fixes and improvements (#786) --- .swift-version | 2 +- MonitorControl.xcodeproj/project.pbxproj | 54 ++- .../CGDirectDisplayID+Extension.swift | 6 +- .../Extensions/NSScreen+Extension.swift | 2 +- MonitorControl/Info.plist | 2 +- MonitorControl/Model/Display.swift | 18 +- MonitorControl/Model/OtherDisplay.swift | 10 +- MonitorControl/Support/AppDelegate.swift | 9 +- MonitorControl/Support/DisplayManager.swift | 12 +- .../Support/MediaKeyTapManager.swift | 10 +- MonitorControl/Support/OSDUtils.swift | 6 +- MonitorControl/Support/SliderHandler.swift | 2 +- MonitorControl/Support/UpdaterDelegate.swift | 2 +- MonitorControl/UI/Base.lproj/Main.storyboard | 50 +-- MonitorControl/UI/es.lproj/Main.strings | 327 ++++++++---------- .../DisplaysPrefsViewController.swift | 2 +- MonitorControlHelper/Info.plist | 2 +- 17 files changed, 264 insertions(+), 252 deletions(-) diff --git a/.swift-version b/.swift-version index 819e07a2..9ad974f6 100644 --- a/.swift-version +++ b/.swift-version @@ -1 +1 @@ -5.0 +5.5 diff --git a/MonitorControl.xcodeproj/project.pbxproj b/MonitorControl.xcodeproj/project.pbxproj index e678429c..15ba7ca2 100644 --- a/MonitorControl.xcodeproj/project.pbxproj +++ b/MonitorControl.xcodeproj/project.pbxproj @@ -41,6 +41,13 @@ AA99521926FE49A300612E07 /* MenuHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA99521826FE49A300612E07 /* MenuHandler.swift */; }; AA9AE86F26B5BF3D00B6CA65 /* OSD.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA9AE86E26B5BF3D00B6CA65 /* OSD.framework */; }; AA9AE87126B5BFB700B6CA65 /* CoreDisplay.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA9AE87026B5BFB700B6CA65 /* CoreDisplay.framework */; }; + AAB2F638273ED099004AB5A4 /* .swiftlint.yml in Resources */ = {isa = PBXBuildFile; fileRef = AAB2F637273ED099004AB5A4 /* .swiftlint.yml */; }; + AAB2F63C273ED0AD004AB5A4 /* .swift-version in Resources */ = {isa = PBXBuildFile; fileRef = AAB2F639273ED0AD004AB5A4 /* .swift-version */; }; + AAB2F63D273ED0AD004AB5A4 /* .gitignore in Resources */ = {isa = PBXBuildFile; fileRef = AAB2F63A273ED0AD004AB5A4 /* .gitignore */; }; + AAB2F63E273ED0AD004AB5A4 /* .swiftformat in Resources */ = {isa = PBXBuildFile; fileRef = AAB2F63B273ED0AD004AB5A4 /* .swiftformat */; }; + AAB2F640273ED0B8004AB5A4 /* .bartycrouch.toml in Resources */ = {isa = PBXBuildFile; fileRef = AAB2F63F273ED0B8004AB5A4 /* .bartycrouch.toml */; }; + AAB2F642273ED0C7004AB5A4 /* .github in Resources */ = {isa = PBXBuildFile; fileRef = AAB2F641273ED0C7004AB5A4 /* .github */; }; + AAB2F644273ED0E9004AB5A4 /* License.txt in Resources */ = {isa = PBXBuildFile; fileRef = AAB2F643273ED0E9004AB5A4 /* License.txt */; }; AACE5E2327050C63006C2A48 /* NSNotification+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = AACE5E2227050C63006C2A48 /* NSNotification+Extension.swift */; }; AADB625A26BC196900DFFAA5 /* DisplayServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AADB625926BC196900DFFAA5 /* DisplayServices.framework */; }; F01B0699228221B7008E64DB /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = F01B0680228221B6008E64DB /* Localizable.strings */; }; @@ -128,6 +135,13 @@ AA9CB6402704C1A40086DC0E /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; }; AA9CB6412704C1B80086DC0E /* zh-Hant-TW */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant-TW"; path = "zh-Hant-TW.lproj/Main.strings"; sourceTree = ""; }; AA9CB6422704C1B80086DC0E /* zh-Hant-TW */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant-TW"; path = "zh-Hant-TW.lproj/Localizable.strings"; sourceTree = ""; }; + AAB2F637273ED099004AB5A4 /* .swiftlint.yml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.yaml; path = .swiftlint.yml; sourceTree = ""; }; + AAB2F639273ED0AD004AB5A4 /* .swift-version */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ".swift-version"; sourceTree = ""; }; + AAB2F63A273ED0AD004AB5A4 /* .gitignore */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = .gitignore; sourceTree = ""; }; + AAB2F63B273ED0AD004AB5A4 /* .swiftformat */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = .swiftformat; sourceTree = ""; }; + AAB2F63F273ED0B8004AB5A4 /* .bartycrouch.toml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = .bartycrouch.toml; sourceTree = ""; }; + AAB2F641273ED0C7004AB5A4 /* .github */ = {isa = PBXFileReference; lastKnownFileType = folder; path = .github; sourceTree = ""; }; + AAB2F643273ED0E9004AB5A4 /* License.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = License.txt; sourceTree = ""; }; AACE5E2227050C63006C2A48 /* NSNotification+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSNotification+Extension.swift"; sourceTree = ""; }; AADB625926BC196900DFFAA5 /* DisplayServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = DisplayServices.framework; path = ../../../../../System/Library/PrivateFrameworks/DisplayServices.framework; sourceTree = ""; }; F01B0682228221B6008E64DB /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; @@ -193,7 +207,7 @@ 56754EA21D9A4016007BCDC5 = { isa = PBXGroup; children = ( - AA3B4A2726AE103C00B74CD2 /* README.md */, + AAB2F646273ED127004AB5A4 /* Misc */, 28D1DDD1227FB759004CB494 /* Frameworks */, 56754EAD1D9A4016007BCDC5 /* MonitorControl */, F06792E8200A73460066C438 /* MonitorControlHelper */, @@ -248,6 +262,21 @@ path = Enums; sourceTree = ""; }; + AAB2F646273ED127004AB5A4 /* Misc */ = { + isa = PBXGroup; + children = ( + AAB2F641273ED0C7004AB5A4 /* .github */, + AAB2F63A273ED0AD004AB5A4 /* .gitignore */, + AAB2F637273ED099004AB5A4 /* .swiftlint.yml */, + AAB2F639273ED0AD004AB5A4 /* .swift-version */, + AAB2F63B273ED0AD004AB5A4 /* .swiftformat */, + AAB2F63F273ED0B8004AB5A4 /* .bartycrouch.toml */, + AAB2F643273ED0E9004AB5A4 /* License.txt */, + AA3B4A2726AE103C00B74CD2 /* README.md */, + ); + name = Misc; + sourceTree = ""; + }; F01B067F228221B6008E64DB /* Support */ = { isa = PBXGroup; children = ( @@ -412,12 +441,19 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + AAB2F642273ED0C7004AB5A4 /* .github in Resources */, + AAB2F63E273ED0AD004AB5A4 /* .swiftformat in Resources */, 56754EB11D9A4016007BCDC5 /* Assets.xcassets in Resources */, 6CDA0FCF26485A8300F52125 /* Main.storyboard in Resources */, + AAB2F640273ED0B8004AB5A4 /* .bartycrouch.toml in Resources */, 8C1741852707B91100E88D53 /* InternetAccessPolicy.plist in Resources */, + AAB2F638273ED099004AB5A4 /* .swiftlint.yml in Resources */, + AAB2F63C273ED0AD004AB5A4 /* .swift-version in Resources */, AA3B4A2826AE103C00B74CD2 /* README.md in Resources */, F01B0699228221B7008E64DB /* Localizable.strings in Resources */, + AAB2F63D273ED0AD004AB5A4 /* .gitignore in Resources */, 8C1741882707B91F00E88D53 /* InternetAccessPolicy.strings in Resources */, + AAB2F644273ED0E9004AB5A4 /* License.txt in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -759,13 +795,13 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.14; - MARKETING_VERSION = 4.0.1; + MARKETING_VERSION = 4.0.2; PRODUCT_BUNDLE_IDENTIFIER = me.guillaumeb.MonitorControl; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OBJC_BRIDGING_HEADER = "MonitorControl/Support/Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; + SWIFT_VERSION = 5.5; SYSTEM_FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(SYSTEM_LIBRARY_DIR)/PrivateFrameworks", @@ -794,13 +830,13 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.14; - MARKETING_VERSION = 4.0.1; + MARKETING_VERSION = 4.0.2; PRODUCT_BUNDLE_IDENTIFIER = me.guillaumeb.MonitorControl; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OBJC_BRIDGING_HEADER = "MonitorControl/Support/Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-O"; - SWIFT_VERSION = 5.0; + SWIFT_VERSION = 5.5; SYSTEM_FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(SYSTEM_LIBRARY_DIR)/PrivateFrameworks", @@ -829,11 +865,11 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.14; - MARKETING_VERSION = 4.0.1; + MARKETING_VERSION = 4.0.2; PRODUCT_BUNDLE_IDENTIFIER = me.guillaumeb.MonitorControlHelper; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; - SWIFT_VERSION = 5.0; + SWIFT_VERSION = 5.5; }; name = Debug; }; @@ -858,11 +894,11 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.14; - MARKETING_VERSION = 4.0.1; + MARKETING_VERSION = 4.0.2; PRODUCT_BUNDLE_IDENTIFIER = me.guillaumeb.MonitorControlHelper; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; - SWIFT_VERSION = 5.0; + SWIFT_VERSION = 5.5; }; name = Release; }; diff --git a/MonitorControl/Extensions/CGDirectDisplayID+Extension.swift b/MonitorControl/Extensions/CGDirectDisplayID+Extension.swift index 536e5d44..e98626e3 100644 --- a/MonitorControl/Extensions/CGDirectDisplayID+Extension.swift +++ b/MonitorControl/Extensions/CGDirectDisplayID+Extension.swift @@ -4,14 +4,14 @@ import Cocoa public extension CGDirectDisplayID { var vendorNumber: UInt32? { - return CGDisplayVendorNumber(self) + CGDisplayVendorNumber(self) } var modelNumber: UInt32? { - return CGDisplayModelNumber(self) + CGDisplayModelNumber(self) } var serialNumber: UInt32? { - return CGDisplaySerialNumber(self) + CGDisplaySerialNumber(self) } } diff --git a/MonitorControl/Extensions/NSScreen+Extension.swift b/MonitorControl/Extensions/NSScreen+Extension.swift index e69f5ad5..b6cd0b71 100644 --- a/MonitorControl/Extensions/NSScreen+Extension.swift +++ b/MonitorControl/Extensions/NSScreen+Extension.swift @@ -4,7 +4,7 @@ import Cocoa public extension NSScreen { var displayID: CGDirectDisplayID { - return (self.deviceDescription[NSDeviceDescriptionKey("NSScreenNumber")] as? CGDirectDisplayID)! + (self.deviceDescription[NSDeviceDescriptionKey("NSScreenNumber")] as? CGDirectDisplayID)! } var vendorNumber: UInt32? { diff --git a/MonitorControl/Info.plist b/MonitorControl/Info.plist index 1b6ff213..3537c98e 100644 --- a/MonitorControl/Info.plist +++ b/MonitorControl/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 6941 + 6956 LSApplicationCategoryType public.app-category.utilities LSMinimumSystemVersion diff --git a/MonitorControl/Model/Display.swift b/MonitorControl/Model/Display.swift index 0563b501..7cdae8c6 100644 --- a/MonitorControl/Model/Display.swift +++ b/MonitorControl/Model/Display.swift @@ -16,7 +16,7 @@ class Display: Equatable { let swBrightnessSemaphore = DispatchSemaphore(value: 1) static func == (lhs: Display, rhs: Display) -> Bool { - return lhs.identifier == rhs.identifier + lhs.identifier == rhs.identifier } var sliderHandler: [Command: SliderHandler] = [:] @@ -31,7 +31,7 @@ class Display: Equatable { var defaultGammaTablePeak: Float = 1 func prefExists(key: PrefKey? = nil, for command: Command? = nil) -> Bool { - return prefs.object(forKey: self.getKey(key: key, for: command)) != nil + prefs.object(forKey: self.getKey(key: key, for: command)) != nil } func removePref(key: PrefKey, for command: Command? = nil) { @@ -43,23 +43,23 @@ class Display: Equatable { } func readPrefAsFloat(key: PrefKey? = nil, for command: Command? = nil) -> Float { - return prefs.float(forKey: self.getKey(key: key, for: command)) + prefs.float(forKey: self.getKey(key: key, for: command)) } func readPrefAsInt(key: PrefKey? = nil, for command: Command? = nil) -> Int { - return prefs.integer(forKey: self.getKey(key: key, for: command)) + prefs.integer(forKey: self.getKey(key: key, for: command)) } func readPrefAsBool(key: PrefKey? = nil, for command: Command? = nil) -> Bool { - return prefs.bool(forKey: self.getKey(key: key, for: command)) + prefs.bool(forKey: self.getKey(key: key, for: command)) } func readPrefAsString(key: PrefKey? = nil, for command: Command? = nil) -> String { - return prefs.string(forKey: self.getKey(key: key, for: command)) ?? "" + prefs.string(forKey: self.getKey(key: key, for: command)) ?? "" } private func getKey(key: PrefKey? = nil, for command: Command? = nil) -> String { - return (key ?? PrefKey.value).rawValue + (command != nil ? String((command ?? Command.none).rawValue) : "") + self.prefsId + (key ?? PrefKey.value).rawValue + (command != nil ? String((command ?? Command.none).rawValue) : "") + self.prefsId } internal init(_ identifier: CGDirectDisplayID, name: String, vendorNumber: UInt32?, modelNumber: UInt32?, isVirtual: Bool = false, isDummy: Bool = false) { @@ -321,7 +321,7 @@ class Display: Equatable { } func resetSwBrightness() -> Bool { - return self.setSwBrightness(1) + self.setSwBrightness(1) } func isSwBrightnessNotDefault() -> Bool { @@ -335,7 +335,7 @@ class Display: Equatable { } func refreshBrightness() -> Float { - return 0 + 0 } func isBuiltIn() -> Bool { diff --git a/MonitorControl/Model/OtherDisplay.swift b/MonitorControl/Model/OtherDisplay.swift index 9c95cb58..e91a918e 100644 --- a/MonitorControl/Model/OtherDisplay.swift +++ b/MonitorControl/Model/OtherDisplay.swift @@ -72,7 +72,7 @@ class OtherDisplay: Display { } func getDDCValueFromPrefs(_ command: Command) -> UInt16 { - return self.convValueToDDC(for: command, from: (!prefs.bool(forKey: PrefKey.disableCombinedBrightness.rawValue) && command == .brightness) ? max(0, self.readPrefAsFloat(for: command) - self.combinedBrightnessSwitchingValue()) * (1 / (1 - self.combinedBrightnessSwitchingValue())) : self.readPrefAsFloat(for: command)) + self.convValueToDDC(for: command, from: (!prefs.bool(forKey: PrefKey.disableCombinedBrightness.rawValue) && command == .brightness) ? max(0, self.readPrefAsFloat(for: command) - self.combinedBrightnessSwitchingValue()) * (1 / (1 - self.combinedBrightnessSwitchingValue())) : self.readPrefAsFloat(for: command)) } func restoreDDCSettingsToDisplay(command: Command) { @@ -162,7 +162,7 @@ class OtherDisplay: Display { } func setupSliderCurrentValue(command: Command) -> Float { - return (command == .audioSpeakerVolume && self.readPrefAsBool(key: .enableMuteUnmute) && self.readPrefAsInt(for: .audioMuteScreenBlank) == 1) ? 0 : self.readPrefAsFloat(for: command) + (command == .audioSpeakerVolume && self.readPrefAsBool(key: .enableMuteUnmute) && self.readPrefAsInt(for: .audioMuteScreenBlank) == 1) ? 0 : self.readPrefAsFloat(for: command) } func stepVolume(isUp: Bool, isSmallIncrement: Bool) { @@ -255,7 +255,7 @@ class OtherDisplay: Display { } func isSwOnly() -> Bool { - return (!self.arm64ddc && self.ddc == nil) || self.isVirtual || self.isDummy + (!self.arm64ddc && self.ddc == nil) || self.isVirtual || self.isDummy } func isSw() -> Bool { @@ -362,7 +362,7 @@ class OtherDisplay: Display { } override func getBrightness() -> Float { - return self.prefExists(for: .brightness) ? self.readPrefAsFloat(for: .brightness) : 1 + self.prefExists(for: .brightness) ? self.readPrefAsFloat(for: .brightness) : 1 } func getRemapControlCodes(command: Command) -> [UInt8] { @@ -510,6 +510,6 @@ class OtherDisplay: Display { } func combinedBrightnessSwitchingValue() -> Float { - return Float(self.readPrefAsInt(key: .combinedBrightnessSwitchingPoint) + 8) / 16 + Float(self.readPrefAsInt(key: .combinedBrightnessSwitchingPoint) + 8) / 16 } } diff --git a/MonitorControl/Support/AppDelegate.swift b/MonitorControl/Support/AppDelegate.swift index 8b777fd6..8a5eee29 100644 --- a/MonitorControl/Support/AppDelegate.swift +++ b/MonitorControl/Support/AppDelegate.swift @@ -117,12 +117,13 @@ class AppDelegate: NSObject, NSApplicationDelegate { DisplayManager.shared.resetSwBrightnessForAllDisplays(noPrefSave: true) CGDisplayRestoreColorSyncSettings() self.reconfigureID += 1 + self.updateMediaKeyTap() os_log("Bumping reconfigureID to %{public}@", type: .info, String(self.reconfigureID)) _ = DisplayManager.shared.destroyAllShades() if self.sleepID == 0 { let dispatchedReconfigureID = self.reconfigureID os_log("Display to be reconfigured with reconfigureID %{public}@", type: .info, String(dispatchedReconfigureID)) - DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { + DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { self.configure(dispatchedReconfigureID: dispatchedReconfigureID) } } @@ -159,7 +160,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { func checkPermissions() { let permissionsRequired: Bool = [KeyboardVolume.media.rawValue, KeyboardVolume.both.rawValue].contains(prefs.integer(forKey: PrefKey.keyboardVolume.rawValue)) || [KeyboardBrightness.media.rawValue, KeyboardBrightness.both.rawValue].contains(prefs.integer(forKey: PrefKey.keyboardBrightness.rawValue)) - if !MediaKeyTapManager.readPrivileges(prompt: false) && permissionsRequired { + if !MediaKeyTapManager.readPrivileges(prompt: false), permissionsRequired { MediaKeyTapManager.acquirePrivileges() } } @@ -177,13 +178,14 @@ class AppDelegate: NSObject, NSApplicationDelegate { @objc private func sleepNotification() { self.sleepID += 1 os_log("Sleeping with sleep %{public}@", type: .info, String(self.sleepID)) + self.updateMediaKeyTap() } @objc private func wakeNotification() { if self.sleepID != 0 { os_log("Waking up from sleep %{public}@", type: .info, String(self.sleepID)) let dispatchedSleepID = self.sleepID - DispatchQueue.main.asyncAfter(deadline: .now() + 6.0) { // Some displays take time to recover... + DispatchQueue.main.asyncAfter(deadline: .now() + 3.0) { // Some displays take time to recover... self.soberNow(dispatchedSleepID: dispatchedSleepID) } } @@ -203,6 +205,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { self.job(start: true) } self.startupActionWriteRepeatAfterSober() + self.updateMediaKeyTap() } } diff --git a/MonitorControl/Support/DisplayManager.swift b/MonitorControl/Support/DisplayManager.swift index f4269721..062e2485 100644 --- a/MonitorControl/Support/DisplayManager.swift +++ b/MonitorControl/Support/DisplayManager.swift @@ -235,15 +235,15 @@ class DisplayManager { } func getOtherDisplays() -> [OtherDisplay] { - return self.displays.compactMap { $0 as? OtherDisplay } + self.displays.compactMap { $0 as? OtherDisplay } } func getAllDisplays() -> [Display] { - return self.displays + self.displays } func getDdcCapableDisplays() -> [OtherDisplay] { - return self.displays.compactMap { display -> OtherDisplay? in + self.displays.compactMap { display -> OtherDisplay? in if let otherDisplay = display as? OtherDisplay, !otherDisplay.isSw() { return otherDisplay } else { return nil } @@ -251,11 +251,11 @@ class DisplayManager { } func getAppleDisplays() -> [AppleDisplay] { - return self.displays.compactMap { $0 as? AppleDisplay } + self.displays.compactMap { $0 as? AppleDisplay } } func getBuiltInDisplay() -> Display? { - return self.displays.first { CGDisplayIsBuiltin($0.identifier) != 0 } + self.displays.first { CGDisplayIsBuiltin($0.identifier) != 0 } } func getCurrentDisplay(byFocus: Bool = false) -> Display? { @@ -481,7 +481,7 @@ class DisplayManager { } static func getByDisplayID(displayID: CGDirectDisplayID) -> NSScreen? { - return NSScreen.screens.first { $0.displayID == displayID } + NSScreen.screens.first { $0.displayID == displayID } } static func getDisplayRawNameByID(displayID: CGDirectDisplayID) -> String { diff --git a/MonitorControl/Support/MediaKeyTapManager.swift b/MonitorControl/Support/MediaKeyTapManager.swift index ff098796..906156b8 100644 --- a/MonitorControl/Support/MediaKeyTapManager.swift +++ b/MonitorControl/Support/MediaKeyTapManager.swift @@ -164,11 +164,15 @@ class MediaKeyTapManager: MediaKeyTapDelegate { keys.append(contentsOf: [.mute, .volumeUp, .volumeDown]) } // Remove brightness keys if no external displays are connected, but only if brightness fine control is not active - var isInternalDisplayOnly = true + var disengageBrightness = true for display in DisplayManager.shared.getAllDisplays() where !display.isBuiltIn() { - isInternalDisplayOnly = false + disengageBrightness = false } - if isInternalDisplayOnly, !prefs.bool(forKey: PrefKey.useFineScaleBrightness.rawValue) { + // Disengage brightness keys on sleep so MacBook native screen can be controlled meanwhile + if app.sleepID != 0 || app.reconfigureID != 0 { + disengageBrightness = true + } + if disengageBrightness, !prefs.bool(forKey: PrefKey.useFineScaleBrightness.rawValue) { let keysToDelete: [MediaKey] = [.brightnessUp, .brightnessDown] keys.removeAll { keysToDelete.contains($0) } } diff --git a/MonitorControl/Support/OSDUtils.swift b/MonitorControl/Support/OSDUtils.swift index a79ff8ab..b3b72072 100644 --- a/MonitorControl/Support/OSDUtils.swift +++ b/MonitorControl/Support/OSDUtils.swift @@ -64,15 +64,15 @@ class OSDUtils: NSObject { static let chicletCount: Float = 16 static func chiclet(fromValue value: Float, maxValue: Float, half: Bool = false) -> Float { - return (value * self.chicletCount * (half ? 2 : 1)) / maxValue + (value * self.chicletCount * (half ? 2 : 1)) / maxValue } static func value(fromChiclet chiclet: Float, maxValue: Float, half: Bool = false) -> Float { - return (chiclet * maxValue) / (self.chicletCount * (half ? 2 : 1)) + (chiclet * maxValue) / (self.chicletCount * (half ? 2 : 1)) } static func getDistance(fromNearestChiclet chiclet: Float) -> Float { - return abs(chiclet.rounded(.towardZero) - chiclet) + abs(chiclet.rounded(.towardZero) - chiclet) } static func showOSDLockOnAllDisplays(osdImage: Int64) { diff --git a/MonitorControl/Support/SliderHandler.swift b/MonitorControl/Support/SliderHandler.swift index a1c2cc4e..4be2f45d 100644 --- a/MonitorControl/Support/SliderHandler.swift +++ b/MonitorControl/Support/SliderHandler.swift @@ -204,7 +204,7 @@ class SliderHandler { class ClickThroughImageView: NSImageView { override func hitTest(_ point: NSPoint) -> NSView? { - return subviews.first { subview in subview.hitTest(point) != nil + subviews.first { subview in subview.hitTest(point) != nil } } } diff --git a/MonitorControl/Support/UpdaterDelegate.swift b/MonitorControl/Support/UpdaterDelegate.swift index 5a48bf3c..df108a5b 100644 --- a/MonitorControl/Support/UpdaterDelegate.swift +++ b/MonitorControl/Support/UpdaterDelegate.swift @@ -5,6 +5,6 @@ import Sparkle class UpdaterDelegate: NSObject, SPUUpdaterDelegate { func allowedChannels(for _: SPUUpdater) -> Set { - return prefs.bool(forKey: PrefKey.isBetaChannel.rawValue) ? Set(["beta"]) : Set([]) + prefs.bool(forKey: PrefKey.isBetaChannel.rawValue) ? Set(["beta"]) : Set([]) } } diff --git a/MonitorControl/UI/Base.lproj/Main.storyboard b/MonitorControl/UI/Base.lproj/Main.storyboard index a209a081..8defea05 100644 --- a/MonitorControl/UI/Base.lproj/Main.storyboard +++ b/MonitorControl/UI/Base.lproj/Main.storyboard @@ -315,15 +315,15 @@ - + - + - - - + + + @@ -349,7 +349,7 @@ - + @@ -359,7 +359,7 @@ - + @@ -378,7 +378,7 @@ - + @@ -388,7 +388,7 @@ - + @@ -405,23 +405,10 @@
- - - - - + @@ -429,6 +416,19 @@ + + + + @@ -686,7 +686,7 @@ - + @@ -700,7 +700,7 @@ - + diff --git a/MonitorControl/UI/es.lproj/Main.strings b/MonitorControl/UI/es.lproj/Main.strings index 4f867e49..1524e021 100644 --- a/MonitorControl/UI/es.lproj/Main.strings +++ b/MonitorControl/UI/es.lproj/Main.strings @@ -1,30 +1,23 @@ - /* Class = "NSButtonCell"; title = "Sync brightness changes from Built-in and Apple displays"; ObjectID = "0ca-DG-AgB"; */ "0ca-DG-AgB.title" = "Sincronizar los cambios del brillo de la pantalla incorporada con la pantalla de Apple"; -/* Class = "NSTextFieldCell"; title = "MonitorControl"; ObjectID = "1PJ-14-Bvn"; */ -"1PJ-14-Bvn.title" = "MonitorControl"; - /* Class = "NSMenuItem"; title = "Assume last saved settings are valid (recommended)"; ObjectID = "1in-79-6qm"; */ "1in-79-6qm.title" = "Asumir que la última configuración guardada es válida (recomendado)"; +/* Class = "NSTextFieldCell"; title = "MonitorControl"; ObjectID = "1PJ-14-Bvn"; */ +"1PJ-14-Bvn.title" = "MonitorControl"; + /* Class = "NSMenuItem"; title = "Standard keyboard volume and mute keys"; ObjectID = "1sy-Kd-WL5"; */ "1sy-Kd-WL5.title" = "Teclas por defecto para silenciar y el volumen"; /* Class = "NSTextFieldCell"; title = "DDC min"; ObjectID = "1zE-fg-xEm"; */ "1zE-fg-xEm.title" = "DDC mín"; -/* Class = "NSMenuItem"; title = "Apply last saved values to the display"; ObjectID = "3Jr-bW-YYq"; */ -"3Jr-bW-YYq.title" = "Aplicar los últimos valores guardados a la pantalla"; - -/* Class = "NSBox"; title = "#bc-ignore!"; ObjectID = "3a3-In-jeQ"; */ -"3a3-In-jeQ.title" = "#bc-ignore!"; - /* Class = "NSMenuItem"; title = "Show separate controls for each display in menu"; ObjectID = "3eO-bN-ZRl"; */ "3eO-bN-ZRl.title" = "Mostrar controles separados para cada pantalla en el menú"; -/* Class = "NSButtonCell"; title = "https://monitorcontrol.app"; ObjectID = "42n-Zy-AqF"; Note = "#bc-ignore!"; */ -"42n-Zy-AqF.title" = "https://monitorcontrol.app"; +/* Class = "NSMenuItem"; title = "Apply last saved values to the display"; ObjectID = "3Jr-bW-YYq"; */ +"3Jr-bW-YYq.title" = "Aplicar los últimos valores guardados a la pantalla"; /* Class = "NSMenuItem"; title = "Custom keyboard shortcuts"; ObjectID = "4CG-0I-anB"; */ "4CG-0I-anB.title" = "Atajos de teclado personalizados"; @@ -32,15 +25,9 @@ /* Class = "NSTextFieldCell"; title = "Using window focus might not work properly with full screen apps."; ObjectID = "4dX-o1-xAc"; */ "4dX-o1-xAc.title" = "Usar el enfoque de ventana podría no funcionar en apps a pantalla completa."; -/* Class = "NSBox"; title = "#bc-ignore!"; ObjectID = "4wn-2u-KRo"; */ -"4wn-2u-KRo.title" = "#bc-ignore!"; - /* Class = "NSButtonCell"; title = "Reset Preferences"; ObjectID = "5yT-5F-X5R"; */ "5yT-5F-X5R.title" = "Restablecer Preferencias"; -/* Class = "NSTextFieldCell"; title = "#bc-ignore!"; ObjectID = "6GJ-6Q-gqz"; */ -"6GJ-6Q-gqz.title" = "#bc-ignore!"; - /* Class = "NSMenuItem"; title = "Always hide"; ObjectID = "6mo-7S-oOO"; */ "6mo-7S-oOO.title" = "Siempre oculto"; @@ -59,9 +46,6 @@ /* Class = "NSButtonCell"; title = "Special thanks to our contributors!"; ObjectID = "95V-M4-2l5"; */ "95V-M4-2l5.title" = "Agradecimientos especiales a nuestros colaboradores!"; -/* Class = "NSBox"; title = "#bc-ignore!"; ObjectID = "9aX-gm-8TS"; */ -"9aX-gm-8TS.title" = "#bc-ignore!"; - /* Class = "NSMenuItem"; title = "Custom keyboard shortcuts"; ObjectID = "9eC-PD-FHl"; */ "9eC-PD-FHl.title" = "Atajos de teclado personalizados"; @@ -71,11 +55,14 @@ /* Class = "NSTextFieldCell"; title = "Show tick marks at 0%, 25%, 50%, 75% and 100% for accuracy."; ObjectID = "A8P-vn-DEJ"; */ "A8P-vn-DEJ.title" = "Mostrar muecas en 0%, 25%, 50%, 75% y 100% para una mayor precisión."; +/* Class = "NSTextFieldCell"; title = "Use brightness, volume and other settings from last time or use defaults. Values will be applied to the display upon first change by the user."; ObjectID = "an7-Aj-3fZ"; */ +"an7-Aj-3fZ.title" = "Usar el brillo, volumen y otras configuraciones de la última vez o por defecto. Los valores serán aplicados a la pantalla cuando el usuario los cambie por primera vez."; + /* Class = "NSMenuItem"; title = "Use audio device name to determine which display to control"; ObjectID = "AqF-uD-KCY"; */ "AqF-uD-KCY.title" = "Usar nombre del dispositivo de audio para determinar qué pantalla controlar"; -/* Class = "NSButtonCell"; title = "Reset settings"; ObjectID = "BYS-7Y-bRz"; */ -"BYS-7Y-bRz.title" = "Restablecer configuración"; +/* Class = "NSMenuItem"; title = "Show sliders only for the display currently showing the menu"; ObjectID = "bbf-sS-uGv"; */ +"bbf-sS-uGv.title" = "Mostrar sliders solo para las pantallas que actualmente se muestran en el menú"; /* Class = "NSTextFieldCell"; title = "Brightness:"; ObjectID = "Bhb-6l-uPQ"; */ "Bhb-6l-uPQ.title" = "Brillo:"; @@ -83,12 +70,33 @@ /* Class = "NSTextFieldCell"; title = "(Software->DDC)"; ObjectID = "Bid-UL-blc"; */ "Bid-UL-blc.title" = "(Software->DDC)"; +/* Class = "NSTextFieldCell"; title = "For hardware (DDC) controlled displays only. Results may vary."; ObjectID = "bIe-6O-xEH"; */ +"bIe-6O-xEH.title" = "Sólo para pantallas controladas por hardware (DDC). Los resultados pueden variar."; + +/* Class = "NSButtonCell"; title = "Disable macOS volume OSD"; ObjectID = "bkM-Px-U3b"; */ +"bkM-Px-U3b.title" = "Deshabilitar OSD de macOS para el volumen"; + +/* Class = "NSTextFieldCell"; title = "OSD scale:"; ObjectID = "bP4-GJ-vhJ"; */ +"bP4-GJ-vhJ.title" = "Escala OSD:"; + /* Class = "NSTextFieldCell"; title = "OSD scale:"; ObjectID = "Bqc-s3-C0w"; */ "Bqc-s3-C0w.title" = "Escala OSD:"; +/* Class = "NSButtonCell"; title = "Reset settings"; ObjectID = "BYS-7Y-bRz"; */ +"BYS-7Y-bRz.title" = "Restablecer configuración"; + +/* Class = "NSButtonCell"; title = "Enable Mute DDC command"; ObjectID = "bZq-0d-lJa"; */ +"bZq-0d-lJa.title" = "Habilitar comando DDC para silenciar"; + +/* Class = "NSButtonCell"; title = "Show volume slider in menu"; ObjectID = "c9D-MB-lma"; */ +"c9D-MB-lma.title" = "Mostrar slider de volumen en el menú"; + /* Class = "NSMenuItem"; title = "Custom"; ObjectID = "Cle-DD-vR7"; */ "Cle-DD-vR7.title" = "Personalizado"; +/* Class = "NSTextFieldCell"; title = "Upon startup or wake:"; ObjectID = "cNt-Cq-vK4"; */ +"cNt-Cq-vK4.title" = "Al iniciar o arrancar:"; + /* Class = "NSTextFieldCell"; title = "⚠️ Warning! Changing some of these settings may cause system freezes or unexpected behavior!"; ObjectID = "Cz1-Mh-llk"; */ "Cz1-Mh-llk.title" = "⚠️ ¡Atención! ¡Cambiar algunos de estos valores puede causar cuelgues en el sistema o comportamientos anómalos!"; @@ -113,164 +121,38 @@ /* Class = "NSTextFieldCell"; title = "Mute:"; ObjectID = "EvN-FT-vdZ"; */ "EvN-FT-vdZ.title" = "Silencio:"; -/* Class = "NSTextFieldCell"; title = "Volume:"; ObjectID = "FER-Ri-4UO"; */ -"FER-Ri-4UO.title" = "Volumen:"; +/* Class = "NSTextFieldCell"; title = "Normally keyboard controls change one OSD chiclet worth of value and Shift+Option allows fine control. This makes fine control default."; ObjectID = "f6J-Ui-uMB"; */ +"f6J-Ui-uMB.title" = "Normalmente, los controles de teclado cambian un valor completo del escalón del OSD y Shift+Option permite un control más preciso. Esto hace el control más preciso por defecto."; + +/* Class = "NSButtonCell"; title = "Reset Name"; ObjectID = "f9g-8s-gdd"; */ +"f9g-8s-gdd.title" = "Restablecer Nombre"; /* Class = "NSButtonCell"; title = "Automatically check for updates"; ObjectID = "Faf-9L-TXx"; */ "Faf-9L-TXx.title" = "Comprobar actualizaciones automáticamente"; +/* Class = "NSTextFieldCell"; title = "Brightness control:"; ObjectID = "fe9-Ia-t9m"; */ +"fe9-Ia-t9m.title" = "Control del brillo:"; + +/* Class = "NSTextFieldCell"; title = "Volume:"; ObjectID = "FER-Ri-4UO"; */ +"FER-Ri-4UO.title" = "Volumen:"; + /* Class = "NSButtonCell"; title = "Allow zero brightness via software or combined dimming"; ObjectID = "FjB-XL-fG5"; */ "FjB-XL-fG5.title" = "Permitir brillo cero vía software u atenuación combinada"; +/* Class = "NSTextFieldCell"; title = "Apple and built-in displays already have a brightness slider in Control Center."; ObjectID = "fmZ-HI-Mdc"; */ +"fmZ-HI-Mdc.title" = "Las pantallas de Apple e incorporadas ya tienen un slider para el brillo en el Centro de Control."; + /* Class = "NSMenuItem"; title = "None"; ObjectID = "FoA-yh-Yx3"; */ "FoA-yh-Yx3.title" = "Ninguno"; -/* Class = "NSTextFieldCell"; title = "Invert"; ObjectID = "G5A-y3-eZz"; */ -"G5A-y3-eZz.title" = "Invertir"; - -/* Class = "NSTextFieldCell"; title = "Override audio device name:"; ObjectID = "H9X-it-sXs"; */ -"H9X-it-sXs.title" = "Sobrescribir nombre del dispositivo de audio:"; - -/* Class = "NSMenuItem"; title = "Hide"; ObjectID = "HUT-Qc-kuu"; */ -"HUT-Qc-kuu.title" = "Esconder"; - -/* Class = "NSTextFieldCell"; title = "Brightness:"; ObjectID = "IJB-mO-e8I"; */ -"IJB-mO-e8I.title" = "Brillo:"; - -/* Class = "NSButtonCell"; title = "Enable smooth brightness transitions"; ObjectID = "IK4-u5-qjf"; */ -"IK4-u5-qjf.title" = "Habilitar transiciones de brillo suaves"; - -/* Class = "NSButtonCell"; title = "Use fine OSD scale for volume"; ObjectID = "J3L-MW-iJL"; */ -"J3L-MW-iJL.title" = "Usar escala OSD de volumen precisa"; - -/* Class = "NSTextFieldCell"; title = "Note: you can press Shift during startup for 'Safe mode' to restore defaults and avoid reading or setting anything."; ObjectID = "Jx2-gO-nq9"; */ -"Jx2-gO-nq9.title" = "Nota: puedes presionar la tecla Shift mientras arrancas la app para entrar en el 'Modo Seguro' para restaurar los valores por defecto y evitar leer o establecer la configuración."; - -/* Class = "NSButtonCell"; title = "Enable for Apple branded and built-in displays as well"; ObjectID = "K6A-4z-1aQ"; */ -"K6A-4z-1aQ.title" = "Habilitar también para pantallas de Apple o incorporadas"; - -/* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "Kfj-WK-aSL"; */ -"Kfj-WK-aSL.title" = "Ventana de control:"; - -/* Class = "NSTextFieldCell"; title = "Brightness and contrast:"; ObjectID = "LO4-4k-gxY"; */ -"LO4-4k-gxY.title" = "Brillo y contraste:"; - -/* Class = "NSMenuItem"; title = "Always show in the menu bar"; ObjectID = "MM0-Lf-VgF"; */ -"MM0-Lf-VgF.title" = "Mostrar siempre en la barra de menú"; - -/* Class = "NSTextFieldCell"; title = "Contrast:"; ObjectID = "MMk-S2-yJN"; */ -"MMk-S2-yJN.title" = "Contraste:"; - -/* Class = "NSButtonCell"; title = "Show brightness slider in menu"; ObjectID = "MWo-6I-s9L"; */ -"MWo-6I-s9L.title" = "Mostrar slider del brillo en el menú"; - -/* Class = "NSButtonCell"; title = "Enable slider snapping"; ObjectID = "MlU-hl-d46"; */ -"MlU-hl-d46.title" = "Habilitar ajuste por slider"; - -/* Class = "NSButtonCell"; title = "Separate scales for combined hardware & software dimming"; ObjectID = "O8o-hI-8eR"; */ -"O8o-hI-8eR.title" = "Separar escalas de atenuación por hardware & software"; - -/* Class = "NSMenuItem"; title = "Standard keyboard brightness keys"; ObjectID = "Oke-bW-cb1"; */ -"Oke-bW-cb1.title" = "Teclas estándar para el brillo"; - -/* Class = "NSTextFieldCell"; title = "count:"; ObjectID = "Orv-yj-Nad"; */ -"Orv-yj-Nad.title" = "conteo:"; - -/* Class = "NSTextFieldCell"; title = "Control method:"; ObjectID = "PaK-1f-DsW"; */ -"PaK-1f-DsW.title" = "Método de control:"; - -/* Class = "NSTextFieldCell"; title = "#bc-ignore!"; ObjectID = "Pqk-VW-JGY"; */ -"Pqk-VW-JGY.title" = "#bc-ignore!"; - -/* Class = "NSTextFieldCell"; title = "Use software dimming after the display reached zero hardware brightness for extended range. Works for DDC controlled displays only."; ObjectID = "PyY-p9-3NP"; */ -"PyY-p9-3NP.title" = "Usar atenuación por software una vez que la pantalla alcanza el brillo 0 para un rango extendido. Funciona sólo para pantallas controladas por DDC."; - -/* Class = "NSMenuItem"; title = "Both standard and custom shortcuts"; ObjectID = "QDG-SA-mRX"; */ -"QDG-SA-mRX.title" = "Ambos, atajos estándar y personalizados"; - -/* Class = "NSMenuItem"; title = "Normal"; ObjectID = "Riq-uM-bTs"; */ -"Riq-uM-bTs.title" = "Normal"; - -/* Class = "NSTextFieldCell"; title = "@the0neyouseek (Guillaume B.)\n@JoniVR (Joni Van Roost)\n@waydabber (István T.)"; ObjectID = "TKd-J8-Iyk"; */ -"TKd-J8-Iyk.title" = "@the0neyouseek (Guillaume B.)\n@JoniVR (Joni Van Roost)\n@waydabber (István T.)"; - -/* Class = "NSButtonCell"; title = "Show advanced settings"; ObjectID = "UBq-Od-SIB"; */ -"UBq-Od-SIB.title" = "Mostrar configuración avanzada"; - -/* Class = "NSButtonCell"; title = "Enable keyboard control for display"; ObjectID = "UqR-WE-jHl"; */ -"UqR-WE-jHl.title" = "Habilitar control por teclado para las pantallas"; - -/* Class = "NSTextFieldCell"; title = "General options:"; ObjectID = "W58-ch-j69"; */ -"W58-ch-j69.title" = "Opciones generales:"; - -/* Class = "NSTextFieldCell"; title = "Works best with various syncing and 'control all' keyboard settings enabled."; ObjectID = "XU4-Bn-bwH"; */ -"XU4-Bn-bwH.title" = "Funciona mejor cuando están habilitadas varias sincronizaciones y la configuración del teclado para 'controlar todo'."; - -/* Class = "NSMenuItem"; title = "Change volume for all screens"; ObjectID = "Xih-P5-NyM"; */ -"Xih-P5-NyM.title" = "Cambiar volumen para todas las pantallas"; - -/* Class = "NSTextFieldCell"; title = "Full OSD scale will be available for hardware brightness control and after reaching 0 brightness, further software dimming will be used."; ObjectID = "YHZ-VL-QJ3"; */ -"YHZ-VL-QJ3.title" = "La escala completa del OSD estará disponible para el control del brillo por hardware y después de alcanzar el brillo 0, será usada la atenuación por software."; - -/* Class = "NSTextFieldCell"; title = "Identifier:"; ObjectID = "YqZ-LS-YvR"; */ -"YqZ-LS-YvR.title" = "Identificador:"; - -/* Class = "NSMenuItem"; title = "Depends on mouse pointer position"; ObjectID = "Ytd-mg-N5E"; */ -"Ytd-mg-N5E.title" = "Depender de la posición del cursor del ratón"; - -/* Class = "NSButtonCell"; title = "Donate"; ObjectID = "ZKk-ve-rS4"; */ -"ZKk-ve-rS4.title" = "Donar"; - -/* Class = "NSButtonCell"; title = "Show percentages"; ObjectID = "ZUu-MR-XwA"; */ -"ZUu-MR-XwA.title" = "Mostrar porcentajes"; - -/* Class = "NSButtonCell"; title = "Use hardware DDC control"; ObjectID = "ZdU-gV-V05"; */ -"ZdU-gV-V05.title" = "Usar control DDC por hardware"; - -/* Class = "NSTextFieldCell"; title = "Use brightness, volume and other settings from last time or use defaults. Values will be applied to the display upon first change by the user."; ObjectID = "an7-Aj-3fZ"; */ -"an7-Aj-3fZ.title" = "Usar el brillo, volumen y otras configuraciones de la última vez o por defecto. Los valores serán aplicados a la pantalla cuando el usuario los cambie por primera vez."; - -/* Class = "NSTextFieldCell"; title = "For hardware (DDC) controlled displays only. Results may vary."; ObjectID = "bIe-6O-xEH"; */ -"bIe-6O-xEH.title" = "Sólo para pantallas controladas por hardware (DDC). Los resultados pueden variar."; - -/* Class = "NSTextFieldCell"; title = "OSD scale:"; ObjectID = "bP4-GJ-vhJ"; */ -"bP4-GJ-vhJ.title" = "Escala OSD:"; - -/* Class = "NSButtonCell"; title = "Enable Mute DDC command"; ObjectID = "bZq-0d-lJa"; */ -"bZq-0d-lJa.title" = "Habilitar comando DDC para silenciar"; - -/* Class = "NSMenuItem"; title = "Show sliders only for the display currently showing the menu"; ObjectID = "bbf-sS-uGv"; */ -"bbf-sS-uGv.title" = "Mostrar sliders solo para las pantallas que actualmente se muestran en el menú"; - -/* Class = "NSButtonCell"; title = "Disable macOS volume OSD"; ObjectID = "bkM-Px-U3b"; */ -"bkM-Px-U3b.title" = "Deshabilitar OSD de macOS para el volumen"; - -/* Class = "NSButtonCell"; title = "Show volume slider in menu"; ObjectID = "c9D-MB-lma"; */ -"c9D-MB-lma.title" = "Mostrar slider de volumen en el menú"; - -/* Class = "NSTextFieldCell"; title = "Upon startup or wake:"; ObjectID = "cNt-Cq-vK4"; */ -"cNt-Cq-vK4.title" = "Al iniciar o arrancar:"; - -/* Class = "NSTextFieldCell"; title = "#bc-ignore!"; ObjectID = "e0q-fb-k7R"; */ -"e0q-fb-k7R.title" = "#bc-ignore!"; - -/* Class = "NSTextFieldCell"; title = "Normally keyboard controls change one OSD chiclet worth of value and Shift+Option allows fine control. This makes fine control default."; ObjectID = "f6J-Ui-uMB"; */ -"f6J-Ui-uMB.title" = "Normalmente, los controles de teclado cambian un valor completo del escalón del OSD y Shift+Option permite un control más preciso. Esto hace el control más preciso por defecto."; - -/* Class = "NSButtonCell"; title = "Reset Name"; ObjectID = "f9g-8s-gdd"; */ -"f9g-8s-gdd.title" = "Restablecer Nombre"; - /* Class = "NSMenuItem"; title = "Show as icons"; ObjectID = "fR3-kq-cps"; */ "fR3-kq-cps.title" = "Mostrar como iconos"; /* Class = "NSMenuItem"; title = "Show as text"; ObjectID = "fWd-Es-zsy"; */ "fWd-Es-zsy.title" = "Mostrar como texto"; -/* Class = "NSTextFieldCell"; title = "Brightness control:"; ObjectID = "fe9-Ia-t9m"; */ -"fe9-Ia-t9m.title" = "Control del brillo:"; - -/* Class = "NSTextFieldCell"; title = "Apple and built-in displays already have a brightness slider in Control Center."; ObjectID = "fmZ-HI-Mdc"; */ -"fmZ-HI-Mdc.title" = "Las pantallas de Apple e incorporadas ya tienen un slider para el brillo en el Centro de Control."; +/* Class = "NSTextFieldCell"; title = "Invert"; ObjectID = "G5A-y3-eZz"; */ +"G5A-y3-eZz.title" = "Invertir"; /* Class = "NSMenuItem"; title = "Use window focus to determine which display to control"; ObjectID = "gTR-FW-FHc"; */ "gTR-FW-FHc.title" = "Usar foco de ventana para determinar qué pantalla controlar"; @@ -278,17 +160,29 @@ /* Class = "NSTextFieldCell"; title = "Brightness slider for hardware or software controlled displays or TVs."; ObjectID = "gXH-HL-ZOL"; */ "gXH-HL-ZOL.title" = "Slider del brillo para pantallas o TVs controladas por hardware o software."; +/* Class = "NSTextFieldCell"; title = "Override audio device name:"; ObjectID = "H9X-it-sXs"; */ +"H9X-it-sXs.title" = "Sobrescribir nombre del dispositivo de audio:"; + /* Class = "NSTextFieldCell"; title = "Relaunch the app to access Preferences if the menu option is not accessible. Use the button below to quit the app."; ObjectID = "hF7-fM-aKr"; */ "hF7-fM-aKr.title" = "Reinicia la app para acceder a Preferencias si el menú opción no es accesible. Usa el botón de arriba para cerrar la app."; /* Class = "NSButtonCell"; title = "Get current"; ObjectID = "hkC-vq-IcD"; */ "hkC-vq-IcD.title" = "Obtener actual"; +/* Class = "NSMenuItem"; title = "Hide"; ObjectID = "HUT-Qc-kuu"; */ +"HUT-Qc-kuu.title" = "Esconder"; + /* Class = "NSTextFieldCell"; title = "Additional controls:"; ObjectID = "i5X-M5-Tf5"; */ "i5X-M5-Tf5.title" = "Controles adicionales:"; -/* Class = "NSTextFieldCell"; title = "#bc-ignore!"; ObjectID = "ibQ-4u-ClE"; */ -"ibQ-4u-ClE.title" = "#bc-ignore!"; +/* Class = "NSTextFieldCell"; title = "Brightness:"; ObjectID = "IJB-mO-e8I"; */ +"IJB-mO-e8I.title" = "Brillo:"; + +/* Class = "NSButtonCell"; title = "Enable smooth brightness transitions"; ObjectID = "IK4-u5-qjf"; */ +"IK4-u5-qjf.title" = "Habilitar transiciones de brillo suaves"; + +/* Class = "NSButtonCell"; title = "Use fine OSD scale for volume"; ObjectID = "J3L-MW-iJL"; */ +"J3L-MW-iJL.title" = "Usar escala OSD de volumen precisa"; /* Class = "NSButtonCell"; title = "Start at Login"; ObjectID = "j72-NF-zsW"; */ "j72-NF-zsW.title" = "Abrir al Iniciar sesión"; @@ -299,69 +193,117 @@ /* Class = "NSButtonCell"; title = "Check for updates"; ObjectID = "jVH-oc-rUi"; */ "jVH-oc-rUi.title" = "Comprobar actualizaciones"; +/* Class = "NSTextFieldCell"; title = "Note: you can press Shift during startup for 'Safe mode' to restore defaults and avoid reading or setting anything."; ObjectID = "Jx2-gO-nq9"; */ +"Jx2-gO-nq9.title" = "Nota: puedes presionar la tecla Shift mientras arrancas la app para entrar en el 'Modo Seguro' para restaurar los valores por defecto y evitar leer o establecer la configuración."; + +/* Class = "NSButtonCell"; title = "Enable for Apple branded and built-in displays as well"; ObjectID = "K6A-4z-1aQ"; */ +"K6A-4z-1aQ.title" = "Habilitar también para pantallas de Apple o incorporadas"; + +/* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "Kfj-WK-aSL"; */ +"Kfj-WK-aSL.title" = "Ventana de control:"; + /* Class = "NSMenuItem"; title = "Depends on mouse pointer position"; ObjectID = "km4-hK-auM"; */ "km4-hK-auM.title" = "Depender de la posición del cursor del ratón"; /* Class = "NSMenuItem"; title = "Use combined slider for all displays"; ObjectID = "lA0-tv-qRs"; */ "lA0-tv-qRs.title" = "Usar slider combinado para todas las pantallas"; +/* Class = "NSTextFieldCell"; title = "Brightness and contrast:"; ObjectID = "LO4-4k-gxY"; */ +"LO4-4k-gxY.title" = "Brillo y contraste:"; + /* Class = "NSTextFieldCell"; title = "Display type:"; ObjectID = "lSJ-6w-KJ2"; */ "lSJ-6w-KJ2.title" = "Tipo de pantalla:"; /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "ltL-gR-K3Z"; */ "ltL-gR-K3Z.title" = "Pantalla a controlar:"; -/* Class = "NSTextFieldCell"; title = "#bc-ignore!"; ObjectID = "mBs-6m-13Q"; */ -"mBs-6m-13Q.title" = "#bc-ignore!"; +/* Class = "NSButtonCell"; title = "Enable slider snapping"; ObjectID = "MlU-hl-d46"; */ +"MlU-hl-d46.title" = "Habilitar ajuste por slider"; + +/* Class = "NSMenuItem"; title = "Always show in the menu bar"; ObjectID = "MM0-Lf-VgF"; */ +"MM0-Lf-VgF.title" = "Mostrar siempre en la barra de menú"; + +/* Class = "NSTextFieldCell"; title = "Contrast:"; ObjectID = "MMk-S2-yJN"; */ +"MMk-S2-yJN.title" = "Contraste:"; /* Class = "NSTextFieldCell"; title = "Volume:"; ObjectID = "mue-fa-8z6"; */ "mue-fa-8z6.title" = "Volumen:"; +/* Class = "NSButtonCell"; title = "Show brightness slider in menu"; ObjectID = "MWo-6I-s9L"; */ +"MWo-6I-s9L.title" = "Mostrar slider del brillo en el menú"; + /* Class = "NSButtonCell"; title = "Avoid gamma table manipulation"; ObjectID = "na6-mS-MPi"; */ "na6-mS-MPi.title" = "Evitar manipulación de la tabla gamma"; +/* Class = "NSButtonCell"; title = "Separate scales for combined hardware & software dimming"; ObjectID = "O8o-hI-8eR"; */ +"O8o-hI-8eR.title" = "Separar escalas de atenuación por hardware & software"; + /* Class = "NSMenuItem"; title = "Disable keyboard"; ObjectID = "oHf-Gh-68c"; */ "oHf-Gh-68c.title" = "Deshabilitar teclado"; /* Class = "NSTextFieldCell"; title = "Application:"; ObjectID = "okD-DG-pYa"; */ "okD-DG-pYa.title" = "Aplicación:"; -/* Class = "NSButtonCell"; title = "Longer delay during DDC read operations"; ObjectID = "pF5-Sw-7BR"; */ -"pF5-Sw-7BR.title" = "Retraso más largo durante las operaciones DDC de lectura"; +/* Class = "NSMenuItem"; title = "Standard keyboard brightness keys"; ObjectID = "Oke-bW-cb1"; */ +"Oke-bW-cb1.title" = "Teclas estándar para el brillo"; -/* Class = "NSTextFieldCell"; title = "#bc-ignore!"; ObjectID = "pIy-Lk-kkm"; */ -"pIy-Lk-kkm.title" = "#bc-ignore!"; +/* Class = "NSTextFieldCell"; title = "count:"; ObjectID = "Orv-yj-Nad"; */ +"Orv-yj-Nad.title" = "conteo:"; /* Class = "NSTextFieldCell"; title = "Use the brightness keys of your Apple keyboard to control brightness. You can hold Control to adjust the built-in display, Control+Command to adjust external displays. Hold Shift+Option for fine control. Control+Option+Command adjusts contrast on DDC compatible displays."; ObjectID = "pa0-Hz-ace"; */ "pa0-Hz-ace.title" = "Usar las teclas de brillo de tu teclado de Apple para controlar el brillo. Puedes mantener la tecla Control para ajustar la pantalla incorporada, Control+Command para ajustar las pantallas externas. Mantén Shift+Option para un control más preciso. Control+Option+Command ajusta el contraste en pantallas compatibles con DDC."; +/* Class = "NSTextFieldCell"; title = "Control method:"; ObjectID = "PaK-1f-DsW"; */ +"PaK-1f-DsW.title" = "Método de control:"; + +/* Class = "NSButtonCell"; title = "Longer delay during DDC read operations"; ObjectID = "pF5-Sw-7BR"; */ +"pF5-Sw-7BR.title" = "Retraso más largo durante las operaciones DDC de lectura"; + /* Class = "NSTextFieldCell"; title = "DDC max"; ObjectID = "psF-vX-AFB"; */ "psF-vX-AFB.title" = "DDC máx"; -/* Class = "NSButtonCell"; title = "Show contrast slider in menu"; ObjectID = "qO0-dB-yUs"; */ -"qO0-dB-yUs.title" = "Mostrar slider de contraste en el menú"; +/* Class = "NSTextFieldCell"; title = "Use software dimming after the display reached zero hardware brightness for extended range. Works for DDC controlled displays only."; ObjectID = "PyY-p9-3NP"; */ +"PyY-p9-3NP.title" = "Usar atenuación por software una vez que la pantalla alcanza el brillo 0 para un rango extendido. Funciona sólo para pantallas controladas por DDC."; -/* Class = "NSTextFieldCell"; title = "Show percentage next to slider for more precision."; ObjectID = "qXy-CL-Wf1"; */ -"qXy-CL-Wf1.title" = "Mostrar porcentaje cerca del slider para una mayor precisión."; +/* Class = "NSMenuItem"; title = "Both standard and custom shortcuts"; ObjectID = "QDG-SA-mRX"; */ +"QDG-SA-mRX.title" = "Ambos, atajos estándar y personalizados"; /* Class = "NSButtonCell"; title = "Quit application"; ObjectID = "qlb-wH-qr4"; */ "qlb-wH-qr4.title" = "Cerrar aplicación"; +/* Class = "NSButtonCell"; title = "Show contrast slider in menu"; ObjectID = "qO0-dB-yUs"; */ +"qO0-dB-yUs.title" = "Mostrar slider de contraste en el menú"; + /* Class = "NSTextFieldCell"; title = "Volume control (DDC only):"; ObjectID = "qoh-Gn-f11"; */ "qoh-Gn-f11.title" = "Control del volumen (sólo DDC):"; +/* Class = "NSTextFieldCell"; title = "Show percentage next to slider for more precision."; ObjectID = "qXy-CL-Wf1"; */ +"qXy-CL-Wf1.title" = "Mostrar porcentaje cerca del slider para una mayor precisión."; + /* Class = "NSButtonCell"; title = "Combine hardware and software dimming"; ObjectID = "r76-Zc-x09"; */ "r76-Zc-x09.title" = "Combinar atenuación por hardware y software"; +/* Class = "NSMenuItem"; title = "Normal"; ObjectID = "Riq-uM-bTs"; */ +"Riq-uM-bTs.title" = "Normal"; + /* Class = "NSTextFieldCell"; title = "General menu items style:"; ObjectID = "thh-DG-ecH"; */ "thh-DG-ecH.title" = "Estilo de los elementos del menú:"; +/* Class = "NSTextFieldCell"; title = "@the0neyouseek (Guillaume B.)\n@JoniVR (Joni Van Roost)\n@waydabber (István T.)"; ObjectID = "TKd-J8-Iyk"; */ +"TKd-J8-Iyk.title" = "@the0neyouseek (Guillaume B.)\n@JoniVR (Joni Van Roost)\n@waydabber (István T.)"; + /* Class = "NSTextFieldCell"; title = "Menu Icon:"; ObjectID = "u6s-Pb-BCG"; */ "u6s-Pb-BCG.title" = "Icono del menú:"; +/* Class = "NSButtonCell"; title = "Show advanced settings"; ObjectID = "UBq-Od-SIB"; */ +"UBq-Od-SIB.title" = "Mostrar configuración avanzada"; + /* Class = "NSTextFieldCell"; title = "Works if an audio device is selected with no native volume control."; ObjectID = "uF5-a9-Ngz"; */ "uF5-a9-Ngz.title" = "Funciona si un dispositivo de audio es seleccionado sin control del volumen nativo."; +/* Class = "NSButtonCell"; title = "Enable keyboard control for display"; ObjectID = "UqR-WE-jHl"; */ +"UqR-WE-jHl.title" = "Habilitar control por teclado para las pantallas"; + /* Class = "NSTextFieldCell"; title = "Contrast (DDC):"; ObjectID = "urd-Rh-aiL"; */ "urd-Rh-aiL.title" = "Contraste (DDC):"; @@ -377,29 +319,56 @@ /* Class = "NSTextFieldCell"; title = "DDC read polling mode:"; ObjectID = "vwm-hY-on5"; */ "vwm-hY-on5.title" = "Modo de sondeo de lectura DDC:"; +/* Class = "NSTextFieldCell"; title = "General options:"; ObjectID = "W58-ch-j69"; */ +"W58-ch-j69.title" = "Opciones generales:"; + /* Class = "NSTextFieldCell"; title = "Useful when a display tends to reset its settings during sleep."; ObjectID = "w8B-x6-sq5"; */ "w8B-x6-sq5.title" = "Útil cuando una pantalla tiende a resetear su configuración mientras está en modo stand by."; /* Class = "NSTextFieldCell"; title = "Changes that are caused by the Ambient light sensor or made using Touch Bar, Control Center, System Preferences will be replicated to all displays."; ObjectID = "wjv-tq-iUx"; */ "wjv-tq-iUx.title" = "Los cambios producidos por el sensor de luz ambiental o hechos a través de la Touch Bar, Centro de Control, Preferencias del Sistema serñan replicados a todas las pantallas."; +/* Class = "NSMenuItem"; title = "Change volume for all screens"; ObjectID = "Xih-P5-NyM"; */ +"Xih-P5-NyM.title" = "Cambiar volumen para todas las pantallas"; + +/* Class = "NSTextFieldCell"; title = "Update settings from the display. May not work with some hardware."; ObjectID = "xjq-hs-wWB"; */ +"xjq-hs-wWB.title" = "Actualizar configuración desde la pantalla. Puede no funcionar con algunos hardware."; + /* Class = "NSMenuItem"; title = "Only if at least one slider is present"; ObjectID = "xLa-PN-rsq"; */ "xLa-PN-rsq.title" = "Sólo si hay presente al menos un slider"; /* Class = "NSMenuItem"; title = "Both standard and custom shortcuts"; ObjectID = "xQJ-aJ-VhH"; */ "xQJ-aJ-VhH.title" = "Ambos, atajos estándar y personalizados"; -/* Class = "NSTextFieldCell"; title = "Update settings from the display. May not work with some hardware."; ObjectID = "xjq-hs-wWB"; */ -"xjq-hs-wWB.title" = "Actualizar configuración desde la pantalla. Puede no funcionar con algunos hardware."; +/* Class = "NSTextFieldCell"; title = "Works best with various syncing and 'control all' keyboard settings enabled."; ObjectID = "XU4-Bn-bwH"; */ +"XU4-Bn-bwH.title" = "Funciona mejor cuando están habilitadas varias sincronizaciones y la configuración del teclado para 'controlar todo'."; /* Class = "NSTextFieldCell"; title = "Available"; ObjectID = "yBJ-5d-I7e"; */ "yBJ-5d-I7e.title" = "Disponible"; +/* Class = "NSTextFieldCell"; title = "Full OSD scale will be available for hardware brightness control and after reaching 0 brightness, further software dimming will be used."; ObjectID = "YHZ-VL-QJ3"; */ +"YHZ-VL-QJ3.title" = "La escala completa del OSD estará disponible para el control del brillo por hardware y después de alcanzar el brillo 0, será usada la atenuación por software."; + /* Class = "NSTextFieldCell"; title = "Warning! With this option enabled, you might find yourself in a position when you end up with a blank display. This, combined with disabled keyboard controls can be frustrating."; ObjectID = "yi3-e1-wsL"; */ "yi3-e1-wsL.title" = "¡Atención! Con esta opción habilitada, puedes acabar con la pantalla en blanco. Esto, combinado con los controles por teclado deshabilitados puede ser frustrante."; +/* Class = "NSTextFieldCell"; title = "Identifier:"; ObjectID = "YqZ-LS-YvR"; */ +"YqZ-LS-YvR.title" = "Identificador:"; + +/* Class = "NSMenuItem"; title = "Depends on mouse pointer position"; ObjectID = "Ytd-mg-N5E"; */ +"Ytd-mg-N5E.title" = "Depender de la posición del cursor del ratón"; + +/* Class = "NSButtonCell"; title = "Use hardware DDC control"; ObjectID = "ZdU-gV-V05"; */ +"ZdU-gV-V05.title" = "Usar control DDC por hardware"; + /* Class = "NSMenuItem"; title = "Disable keyboard"; ObjectID = "zHa-xo-XPW"; */ "zHa-xo-XPW.title" = "Deshabilitar teclado"; +/* Class = "NSButtonCell"; title = "Donate"; ObjectID = "ZKk-ve-rS4"; */ +"ZKk-ve-rS4.title" = "Donar"; + +/* Class = "NSButtonCell"; title = "Show percentages"; ObjectID = "ZUu-MR-XwA"; */ +"ZUu-MR-XwA.title" = "Mostrar porcentajes"; + /* Class = "NSTextFieldCell"; title = "Combined dimming switchover point:"; ObjectID = "zv8-pZ-OPy"; */ "zv8-pZ-OPy.title" = "Puntos combinados de atenuación:"; diff --git a/MonitorControl/View Controllers/DisplaysPrefsViewController.swift b/MonitorControl/View Controllers/DisplaysPrefsViewController.swift index 6bfcf26e..07425940 100644 --- a/MonitorControl/View Controllers/DisplaysPrefsViewController.swift +++ b/MonitorControl/View Controllers/DisplaysPrefsViewController.swift @@ -68,7 +68,7 @@ class DisplaysPrefsViewController: NSViewController, PreferencePane, NSTableView } func numberOfRows(in _: NSTableView) -> Int { - return self.displays.count + self.displays.count } public static func isImac() -> Bool { diff --git a/MonitorControlHelper/Info.plist b/MonitorControlHelper/Info.plist index 955c2f9d..7298759a 100644 --- a/MonitorControlHelper/Info.plist +++ b/MonitorControlHelper/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 6941 + 6956 LSApplicationCategoryType public.app-category.utilities LSBackgroundOnly From ec83769e21829f184cd45043d12e267d27e357f8 Mon Sep 17 00:00:00 2001 From: Istvan T <37590873+waydabber@users.noreply.github.com> Date: Mon, 15 Nov 2021 07:25:03 +0100 Subject: [PATCH 013/101] Fixed Samsung 28E850 being treated as a dummy. (#788) --- MonitorControl/Info.plist | 2 +- MonitorControl/Support/Arm64DDC.swift | 21 ++++++++++++--------- MonitorControl/Support/DisplayManager.swift | 8 ++++++-- MonitorControlHelper/Info.plist | 2 +- README.md | 4 ---- 5 files changed, 20 insertions(+), 17 deletions(-) diff --git a/MonitorControl/Info.plist b/MonitorControl/Info.plist index 3537c98e..85621d8b 100644 --- a/MonitorControl/Info.plist +++ b/MonitorControl/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 6956 + 6957 LSApplicationCategoryType public.app-category.utilities LSMinimumSystemVersion diff --git a/MonitorControl/Support/Arm64DDC.swift b/MonitorControl/Support/Arm64DDC.swift index c08ae7f9..2ac3855b 100644 --- a/MonitorControl/Support/Arm64DDC.swift +++ b/MonitorControl/Support/Arm64DDC.swift @@ -9,6 +9,7 @@ class Arm64DDC: NSObject { var service: IOAVService? var serviceLocation: Int = 0 var isDiscouraged: Bool = false + var isDummy: Bool = false } #if arch(arm64) @@ -26,7 +27,8 @@ class Arm64DDC: NSObject { for ioregServiceForMatching in ioregServicesForMatching { let score = self.ioregMatchScore(displayID: displayID, ioregEdidUUID: ioregServiceForMatching.edidUUID, ioregProductName: ioregServiceForMatching.productName, ioregSerialNumber: ioregServiceForMatching.serialNumber, serviceLocation: ioregServiceForMatching.serviceLocation) let isDiscouraged = self.checkIfDiscouraged(ioregService: ioregServiceForMatching) - let displayService = DisplayService(displayID: displayID, service: ioregServiceForMatching.service, serviceLocation: ioregServiceForMatching.serviceLocation, isDiscouraged: isDiscouraged) + let isDummy = self.checkIfDummy(ioregService: ioregServiceForMatching) + let displayService = DisplayService(displayID: displayID, service: ioregServiceForMatching.service, serviceLocation: ioregServiceForMatching.serviceLocation, isDiscouraged: isDiscouraged, isDummy: isDummy) if scoredCandidateDisplayServices[score] == nil { scoredCandidateDisplayServices[score] = [] } @@ -260,6 +262,15 @@ class Arm64DDC: NSObject { return ioregServicesForMatching } + // Check if display is a dummy + private static func checkIfDummy(ioregService: IOregService) -> Bool { + // This is a well known dummy plug + if ioregService.manufacturerID == "AOC", ioregService.productName == "28E850" { + return true + } + return false + } + // Check if it is problematic to enable DDC on the display private static func checkIfDiscouraged(ioregService: IOregService) -> Bool { var modelIdentifier: String = "" @@ -267,14 +278,6 @@ class Arm64DDC: NSObject { if let modelData = IORegistryEntryCreateCFProperty(platformExpertDevice, "model" as CFString, kCFAllocatorDefault, 0).takeRetainedValue() as? Data, let modelIdentifierCString = String(data: modelData, encoding: .utf8)?.cString(using: .utf8) { modelIdentifier = String(cString: modelIdentifierCString) } - // This is a well known dummy plug (not a real display) but it breaks DDC communication on M1 - if ioregService.manufacturerID == "AOC", ioregService.productName == "28E850" { - return true - } - // If the display contains the string "Dummy", then it is highly suspicious - if ioregService.productName.contains("Dummy") || ioregService.productName.contains("dummy") { - return true - } // First service location of Mac Mini HDMI is broken for DDC communication if ioregService.transportDownstream == "HDMI", ioregService.serviceLocation == 1, modelIdentifier == "Macmini9,1" { return true diff --git a/MonitorControl/Support/DisplayManager.swift b/MonitorControl/Support/DisplayManager.swift index 062e2485..f6e07a3f 100644 --- a/MonitorControl/Support/DisplayManager.swift +++ b/MonitorControl/Support/DisplayManager.swift @@ -313,7 +313,11 @@ class DisplayManager { os_log("Display service match successful for display %{public}@", type: .info, String(serviceMatch.displayID)) if serviceMatch.isDiscouraged { os_log("Display %{public}@ is flagged as discouraged by Arm64DDC.", type: .info, String(serviceMatch.displayID)) - otherDisplay.isDiscouraged = serviceMatch.isDiscouraged + otherDisplay.isDiscouraged = true + } else if serviceMatch.isDummy { + os_log("Display %{public}@ is flagged as dummy by Arm64DDC.", type: .info, String(serviceMatch.displayID)) + otherDisplay.isDiscouraged = true + otherDisplay.isDummy = true } else { otherDisplay.arm64ddc = DEBUG_SW ? false : true // MARK: (point of interest when testing) } @@ -396,7 +400,7 @@ class DisplayManager { static func isDummy(displayID: CGDirectDisplayID) -> Bool { let rawName = DisplayManager.getDisplayRawNameByID(displayID: displayID) var isDummy: Bool = false - if rawName == "28E850" || rawName.lowercased().contains("dummy") { + if rawName.lowercased().contains("dummy") { os_log("NOTE: Display is a dummy!", type: .info) isDummy = true } diff --git a/MonitorControlHelper/Info.plist b/MonitorControlHelper/Info.plist index 7298759a..0d25c8c9 100644 --- a/MonitorControlHelper/Info.plist +++ b/MonitorControlHelper/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 6956 + 6957 LSApplicationCategoryType public.app-category.utilities LSBackgroundOnly diff --git a/README.md b/README.md index f7d3e01c..a92b5cd4 100644 --- a/README.md +++ b/README.md @@ -99,11 +99,7 @@ _* With some limitations - full functionality available on macOS 11 Big Sur or n - LCD and LED Televisions usually do not implement DDC, these are supported using software alternatives to dim the image (some higher-end sets are able to translate this into hardware backlight dimming). - OLED or mini/micro-LED displays and televisions are fully supported using gamma table manipulation (this is a no-compromise solution for this class of displays). - DisplayLink, Airplay and Sidecar are supported using shade (dark overlay) control. - -Dummy compatibility: - - The app is compatible with [BetterDummy](https://github.com/waydabber/BetterDummy) mirrored sets. -- The app is compatible with mirrored sets that include a dummy dongle identifying as `28E850` Notable exceptions for hardware control compatibility: From a2203ab2b11ceb5c5cc31ffdaaa13349d4f2c66e Mon Sep 17 00:00:00 2001 From: Istvan Toth <37590873+waydabber@users.noreply.github.com> Date: Tue, 16 Nov 2021 11:56:49 +0100 Subject: [PATCH 014/101] Removed OSD lock popup completely (#791) --- MonitorControl/Support/MediaKeyTapManager.swift | 10 ---------- MonitorControl/Support/OSDUtils.swift | 13 ------------- 2 files changed, 23 deletions(-) diff --git a/MonitorControl/Support/MediaKeyTapManager.swift b/MonitorControl/Support/MediaKeyTapManager.swift index 906156b8..adab913c 100644 --- a/MonitorControl/Support/MediaKeyTapManager.swift +++ b/MonitorControl/Support/MediaKeyTapManager.swift @@ -21,7 +21,6 @@ class MediaKeyTapManager: MediaKeyTapDelegate { return } guard app.sleepID == 0, app.reconfigureID == 0 else { - self.showOSDLock(mediaKey) return } if isPressed, self.handleOpenPrefPane(mediaKey: mediaKey, event: event, modifiers: modifiers) { @@ -68,15 +67,6 @@ class MediaKeyTapManager: MediaKeyTapDelegate { } } - private func showOSDLock(_ mediaKey: MediaKey) { - if [.brightnessUp, .brightnessDown].contains(mediaKey) { - OSDUtils.showOSDLockOnAllDisplays(osdImage: OSDUtils.OSDImage.brightness.rawValue) - } - if [.volumeUp, .volumeDown, .mute].contains(mediaKey) { - OSDUtils.showOSDLockOnAllDisplays(osdImage: OSDUtils.OSDImage.audioSpeaker.rawValue) - } - } - private func sendDisplayCommand(mediaKey: MediaKey, isRepeat: Bool, isSmallIncrement: Bool, isPressed: Bool, isContrast: Bool = false) { self.sendDisplayCommandVolumeMute(mediaKey: mediaKey, isRepeat: isRepeat, isSmallIncrement: isSmallIncrement, isPressed: isPressed) self.sendDisplayCommandBrightnessContrast(mediaKey: mediaKey, isRepeat: isRepeat, isSmallIncrement: isSmallIncrement, isPressed: isPressed, isContrast: isContrast) diff --git a/MonitorControl/Support/OSDUtils.swift b/MonitorControl/Support/OSDUtils.swift index b3b72072..a2502732 100644 --- a/MonitorControl/Support/OSDUtils.swift +++ b/MonitorControl/Support/OSDUtils.swift @@ -74,17 +74,4 @@ class OSDUtils: NSObject { static func getDistance(fromNearestChiclet chiclet: Float) -> Float { abs(chiclet.rounded(.towardZero) - chiclet) } - - static func showOSDLockOnAllDisplays(osdImage: Int64) { - var displayCount: UInt32 = 0 - var onlineDisplays = [CGDirectDisplayID](repeating: 0, count: Int(16)) - if CGGetOnlineDisplayList(16, &onlineDisplays, &displayCount) == CGError.success { - let displayIDs = onlineDisplays.prefix(Int(displayCount)) - for id in displayIDs { - if let manager = OSDManager.sharedManager() as? OSDManager { - manager.showImage(osdImage, onDisplayID: id, priority: 0x1F4, msecUntilFade: 1000, filledChiclets: 0, totalChiclets: 100, locked: true) - } - } - } - } } From 226f06845826b6c03427d60a62256eb5076d422a Mon Sep 17 00:00:00 2001 From: Istvan Toth <37590873+waydabber@users.noreply.github.com> Date: Tue, 16 Nov 2021 22:18:19 +0100 Subject: [PATCH 015/101] Virtual displays now use serial number as preferences ID appendix. (#793) --- MonitorControl/Info.plist | 2 +- MonitorControl/Model/AppleDisplay.swift | 4 ++-- MonitorControl/Model/Display.swift | 24 +++++++++++---------- MonitorControl/Model/OtherDisplay.swift | 4 ++-- MonitorControl/Support/DisplayManager.swift | 5 +++-- MonitorControlHelper/Info.plist | 2 +- 6 files changed, 22 insertions(+), 19 deletions(-) diff --git a/MonitorControl/Info.plist b/MonitorControl/Info.plist index 85621d8b..90310173 100644 --- a/MonitorControl/Info.plist +++ b/MonitorControl/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 6957 + 6965 LSApplicationCategoryType public.app-category.utilities LSMinimumSystemVersion diff --git a/MonitorControl/Model/AppleDisplay.swift b/MonitorControl/Model/AppleDisplay.swift index 68dd948e..85bc92fb 100644 --- a/MonitorControl/Model/AppleDisplay.swift +++ b/MonitorControl/Model/AppleDisplay.swift @@ -6,9 +6,9 @@ import os.log class AppleDisplay: Display { private var displayQueue: DispatchQueue - override init(_ identifier: CGDirectDisplayID, name: String, vendorNumber: UInt32?, modelNumber: UInt32?, isVirtual: Bool = false, isDummy: Bool = false) { + override init(_ identifier: CGDirectDisplayID, name: String, vendorNumber: UInt32?, modelNumber: UInt32?, serialNumber: UInt32?, isVirtual: Bool = false, isDummy: Bool = false) { self.displayQueue = DispatchQueue(label: String("displayQueue-\(identifier)")) - super.init(identifier, name: name, vendorNumber: vendorNumber, modelNumber: modelNumber, isVirtual: isVirtual, isDummy: isDummy) + super.init(identifier, name: name, vendorNumber: vendorNumber, modelNumber: modelNumber, serialNumber: serialNumber, isVirtual: isVirtual, isDummy: isDummy) } public func getAppleBrightness() -> Float { diff --git a/MonitorControl/Model/Display.swift b/MonitorControl/Model/Display.swift index 7cdae8c6..b661249b 100644 --- a/MonitorControl/Model/Display.swift +++ b/MonitorControl/Model/Display.swift @@ -5,14 +5,15 @@ import Foundation import os.log class Display: Equatable { - internal let identifier: CGDirectDisplayID - internal let prefsId: String - internal var name: String - internal var vendorNumber: UInt32? - internal var modelNumber: UInt32? - internal var smoothBrightnessTransient: Float = 1 - internal var smoothBrightnessRunning: Bool = false - internal var smoothBrightnessSlow: Bool = false + let identifier: CGDirectDisplayID + let prefsId: String + var name: String + var vendorNumber: UInt32? + var modelNumber: UInt32? + var serialNumber: UInt32? + var smoothBrightnessTransient: Float = 1 + var smoothBrightnessRunning: Bool = false + var smoothBrightnessSlow: Bool = false let swBrightnessSemaphore = DispatchSemaphore(value: 1) static func == (lhs: Display, rhs: Display) -> Bool { @@ -62,15 +63,16 @@ class Display: Equatable { (key ?? PrefKey.value).rawValue + (command != nil ? String((command ?? Command.none).rawValue) : "") + self.prefsId } - internal init(_ identifier: CGDirectDisplayID, name: String, vendorNumber: UInt32?, modelNumber: UInt32?, isVirtual: Bool = false, isDummy: Bool = false) { + init(_ identifier: CGDirectDisplayID, name: String, vendorNumber: UInt32?, modelNumber: UInt32?, serialNumber: UInt32?, isVirtual: Bool = false, isDummy: Bool = false) { self.identifier = identifier self.name = name self.vendorNumber = vendorNumber self.modelNumber = modelNumber - self.prefsId = "(" + String(name.filter { !$0.isWhitespace }) + String(vendorNumber ?? 0) + String(modelNumber ?? 0) + "@" + String(identifier) + ")" - os_log("Display init with prefsIdentifier %{public}@", type: .info, self.prefsId) + self.serialNumber = serialNumber self.isVirtual = DEBUG_VIRTUAL ? true : isVirtual self.isDummy = isDummy + self.prefsId = "(\(name.filter { !$0.isWhitespace })\(vendorNumber ?? 0)\(modelNumber ?? 0)@\(self.isVirtual ? (self.serialNumber ?? 9999) : identifier))" + os_log("Display init with prefsIdentifier %{public}@", type: .info, self.prefsId) self.swUpdateDefaultGammaTable() self.smoothBrightnessTransient = self.getBrightness() if self.isVirtual || self.readPrefAsBool(key: PrefKey.avoidGamma), !self.isDummy { diff --git a/MonitorControl/Model/OtherDisplay.swift b/MonitorControl/Model/OtherDisplay.swift index e91a918e..dee05ddb 100644 --- a/MonitorControl/Model/OtherDisplay.swift +++ b/MonitorControl/Model/OtherDisplay.swift @@ -26,8 +26,8 @@ class OtherDisplay: Display { set { prefs.set(newValue, forKey: PrefKey.pollingCount.rawValue + self.prefsId) } } - override init(_ identifier: CGDirectDisplayID, name: String, vendorNumber: UInt32?, modelNumber: UInt32?, isVirtual: Bool = false, isDummy: Bool = false) { - super.init(identifier, name: name, vendorNumber: vendorNumber, modelNumber: modelNumber, isVirtual: isVirtual, isDummy: isDummy) + override init(_ identifier: CGDirectDisplayID, name: String, vendorNumber: UInt32?, modelNumber: UInt32?, serialNumber: UInt32?, isVirtual: Bool = false, isDummy: Bool = false) { + super.init(identifier, name: name, vendorNumber: vendorNumber, modelNumber: modelNumber, serialNumber: serialNumber, isVirtual: isVirtual, isDummy: isDummy) if !isVirtual, !Arm64DDC.isArm64 { self.ddc = IntelDDC(for: identifier) } diff --git a/MonitorControl/Support/DisplayManager.swift b/MonitorControl/Support/DisplayManager.swift index f6e07a3f..36064c51 100644 --- a/MonitorControl/Support/DisplayManager.swift +++ b/MonitorControl/Support/DisplayManager.swift @@ -172,14 +172,15 @@ class DisplayManager { let id = onlineDisplayID let vendorNumber = CGDisplayVendorNumber(onlineDisplayID) let modelNumber = CGDisplayModelNumber(onlineDisplayID) + let serialNumber = CGDisplaySerialNumber(onlineDisplayID) let isDummy: Bool = DisplayManager.isDummy(displayID: onlineDisplayID) let isVirtual: Bool = DisplayManager.isVirtual(displayID: onlineDisplayID) if !DEBUG_SW, DisplayManager.isAppleDisplay(displayID: onlineDisplayID) { // MARK: (point of interest for testing) - let appleDisplay = AppleDisplay(id, name: name, vendorNumber: vendorNumber, modelNumber: modelNumber, isVirtual: isVirtual, isDummy: isDummy) + let appleDisplay = AppleDisplay(id, name: name, vendorNumber: vendorNumber, modelNumber: modelNumber, serialNumber: serialNumber, isVirtual: isVirtual, isDummy: isDummy) os_log("Apple display found - %{public}@", type: .info, "ID: \(appleDisplay.identifier), Name: \(appleDisplay.name) (Vendor: \(appleDisplay.vendorNumber ?? 0), Model: \(appleDisplay.modelNumber ?? 0))") self.addDisplay(display: appleDisplay) } else { - let otherDisplay = OtherDisplay(id, name: name, vendorNumber: vendorNumber, modelNumber: modelNumber, isVirtual: isVirtual, isDummy: isDummy) + let otherDisplay = OtherDisplay(id, name: name, vendorNumber: vendorNumber, modelNumber: modelNumber, serialNumber: serialNumber, isVirtual: isVirtual, isDummy: isDummy) os_log("Other display found - %{public}@", type: .info, "ID: \(otherDisplay.identifier), Name: \(otherDisplay.name) (Vendor: \(otherDisplay.vendorNumber ?? 0), Model: \(otherDisplay.modelNumber ?? 0))") self.addDisplay(display: otherDisplay) } diff --git a/MonitorControlHelper/Info.plist b/MonitorControlHelper/Info.plist index 0d25c8c9..f9d7f9ce 100644 --- a/MonitorControlHelper/Info.plist +++ b/MonitorControlHelper/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 6957 + 6965 LSApplicationCategoryType public.app-category.utilities LSBackgroundOnly From 6fdbdc024782b4e62d30a9f113d29ff572be3bdc Mon Sep 17 00:00:00 2001 From: Istvan Toth <37590873+waydabber@users.noreply.github.com> Date: Sat, 20 Nov 2021 21:23:21 +0100 Subject: [PATCH 016/101] Update main.yml (#805) --- .github/workflows/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index fa7ffd17..2119acb6 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -2,9 +2,9 @@ name: CI on: push: - branches: [master] + branches: [main] pull_request: - branches: [master] + branches: [main] jobs: build: From 9792facd565f2be3f0f5b9c9cb9c222ff0163682 Mon Sep 17 00:00:00 2001 From: Istvan Toth <37590873+waydabber@users.noreply.github.com> Date: Sun, 21 Nov 2021 10:24:18 +0100 Subject: [PATCH 017/101] Fix SimplyCoreAudio incompatibility (#807) --- MonitorControl.xcodeproj/project.pbxproj | 4 ++-- MonitorControl/Info.plist | 2 +- MonitorControl/Support/AppDelegate.swift | 2 +- MonitorControl/Support/MediaKeyTapManager.swift | 2 +- MonitorControlHelper/Info.plist | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/MonitorControl.xcodeproj/project.pbxproj b/MonitorControl.xcodeproj/project.pbxproj index 15ba7ca2..6f658a26 100644 --- a/MonitorControl.xcodeproj/project.pbxproj +++ b/MonitorControl.xcodeproj/project.pbxproj @@ -939,8 +939,8 @@ isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/rnine/SimplyCoreAudio"; requirement = { - kind = upToNextMajorVersion; - minimumVersion = 4.0.1; + kind = revision; + revision = 75970285e2470f12a569cdff68ef5a75498a4646; }; }; 6CD35F5426500008001F1344 /* XCRemoteSwiftPackageReference "MediaKeyTap" */ = { diff --git a/MonitorControl/Info.plist b/MonitorControl/Info.plist index 90310173..d587e597 100644 --- a/MonitorControl/Info.plist +++ b/MonitorControl/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 6965 + 6968 LSApplicationCategoryType public.app-category.utilities LSMinimumSystemVersion diff --git a/MonitorControl/Support/AppDelegate.swift b/MonitorControl/Support/AppDelegate.swift index 8a5eee29..d6270c24 100644 --- a/MonitorControl/Support/AppDelegate.swift +++ b/MonitorControl/Support/AppDelegate.swift @@ -284,7 +284,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { @objc func audioDeviceChanged() { if let defaultDevice = self.coreAudio.defaultOutputDevice { os_log("Default output device changed to “%{public}@”.", type: .info, defaultDevice.name) - os_log("Can device set its own volume? %{public}@", type: .info, defaultDevice.canSetVirtualMasterVolume(scope: .output).description) + os_log("Can device set its own volume? %{public}@", type: .info, defaultDevice.canSetVirtualMainVolume(scope: .output).description) } self.updateMediaKeyTap() } diff --git a/MonitorControl/Support/MediaKeyTapManager.swift b/MonitorControl/Support/MediaKeyTapManager.swift index adab913c..893eb8b7 100644 --- a/MonitorControl/Support/MediaKeyTapManager.swift +++ b/MonitorControl/Support/MediaKeyTapManager.swift @@ -173,7 +173,7 @@ class MediaKeyTapManager: MediaKeyTapDelegate { if DisplayManager.shared.updateAudioControlTargetDisplays(deviceName: defaultAudioDevice.name) == 0 { keys.removeAll { keysToDelete.contains($0) } } - } else if defaultAudioDevice.canSetVirtualMasterVolume(scope: .output) == true { + } else if defaultAudioDevice.canSetVirtualMainVolume(scope: .output) == true { keys.removeAll { keysToDelete.contains($0) } } } diff --git a/MonitorControlHelper/Info.plist b/MonitorControlHelper/Info.plist index f9d7f9ce..680182a8 100644 --- a/MonitorControlHelper/Info.plist +++ b/MonitorControlHelper/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 6965 + 6968 LSApplicationCategoryType public.app-category.utilities LSBackgroundOnly From bc0b92e3a29e95d1ff29da498b7dc81eb35f60d7 Mon Sep 17 00:00:00 2001 From: Istvan Toth <37590873+waydabber@users.noreply.github.com> Date: Thu, 9 Dec 2021 16:08:21 +0100 Subject: [PATCH 018/101] Added Portugese (Brazil) translation - thanks to @gpnunes75 (#840) --- MonitorControl.xcodeproj/project.pbxproj | 7 + MonitorControl/Info.plist | 2 +- .../pt-BR.lproj/InternetAccessPolicy.strings | 8 + .../UI/pt-BR.lproj/Localizable.strings | 152 +++++++ MonitorControl/UI/pt-BR.lproj/Main.strings | 377 ++++++++++++++++++ MonitorControlHelper/Info.plist | 2 +- 6 files changed, 546 insertions(+), 2 deletions(-) create mode 100644 MonitorControl/UI/pt-BR.lproj/InternetAccessPolicy.strings create mode 100644 MonitorControl/UI/pt-BR.lproj/Localizable.strings create mode 100644 MonitorControl/UI/pt-BR.lproj/Main.strings diff --git a/MonitorControl.xcodeproj/project.pbxproj b/MonitorControl.xcodeproj/project.pbxproj index 6f658a26..8639f173 100644 --- a/MonitorControl.xcodeproj/project.pbxproj +++ b/MonitorControl.xcodeproj/project.pbxproj @@ -115,6 +115,9 @@ AA78BDBC2709FE7B00CA8DF7 /* UpdaterDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdaterDelegate.swift; sourceTree = ""; }; AA99521626FE25AB00612E07 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; AA99521826FE49A300612E07 /* MenuHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuHandler.swift; sourceTree = ""; }; + AA99E81527622EBE00413316 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Main.strings"; sourceTree = ""; }; + AA99E81627622EBE00413316 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/InternetAccessPolicy.strings"; sourceTree = ""; }; + AA99E81727622EBE00413316 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Localizable.strings"; sourceTree = ""; }; AA9AE86E26B5BF3D00B6CA65 /* OSD.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OSD.framework; path = ../../../../../System/Library/PrivateFrameworks/OSD.framework; sourceTree = ""; }; AA9AE87026B5BFB700B6CA65 /* CoreDisplay.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreDisplay.framework; path = ../../../../../System/Library/Frameworks/CoreDisplay.framework; sourceTree = ""; }; AA9CB6252704BB440086DC0E /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Main.strings; sourceTree = ""; }; @@ -417,6 +420,7 @@ "zh-Hans", "zh-Hant-TW", es, + "pt-BR", ); mainGroup = 56754EA21D9A4016007BCDC5; packageReferences = ( @@ -616,6 +620,7 @@ AA9CB63F2704C1A40086DC0E /* zh-Hans */, AA9CB6412704C1B80086DC0E /* zh-Hant-TW */, 17DE48C4273E9DC500A1779F /* es */, + AA99E81527622EBE00413316 /* pt-BR */, ); name = Main.storyboard; sourceTree = ""; @@ -634,6 +639,7 @@ 8C1741932707B92A00E88D53 /* ko */, 8C1741972707B92E00E88D53 /* tr */, 17DE48C5273E9DC500A1779F /* es */, + AA99E81627622EBE00413316 /* pt-BR */, ); name = InternetAccessPolicy.strings; sourceTree = ""; @@ -652,6 +658,7 @@ AA9CB6402704C1A40086DC0E /* zh-Hans */, AA9CB6422704C1B80086DC0E /* zh-Hant-TW */, 17DE48C6273E9DC500A1779F /* es */, + AA99E81727622EBE00413316 /* pt-BR */, ); name = Localizable.strings; sourceTree = ""; diff --git a/MonitorControl/Info.plist b/MonitorControl/Info.plist index d587e597..d672b315 100644 --- a/MonitorControl/Info.plist +++ b/MonitorControl/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 6968 + 6970 LSApplicationCategoryType public.app-category.utilities LSMinimumSystemVersion diff --git a/MonitorControl/UI/pt-BR.lproj/InternetAccessPolicy.strings b/MonitorControl/UI/pt-BR.lproj/InternetAccessPolicy.strings new file mode 100644 index 00000000..c68f7993 --- /dev/null +++ b/MonitorControl/UI/pt-BR.lproj/InternetAccessPolicy.strings @@ -0,0 +1,8 @@ +/* General application description */ +"ApplicationDescription" = "MonitorControl permite controlar o brilho e o volume de monitores externos"; + +/* Sofware update deny consequences */ +"SoftwareUpdateDenyConsequences" = "Se negar as conexões, você não será alertado sobre novas versões e atualizações de segurança. Atualizações de segurança são importantes."; + +/* Software update purpose */ +"SoftwareUpdatePurpose" = "MonitorControl verifica novas versões e atualizações de segurança."; diff --git a/MonitorControl/UI/pt-BR.lproj/Localizable.strings b/MonitorControl/UI/pt-BR.lproj/Localizable.strings new file mode 100644 index 00000000..a8b396c7 --- /dev/null +++ b/MonitorControl/UI/pt-BR.lproj/Localizable.strings @@ -0,0 +1,152 @@ +/* Shown in the main prefs window */ +"About" = "Sobre"; + +/* Shown in the alert dialog */ +"An other app seems to change the brightness or colors which causes issues.\n\nTo solve this, you need to quit the other app or disable gamma control for your displays in MonitorControl!" = "Parece que outro App está alterando o brilho ou as cores.\n\nPara resolver você precisa fechar o outro app ou desabilitar o controle de gamma no MonitorControl"; + +/* Shown in the main prefs window */ +"App menu" = "App menu"; + +/* Shown in the alert dialog */ +"Are you sure you want to enable a longer delay? Doing so may freeze your system and require a restart. Start at login will be disabled as a safety measure." = "Tem certeza que deseja ligar o delay longo? Isso pode congelar seu sistema e precisar reiniciar. Iniciar no login vai ser desligado para segurança."; + +/* Shown in the alert dialog */ +"Are you sure you want to reset all preferences?" = "Tem certeza que desejar reiniciar todas as preferências?"; + +/* Shown in menu */ +"Brightness" = "Brilho"; + +/* Build */ +"Build" = "Build"; + +/* Shown in the Display Preferences */ +"Built-in Display" = "Monitor interno"; + +/* Shown in menu */ +"Check for updates…" = "Verificar atualizações…"; + +/* Shown in menu */ +"Contrast" = "Contraste"; + +/* Version */ +"Copyright Ⓒ MonitorControl, " = "Direitos Reservados Ⓒ MonitorControl, "; + +/* Shown in record shortcut box */ +"Decrease" = "Diminuir"; + +/* Shown in the alert dialog */ +"Disable gamma control for my displays" = "Desligar controle de gamma para os meus monitores"; + +/* Shown in the main prefs window */ +"Displays" = "Monitores"; + +/* Shown in the alert dialog */ +"Enable Longer Delay?" = "Ligar delay longo?"; + +/* Shown in the Display Preferences */ +"External Display" = "Monitor Externo"; + +/* Shown in the main prefs window */ +"General" = "Geral"; + +/* Shown in the Display Preferences */ +"Hardware (Apple)" = "Hardware (Apple)"; + +/* Shown in the Display Preferences */ +"Hardware (DDC)" = "Hardware (DDC)"; + +/* Shown in the alert dialog */ +"I'll quit the other app" = "Eu vou desligar o outro app"; + +/* Shown in the alert dialog */ +"Incompatible previous version" = "Verão anterior incompatível"; + +/* Shown in record shortcut box */ +"Increase" = "Aumentar"; + +/* Shown in the alert dialog */ +"Is f.lux or similar running?" = "f.lux ou similar está executando?"; + +/* Shown in the main prefs window */ +"Keyboard" = "Teclado"; + +/* Shown in record shortcut box */ +"Mute" = "Mudo"; + +/* Shown in the alert dialog */ +"No" = "Não"; + +/* Shown in the Display Preferences */ +"No Control" = "Sem Controle"; + +/* Shown in the Display Preferences */ +"Other Display" = "Outro Monitor"; + +/* Shown in the alert dialog */ +"Preferences for an incompatible previous app version detected. Default preferences are reloaded." = "Detectado incompatibilidade. Preferências padrão foram carregadas."; + +/* Shown in menu */ +"Preferences…" = "Preferências…"; + +/* Shown in menu */ +"Quit" = "Sair"; + +/* Shown in the alert dialog */ +"Reset Preferences?" = "Reiniciar Preferências?"; + +/* Shown in the alert dialog */ +"Safe Mode Activated" = "Modo Seguro Ativado"; + +/* Shown in the alert dialog */ +"Shift was pressed during launch. MonitorControl started in safe mode. Default preferences are reloaded, DDC read is blocked." = "Shift foi pressionado durante o início. MonitorControl iniciou em modo seguro. Preferências padrão foram carregadas, Leitura do DDC read está bloqueada."; + +/* Shown in the alert dialog */ +"Shortcuts not available" = "Atalhos não disponíveis"; + +/* Shown in the Display Preferences */ +"Software (gamma)" = "Software (gamma)"; + +/* Shown in the Display Preferences */ +"Software (gamma, forced)" = "Software (gamma, forçado)"; + +/* Shown in the Display Preferences */ +"Software (shade)" = "Software (shade)"; + +/* Shown in the Display Preferences */ +"Software (shade, forced)" = "Software (shade, forçado)"; + +/* Shown in the Display Preferences */ +"This display allows for software brightness control via gamma table manipulation or shade as it does not support hardware control. Reasons for this might be using the HDMI port of a Mac mini (which blocks hardware DDC control) or having a blacklisted display." = "Este monitor permite controle de brilho via manipulação da tabela gamma ou shade. Não suporta controle por hardware. Motivos pode ser o uso da porta HDMI de um Mac mini (bloqueia controle DDC) ou o monitor está na blacklist."; + +/* Shown in the Display Preferences */ +"This display has an unspecified control status." = "Este monitor tem o estado do controle não especificado."; + +/* Shown in the Display Preferences */ +"This display is reported to support hardware DDC control but the current settings allow for software control only." = "Este monitor tem a controle de hardware DDC mas as configurações atuais só permitem controle por software."; + +/* Shown in the Display Preferences */ +"This display is reported to support hardware DDC control. If you encounter issues, you can disable hardware DDC control to force software control." = "Este monitor tem suporte a controle de hardware DCC. Se tiver problemas, você pode desligar o controle de hardware DDC e forçar o controle via software"; + +/* Shown in the Display Preferences */ +"This display supports native Apple brightness protocol. This allows macOS to control this display without MonitorControl as well." = "Este monitor suport o protocolo nativo Apple. Permite o macOS controlar ele sem o MonitorControl."; + +/* Shown in the Display Preferences */ +"This is a virtual display (examples: AirPlay, Sidecar, display connected via a DisplayLink Dock or similar) which does not allow hardware or software gammatable control. Shading is used as a substitute but only in non-mirror scenarios. Mouse cursor will be unaffected and artifacts may appear when entering/leaving full screen mode." = "Este é um monitor virtual(exemplos: AirPlay, Sidecar, monitor conectado via a DisplayLink Dock ou similar) que não permite controle via hardware ou software. Shading é usado como um substituto mas somente em cenários não espelhados. O cursor do Mouse não será afetado e artefatos podem aparecer entrando ou saindo de tela cheia."; + +/* Unknown display name */ +"Unknown" = "Desconhecido"; + +/* Version */ +"Version" = "Versão"; + +/* Shown in the Display Preferences */ +"Virtual Display" = "Monitor Virtual"; + +/* Shown in menu */ +"Volume" = "Volume"; + +/* Shown in the alert dialog */ +"Yes" = "Sim"; + +/* Shown in the alert dialog */ +"You need to enable MonitorControl in System Preferences > Security and Privacy > Accessibility for the keyboard shortcuts to work" = "Você precisa habilitar o MonitorControl nas Preferências do Sistema > Segurança e privacidade > Acessibilidade para que os atalhos de teclado funcionem"; diff --git a/MonitorControl/UI/pt-BR.lproj/Main.strings b/MonitorControl/UI/pt-BR.lproj/Main.strings new file mode 100644 index 00000000..909578fd --- /dev/null +++ b/MonitorControl/UI/pt-BR.lproj/Main.strings @@ -0,0 +1,377 @@ +/* Class = "NSButtonCell"; title = "Sync brightness changes from Built-in and Apple displays"; ObjectID = "0ca-DG-AgB"; */ +"0ca-DG-AgB.title" = "Sincronizar as mudança de brilho entre o monitor interno e o da Apple"; + +/* Class = "NSMenuItem"; title = "Assume last saved settings are valid (recommended)"; ObjectID = "1in-79-6qm"; */ +"1in-79-6qm.title" = "Considerar que as últimas configurações salvas são válidas (recomendado)"; + +/* Class = "NSTextFieldCell"; title = "MonitorControl"; ObjectID = "1PJ-14-Bvn"; */ +"1PJ-14-Bvn.title" = "MonitorControl"; + +/* Class = "NSMenuItem"; title = "Standard keyboard volume and mute keys"; ObjectID = "1sy-Kd-WL5"; */ +"1sy-Kd-WL5.title" = "Teclas de volume e mudo padrão"; + +/* Class = "NSTextFieldCell"; title = "DDC min"; ObjectID = "1zE-fg-xEm"; */ +"1zE-fg-xEm.title" = "DDC min"; + +/* Class = "NSMenuItem"; title = "Show separate controls for each display in menu"; ObjectID = "3eO-bN-ZRl"; */ +"3eO-bN-ZRl.title" = "Mostrar controles separados para cada monitor no menu"; + +/* Class = "NSMenuItem"; title = "Apply last saved values to the display"; ObjectID = "3Jr-bW-YYq"; */ +"3Jr-bW-YYq.title" = "Aplicar últimos valores salvos ao monitor"; + +/* Class = "NSMenuItem"; title = "Custom keyboard shortcuts"; ObjectID = "4CG-0I-anB"; */ +"4CG-0I-anB.title" = "Atalhos de teclado personalizados"; + +/* Class = "NSTextFieldCell"; title = "Using window focus might not work properly with full screen apps."; ObjectID = "4dX-o1-xAc"; */ +"4dX-o1-xAc.title" = "Usar o foco da janela pode não funcionar com aplicativos em tela cheia."; + +/* Class = "NSButtonCell"; title = "Reset Preferences"; ObjectID = "5yT-5F-X5R"; */ +"5yT-5F-X5R.title" = "Redefinir preferências"; + +/* Class = "NSMenuItem"; title = "Always hide"; ObjectID = "6mo-7S-oOO"; */ +"6mo-7S-oOO.title" = "Sempre esconder"; + +/* Class = "NSTextFieldCell"; title = "Slider behavior:"; ObjectID = "75n-7M-1mS"; */ +"75n-7M-1mS.title" = "Comportamento do controle deslizante:"; + +/* Class = "NSButtonCell"; title = "Show slider tick marks"; ObjectID = "7zf-m1-gJO"; */ +"7zf-m1-gJO.title" = "Mostrar marcas de seleção do controle deslizante"; + +/* Class = "NSTextFieldCell"; title = "Slider knob will snap to 0%, 25%, 50%, 75% and 100% when in proximity making setting these values easier. Disable for finer control."; ObjectID = "8Gx-Ya-zhp"; */ +"8Gx-Ya-zhp.title" = "O botão deslizante se ajustará em 0%, 25%, 50%, 75% e 100% quando estiver próximo, tornando mais fácil definir esses valores. Desative para um controle mais preciso."; + +/* Class = "NSButtonCell"; title = "Use fine OSD scale for brightness and contrast"; ObjectID = "8Q8-57-xnT"; */ +"8Q8-57-xnT.title" = "Use escala fina de OSD para brilho e contraste"; + +/* Class = "NSButtonCell"; title = "Special thanks to our contributors!"; ObjectID = "95V-M4-2l5"; */ +"95V-M4-2l5.title" = "Agradecimento especial para nossos colaboradores!"; + +/* Class = "NSMenuItem"; title = "Custom keyboard shortcuts"; ObjectID = "9eC-PD-FHl"; */ +"9eC-PD-FHl.title" = "Atalhos de teclado personalizados"; + +/* Class = "NSMenuItem"; title = "Attempt to read display settings"; ObjectID = "9yL-no-aWa"; */ +"9yL-no-aWa.title" = "Tentar ler as configurações do monitor"; + +/* Class = "NSTextFieldCell"; title = "Show tick marks at 0%, 25%, 50%, 75% and 100% for accuracy."; ObjectID = "A8P-vn-DEJ"; */ +"A8P-vn-DEJ.title" = "Mostrar marcas da escala em 0%, 25%, 50%, 75% e 100% para precisão."; + +/* Class = "NSTextFieldCell"; title = "Use brightness, volume and other settings from last time or use defaults. Values will be applied to the display upon first change by the user."; ObjectID = "an7-Aj-3fZ"; */ +"an7-Aj-3fZ.title" = "Usar brilho, volume e outras configurações anterior ou use padrão. Valores serão aplicados para o primeiro monitor alterado pelo usuário."; + +/* Class = "NSMenuItem"; title = "Use audio device name to determine which display to control"; ObjectID = "AqF-uD-KCY"; */ +"AqF-uD-KCY.title" = "Usar nome do dispositivo de áudio para determinar qual monitor controlar"; + +/* Class = "NSMenuItem"; title = "Show sliders only for the display currently showing the menu"; ObjectID = "bbf-sS-uGv"; */ +"bbf-sS-uGv.title" = "Mostrar os controles deslizantes apenas para o monitor apresentado no menu"; + +/* Class = "NSTextFieldCell"; title = "Brightness:"; ObjectID = "Bhb-6l-uPQ"; */ +"Bhb-6l-uPQ.title" = "Brilho:"; + +/* Class = "NSTextFieldCell"; title = "(Software->DDC)"; ObjectID = "Bid-UL-blc"; */ +"Bid-UL-blc.title" = "(Software->DDC)"; + +/* Class = "NSTextFieldCell"; title = "For hardware (DDC) controlled displays only. Results may vary."; ObjectID = "bIe-6O-xEH"; */ +"bIe-6O-xEH.title" = "Apenas para monitores controlados por hardware (DDC). Resultados podem variar."; + +/* Class = "NSButtonCell"; title = "Disable macOS volume OSD"; ObjectID = "bkM-Px-U3b"; */ +"bkM-Px-U3b.title" = "Desativar o volume OSD do macOS"; + +/* Class = "NSTextFieldCell"; title = "OSD scale:"; ObjectID = "bP4-GJ-vhJ"; */ +"bP4-GJ-vhJ.title" = "Escala OSD:"; + +/* Class = "NSTextFieldCell"; title = "OSD scale:"; ObjectID = "Bqc-s3-C0w"; */ +"Bqc-s3-C0w.title" = "Escala OSD:"; + +/* Class = "NSButtonCell"; title = "Reset settings"; ObjectID = "BYS-7Y-bRz"; */ +"BYS-7Y-bRz.title" = "Redefinir as configurações"; + +/* Class = "NSButtonCell"; title = "Enable Mute DDC command"; ObjectID = "bZq-0d-lJa"; */ +"bZq-0d-lJa.title" = "Habilitar o comando Mudo DDC"; + +/* Class = "NSButtonCell"; title = "Show volume slider in menu"; ObjectID = "c9D-MB-lma"; */ +"c9D-MB-lma.title" = "Mostrar controle deslizante de volume no menu"; + +/* Class = "NSMenuItem"; title = "Custom"; ObjectID = "Cle-DD-vR7"; */ +"Cle-DD-vR7.title" = "Personalizado"; + +/* Class = "NSTextFieldCell"; title = "Upon startup or wake:"; ObjectID = "cNt-Cq-vK4"; */ +"cNt-Cq-vK4.title" = "Na inicialização do computador:"; + +/* Class = "NSTextFieldCell"; title = "⚠️ Warning! Changing some of these settings may cause system freezes or unexpected behavior!"; ObjectID = "Cz1-Mh-llk"; */ +"Cz1-Mh-llk.title" = "⚠️ Aviso! Alterar algumas dessas configurações pode causar travamentos do sistema ou comportamento inesperado!"; + +/* Class = "NSTextFieldCell"; title = "Alternative keys are the F14/F15 (Scroll Lock and Pause on PC keyboards, brightness keys on some Logitech keyboards)."; ObjectID = "D4H-hU-FLn"; */ +"D4H-hU-FLn.title" = "As teclas alternativas são F14 / F15 (Scroll Lock e Pause em teclados de PC, teclas de brilho em alguns teclados Logitech)."; + +/* Class = "NSTextFieldCell"; title = "VCP list"; ObjectID = "D9t-vT-gNJ"; */ +"D9t-vT-gNJ.title" = "Lista VCP"; + +/* Class = "NSTextFieldCell"; title = "You can override audio device name under Displays (advanced) if needed."; ObjectID = "Dha-Tm-cDM"; */ +"Dha-Tm-cDM.title" = "Você pode substituir o nome do dispositivo de áudio em Monitores (avançado), se necessário."; + +/* Class = "NSTextFieldCell"; title = "You can disable smooth transitions for a more direct, immediate control."; ObjectID = "ENt-mP-0yH"; */ +"ENt-mP-0yH.title" = "Você pode desativar as transições suaves para um controle mais direto e imediato."; + +/* Class = "NSMenuItem"; title = "Minimal"; ObjectID = "Eq3-z9-yIo"; */ +"Eq3-z9-yIo.title" = "Mínimo"; + +/* Class = "NSTextFieldCell"; title = "Scale mapping curve"; ObjectID = "Eui-5S-JR6"; */ +"Eui-5S-JR6.title" = "Curva de mapeamento de escala"; + +/* Class = "NSTextFieldCell"; title = "Mute:"; ObjectID = "EvN-FT-vdZ"; */ +"EvN-FT-vdZ.title" = "Mudo:"; + +/* Class = "NSTextFieldCell"; title = "Normally keyboard controls change one OSD chiclet worth of value and Shift+Option allows fine control. This makes fine control default."; ObjectID = "f6J-Ui-uMB"; */ +"f6J-Ui-uMB.title" = "Normalmente, os controles do teclado mudam uma faixa OSD de valor e Shift + Option permite um controle preciso. Isso torna padrão o controle fino."; + +/* Class = "NSButtonCell"; title = "Reset Name"; ObjectID = "f9g-8s-gdd"; */ +"f9g-8s-gdd.title" = "Redefinir o nome"; + +/* Class = "NSButtonCell"; title = "Automatically check for updates"; ObjectID = "Faf-9L-TXx"; */ +"Faf-9L-TXx.title" = "Verificar automaticamente se há atualizações"; + +/* Class = "NSTextFieldCell"; title = "Brightness control:"; ObjectID = "fe9-Ia-t9m"; */ +"fe9-Ia-t9m.title" = "Controle de Brilho:"; + +/* Class = "NSTextFieldCell"; title = "Volume:"; ObjectID = "FER-Ri-4UO"; */ +"FER-Ri-4UO.title" = "Volume:"; + +/* Class = "NSButtonCell"; title = "Allow zero brightness via software or combined dimming"; ObjectID = "FjB-XL-fG5"; */ +"FjB-XL-fG5.title" = "Permitir brilho zero via software"; + +/* Class = "NSTextFieldCell"; title = "Apple and built-in displays already have a brightness slider in Control Center."; ObjectID = "fmZ-HI-Mdc"; */ +"fmZ-HI-Mdc.title" = "A Apple e os monitores integrados já possuem um controle deslizante de brilho no Centro de controle."; + +/* Class = "NSMenuItem"; title = "None"; ObjectID = "FoA-yh-Yx3"; */ +"FoA-yh-Yx3.title" = "Nenhum"; + +/* Class = "NSMenuItem"; title = "Show as icons"; ObjectID = "fR3-kq-cps"; */ +"fR3-kq-cps.title" = "Mostrar como ícones"; + +/* Class = "NSMenuItem"; title = "Show as text"; ObjectID = "fWd-Es-zsy"; */ +"fWd-Es-zsy.title" = "Mostrar como texto"; + +/* Class = "NSTextFieldCell"; title = "Invert"; ObjectID = "G5A-y3-eZz"; */ +"G5A-y3-eZz.title" = "Inverter"; + +/* Class = "NSMenuItem"; title = "Use window focus to determine which display to control"; ObjectID = "gTR-FW-FHc"; */ +"gTR-FW-FHc.title" = "Use o foco da janela para determinar qual monitor controlar"; + +/* Class = "NSTextFieldCell"; title = "Brightness slider for hardware or software controlled displays or TVs."; ObjectID = "gXH-HL-ZOL"; */ +"gXH-HL-ZOL.title" = "Controle deslizante de brilho para monitores ou TVs controlados por hardware ou software."; + +/* Class = "NSTextFieldCell"; title = "Override audio device name:"; ObjectID = "H9X-it-sXs"; */ +"H9X-it-sXs.title" = "Substituir o nome do dispositivo de áudio:"; + +/* Class = "NSTextFieldCell"; title = "Relaunch the app to access Preferences if the menu option is not accessible. Use the button below to quit the app."; ObjectID = "hF7-fM-aKr"; */ +"hF7-fM-aKr.title" = "Reinicie o aplicativo para acessar as Preferências se a opção do menu não estiver acessível. Use o botão abaixo para sair do aplicativo."; + +/* Class = "NSButtonCell"; title = "Get current"; ObjectID = "hkC-vq-IcD"; */ +"hkC-vq-IcD.title" = "Selecione o atual"; + +/* Class = "NSMenuItem"; title = "Hide"; ObjectID = "HUT-Qc-kuu"; */ +"HUT-Qc-kuu.title" = "Esconder"; + +/* Class = "NSTextFieldCell"; title = "Additional controls:"; ObjectID = "i5X-M5-Tf5"; */ +"i5X-M5-Tf5.title" = "Controles adicionais:"; + +/* Class = "NSTextFieldCell"; title = "Brightness:"; ObjectID = "IJB-mO-e8I"; */ +"IJB-mO-e8I.title" = "Brilho:"; + +/* Class = "NSButtonCell"; title = "Enable smooth brightness transitions"; ObjectID = "IK4-u5-qjf"; */ +"IK4-u5-qjf.title" = "Ativar transições suaves de brilho"; + +/* Class = "NSButtonCell"; title = "Use fine OSD scale for volume"; ObjectID = "J3L-MW-iJL"; */ +"J3L-MW-iJL.title" = "Use a escala OSD fina para o volume"; + +/* Class = "NSButtonCell"; title = "Start at Login"; ObjectID = "j72-NF-zsW"; */ +"j72-NF-zsW.title" = "Iniciar ao entrar"; + +/* Class = "NSMenuItem"; title = "Change for all screens"; ObjectID = "jSj-HB-T2t"; */ +"jSj-HB-T2t.title" = "Alterar para todos os monitores"; + +/* Class = "NSButtonCell"; title = "Check for updates"; ObjectID = "jVH-oc-rUi"; */ +"jVH-oc-rUi.title" = "Verificar atualizações"; + +/* Class = "NSTextFieldCell"; title = "Note: you can press Shift during startup for 'Safe mode' to restore defaults and avoid reading or setting anything."; ObjectID = "Jx2-gO-nq9"; */ +"Jx2-gO-nq9.title" = "Nota: você pode pressionar Shift durante a inicialização para 'Modo de segurança' para restaurar os padrões e evitar carregar as configurações."; + +/* Class = "NSButtonCell"; title = "Enable for Apple branded and built-in displays as well"; ObjectID = "K6A-4z-1aQ"; */ +"K6A-4z-1aQ.title" = "Habilite para monitores integrados e da Apple"; + +/* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "Kfj-WK-aSL"; */ +"Kfj-WK-aSL.title" = "Monitor para controlar:"; + +/* Class = "NSMenuItem"; title = "Depends on mouse pointer position"; ObjectID = "km4-hK-auM"; */ +"km4-hK-auM.title" = "Depende da posição do ponteiro do mouse"; + +/* Class = "NSMenuItem"; title = "Use combined slider for all displays"; ObjectID = "lA0-tv-qRs"; */ +"lA0-tv-qRs.title" = "Use o controle deslizante combinado para todos os monitores"; + +/* Class = "NSTextFieldCell"; title = "Brightness and contrast:"; ObjectID = "LO4-4k-gxY"; */ +"LO4-4k-gxY.title" = "Brilho e contraste:"; + +/* Class = "NSTextFieldCell"; title = "Display type:"; ObjectID = "lSJ-6w-KJ2"; */ +"lSJ-6w-KJ2.title" = "Tipo do monitor:"; + +/* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "ltL-gR-K3Z"; */ +"ltL-gR-K3Z.title" = "Monitor para controlar:"; + +/* Class = "NSButtonCell"; title = "Enable slider snapping"; ObjectID = "MlU-hl-d46"; */ +"MlU-hl-d46.title" = "Ativar ajuste de controle deslizante"; + +/* Class = "NSMenuItem"; title = "Always show in the menu bar"; ObjectID = "MM0-Lf-VgF"; */ +"MM0-Lf-VgF.title" = "Sempre mostrar na barra de menu"; + +/* Class = "NSTextFieldCell"; title = "Contrast:"; ObjectID = "MMk-S2-yJN"; */ +"MMk-S2-yJN.title" = "Contraste:"; + +/* Class = "NSTextFieldCell"; title = "Volume:"; ObjectID = "mue-fa-8z6"; */ +"mue-fa-8z6.title" = "Volume:"; + +/* Class = "NSButtonCell"; title = "Show brightness slider in menu"; ObjectID = "MWo-6I-s9L"; */ +"MWo-6I-s9L.title" = "Mostrar o controle deslizante de brilho no menu"; + +/* Class = "NSButtonCell"; title = "Avoid gamma table manipulation"; ObjectID = "na6-mS-MPi"; */ +"na6-mS-MPi.title" = "Evite a manipulação da tabela gama"; + +/* Class = "NSButtonCell"; title = "Separate scales for combined hardware & software dimming"; ObjectID = "O8o-hI-8eR"; */ +"O8o-hI-8eR.title" = "Escalas separadas para escurecimento combinado de hardware e software"; + +/* Class = "NSMenuItem"; title = "Disable keyboard"; ObjectID = "oHf-Gh-68c"; */ +"oHf-Gh-68c.title" = "Desativar teclado"; + +/* Class = "NSTextFieldCell"; title = "Application:"; ObjectID = "okD-DG-pYa"; */ +"okD-DG-pYa.title" = "Aplicação:"; + +/* Class = "NSMenuItem"; title = "Standard keyboard brightness keys"; ObjectID = "Oke-bW-cb1"; */ +"Oke-bW-cb1.title" = "Teclas de brilho padrão do teclado"; + +/* Class = "NSTextFieldCell"; title = "count:"; ObjectID = "Orv-yj-Nad"; */ +"Orv-yj-Nad.title" = "contagem:"; + +/* Class = "NSTextFieldCell"; title = "Use the brightness keys of your Apple keyboard to control brightness. You can hold Control to adjust the built-in display, Control+Command to adjust external displays. Hold Shift+Option for fine control. Control+Option+Command adjusts contrast on DDC compatible displays."; ObjectID = "pa0-Hz-ace"; */ +"pa0-Hz-ace.title" = "Use as teclas de brilho do teclado Apple para controlar o brilho. Você pode segurar Control para ajustar a tela embutida, Control + Command para ajustar as telas externas. Segure Shift + Option para um controle preciso. Control + Option + Command ajusta o contraste em monitores compatíveis com DDC."; + +/* Class = "NSTextFieldCell"; title = "Control method:"; ObjectID = "PaK-1f-DsW"; */ +"PaK-1f-DsW.title" = "Método de controle:"; + +/* Class = "NSButtonCell"; title = "Longer delay during DDC read operations"; ObjectID = "pF5-Sw-7BR"; */ +"pF5-Sw-7BR.title" = "Atraso maior durante as operações de leitura DDC"; + +/* Class = "NSTextFieldCell"; title = "DDC max"; ObjectID = "psF-vX-AFB"; */ +"psF-vX-AFB.title" = "Máximo DCC"; + +/* Class = "NSTextFieldCell"; title = "Use software dimming after the display reached zero hardware brightness for extended range. Works for DDC controlled displays only."; ObjectID = "PyY-p9-3NP"; */ +"PyY-p9-3NP.title" = "Use o escurecimento do software depois que a tela atingir o brilho zero do hardware para uma faixa estendida. Funciona apenas para monitores controlados por DDC." + +/* Class = "NSMenuItem"; title = "Both standard and custom shortcuts"; ObjectID = "QDG-SA-mRX"; */ +"QDG-SA-mRX.title" = "Atalhos padrão e personalizados"; + +/* Class = "NSMenuItem"; title = "Both standard and custom shortcuts"; ObjectID = "QDG-SA-mRX"; */ +"QDG-SA-mRX.title" = "Both standard and custom shortcuts"; + +/* Class = "NSButtonCell"; title = "Quit application"; ObjectID = "qlb-wH-qr4"; */ +"qlb-wH-qr4.title" = "Sair do aplicativo"; + +/* Class = "NSButtonCell"; title = "Show contrast slider in menu"; ObjectID = "qO0-dB-yUs"; */ +"qO0-dB-yUs.title" = "Mostrar controle deslizante de contraste no menu"; + +/* Class = "NSTextFieldCell"; title = "Volume control (DDC only):"; ObjectID = "qoh-Gn-f11"; */ +"qoh-Gn-f11.title" = "Controle de volume (apenas DDC):"; + +/* Class = "NSTextFieldCell"; title = "Show percentage next to slider for more precision."; ObjectID = "qXy-CL-Wf1"; */ +"qXy-CL-Wf1.title" = "Mostre a porcentagem ao lado do controle deslizante para mais precisão."; + +/* Class = "NSButtonCell"; title = "Combine hardware and software dimming"; ObjectID = "r76-Zc-x09"; */ +"r76-Zc-x09.title" = "Combine escurecimento de hardware e software"; + +/* Class = "NSMenuItem"; title = "Normal"; ObjectID = "Riq-uM-bTs"; */ +"Riq-uM-bTs.title" = "Normal"; + +/* Class = "NSTextFieldCell"; title = "General menu items style:"; ObjectID = "thh-DG-ecH"; */ +"thh-DG-ecH.title" = "Estilo de itens do menu geral:"; + +/* Class = "NSTextFieldCell"; title = "@the0neyouseek (Guillaume B.)\n@JoniVR (Joni Van Roost)\n@waydabber (István T.)"; ObjectID = "TKd-J8-Iyk"; */ +"TKd-J8-Iyk.title" = "@the0neyouseek (Guillaume B.)\n@JoniVR (Joni Van Roost)\n@waydabber (István T.)"; + +/* Class = "NSTextFieldCell"; title = "Menu Icon:"; ObjectID = "u6s-Pb-BCG"; */ +"u6s-Pb-BCG.title" = "Ícone do Meny:"; + +/* Class = "NSButtonCell"; title = "Show advanced settings"; ObjectID = "UBq-Od-SIB"; */ +"UBq-Od-SIB.title" = "Mostrar configurações avançadas"; + +/* Class = "NSTextFieldCell"; title = "Works if an audio device is selected with no native volume control."; ObjectID = "uF5-a9-Ngz"; */ +"uF5-a9-Ngz.title" = "Funciona se um dispositivo de áudio for selecionado sem controle de volume nativo."; + +/* Class = "NSButtonCell"; title = "Enable keyboard control for display"; ObjectID = "UqR-WE-jHl"; */ +"UqR-WE-jHl.title" = "Habilitar controle de teclado para exibição"; + +/* Class = "NSTextFieldCell"; title = "Contrast (DDC):"; ObjectID = "urd-Rh-aiL"; */ +"urd-Rh-aiL.title" = "Contraste (DDC):"; + +/* Class = "NSButtonCell"; title = "Do not use alternative brightness keys"; ObjectID = "vd2-Lk-neX"; */ +"vd2-Lk-neX.title" = "Não use teclas de brilho alternativas"; + +/* Class = "NSMenuItem"; title = "Heavy"; ObjectID = "vik-vN-bJe"; */ +"vik-vN-bJe.title" = "Pesado"; + +/* Class = "NSTextFieldCell"; title = "Multiple displays:"; ObjectID = "vri-pv-tJ4"; */ +"vri-pv-tJ4.title" = "Múltiplos monitores:"; + +/* Class = "NSTextFieldCell"; title = "DDC read polling mode:"; ObjectID = "vwm-hY-on5"; */ +"vwm-hY-on5.title" = "Modo de pesquisa de leitura DDC:"; + +/* Class = "NSTextFieldCell"; title = "General options:"; ObjectID = "W58-ch-j69"; */ +"W58-ch-j69.title" = "Opções gerais:"; + +/* Class = "NSTextFieldCell"; title = "Useful when a display tends to reset its settings during sleep."; ObjectID = "w8B-x6-sq5"; */ +"w8B-x6-sq5.title" = "Útil quando um monitor tende a redefinir suas configurações ao hibernar."; + +/* Class = "NSTextFieldCell"; title = "Changes that are caused by the Ambient light sensor or made using Touch Bar, Control Center, System Preferences will be replicated to all displays."; ObjectID = "wjv-tq-iUx"; */ +"wjv-tq-iUx.title" = "As alterações causadas pelo sensor de luz ambiente ou feitas usando a Barra de toque, Centro de controle, Preferências do sistema serão replicadas para todos os monitores."; + +/* Class = "NSMenuItem"; title = "Change volume for all screens"; ObjectID = "Xih-P5-NyM"; */ +"Xih-P5-NyM.title" = "Alterar o volume para todas as telas"; + +/* Class = "NSTextFieldCell"; title = "Update settings from the display. May not work with some hardware."; ObjectID = "xjq-hs-wWB"; */ +"xjq-hs-wWB.title" = "Atualize as configurações do monitor. Pode não funcionar com algum hardware."; + +/* Class = "NSMenuItem"; title = "Only if at least one slider is present"; ObjectID = "xLa-PN-rsq"; */ +"xLa-PN-rsq.title" = "Apenas se pelo menos um controle deslizante estiver presente"; + +/* Class = "NSMenuItem"; title = "Both standard and custom shortcuts"; ObjectID = "xQJ-aJ-VhH"; */ +"xQJ-aJ-VhH.title" = "Atalhos padrão e personalizados"; + +/* Class = "NSTextFieldCell"; title = "Works best with various syncing and 'control all' keyboard settings enabled."; ObjectID = "XU4-Bn-bwH"; */ +"XU4-Bn-bwH.title" = "Funciona melhor com várias configurações de sincronização e 'controle total' do teclado ativadas."; + +/* Class = "NSTextFieldCell"; title = "Available"; ObjectID = "yBJ-5d-I7e"; */ +"yBJ-5d-I7e.title" = "Disponível"; + +/* Class = "NSTextFieldCell"; title = "Full OSD scale will be available for hardware brightness control and after reaching 0 brightness, further software dimming will be used."; ObjectID = "YHZ-VL-QJ3"; */ +"YHZ-VL-QJ3.title" = "A escala OSD completa estará disponível para o controle de brilho do hardware e depois de atingir o brilho 0, mais escurecimento do software será usado."; + +/* Class = "NSTextFieldCell"; title = "Warning! With this option enabled, you might find yourself in a position when you end up with a blank display. This, combined with disabled keyboard controls can be frustrating."; ObjectID = "yi3-e1-wsL"; */ +"yi3-e1-wsL.title" = "Aviso! Com esta opção ativada, você pode ter o monitor com uma tela preta. Isso, combinado com os controles do teclado desativados, pode ser frustrante."; + +/* Class = "NSTextFieldCell"; title = "Identifier:"; ObjectID = "YqZ-LS-YvR"; */ +"YqZ-LS-YvR.title" = "Identificador:"; + +/* Class = "NSMenuItem"; title = "Depends on mouse pointer position"; ObjectID = "Ytd-mg-N5E"; */ +"Ytd-mg-N5E.title" = "Depende da posição do ponteiro do mouse"; + +/* Class = "NSButtonCell"; title = "Use hardware DDC control"; ObjectID = "ZdU-gV-V05"; */ +"ZdU-gV-V05.title" = "Use o controle de hardware DDC"; + +/* Class = "NSMenuItem"; title = "Disable keyboard"; ObjectID = "zHa-xo-XPW"; */ +"zHa-xo-XPW.title" = "Desativar teclado"; + +/* Class = "NSButtonCell"; title = "Donate"; ObjectID = "ZKk-ve-rS4"; */ +"ZKk-ve-rS4.title" = "Doar"; + +/* Class = "NSButtonCell"; title = "Show percentages"; ObjectID = "ZUu-MR-XwA"; */ +"ZUu-MR-XwA.title" = "Mostrar percentagens"; + +/* Class = "NSTextFieldCell"; title = "Combined dimming switchover point:"; ObjectID = "zv8-pZ-OPy"; */ +"zv8-pZ-OPy.title" = "Ponto de transição de escurecimento combinado:"; diff --git a/MonitorControlHelper/Info.plist b/MonitorControlHelper/Info.plist index 680182a8..7284ba43 100644 --- a/MonitorControlHelper/Info.plist +++ b/MonitorControlHelper/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 6968 + 6970 LSApplicationCategoryType public.app-category.utilities LSBackgroundOnly From 2805f40a95571047fe326787db152c35e216ca53 Mon Sep 17 00:00:00 2001 From: fejese Date: Sat, 22 Jan 2022 21:04:23 +0000 Subject: [PATCH 019/101] Adding missing Hungarian translations and fixing some typos (#905) --- MonitorControl/UI/hu.lproj/Localizable.strings | 8 ++++---- MonitorControl/UI/hu.lproj/Main.strings | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/MonitorControl/UI/hu.lproj/Localizable.strings b/MonitorControl/UI/hu.lproj/Localizable.strings index 61c9caf7..41089bf0 100644 --- a/MonitorControl/UI/hu.lproj/Localizable.strings +++ b/MonitorControl/UI/hu.lproj/Localizable.strings @@ -2,7 +2,7 @@ "About" = "Névjegy"; /* Shown in the alert dialog */ -"An other app seems to change the brightness or colors which causes issues.\n\nTo solve this, you need to quit the other app or disable gamma control for your displays in MonitorControl!" = "An other app seems to change the brightness or colors which causes issues.\n\nTo solve this, you need to quit the other app or disable gamma control for your displays in MonitorControl!"; +"An other app seems to change the brightness or colors which causes issues.\n\nTo solve this, you need to quit the other app or disable gamma control for your displays in MonitorControl!" = "Úgy tűnik Egy másik alkalmazás módosítja a fényerőt vagy a színeket ami problémát okoz.\n\nEz megoldható a másik alkalmazás bezárásával vagy a MonitorControl-ban a kijelzők gamma vezérlésének letiltásával!"; /* Shown in the main prefs window */ "App menu" = "Menü"; @@ -35,7 +35,7 @@ "Decrease" = "Csökkentés"; /* Shown in the alert dialog */ -"Disable gamma control for my displays" = "Disable gamma control for my displays"; +"Disable gamma control for my displays" = "Kijelzők gamma vezérlésének letiltása"; /* Shown in the main prefs window */ "Displays" = "Kijelzők"; @@ -56,7 +56,7 @@ "Hardware (DDC)" = "Hardver (DDC)"; /* Shown in the alert dialog */ -"I'll quit the other app" = "I'll quit the other app"; +"I'll quit the other app" = "Bezárom a másik alkalmazást"; /* Shown in the alert dialog */ "Incompatible previous version" = "Inkompatibilis előző verzió"; @@ -65,7 +65,7 @@ "Increase" = "Növelés"; /* Shown in the alert dialog */ -"Is f.lux or similar running?" = "Is f.lux or similar running?"; +"Is f.lux or similar running?" = "Fut f.lux vagy hasonló alkalmazás?"; /* Shown in the main prefs window */ "Keyboard" = "Billentyűzet"; diff --git a/MonitorControl/UI/hu.lproj/Main.strings b/MonitorControl/UI/hu.lproj/Main.strings index c7fd1cb8..c87f1151 100644 --- a/MonitorControl/UI/hu.lproj/Main.strings +++ b/MonitorControl/UI/hu.lproj/Main.strings @@ -101,7 +101,7 @@ "Cz1-Mh-llk.title" = "⚠️ Figyelem! Ezen beállítások változtatása veszélyeztetheti a rendszer stabilitását!"; /* Class = "NSTextFieldCell"; title = "Alternative keys are the F14/F15 (Scroll Lock and Pause on PC keyboards, brightness keys on some Logitech keyboards)."; ObjectID = "D4H-hU-FLn"; */ -"D4H-hU-FLn.title" = "Az alternatív gombok az F14/F15 (Scroll Lock vagy Pause PC-k esetén ill. fényerő gombok egyes Logitech billentyűn)."; +"D4H-hU-FLn.title" = "Az alternatív gombok az F14/F15 (Scroll Lock vagy Pause PC-k esetén ill. fényerő gombok egyes Logitech billentyűzeteken)."; /* Class = "NSTextFieldCell"; title = "VCP list"; ObjectID = "D9t-vT-gNJ"; */ "D9t-vT-gNJ.title" = "VCP lista"; From 370d6cf890627a89c650be56c34136fd63b19ee4 Mon Sep 17 00:00:00 2001 From: Guillaume B Date: Sat, 22 Jan 2022 22:08:01 +0100 Subject: [PATCH 020/101] Add check for M1 Pro/Max Macbook Pro HDMI (#904) --- MonitorControl/Support/Arm64DDC.swift | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/MonitorControl/Support/Arm64DDC.swift b/MonitorControl/Support/Arm64DDC.swift index 2ac3855b..cc985f1e 100644 --- a/MonitorControl/Support/Arm64DDC.swift +++ b/MonitorControl/Support/Arm64DDC.swift @@ -278,8 +278,13 @@ class Arm64DDC: NSObject { if let modelData = IORegistryEntryCreateCFProperty(platformExpertDevice, "model" as CFString, kCFAllocatorDefault, 0).takeRetainedValue() as? Data, let modelIdentifierCString = String(data: modelData, encoding: .utf8)?.cString(using: .utf8) { modelIdentifier = String(cString: modelIdentifierCString) } - // First service location of Mac Mini HDMI is broken for DDC communication - if ioregService.transportDownstream == "HDMI", ioregService.serviceLocation == 1, modelIdentifier == "Macmini9,1" { + // First service location of M1 Mac Mini & Macbook Pro HDMI is broken for DDC communication + let ddcBlockedModels = [ + "Macmini9", // Mac mini M1 2020 + "MacBookPro18", // Macbook Pro M1 Pro/Max 2021 (14", 16") + ] + let isBlockedModel = ddcBlockedModels.contains { $0.starts(with: modelIdentifier) } + if ioregService.transportDownstream == "HDMI", ioregService.serviceLocation == 1, isBlockedModel { return true } return false From 4d408a581f887591da61a8ec6d3697d3037a16e3 Mon Sep 17 00:00:00 2001 From: Jack Hinkle <58039705+JackHinkle@users.noreply.github.com> Date: Sun, 23 Jan 2022 07:43:11 -0500 Subject: [PATCH 021/101] Update menu bar icon and its behavior. (#880) --- .../status.imageset/Contents.json | 10 +++++----- .../Assets.xcassets/status.imageset/status.pdf | Bin 0 -> 4679 bytes .../Assets.xcassets/status.imageset/status.png | Bin 1312 -> 0 bytes .../status.imageset/status@2x.pdf | Bin 0 -> 4675 bytes .../status.imageset/status@2x.png | Bin 1592 -> 0 bytes MonitorControl/Support/AppDelegate.swift | 6 +----- 6 files changed, 6 insertions(+), 10 deletions(-) create mode 100644 MonitorControl/Assets.xcassets/status.imageset/status.pdf delete mode 100644 MonitorControl/Assets.xcassets/status.imageset/status.png create mode 100644 MonitorControl/Assets.xcassets/status.imageset/status@2x.pdf delete mode 100644 MonitorControl/Assets.xcassets/status.imageset/status@2x.png diff --git a/MonitorControl/Assets.xcassets/status.imageset/Contents.json b/MonitorControl/Assets.xcassets/status.imageset/Contents.json index 719188ed..64768219 100644 --- a/MonitorControl/Assets.xcassets/status.imageset/Contents.json +++ b/MonitorControl/Assets.xcassets/status.imageset/Contents.json @@ -1,13 +1,13 @@ { "images" : [ { + "filename" : "status.pdf", "idiom" : "universal", - "filename" : "status.png", "scale" : "1x" }, { + "filename" : "status@2x.pdf", "idiom" : "universal", - "filename" : "status@2x.png", "scale" : "2x" }, { @@ -16,10 +16,10 @@ } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 }, "properties" : { "template-rendering-intent" : "template" } -} \ No newline at end of file +} diff --git a/MonitorControl/Assets.xcassets/status.imageset/status.pdf b/MonitorControl/Assets.xcassets/status.imageset/status.pdf new file mode 100644 index 0000000000000000000000000000000000000000..dfa85e747e1654f8b554312ccf77606e96ebfa49 GIT binary patch literal 4679 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 BMSlPQ literal 0 HcmV?d00001 diff --git a/MonitorControl/Assets.xcassets/status.imageset/status.png b/MonitorControl/Assets.xcassets/status.imageset/status.png deleted file mode 100644 index 44e755220926d8a353d5e5bf87eda719bab14aa8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1312 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 Awg3PC literal 0 HcmV?d00001 diff --git a/MonitorControl/Assets.xcassets/status.imageset/status@2x.png b/MonitorControl/Assets.xcassets/status.imageset/status@2x.png deleted file mode 100644 index cd07318f541a48fb391030457b73331ab1b170d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1592 zcmV-82FLk{P)4Tx062|}Rb6NtRTMtEb7vzY&QokOg>Hg1+lHrgWS zWcKdPn90sKGrRqvPeo9CG3uKX#J{(IASm?@+di}}l?o-=)F3E6wD^Ni=!>T7nL9I? zX}YoAW$t|Qo$sD|?zw001?ah|SeB6#0T!CBEf+H4bBB+JJu8rehoBb*p;u8ID_yBf z0ya+zcePvJL&AGs+11_tpRKn>9TgyPA7ZoSs0)aX0r00)%XR^J`jH<$>RKN5V(7Oq zK*TS4xZz{h!*f1C3ECFkK$#7nA@pGN!$;%jYvwjAKwmYb0gKL(K8 z-kPtb5${A?tlI~wzMrJ6wTdBr=Y%%%EaEMQ&o}4FQ^DA)s*}Z>!FI&AHCpoWI|RUq zx?7s@$8!5^Q=anY%X@i5{QA6kNcMelpE>R6eCYFpmMsVTrI(b06~u#xf1yS} z_UGdMvD``!0~u->P=lA4?YN`hilQ|3tHka)7T{2CGqw zjZfMwx$5irQN_*|e4l)UHmiYuz74Yp1t^#>hrJ3-SOXDcC_o0^7T9R1gAN8V6s;5) zieI5-7aQlmJn}lUna#nz!j%5V$X|o`xX!dHWQRV27P1=rj;t2bW$~+pTw@bIek?Zv zKPDL<64`^#UNTAck#RBsB6*5DP4<%UA_FqU$I>2EH_cM;u)Q~SI+rg`Rn{L_AC5qq~L$#SMj%U z$6Cz0vP{G5Y*=%5RT^yu;}-DInZ=349rJPVM6C3K^oO)8y(fJr{l>k`ead~!ea?NsT>_Ci%bnxC;Vy6=b6>{xYV#Ue-+LB$ z7`JEXmTRm^AtP)R9u{)KHsMiWGV&)32xCG~*nyU<>-!d;FP=Re4r3qYr~6#KE>;1F z`>_J_P5xC?ROxV(DIHdCO*p$HRQI@7^PwV@Pvuf+5K}u-6REM(K@W$s zrgorh0{i?O)v0c>QtHxU-hBdD(>iYJ4b2sIOVX2K8m~4gmYVA5h^QEb$V`rCQ-|7Z zS{nuL-t>?3n=-o(6I(7vocj#GzCZEo`!3>+v;dYIfPu#&ZWzzX2i^rZ^Mu;6+rb@? zNPG+6)c5T6zxpzGe*M(x+{AON=PiJ>H#?ob-|uwRK0yDg0B4PV0id6JRZw95ZvX%R z=1D|BR9FekmOW0yFc5_okoE>C5TZrmN8$t=0;DaFD7g<5T!Fm;)mF4LTficE-~iP8 zybm(bC~Rz#WMiK6(xMC`$Fq7gq!VzpHEhJXfIXi`KJRBH*e zXVHx20CK%nY*i~IU-ezp`*(xf)Ybf@PW1?!);tG#z7X%lx02ZO?Ta4dqS0j)E4{I- zEAd^l@4w#SBZk;sf#6K^1HS0_rX;ra5!-7K%*qB}uw!veG+@)`3n8Z$@Lp}%8DKl0 ziqDE5r@kiwsm-oSxoq~#G6rHSo{bpz3#87Z&H2sd*6Ku?t{*JR= zNG6({zeaVrOpxof(2ioN2;M7+SuUli*K#}C*?8C?F!SVVc}U3n5VbELX=#13+1Y Date: Wed, 26 Jan 2022 14:16:56 +0100 Subject: [PATCH 022/101] Onboarding Screen (#906) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR is related to this issue: #676 ### What's new - ✨ Add an onboarding screen (only appear on first launch) - 🇫🇷 French translations for the new onboarding screen - 🛠 Reorganize AppDelegate a bit - 🛠 Move View Controllers into folders ### What's left to do All current translations beside French & English (for the new onboarding) are missing for now. If you want to help with translations, please read the opening post of this discussion: #637 --- MonitorControl.xcodeproj/project.pbxproj | 32 ++- .../Contents.json | 18 ++ .../icon_keyboard.png | Bin 0 -> 1217 bytes .../icon_keyboard@2x.png | Bin 0 -> 2536 bytes .../Contents.json | 18 ++ .../icon_person.png | Bin 0 -> 1417 bytes .../icon_person@2x.png | Bin 0 -> 3261 bytes .../Contents.json | 40 +++ .../onboarding_keyboard.png | Bin 0 -> 31677 bytes .../onboarding_keyboard@2x.png | Bin 0 -> 104821 bytes .../onboarding_keyboard_dark.png | Bin 0 -> 31703 bytes .../onboarding_keyboard_dark@2x.png | Bin 0 -> 104682 bytes MonitorControl/Info.plist | 2 +- MonitorControl/Support/AppDelegate.swift | 72 +++-- .../Support/MediaKeyTapManager.swift | 4 +- MonitorControl/UI/Base.lproj/Main.storyboard | 257 +++++++++++++++++- MonitorControl/UI/de.lproj/Main.strings | 42 +++ MonitorControl/UI/en.lproj/Main.strings | 42 +++ MonitorControl/UI/es.lproj/Main.strings | 42 +++ MonitorControl/UI/fr.lproj/Main.strings | 42 +++ MonitorControl/UI/hu.lproj/Main.strings | 42 +++ MonitorControl/UI/it.lproj/Main.strings | 42 +++ MonitorControl/UI/ko.lproj/Main.strings | 42 +++ MonitorControl/UI/nl.lproj/Main.strings | 42 +++ MonitorControl/UI/pt-BR.lproj/Main.strings | 42 +++ MonitorControl/UI/tr.lproj/Main.strings | 42 +++ MonitorControl/UI/zh-Hans.lproj/Main.strings | 42 +++ .../UI/zh-Hant-TW.lproj/Main.strings | 42 +++ .../Onboarding/OnboardingViewController.swift | 26 ++ .../AboutPrefsViewController.swift | 0 .../DisplaysPrefsCellView.swift | 0 .../DisplaysPrefsViewController.swift | 0 .../KeyboardPrefsViewController.swift | 0 .../MainPrefsViewController.swift | 0 .../MenuslidersPrefsViewController.swift | 0 MonitorControl/main.swift | 8 +- MonitorControlHelper/Info.plist | 2 +- 37 files changed, 944 insertions(+), 39 deletions(-) create mode 100644 MonitorControl/Assets.xcassets/onboarding_icon_keyboard.imageset/Contents.json create mode 100644 MonitorControl/Assets.xcassets/onboarding_icon_keyboard.imageset/icon_keyboard.png create mode 100644 MonitorControl/Assets.xcassets/onboarding_icon_keyboard.imageset/icon_keyboard@2x.png create mode 100644 MonitorControl/Assets.xcassets/onboarding_icon_person.imageset/Contents.json create mode 100644 MonitorControl/Assets.xcassets/onboarding_icon_person.imageset/icon_person.png create mode 100644 MonitorControl/Assets.xcassets/onboarding_icon_person.imageset/icon_person@2x.png create mode 100644 MonitorControl/Assets.xcassets/onboarding_keyboard.imageset/Contents.json create mode 100644 MonitorControl/Assets.xcassets/onboarding_keyboard.imageset/onboarding_keyboard.png create mode 100644 MonitorControl/Assets.xcassets/onboarding_keyboard.imageset/onboarding_keyboard@2x.png create mode 100644 MonitorControl/Assets.xcassets/onboarding_keyboard.imageset/onboarding_keyboard_dark.png create mode 100644 MonitorControl/Assets.xcassets/onboarding_keyboard.imageset/onboarding_keyboard_dark@2x.png create mode 100644 MonitorControl/View Controllers/Onboarding/OnboardingViewController.swift rename MonitorControl/View Controllers/{ => Preferences}/AboutPrefsViewController.swift (100%) rename MonitorControl/View Controllers/{ => Preferences}/DisplaysPrefsCellView.swift (100%) rename MonitorControl/View Controllers/{ => Preferences}/DisplaysPrefsViewController.swift (100%) rename MonitorControl/View Controllers/{ => Preferences}/KeyboardPrefsViewController.swift (100%) rename MonitorControl/View Controllers/{ => Preferences}/MainPrefsViewController.swift (100%) rename MonitorControl/View Controllers/{ => Preferences}/MenuslidersPrefsViewController.swift (100%) diff --git a/MonitorControl.xcodeproj/project.pbxproj b/MonitorControl.xcodeproj/project.pbxproj index 8639f173..1fa5a4b9 100644 --- a/MonitorControl.xcodeproj/project.pbxproj +++ b/MonitorControl.xcodeproj/project.pbxproj @@ -56,6 +56,7 @@ F0445D3820023E710025AE82 /* MainPrefsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0445D3720023E710025AE82 /* MainPrefsViewController.swift */; }; F06792EA200A73460066C438 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = F06792E9200A73460066C438 /* main.swift */; }; F06792F6200A745F0066C438 /* MonitorControlHelper.app in [Login] Copy Helper to start at Login */ = {isa = PBXBuildFile; fileRef = F06792E7200A73460066C438 /* MonitorControlHelper.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + F0A489C4279C71B200BEDFD6 /* OnboardingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0A489C3279C71B200BEDFD6 /* OnboardingViewController.swift */; }; FE4E0896249D584C003A50BB /* OSDUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE4E0895249D584C003A50BB /* OSDUtils.swift */; }; /* End PBXBuildFile section */ @@ -157,6 +158,7 @@ F06792E9200A73460066C438 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; F06792F0200A73470066C438 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; F06792F1200A73470066C438 /* MonitorControlHelper.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = MonitorControlHelper.entitlements; sourceTree = ""; }; + F0A489C3279C71B200BEDFD6 /* OnboardingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingViewController.swift; sourceTree = ""; }; FE4E0895249D584C003A50BB /* OSDUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OSDUtils.swift; sourceTree = ""; }; /* End PBXFileReference section */ @@ -311,12 +313,8 @@ F0445D3620023D5B0025AE82 /* View Controllers */ = { isa = PBXGroup; children = ( - F0445D3720023E710025AE82 /* MainPrefsViewController.swift */, - AA25F6CE26E680510087F3A2 /* MenuslidersPrefsViewController.swift */, - AA25F6D026E681D30087F3A2 /* KeyboardPrefsViewController.swift */, - AA062E8926C9A039007E628C /* DisplaysPrefsViewController.swift */, - AA062E8D26CA7BE5007E628C /* DisplaysPrefsCellView.swift */, - AA665A5C26C5892800FEF2C1 /* AboutPrefsViewController.swift */, + F0A489C2279C719200BEDFD6 /* Onboarding */, + F0A489C1279C718400BEDFD6 /* Preferences */, ); path = "View Controllers"; sourceTree = ""; @@ -331,6 +329,27 @@ path = MonitorControlHelper; sourceTree = ""; }; + F0A489C1279C718400BEDFD6 /* Preferences */ = { + isa = PBXGroup; + children = ( + F0445D3720023E710025AE82 /* MainPrefsViewController.swift */, + AA25F6CE26E680510087F3A2 /* MenuslidersPrefsViewController.swift */, + AA25F6D026E681D30087F3A2 /* KeyboardPrefsViewController.swift */, + AA062E8926C9A039007E628C /* DisplaysPrefsViewController.swift */, + AA062E8D26CA7BE5007E628C /* DisplaysPrefsCellView.swift */, + AA665A5C26C5892800FEF2C1 /* AboutPrefsViewController.swift */, + ); + path = Preferences; + sourceTree = ""; + }; + F0A489C2279C719200BEDFD6 /* Onboarding */ = { + isa = PBXGroup; + children = ( + F0A489C3279C71B200BEDFD6 /* OnboardingViewController.swift */, + ); + path = Onboarding; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -581,6 +600,7 @@ F03A8DF21FFBAA6F0034DC27 /* OtherDisplay.swift in Sources */, AA78BDBD2709FE7B00CA8DF7 /* UpdaterDelegate.swift in Sources */, AA44E7052703790100E06865 /* KeyboardShortcuts+Extension.swift in Sources */, + F0A489C4279C71B200BEDFD6 /* OnboardingViewController.swift in Sources */, AA16139B26BE772E00DCF027 /* Arm64DDC.swift in Sources */, F0445D3820023E710025AE82 /* MainPrefsViewController.swift in Sources */, 28D1DDF2227FBE71004CB494 /* NSScreen+Extension.swift in Sources */, diff --git a/MonitorControl/Assets.xcassets/onboarding_icon_keyboard.imageset/Contents.json b/MonitorControl/Assets.xcassets/onboarding_icon_keyboard.imageset/Contents.json new file mode 100644 index 00000000..7ae38f6e --- /dev/null +++ b/MonitorControl/Assets.xcassets/onboarding_icon_keyboard.imageset/Contents.json @@ -0,0 +1,18 @@ +{ + "images" : [ + { + "filename" : "icon_keyboard.png", + "idiom" : "mac", + "scale" : "1x" + }, + { + "filename" : "icon_keyboard@2x.png", + "idiom" : "mac", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MonitorControl/Assets.xcassets/onboarding_icon_keyboard.imageset/icon_keyboard.png b/MonitorControl/Assets.xcassets/onboarding_icon_keyboard.imageset/icon_keyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..abd33073f1778d689281f671f886bbf8924e199b GIT binary patch literal 1217 zcmV;y1U~zTP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91D4+uX1ONa40RR91C;$Ke0D9(TtN;K6D@jB_R9Fe^Slf$LRT%%RbDXif zjh8|Y5z@dX^Q9LbN-!d<1RqrB0wNkA8odgNF~%{*B*oLHmn77%fy4W_nxw`z@GBawj()6Q-z}qT3F|BQEa0=6y*Z2g zHLUlsGuNSEw$JJyKnur`_^HE$(}x?J+T%35N!H((hufU&f8jbN=;|8YMw9p|oYNIT zCt{|g11Dim(9vuf-63tVWmhTC#5Aqdzz`NQ*bk=eOqy8cs1CAWnUmvo2mM6pPPx*m zGBEuaNEe4t4sl`F+;d1>SsQM7)^0=|w%vPJic>MGSww++k5Kj{f_QPbg~!PFibsIE z6z(=*LL=E_IFg;7zT)Lujn=V`U#9j}imMIqhL^>(<#C=0`G=(Lb=#!O;hSC>(;6nH zTU@j4$ybUF1)rHLp)GuFIH3t&X-UqD4(nKN4(fOYgR&NiWBQ!Y8aDcX>n-O7(pRxp zn>azSlr$_`TF}DwvK3c3~22#glO$KERcM)ye7=IX++8Mu7d%EhO z1Z-%7O?-zTUg!*y-9KHsJAZCBE|i0I;0fhZGYsSdkB=G-Wyo+KUmA|&RWCp9@g^_7 z?)9JaxWx@U9zHevXfm|pdzdFf@>C{RUOruTP+s(LkK{vSGnkhu4&;Cthw`zB19{&& zJM8fuk53tnWV_do$5JF4z5I&Fbr|W^AIb#YlLw90_3J;F!R#a{`w|^{f^8Ii$Up4e z{PH1U9n8HI$LqF+dzAK%)BYP8-{imXLeAP-|K_N?i=F*u$9DU%otHiHILGwz5Dc=H zj^`Rr`Q1LNdBqUhe`{9^{k#cE8rSmi9GjjiE`xPeP4MbK@BmE?lYYX+T*~N7C1`Tx zYvF0ed5dlb81r=|V6-ztwt-SiP?ZQ4=+H^$1a}gdoJSQCGQfl@L**a|s&} zqOP*C2+_hK;>nwN_sx4hzB%VR=bJNgX3m^*9@|(MGtu+W0{{RfQxiDi%G&$_EeHUh zIOXnzUJ;7>2xEP~tM~kyR|M|kV0zoq5+HNs(*h_``~XzHBv;_O0sugXr2tS~S&CmV zEbyPK4VLo1{x6{-!NM83RNI?It68;K89fxh@C=x@0!1<| z)vLpxl%i}kkn=Hop&&Wbhue@zMk0+*eou|hFw=G)ZlU1MnJGn!Td|?yqC(kMqPyE` z+iQP+@HVADVAj$O@!R+9nal6n-@k3uY;6h8^}Vzm)nGsbC1+@-G#*H0Bi{IQW!OK( z6;pY^_mmxQde{1mhO)U={9BbBHJQIAvyG;rfltG=z-6{_nJRN_{&H45a%W0F@MZ4f zTca6DkUaku6cqDf)0Jn}*JxMB^gM5o2-<>a?q|u_)2-@$?w@fC)+wAj=Q5fP(f}pQ z2@{x@qoY{^%b42nM@a3%2akwo^{D5LrDCEp1iD7UY1|LD_vr~XpG2KrHmaCvnI9w4 zdaDtv8~yoYRG%wyOw2D`Tj;H7h0t3gl_AOP66MdpvGwY#dW1>NYGhfGv}i2D{-22m z`ZV*X3SGxVeZjt3j8J}Q8OKK@J4PUgBB{qME&e3K9(0>1ROe|g-B{`OH2I+}vPpIH zjgx%ksV3gc*)sv;G}|MDx)u%2v#WO)2nfsJ*Ka2|=WkfjFCht7tqQPNXjtTyL8e!Z z_zQAMZY_wN!S1COynUbc?8J`uX`MEI)Ww~G{xEUc7C$NN?Da!*?02MkF@~QrLP|V7dnXgtZ z_jJET&{yVtw%E9ax$)tr$gOiclLg)*#Wy&REYorqIjLmc9X22NVoJWj`Rm^}J2wH0 z*LNgd`YpZG%{1yyaX8l$4IW72by!^H51Trkn-8rsdm)EBp{H`dPVkX1K|NtPgS10* zfbR?}?EKzDVo9DY>KxolR(7s65G8FOInc3f4VgMh7vHsIl@C7s{lBC*54Dks=3o zTOH!PAhRt5d#d-3%I^rKOJbh!cSSyeW5gS#LZZpSD{31)t8BNR2r~(bZA<{$5UvJU z$iw3wmi|USWe5(lFE%M}$-Ppnf$<9DvHZPiwJ7Tjm%juP^LlBlAO1iMPf$RcbGSG? zwKNl@17_~c3as6LX??UZ>8!PehK-1UAM1Y1ZPD|ys%uhdVA)s~7Jtp{EpyuOoZ>VZ zmrYto4#I{#q+$x2e=ZUsG=XQRQLHcTaB=vlVEpb3D{{eJwJBShSbl%f9K-XhjvJHX zx}s+6xW!l08B(&l=dixW+2yY~!rkfDD@6=lOGW*(HEhcFemHqtS&N&;DbfDl#QYDH zVoBJmL>6h6RE#6yIu7|PF7bd{Gp*cf>n9RjSd4i8ED)ZybsGLaz!H0VAC_I*PdOZXB8K6zX<>lAfY`S1HOTgCo1l1(0u>m+4*ev} zSyK$6+yx@TU#%W%yh`_Cm6o8>po(2n3;d!f)GM;7Zy zv%NQ2=wgG(bEin>&9F>4{eB%lBKjLu7h-T36IAvER+A%Ft03i0i#;`Ab*ztf+7#zi z?=Kadk>!d>pO?8x_Dac&Y`#H*dZjg8k^O;#fphP^2(nm04~Ni3Nyz^nZ3f3v*l>M zX`}~t8@D^Iwc@F*iW~Vg{=UL!tT^NjlP>0G?eY)elD>dL-8-x!#=Gv2szZHSAP9xOi{ zO9V%?el?0ifHP;ku|39leqY!7feY#*b}7Udfp)qslVF0FcizWVu;!w z)fd?Qm6zzht>JYvS(4pZ9*pO+MD-ERC!K78S7osI@8U*?zG5YR43}C351X&&$GhkD zx#d!l^TUA$5;G2J_3_F!@btPyiRc@Z`pPOlBetRDU4Kp+47U3?77KF1XB6k@PJ~{k z05%xzQmg1I;@v<>U)q|>ZHIpc%(Y(HahDM3d?^nP+WZ#=b8o^w97$_6Gln*CbjPR2 zz8+gI(K=)9E_s74C1N`_fmsQO#d@D5s@_iw|L!eD`;eM&vAd@(6!S?gBJNbW`_sy0 z!jW`-UjZlcBigf(m0+Wh?P)-k-3!GhwlFj=o2+J19Gl~nPk5)`ErW}hS&L_}^j}aq zE*HiwDX_wFY`tDL-KJftK;+FQ`LV~bgs5`LW?l9?oUBNMdZkLdnYWQ{7HAOCI8_DY zxa_!N^oF&0ivY< literal 0 HcmV?d00001 diff --git a/MonitorControl/Assets.xcassets/onboarding_icon_person.imageset/Contents.json b/MonitorControl/Assets.xcassets/onboarding_icon_person.imageset/Contents.json new file mode 100644 index 00000000..5e939b20 --- /dev/null +++ b/MonitorControl/Assets.xcassets/onboarding_icon_person.imageset/Contents.json @@ -0,0 +1,18 @@ +{ + "images" : [ + { + "filename" : "icon_person.png", + "idiom" : "mac", + "scale" : "1x" + }, + { + "filename" : "icon_person@2x.png", + "idiom" : "mac", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MonitorControl/Assets.xcassets/onboarding_icon_person.imageset/icon_person.png b/MonitorControl/Assets.xcassets/onboarding_icon_person.imageset/icon_person.png new file mode 100644 index 0000000000000000000000000000000000000000..e329079cf1cc28cef188e9574cbfae9efbc5ecf4 GIT binary patch literal 1417 zcmV;41$O$0P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91D4+uX1ONa40RR91C;$Ke0D9(TtN;K6^GQTOR9Fe^SX*daMHF3go5p8b z8*77#u|BZ)K>g4ktA$oe0@@EPYK7v552PP0sQrldoW`RhL3~u(iYQI-Bcd2TL@mTO z3I!EW>W@mTibaT^C~3sTo0{#KId|sFdE9evR20j-aL(+nlZ|M5yqo1tdbjlokHP zHk8{<&rt3(Z6F8pmaLbNblR{OP%1>Wn+025x5Fw9qc8h+>Gb%4?B+7wW?WFX3PWmd z-km@W8(}2JI%Oc+EuE~we4K2AH5_)~5&V${M(Q^!Wc$0J7vX*@ODtC9DI-)E;l6mn z(3AMl0+Y#Xl@%N)?R;sl^~|fX&06|DwZn2sEAA%2@zIe~P{R@C=>e|xdA17WGPvw2yLx-*t!|IZ($nh1dz%0IXJc;5M>Zw$4Bf&5E;0zs+-^AH0 z@#Vz^H6oG|v(s@M6(+bKr#Ze&91Rh8L{5N6;~nA6u`$TztOquv!q?m~=Vry_d{uUs zgFBEba=<`#8C@h7<#dIDP|kN%zyd<)<3{hXEa|QsrmoB%4zu{2x+Dv#GR+hmXV!d2 zBQKbKk@}fQ`!xAf9&26NU?5i#IL-W=FdfHa9@}FK9lzE)dPr>~z0C1-B5hExfu(ep z1Kp%t;d8Pq5y|nsC~Xi}Ob>tY0p#CydZ zsKo_S@jKP&F?x4%R-RpySRYU0nJn1xinXM`nAR72=z5X}q@VAVd=3%)JO!s9Sr4O zy7MRv3kTbY`M8e*`QK>eW9qUl{6rI+PT+nl!KJN4wYh`3D(}MwGMwyAd}*Soa4RQ0n$mkradEPM8Uh;8`)9n+xraoT*j@`S zY-_kBC)b~F+OhbzBd7NS6G4ueVp2SolWIXn{oeq6hlu3t zLJWn?9JJTSWsM9lvi)>IA1?!ZK4N4h_>9u>DqaB=a(UecZ_36IoN4&@BsiGTc})2p z4CO3t=x+?Z6K8O+@4dc%kBsls`Wn2G6WQFzSh<6`*MMBjWA`m%paX00pn3;-?;V0R zdN-fNMpyPyc%AA8m<%7Hl~cj9)!ac1)_3t5J|m^8#Xs{?SWkyvY-X%A2d$MrRx)eH z$aY)NoLj}D>gImktl~f4ni!aygTAq<^fDQ?)8Xa5I7ch!YBMtD%9AtH7PKSq-$dX~ XxKM9(rUVX%00000NkvXXu0mjf5(<@A literal 0 HcmV?d00001 diff --git a/MonitorControl/Assets.xcassets/onboarding_icon_person.imageset/icon_person@2x.png b/MonitorControl/Assets.xcassets/onboarding_icon_person.imageset/icon_person@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..99026af243324dbc671c258db7b090c500b02e34 GIT binary patch literal 3261 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 literal 0 HcmV?d00001 diff --git a/MonitorControl/Assets.xcassets/onboarding_keyboard.imageset/Contents.json b/MonitorControl/Assets.xcassets/onboarding_keyboard.imageset/Contents.json new file mode 100644 index 00000000..2eeb18db --- /dev/null +++ b/MonitorControl/Assets.xcassets/onboarding_keyboard.imageset/Contents.json @@ -0,0 +1,40 @@ +{ + "images" : [ + { + "filename" : "onboarding_keyboard.png", + "idiom" : "mac", + "scale" : "1x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "onboarding_keyboard_dark.png", + "idiom" : "mac", + "scale" : "1x" + }, + { + "filename" : "onboarding_keyboard@2x.png", + "idiom" : "mac", + "scale" : "2x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "onboarding_keyboard_dark@2x.png", + "idiom" : "mac", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MonitorControl/Assets.xcassets/onboarding_keyboard.imageset/onboarding_keyboard.png b/MonitorControl/Assets.xcassets/onboarding_keyboard.imageset/onboarding_keyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..8b9b3b30b6bad26212ce6706aabbbc518575fbcc GIT binary patch literal 31677 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 literal 0 HcmV?d00001 diff --git a/MonitorControl/Assets.xcassets/onboarding_keyboard.imageset/onboarding_keyboard@2x.png b/MonitorControl/Assets.xcassets/onboarding_keyboard.imageset/onboarding_keyboard@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..434bde8a612709ac7a7486ca77324204ef22d0f0 GIT binary patch literal 104821 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\l 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 f?(_?cFMTXyPsR>^VO;(#H}BL%;tIUx7YF literal 0 HcmV?d00001 diff --git a/MonitorControl/Assets.xcassets/onboarding_keyboard.imageset/onboarding_keyboard_dark@2x.png b/MonitorControl/Assets.xcassets/onboarding_keyboard.imageset/onboarding_keyboard_dark@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..bcc24ed52fdea2918f185035741acda52fd4c144 GIT binary patch literal 104682 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�mZxR>y`bTJueJy)iha+a$ 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 KMNUMnLSTXtaLK;_ literal 0 HcmV?d00001 diff --git a/MonitorControl/Info.plist b/MonitorControl/Info.plist index d672b315..a6276e04 100644 --- a/MonitorControl/Info.plist +++ b/MonitorControl/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 6970 + 7000 LSApplicationCategoryType public.app-category.utilities LSMinimumSystemVersion diff --git a/MonitorControl/Support/AppDelegate.swift b/MonitorControl/Support/AppDelegate.swift index 59e3deeb..7e6ea158 100644 --- a/MonitorControl/Support/AppDelegate.swift +++ b/MonitorControl/Support/AppDelegate.swift @@ -48,32 +48,16 @@ class AppDelegate: NSObject, NSApplicationDelegate { func applicationDidFinishLaunching(_: Notification) { app = self - menu = MenuHandler() - menu.delegate = menu self.subscribeEventListeners() - if NSEvent.modifierFlags.contains(NSEvent.ModifierFlags.shift) { - self.safeMode = true - let alert = NSAlert() - alert.messageText = NSLocalizedString("Safe Mode Activated", comment: "Shown in the alert dialog") - alert.informativeText = NSLocalizedString("Shift was pressed during launch. MonitorControl started in safe mode. Default preferences are reloaded, DDC read is blocked.", comment: "Shown in the alert dialog") - alert.runModal() - } - let currentBuildNumber = Int(Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as? String ?? "1") ?? 1 - let previousBuildNumber: Int = (Int(prefs.string(forKey: PrefKey.buildNumber.rawValue) ?? "0") ?? 0) - if self.safeMode || ((previousBuildNumber < MIN_PREVIOUS_BUILD_NUMBER) && previousBuildNumber > 0) || (previousBuildNumber > currentBuildNumber), let bundleID = Bundle.main.bundleIdentifier { - if !self.safeMode { - let alert = NSAlert() - alert.messageText = NSLocalizedString("Incompatible previous version", comment: "Shown in the alert dialog") - alert.informativeText = NSLocalizedString("Preferences for an incompatible previous app version detected. Default preferences are reloaded.", comment: "Shown in the alert dialog") - alert.runModal() - } - prefs.removePersistentDomain(forName: bundleID) + self.showSafeModeAlertIfNeeded() + if !prefs.bool(forKey: PrefKey.appAlreadyLaunched.rawValue) { + self.showOnboardingWindow() + } else { + self.checkPermissions() } - prefs.set(currentBuildNumber, forKey: PrefKey.buildNumber.rawValue) + self.setPrefsBuildNumber() self.setDefaultPrefs() - self.statusItem.button?.image = NSImage(named: "status") - self.statusItem.menu = menu - self.checkPermissions() + self.setMenu() CGDisplayRegisterReconfigurationCallback({ _, _, _ in app.displayReconfigured() }, nil) self.configure(firstrun: true) DisplayManager.shared.createGammaActivityEnforcer() @@ -101,6 +85,21 @@ class AppDelegate: NSObject, NSApplicationDelegate { self.statusItem.isVisible = true } + private func setPrefsBuildNumber() { + let currentBuildNumber = Int(Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as? String ?? "1") ?? 1 + let previousBuildNumber: Int = (Int(prefs.string(forKey: PrefKey.buildNumber.rawValue) ?? "0") ?? 0) + if self.safeMode || ((previousBuildNumber < MIN_PREVIOUS_BUILD_NUMBER) && previousBuildNumber > 0) || (previousBuildNumber > currentBuildNumber), let bundleID = Bundle.main.bundleIdentifier { + if !self.safeMode { + let alert = NSAlert() + alert.messageText = NSLocalizedString("Incompatible previous version", comment: "Shown in the alert dialog") + alert.informativeText = NSLocalizedString("Preferences for an incompatible previous app version detected. Default preferences are reloaded.", comment: "Shown in the alert dialog") + alert.runModal() + } + prefs.removePersistentDomain(forName: bundleID) + } + prefs.set(currentBuildNumber, forKey: PrefKey.buildNumber.rawValue) + } + func setDefaultPrefs() { if !prefs.bool(forKey: PrefKey.appAlreadyLaunched.rawValue) { // Only preferences that are not false, 0 or "" by default are set here. Assumes pre-wiped database. @@ -154,10 +153,10 @@ class AppDelegate: NSObject, NSApplicationDelegate { self.updateMediaKeyTap() } - func checkPermissions() { + func checkPermissions(firstAsk: Bool = false) { let permissionsRequired: Bool = [KeyboardVolume.media.rawValue, KeyboardVolume.both.rawValue].contains(prefs.integer(forKey: PrefKey.keyboardVolume.rawValue)) || [KeyboardBrightness.media.rawValue, KeyboardBrightness.both.rawValue].contains(prefs.integer(forKey: PrefKey.keyboardBrightness.rawValue)) if !MediaKeyTapManager.readPrivileges(prompt: false), permissionsRequired { - MediaKeyTapManager.acquirePrivileges() + MediaKeyTapManager.acquirePrivileges(firstAsk: firstAsk) } } @@ -329,4 +328,27 @@ class AppDelegate: NSObject, NSApplicationDelegate { os_log("%{public}@", type: .error, error.localizedDescription) } } + + private func setMenu() { + menu = MenuHandler() + menu.delegate = menu + self.statusItem.button?.image = NSImage(named: "status") + self.statusItem.menu = menu + } + + private func showSafeModeAlertIfNeeded() { + if NSEvent.modifierFlags.contains(NSEvent.ModifierFlags.shift) { + self.safeMode = true + let alert = NSAlert() + alert.messageText = NSLocalizedString("Safe Mode Activated", comment: "Shown in the alert dialog") + alert.informativeText = NSLocalizedString("Shift was pressed during launch. MonitorControl started in safe mode. Default preferences are reloaded, DDC read is blocked.", comment: "Shown in the alert dialog") + alert.runModal() + } + } + + private func showOnboardingWindow() { + onboardingVc?.showWindow(self) + onboardingVc?.window?.center() + NSApp.activate(ignoringOtherApps: true) + } } diff --git a/MonitorControl/Support/MediaKeyTapManager.swift b/MonitorControl/Support/MediaKeyTapManager.swift index 893eb8b7..0b11f7bd 100644 --- a/MonitorControl/Support/MediaKeyTapManager.swift +++ b/MonitorControl/Support/MediaKeyTapManager.swift @@ -204,8 +204,8 @@ class MediaKeyTapManager: MediaKeyTapDelegate { return true } - static func acquirePrivileges() { - if !self.readPrivileges(prompt: true) { + static func acquirePrivileges(firstAsk: Bool = false) { + if !self.readPrivileges(prompt: true), !firstAsk { let alert = NSAlert() alert.messageText = NSLocalizedString("Shortcuts not available", comment: "Shown in the alert dialog") alert.informativeText = NSLocalizedString("You need to enable MonitorControl in System Preferences > Security and Privacy > Accessibility for the keyboard shortcuts to work", comment: "Shown in the alert dialog") diff --git a/MonitorControl/UI/Base.lproj/Main.storyboard b/MonitorControl/UI/Base.lproj/Main.storyboard index 8defea05..56bedbbf 100644 --- a/MonitorControl/UI/Base.lproj/Main.storyboard +++ b/MonitorControl/UI/Base.lproj/Main.storyboard @@ -1,8 +1,9 @@ - + - + + @@ -1249,7 +1250,7 @@ - + @@ -2082,9 +2083,259 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MonitorControl needs access to "accessibility" to use macOS native keys to control your display. +You can enable it by adding MonitorControl in System Preferences > Security and Privacy > Accessibility. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MonitorControl/UI/de.lproj/Main.strings b/MonitorControl/UI/de.lproj/Main.strings index b61cf2f8..3b1b0691 100644 --- a/MonitorControl/UI/de.lproj/Main.strings +++ b/MonitorControl/UI/de.lproj/Main.strings @@ -13,6 +13,9 @@ /* Class = "NSTextFieldCell"; title = "DDC min"; ObjectID = "1zE-fg-xEm"; */ "1zE-fg-xEm.title" = "DDC min"; +/* Class = "NSTextFieldCell"; title = "Volume down"; ObjectID = "21s-bv-GTK"; */ +"21s-bv-GTK.title" = "Volume down"; + /* Class = "NSMenuItem"; title = "Show separate controls for each display in menu"; ObjectID = "3eO-bN-ZRl"; */ "3eO-bN-ZRl.title" = "Separate Steuerung für jeden Monitor im Menü anzeigen"; @@ -25,6 +28,9 @@ /* Class = "NSTextFieldCell"; title = "Using window focus might not work properly with full screen apps."; ObjectID = "4dX-o1-xAc"; */ "4dX-o1-xAc.title" = "Verwenden des Fensterfokus könnte bei Vollbildanwendungen nicht gut funktionieren."; +/* Class = "NSTextFieldCell"; title = "Welcome to MonitorControl"; ObjectID = "5J0-BD-top"; */ +"5J0-BD-top.title" = "Welcome to MonitorControl"; + /* Class = "NSButtonCell"; title = "Reset Preferences"; ObjectID = "5yT-5F-X5R"; */ "5yT-5F-X5R.title" = "Einstellungen zurücksetzen"; @@ -43,6 +49,9 @@ /* Class = "NSButtonCell"; title = "Use fine OSD scale for brightness and contrast"; ObjectID = "8Q8-57-xnT"; */ "8Q8-57-xnT.title" = "Feine OSD-Skalierung verwenden"; +/* Class = "NSButtonCell"; title = "Start using MonitorControl"; ObjectID = "8WE-da-OZC"; */ +"8WE-da-OZC.title" = "Start using MonitorControl"; + /* Class = "NSButtonCell"; title = "Special thanks to our contributors!"; ObjectID = "95V-M4-2l5"; */ "95V-M4-2l5.title" = "Besonderen Dank an unsere Mitwirkenden!"; @@ -61,6 +70,9 @@ /* Class = "NSMenuItem"; title = "Use audio device name to determine which display to control"; ObjectID = "AqF-uD-KCY"; */ "AqF-uD-KCY.title" = "Verwenden des Namens des Audiogeräts, um zu bestimmen, welcher Monitor gesteuert werden soll"; +/* Class = "NSTextFieldCell"; title = "Start at Login ?"; ObjectID = "bA1-GF-Y2n"; */ +"bA1-GF-Y2n.title" = "Start at Login ?"; + /* Class = "NSMenuItem"; title = "Show sliders only for the display currently showing the menu"; ObjectID = "bbf-sS-uGv"; */ "bbf-sS-uGv.title" = "Regler nur für den Monitor anzeigen, auf dem das Menü gerade angezeigt wird"; @@ -187,18 +199,27 @@ /* Class = "NSButtonCell"; title = "Start at Login"; ObjectID = "j72-NF-zsW"; */ "j72-NF-zsW.title" = "Bei Anmeldung starten"; +/* Class = "NSTextFieldCell"; title = "Toggle Mute"; ObjectID = "jK7-7w-uib"; */ +"jK7-7w-uib.title" = "Toggle Mute"; + /* Class = "NSMenuItem"; title = "Change for all screens"; ObjectID = "jSj-HB-T2t"; */ "jSj-HB-T2t.title" = "Für alle Monitore ändern"; /* Class = "NSButtonCell"; title = "Check for updates"; ObjectID = "jVH-oc-rUi"; */ "jVH-oc-rUi.title" = "Nach Updates suchen"; +/* Class = "NSButtonCell"; title = "Start MonitorControl at Login"; ObjectID = "JWJ-OY-VtE"; */ +"JWJ-OY-VtE.title" = "Start MonitorControl at Login"; + /* Class = "NSTextFieldCell"; title = "Note: you can press Shift during startup for 'Safe mode' to restore defaults and avoid reading or setting anything."; ObjectID = "Jx2-gO-nq9"; */ "Jx2-gO-nq9.title" = "Hinweis: Du kannst während des Starts die Umschalttaste drücken, um den 'Abgesicherten Modus' zu aktivieren, damit die Standardeinstellungen wiederhergestellt werden und nichts gelesen oder eingestellt wird."; /* Class = "NSButtonCell"; title = "Enable for Apple branded and built-in displays as well"; ObjectID = "K6A-4z-1aQ"; */ "K6A-4z-1aQ.title" = "Auch für Apple und eingebaute Monitore aktivieren"; +/* Class = "NSTextFieldCell"; title = "MonitorControl needs access to \"accessibility\" to use macOS native keys to control your display.\nYou can enable it by adding MonitorControl in System Preferences > Security and Privacy > Accessibility."; ObjectID = "kBJ-Zf-1k2"; */ +"kBJ-Zf-1k2.title" = "MonitorControl needs access to \"accessibility\" to use macOS native keys to control your display.\nYou can enable it by adding MonitorControl in System Preferences > Security and Privacy > Accessibility."; + /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "Kfj-WK-aSL"; */ "Kfj-WK-aSL.title" = "Monitor für Steuerung:"; @@ -217,6 +238,9 @@ /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "ltL-gR-K3Z"; */ "ltL-gR-K3Z.title" = "Monitor für Steuerung:"; +/* Class = "NSTextFieldCell"; title = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; ObjectID = "Mh5-1A-apq"; */ +"Mh5-1A-apq.title" = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; + /* Class = "NSButtonCell"; title = "Enable slider snapping"; ObjectID = "MlU-hl-d46"; */ "MlU-hl-d46.title" = "Regler einrasten lassen"; @@ -235,6 +259,12 @@ /* Class = "NSButtonCell"; title = "Avoid gamma table manipulation"; ObjectID = "na6-mS-MPi"; */ "na6-mS-MPi.title" = "Manipulation der Gammatabelle vermeiden"; +/* Class = "NSTextFieldCell"; title = "Ensure MonitorControl is always running when you need it by launching the app at startup."; ObjectID = "nk6-Gh-Mfs"; */ +"nk6-Gh-Mfs.title" = "Ensure MonitorControl is always running when you need it by launching the app at startup."; + +/* Class = "NSTextFieldCell"; title = "Brightness up"; ObjectID = "nty-g6-Sde"; */ +"nty-g6-Sde.title" = "Brightness up"; + /* Class = "NSButtonCell"; title = "Separate scales for combined hardware & software dimming"; ObjectID = "O8o-hI-8eR"; */ "O8o-hI-8eR.title" = "Getrennte Skalen für kombiniertes Dimmen von Hardware und Software"; @@ -262,9 +292,15 @@ /* Class = "NSTextFieldCell"; title = "DDC max"; ObjectID = "psF-vX-AFB"; */ "psF-vX-AFB.title" = "DDC max"; +/* Class = "NSButtonCell"; title = "Open System Preferences…"; ObjectID = "pVc-wG-Bdh"; */ +"pVc-wG-Bdh.title" = "Open System Preferences…"; + /* Class = "NSTextFieldCell"; title = "Use software dimming after the display reached zero hardware brightness for extended range. Works for DDC controlled displays only."; ObjectID = "PyY-p9-3NP"; */ "PyY-p9-3NP.title" = "Verwende die Software-Dimmung, nachdem der Monitor die Null-Hardware-Helligkeit erreicht hat, um die Bandbreite zu erweitern. Funktioniert nur bei DDC-gesteuerten Monitoren."; +/* Class = "NSTextFieldCell"; title = "Brightness down"; ObjectID = "q5a-Ix-Hjs"; */ +"q5a-Ix-Hjs.title" = "Brightness down"; + /* Class = "NSMenuItem"; title = "Both standard and custom shortcuts"; ObjectID = "QDG-SA-mRX"; */ "QDG-SA-mRX.title" = "Sowohl Standard- als auch benutzerdefinierte Tastenkombinationen"; @@ -283,6 +319,9 @@ /* Class = "NSButtonCell"; title = "Combine hardware and software dimming"; ObjectID = "r76-Zc-x09"; */ "r76-Zc-x09.title" = "Hardware- und Software-Dimmung kombinieren"; +/* Class = "NSTextFieldCell"; title = "Enable Apple keyboard native key access"; ObjectID = "RBj-pU-aen"; */ +"RBj-pU-aen.title" = "Enable Apple keyboard native key access"; + /* Class = "NSMenuItem"; title = "Normal"; ObjectID = "Riq-uM-bTs"; */ "Riq-uM-bTs.title" = "Normal"; @@ -358,6 +397,9 @@ /* Class = "NSMenuItem"; title = "Depends on mouse pointer position"; ObjectID = "Ytd-mg-N5E"; */ "Ytd-mg-N5E.title" = "Abhängig von der Mauszeigerposition"; +/* Class = "NSTextFieldCell"; title = "Volume up"; ObjectID = "Z3w-eR-qDF"; */ +"Z3w-eR-qDF.title" = "Volume up"; + /* Class = "NSButtonCell"; title = "Use hardware DDC control"; ObjectID = "ZdU-gV-V05"; */ "ZdU-gV-V05.title" = "Hardware DDC Steuerung verwenden"; diff --git a/MonitorControl/UI/en.lproj/Main.strings b/MonitorControl/UI/en.lproj/Main.strings index a05bb849..524a3b0c 100644 --- a/MonitorControl/UI/en.lproj/Main.strings +++ b/MonitorControl/UI/en.lproj/Main.strings @@ -13,6 +13,9 @@ /* Class = "NSTextFieldCell"; title = "DDC min"; ObjectID = "1zE-fg-xEm"; */ "1zE-fg-xEm.title" = "DDC min"; +/* Class = "NSTextFieldCell"; title = "Volume down"; ObjectID = "21s-bv-GTK"; */ +"21s-bv-GTK.title" = "Volume down"; + /* Class = "NSMenuItem"; title = "Show separate controls for each display in menu"; ObjectID = "3eO-bN-ZRl"; */ "3eO-bN-ZRl.title" = "Show separate controls for each display in menu"; @@ -25,6 +28,9 @@ /* Class = "NSTextFieldCell"; title = "Using window focus might not work properly with full screen apps."; ObjectID = "4dX-o1-xAc"; */ "4dX-o1-xAc.title" = "Using window focus might not work properly with full screen apps."; +/* Class = "NSTextFieldCell"; title = "Welcome to MonitorControl"; ObjectID = "5J0-BD-top"; */ +"5J0-BD-top.title" = "Welcome to MonitorControl"; + /* Class = "NSButtonCell"; title = "Reset Preferences"; ObjectID = "5yT-5F-X5R"; */ "5yT-5F-X5R.title" = "Reset Preferences"; @@ -43,6 +49,9 @@ /* Class = "NSButtonCell"; title = "Use fine OSD scale for brightness and contrast"; ObjectID = "8Q8-57-xnT"; */ "8Q8-57-xnT.title" = "Use fine OSD scale for brightness and contrast"; +/* Class = "NSButtonCell"; title = "Start using MonitorControl"; ObjectID = "8WE-da-OZC"; */ +"8WE-da-OZC.title" = "Start using MonitorControl"; + /* Class = "NSButtonCell"; title = "Special thanks to our contributors!"; ObjectID = "95V-M4-2l5"; */ "95V-M4-2l5.title" = "Special thanks to our contributors!"; @@ -61,6 +70,9 @@ /* Class = "NSMenuItem"; title = "Use audio device name to determine which display to control"; ObjectID = "AqF-uD-KCY"; */ "AqF-uD-KCY.title" = "Use audio device name to determine which display to control"; +/* Class = "NSTextFieldCell"; title = "Start at Login ?"; ObjectID = "bA1-GF-Y2n"; */ +"bA1-GF-Y2n.title" = "Start at Login ?"; + /* Class = "NSMenuItem"; title = "Show sliders only for the display currently showing the menu"; ObjectID = "bbf-sS-uGv"; */ "bbf-sS-uGv.title" = "Show sliders only for the display currently showing the menu"; @@ -187,18 +199,27 @@ /* Class = "NSButtonCell"; title = "Start at Login"; ObjectID = "j72-NF-zsW"; */ "j72-NF-zsW.title" = "Start at Login"; +/* Class = "NSTextFieldCell"; title = "Toggle Mute"; ObjectID = "jK7-7w-uib"; */ +"jK7-7w-uib.title" = "Toggle Mute"; + /* Class = "NSMenuItem"; title = "Change for all screens"; ObjectID = "jSj-HB-T2t"; */ "jSj-HB-T2t.title" = "Change for all screens"; /* Class = "NSButtonCell"; title = "Check for updates"; ObjectID = "jVH-oc-rUi"; */ "jVH-oc-rUi.title" = "Check for updates"; +/* Class = "NSButtonCell"; title = "Start MonitorControl at Login"; ObjectID = "JWJ-OY-VtE"; */ +"JWJ-OY-VtE.title" = "Start MonitorControl at Login"; + /* Class = "NSTextFieldCell"; title = "Note: you can press Shift during startup for 'Safe mode' to restore defaults and avoid reading or setting anything."; ObjectID = "Jx2-gO-nq9"; */ "Jx2-gO-nq9.title" = "Note: you can press Shift during startup for 'Safe mode' to restore defaults and avoid reading or setting anything."; /* Class = "NSButtonCell"; title = "Enable for Apple branded and built-in displays as well"; ObjectID = "K6A-4z-1aQ"; */ "K6A-4z-1aQ.title" = "Enable for Apple branded and built-in displays as well"; +/* Class = "NSTextFieldCell"; title = "MonitorControl needs access to \"accessibility\" to use macOS native keys to control your display.\nYou can enable it by adding MonitorControl in System Preferences > Security and Privacy > Accessibility."; ObjectID = "kBJ-Zf-1k2"; */ +"kBJ-Zf-1k2.title" = "MonitorControl needs access to \"accessibility\" to use macOS native keys to control your display.\nYou can enable it by adding MonitorControl in System Preferences > Security and Privacy > Accessibility."; + /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "Kfj-WK-aSL"; */ "Kfj-WK-aSL.title" = "Screen to control:"; @@ -217,6 +238,9 @@ /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "ltL-gR-K3Z"; */ "ltL-gR-K3Z.title" = "Screen to control:"; +/* Class = "NSTextFieldCell"; title = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; ObjectID = "Mh5-1A-apq"; */ +"Mh5-1A-apq.title" = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; + /* Class = "NSButtonCell"; title = "Enable slider snapping"; ObjectID = "MlU-hl-d46"; */ "MlU-hl-d46.title" = "Enable slider snapping"; @@ -235,6 +259,12 @@ /* Class = "NSButtonCell"; title = "Avoid gamma table manipulation"; ObjectID = "na6-mS-MPi"; */ "na6-mS-MPi.title" = "Avoid gamma table manipulation"; +/* Class = "NSTextFieldCell"; title = "Ensure MonitorControl is always running when you need it by launching the app at startup."; ObjectID = "nk6-Gh-Mfs"; */ +"nk6-Gh-Mfs.title" = "Ensure MonitorControl is always running when you need it by launching the app at startup."; + +/* Class = "NSTextFieldCell"; title = "Brightness up"; ObjectID = "nty-g6-Sde"; */ +"nty-g6-Sde.title" = "Brightness up"; + /* Class = "NSButtonCell"; title = "Separate scales for combined hardware & software dimming"; ObjectID = "O8o-hI-8eR"; */ "O8o-hI-8eR.title" = "Separate scales for combined hardware & software dimming"; @@ -262,9 +292,15 @@ /* Class = "NSTextFieldCell"; title = "DDC max"; ObjectID = "psF-vX-AFB"; */ "psF-vX-AFB.title" = "DDC max"; +/* Class = "NSButtonCell"; title = "Open System Preferences…"; ObjectID = "pVc-wG-Bdh"; */ +"pVc-wG-Bdh.title" = "Open System Preferences…"; + /* Class = "NSTextFieldCell"; title = "Use software dimming after the display reached zero hardware brightness for extended range. Works for DDC controlled displays only."; ObjectID = "PyY-p9-3NP"; */ "PyY-p9-3NP.title" = "Use software dimming after the display reached zero hardware brightness for extended range. Works for DDC controlled displays only."; +/* Class = "NSTextFieldCell"; title = "Brightness down"; ObjectID = "q5a-Ix-Hjs"; */ +"q5a-Ix-Hjs.title" = "Brightness down"; + /* Class = "NSMenuItem"; title = "Both standard and custom shortcuts"; ObjectID = "QDG-SA-mRX"; */ "QDG-SA-mRX.title" = "Both standard and custom shortcuts"; @@ -283,6 +319,9 @@ /* Class = "NSButtonCell"; title = "Combine hardware and software dimming"; ObjectID = "r76-Zc-x09"; */ "r76-Zc-x09.title" = "Combine hardware and software dimming"; +/* Class = "NSTextFieldCell"; title = "Enable Apple keyboard native key access"; ObjectID = "RBj-pU-aen"; */ +"RBj-pU-aen.title" = "Enable Apple keyboard native key access"; + /* Class = "NSMenuItem"; title = "Normal"; ObjectID = "Riq-uM-bTs"; */ "Riq-uM-bTs.title" = "Normal"; @@ -358,6 +397,9 @@ /* Class = "NSMenuItem"; title = "Depends on mouse pointer position"; ObjectID = "Ytd-mg-N5E"; */ "Ytd-mg-N5E.title" = "Depends on mouse pointer position"; +/* Class = "NSTextFieldCell"; title = "Volume up"; ObjectID = "Z3w-eR-qDF"; */ +"Z3w-eR-qDF.title" = "Volume up"; + /* Class = "NSButtonCell"; title = "Use hardware DDC control"; ObjectID = "ZdU-gV-V05"; */ "ZdU-gV-V05.title" = "Use hardware DDC control"; diff --git a/MonitorControl/UI/es.lproj/Main.strings b/MonitorControl/UI/es.lproj/Main.strings index 1524e021..76121f47 100644 --- a/MonitorControl/UI/es.lproj/Main.strings +++ b/MonitorControl/UI/es.lproj/Main.strings @@ -13,6 +13,9 @@ /* Class = "NSTextFieldCell"; title = "DDC min"; ObjectID = "1zE-fg-xEm"; */ "1zE-fg-xEm.title" = "DDC mín"; +/* Class = "NSTextFieldCell"; title = "Volume down"; ObjectID = "21s-bv-GTK"; */ +"21s-bv-GTK.title" = "Volume down"; + /* Class = "NSMenuItem"; title = "Show separate controls for each display in menu"; ObjectID = "3eO-bN-ZRl"; */ "3eO-bN-ZRl.title" = "Mostrar controles separados para cada pantalla en el menú"; @@ -25,6 +28,9 @@ /* Class = "NSTextFieldCell"; title = "Using window focus might not work properly with full screen apps."; ObjectID = "4dX-o1-xAc"; */ "4dX-o1-xAc.title" = "Usar el enfoque de ventana podría no funcionar en apps a pantalla completa."; +/* Class = "NSTextFieldCell"; title = "Welcome to MonitorControl"; ObjectID = "5J0-BD-top"; */ +"5J0-BD-top.title" = "Welcome to MonitorControl"; + /* Class = "NSButtonCell"; title = "Reset Preferences"; ObjectID = "5yT-5F-X5R"; */ "5yT-5F-X5R.title" = "Restablecer Preferencias"; @@ -43,6 +49,9 @@ /* Class = "NSButtonCell"; title = "Use fine OSD scale for brightness and contrast"; ObjectID = "8Q8-57-xnT"; */ "8Q8-57-xnT.title" = "Usar escala más precisa en OSD para el brillo y el contraste"; +/* Class = "NSButtonCell"; title = "Start using MonitorControl"; ObjectID = "8WE-da-OZC"; */ +"8WE-da-OZC.title" = "Start using MonitorControl"; + /* Class = "NSButtonCell"; title = "Special thanks to our contributors!"; ObjectID = "95V-M4-2l5"; */ "95V-M4-2l5.title" = "Agradecimientos especiales a nuestros colaboradores!"; @@ -61,6 +70,9 @@ /* Class = "NSMenuItem"; title = "Use audio device name to determine which display to control"; ObjectID = "AqF-uD-KCY"; */ "AqF-uD-KCY.title" = "Usar nombre del dispositivo de audio para determinar qué pantalla controlar"; +/* Class = "NSTextFieldCell"; title = "Start at Login ?"; ObjectID = "bA1-GF-Y2n"; */ +"bA1-GF-Y2n.title" = "Start at Login ?"; + /* Class = "NSMenuItem"; title = "Show sliders only for the display currently showing the menu"; ObjectID = "bbf-sS-uGv"; */ "bbf-sS-uGv.title" = "Mostrar sliders solo para las pantallas que actualmente se muestran en el menú"; @@ -187,18 +199,27 @@ /* Class = "NSButtonCell"; title = "Start at Login"; ObjectID = "j72-NF-zsW"; */ "j72-NF-zsW.title" = "Abrir al Iniciar sesión"; +/* Class = "NSTextFieldCell"; title = "Toggle Mute"; ObjectID = "jK7-7w-uib"; */ +"jK7-7w-uib.title" = "Toggle Mute"; + /* Class = "NSMenuItem"; title = "Change for all screens"; ObjectID = "jSj-HB-T2t"; */ "jSj-HB-T2t.title" = "Cambiar para todas las pantallas"; /* Class = "NSButtonCell"; title = "Check for updates"; ObjectID = "jVH-oc-rUi"; */ "jVH-oc-rUi.title" = "Comprobar actualizaciones"; +/* Class = "NSButtonCell"; title = "Start MonitorControl at Login"; ObjectID = "JWJ-OY-VtE"; */ +"JWJ-OY-VtE.title" = "Start MonitorControl at Login"; + /* Class = "NSTextFieldCell"; title = "Note: you can press Shift during startup for 'Safe mode' to restore defaults and avoid reading or setting anything."; ObjectID = "Jx2-gO-nq9"; */ "Jx2-gO-nq9.title" = "Nota: puedes presionar la tecla Shift mientras arrancas la app para entrar en el 'Modo Seguro' para restaurar los valores por defecto y evitar leer o establecer la configuración."; /* Class = "NSButtonCell"; title = "Enable for Apple branded and built-in displays as well"; ObjectID = "K6A-4z-1aQ"; */ "K6A-4z-1aQ.title" = "Habilitar también para pantallas de Apple o incorporadas"; +/* Class = "NSTextFieldCell"; title = "MonitorControl needs access to \"accessibility\" to use macOS native keys to control your display.\nYou can enable it by adding MonitorControl in System Preferences > Security and Privacy > Accessibility."; ObjectID = "kBJ-Zf-1k2"; */ +"kBJ-Zf-1k2.title" = "MonitorControl needs access to \"accessibility\" to use macOS native keys to control your display.\nYou can enable it by adding MonitorControl in System Preferences > Security and Privacy > Accessibility."; + /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "Kfj-WK-aSL"; */ "Kfj-WK-aSL.title" = "Ventana de control:"; @@ -217,6 +238,9 @@ /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "ltL-gR-K3Z"; */ "ltL-gR-K3Z.title" = "Pantalla a controlar:"; +/* Class = "NSTextFieldCell"; title = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; ObjectID = "Mh5-1A-apq"; */ +"Mh5-1A-apq.title" = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; + /* Class = "NSButtonCell"; title = "Enable slider snapping"; ObjectID = "MlU-hl-d46"; */ "MlU-hl-d46.title" = "Habilitar ajuste por slider"; @@ -235,6 +259,12 @@ /* Class = "NSButtonCell"; title = "Avoid gamma table manipulation"; ObjectID = "na6-mS-MPi"; */ "na6-mS-MPi.title" = "Evitar manipulación de la tabla gamma"; +/* Class = "NSTextFieldCell"; title = "Ensure MonitorControl is always running when you need it by launching the app at startup."; ObjectID = "nk6-Gh-Mfs"; */ +"nk6-Gh-Mfs.title" = "Ensure MonitorControl is always running when you need it by launching the app at startup."; + +/* Class = "NSTextFieldCell"; title = "Brightness up"; ObjectID = "nty-g6-Sde"; */ +"nty-g6-Sde.title" = "Brightness up"; + /* Class = "NSButtonCell"; title = "Separate scales for combined hardware & software dimming"; ObjectID = "O8o-hI-8eR"; */ "O8o-hI-8eR.title" = "Separar escalas de atenuación por hardware & software"; @@ -262,9 +292,15 @@ /* Class = "NSTextFieldCell"; title = "DDC max"; ObjectID = "psF-vX-AFB"; */ "psF-vX-AFB.title" = "DDC máx"; +/* Class = "NSButtonCell"; title = "Open System Preferences…"; ObjectID = "pVc-wG-Bdh"; */ +"pVc-wG-Bdh.title" = "Open System Preferences…"; + /* Class = "NSTextFieldCell"; title = "Use software dimming after the display reached zero hardware brightness for extended range. Works for DDC controlled displays only."; ObjectID = "PyY-p9-3NP"; */ "PyY-p9-3NP.title" = "Usar atenuación por software una vez que la pantalla alcanza el brillo 0 para un rango extendido. Funciona sólo para pantallas controladas por DDC."; +/* Class = "NSTextFieldCell"; title = "Brightness down"; ObjectID = "q5a-Ix-Hjs"; */ +"q5a-Ix-Hjs.title" = "Brightness down"; + /* Class = "NSMenuItem"; title = "Both standard and custom shortcuts"; ObjectID = "QDG-SA-mRX"; */ "QDG-SA-mRX.title" = "Ambos, atajos estándar y personalizados"; @@ -283,6 +319,9 @@ /* Class = "NSButtonCell"; title = "Combine hardware and software dimming"; ObjectID = "r76-Zc-x09"; */ "r76-Zc-x09.title" = "Combinar atenuación por hardware y software"; +/* Class = "NSTextFieldCell"; title = "Enable Apple keyboard native key access"; ObjectID = "RBj-pU-aen"; */ +"RBj-pU-aen.title" = "Enable Apple keyboard native key access"; + /* Class = "NSMenuItem"; title = "Normal"; ObjectID = "Riq-uM-bTs"; */ "Riq-uM-bTs.title" = "Normal"; @@ -358,6 +397,9 @@ /* Class = "NSMenuItem"; title = "Depends on mouse pointer position"; ObjectID = "Ytd-mg-N5E"; */ "Ytd-mg-N5E.title" = "Depender de la posición del cursor del ratón"; +/* Class = "NSTextFieldCell"; title = "Volume up"; ObjectID = "Z3w-eR-qDF"; */ +"Z3w-eR-qDF.title" = "Volume up"; + /* Class = "NSButtonCell"; title = "Use hardware DDC control"; ObjectID = "ZdU-gV-V05"; */ "ZdU-gV-V05.title" = "Usar control DDC por hardware"; diff --git a/MonitorControl/UI/fr.lproj/Main.strings b/MonitorControl/UI/fr.lproj/Main.strings index 96f511db..e6a5d5ff 100644 --- a/MonitorControl/UI/fr.lproj/Main.strings +++ b/MonitorControl/UI/fr.lproj/Main.strings @@ -13,6 +13,9 @@ /* Class = "NSTextFieldCell"; title = "DDC min"; ObjectID = "1zE-fg-xEm"; */ "1zE-fg-xEm.title" = "min. DDC"; +/* Class = "NSTextFieldCell"; title = "Volume down"; ObjectID = "21s-bv-GTK"; */ +"21s-bv-GTK.title" = "Volume moins"; + /* Class = "NSMenuItem"; title = "Show separate controls for each display in menu"; ObjectID = "3eO-bN-ZRl"; */ "3eO-bN-ZRl.title" = "Afficher des commandes distinctes pour chaque écran dans le menu"; @@ -25,6 +28,9 @@ /* Class = "NSTextFieldCell"; title = "Using window focus might not work properly with full screen apps."; ObjectID = "4dX-o1-xAc"; */ "4dX-o1-xAc.title" = "L'utilisation du \"focus de la fenêtre\" à la place peut ne pas fonctionner correctement avec les applications en plein écran."; +/* Class = "NSTextFieldCell"; title = "Welcome to MonitorControl"; ObjectID = "5J0-BD-top"; */ +"5J0-BD-top.title" = "Bienvenue sur MonitorControl"; + /* Class = "NSButtonCell"; title = "Reset Preferences"; ObjectID = "5yT-5F-X5R"; */ "5yT-5F-X5R.title" = "Réinitialiser les préférences"; @@ -43,6 +49,9 @@ /* Class = "NSButtonCell"; title = "Use fine OSD scale for brightness and contrast"; ObjectID = "8Q8-57-xnT"; */ "8Q8-57-xnT.title" = "Utiliser une échelle fine sur l'OSD"; +/* Class = "NSButtonCell"; title = "Start using MonitorControl"; ObjectID = "8WE-da-OZC"; */ +"8WE-da-OZC.title" = "Commencer à utiliser MonitorControl"; + /* Class = "NSButtonCell"; title = "Special thanks to our contributors!"; ObjectID = "95V-M4-2l5"; */ "95V-M4-2l5.title" = "Remerciements particuliers à nos contributeurs !"; @@ -61,6 +70,9 @@ /* Class = "NSMenuItem"; title = "Use audio device name to determine which display to control"; ObjectID = "AqF-uD-KCY"; */ "AqF-uD-KCY.title" = "Utiliser le nom du périphérique audio pour déterminer quel écran contrôler"; +/* Class = "NSTextFieldCell"; title = "Start at Login ?"; ObjectID = "bA1-GF-Y2n"; */ +"bA1-GF-Y2n.title" = "Lancer au démarrage ?"; + /* Class = "NSMenuItem"; title = "Show sliders only for the display currently showing the menu"; ObjectID = "bbf-sS-uGv"; */ "bbf-sS-uGv.title" = "Afficher les curseurs uniquement pour l'écran affichant actuellement le menu"; @@ -187,18 +199,27 @@ /* Class = "NSButtonCell"; title = "Start at Login"; ObjectID = "j72-NF-zsW"; */ "j72-NF-zsW.title" = "Lancer MonitorControl au démarrage"; +/* Class = "NSTextFieldCell"; title = "Toggle Mute"; ObjectID = "jK7-7w-uib"; */ +"jK7-7w-uib.title" = "Sourdine"; + /* Class = "NSMenuItem"; title = "Change for all screens"; ObjectID = "jSj-HB-T2t"; */ "jSj-HB-T2t.title" = "Changer pour tous les écrans"; /* Class = "NSButtonCell"; title = "Check for updates"; ObjectID = "jVH-oc-rUi"; */ "jVH-oc-rUi.title" = "Vérifier les mises à jour"; +/* Class = "NSButtonCell"; title = "Start MonitorControl at Login"; ObjectID = "JWJ-OY-VtE"; */ +"JWJ-OY-VtE.title" = "Lancer MonitorControl au démarrage"; + /* Class = "NSTextFieldCell"; title = "Note: you can press Shift during startup for 'Safe mode' to restore defaults and avoid reading or setting anything."; ObjectID = "Jx2-gO-nq9"; */ "Jx2-gO-nq9.title" = "Remarque : vous pouvez appuyer sur Maj pendant le démarrage pour démarrer en « Mode sans échec » ce qui restaure les paramètres par défaut et évite de lire ou de définir quoi que ce soit."; /* Class = "NSButtonCell"; title = "Enable for Apple branded and built-in displays as well"; ObjectID = "K6A-4z-1aQ"; */ "K6A-4z-1aQ.title" = "Activer également les écrans Apple et intégrés"; +/* Class = "NSTextFieldCell"; title = "MonitorControl needs access to \"accessibility\" to use macOS native keys to control your display.\nYou can enable it by adding MonitorControl in System Preferences > Security and Privacy > Accessibility."; ObjectID = "kBJ-Zf-1k2"; */ +"kBJ-Zf-1k2.title" = "MonitorControl a besoin d'accéder à \"l'accessibilité\" pour utiliser les touches natives macOS afin de contrôler votre écran.\nVous pouvez l'activer en ajoutant MonitorControl dans Préférences Système > Sécurité et confidentialité > Accessibilité."; + /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "Kfj-WK-aSL"; */ "Kfj-WK-aSL.title" = "Écran à contrôler :"; @@ -217,6 +238,9 @@ /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "ltL-gR-K3Z"; */ "ltL-gR-K3Z.title" = "Écran à contrôler :"; +/* Class = "NSTextFieldCell"; title = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; ObjectID = "Mh5-1A-apq"; */ +"Mh5-1A-apq.title" = "Contrôlez la luminosité, le contraste et le volume de vos écrans externes directement depuis votre Mac, à l'aide des curseurs du menu ou du clavier, y compris avec les touches Apple natives."; + /* Class = "NSButtonCell"; title = "Enable slider snapping"; ObjectID = "MlU-hl-d46"; */ "MlU-hl-d46.title" = "Activer l'accrochage du curseur"; @@ -235,6 +259,12 @@ /* Class = "NSButtonCell"; title = "Avoid gamma table manipulation"; ObjectID = "na6-mS-MPi"; */ "na6-mS-MPi.title" = "Éviter de manipuler la table gamma"; +/* Class = "NSTextFieldCell"; title = "Ensure MonitorControl is always running when you need it by launching the app at startup."; ObjectID = "nk6-Gh-Mfs"; */ +"nk6-Gh-Mfs.title" = "Assurez-vous que MonitorControl est toujours en cours d'exécution lorsque vous en avez besoin en lançant l'application au démarrage."; + +/* Class = "NSTextFieldCell"; title = "Brightness up"; ObjectID = "nty-g6-Sde"; */ +"nty-g6-Sde.title" = "Luminosité plus"; + /* Class = "NSButtonCell"; title = "Separate scales for combined hardware & software dimming"; ObjectID = "O8o-hI-8eR"; */ "O8o-hI-8eR.title" = "Séparer les échelles pour le contrôle matériel et logiciel combiné"; @@ -262,9 +292,15 @@ /* Class = "NSTextFieldCell"; title = "DDC max"; ObjectID = "psF-vX-AFB"; */ "psF-vX-AFB.title" = "max. DDC"; +/* Class = "NSButtonCell"; title = "Open System Preferences…"; ObjectID = "pVc-wG-Bdh"; */ +"pVc-wG-Bdh.title" = "Ouvrir les Préférences Système…"; + /* Class = "NSTextFieldCell"; title = "Use software dimming after the display reached zero hardware brightness for extended range. Works for DDC controlled displays only."; ObjectID = "PyY-p9-3NP"; */ "PyY-p9-3NP.title" = "Utilisez le contrôle logiciel une fois que l'écran a atteint une luminosité matérielle de zéro pour une portée étendue. Fonctionne pour les écrans contrôlés par matériel (DDC) uniquement."; +/* Class = "NSTextFieldCell"; title = "Brightness down"; ObjectID = "q5a-Ix-Hjs"; */ +"q5a-Ix-Hjs.title" = "Luminosité moins"; + /* Class = "NSMenuItem"; title = "Both standard and custom shortcuts"; ObjectID = "QDG-SA-mRX"; */ "QDG-SA-mRX.title" = "Raccourcis standard et personnalisés"; @@ -283,6 +319,9 @@ /* Class = "NSButtonCell"; title = "Combine hardware and software dimming"; ObjectID = "r76-Zc-x09"; */ "r76-Zc-x09.title" = "Combiner le contrôle matériel et logiciel"; +/* Class = "NSTextFieldCell"; title = "Enable Apple keyboard native key access"; ObjectID = "RBj-pU-aen"; */ +"RBj-pU-aen.title" = "Activer l'accès aux touches natives Apple du clavier"; + /* Class = "NSMenuItem"; title = "Normal"; ObjectID = "Riq-uM-bTs"; */ "Riq-uM-bTs.title" = "Normal"; @@ -358,6 +397,9 @@ /* Class = "NSMenuItem"; title = "Depends on mouse pointer position"; ObjectID = "Ytd-mg-N5E"; */ "Ytd-mg-N5E.title" = "Dépend de la position du pointeur de la souris"; +/* Class = "NSTextFieldCell"; title = "Volume up"; ObjectID = "Z3w-eR-qDF"; */ +"Z3w-eR-qDF.title" = "Volume plus"; + /* Class = "NSButtonCell"; title = "Use hardware DDC control"; ObjectID = "ZdU-gV-V05"; */ "ZdU-gV-V05.title" = "Utiliser le contrôle matériel DDC"; diff --git a/MonitorControl/UI/hu.lproj/Main.strings b/MonitorControl/UI/hu.lproj/Main.strings index c87f1151..980024f7 100644 --- a/MonitorControl/UI/hu.lproj/Main.strings +++ b/MonitorControl/UI/hu.lproj/Main.strings @@ -13,6 +13,9 @@ /* Class = "NSTextFieldCell"; title = "DDC min"; ObjectID = "1zE-fg-xEm"; */ "1zE-fg-xEm.title" = "DDC min"; +/* Class = "NSTextFieldCell"; title = "Volume down"; ObjectID = "21s-bv-GTK"; */ +"21s-bv-GTK.title" = "Volume down"; + /* Class = "NSMenuItem"; title = "Show separate controls for each display in menu"; ObjectID = "3eO-bN-ZRl"; */ "3eO-bN-ZRl.title" = "Külön vezérlő minden képernyő számára"; @@ -25,6 +28,9 @@ /* Class = "NSTextFieldCell"; title = "Using window focus might not work properly with full screen apps."; ObjectID = "4dX-o1-xAc"; */ "4dX-o1-xAc.title" = "Az ablakfókusz mód nem mindig működik teljes képernyős programokkal."; +/* Class = "NSTextFieldCell"; title = "Welcome to MonitorControl"; ObjectID = "5J0-BD-top"; */ +"5J0-BD-top.title" = "Welcome to MonitorControl"; + /* Class = "NSButtonCell"; title = "Reset Preferences"; ObjectID = "5yT-5F-X5R"; */ "5yT-5F-X5R.title" = "Beállítások visszaállítása"; @@ -43,6 +49,9 @@ /* Class = "NSButtonCell"; title = "Use fine OSD scale for brightness and contrast"; ObjectID = "8Q8-57-xnT"; */ "8Q8-57-xnT.title" = "Finom OSD skála használata a fényerőhöz és kontraszthoz"; +/* Class = "NSButtonCell"; title = "Start using MonitorControl"; ObjectID = "8WE-da-OZC"; */ +"8WE-da-OZC.title" = "Start using MonitorControl"; + /* Class = "NSButtonCell"; title = "Special thanks to our contributors!"; ObjectID = "95V-M4-2l5"; */ "95V-M4-2l5.title" = "Köszönjük mindenkinek, aki hozzájárult!"; @@ -61,6 +70,9 @@ /* Class = "NSMenuItem"; title = "Use audio device name to determine which display to control"; ObjectID = "AqF-uD-KCY"; */ "AqF-uD-KCY.title" = "Hangeszköz nevének megfelelő kijelző vezérlése"; +/* Class = "NSTextFieldCell"; title = "Start at Login ?"; ObjectID = "bA1-GF-Y2n"; */ +"bA1-GF-Y2n.title" = "Start at Login ?"; + /* Class = "NSMenuItem"; title = "Show sliders only for the display currently showing the menu"; ObjectID = "bbf-sS-uGv"; */ "bbf-sS-uGv.title" = "Az aktuális kijelző csúszkáinak mutatása"; @@ -187,18 +199,27 @@ /* Class = "NSButtonCell"; title = "Start at Login"; ObjectID = "j72-NF-zsW"; */ "j72-NF-zsW.title" = "Automatikus indítás bejelentkezéskor"; +/* Class = "NSTextFieldCell"; title = "Toggle Mute"; ObjectID = "jK7-7w-uib"; */ +"jK7-7w-uib.title" = "Toggle Mute"; + /* Class = "NSMenuItem"; title = "Change for all screens"; ObjectID = "jSj-HB-T2t"; */ "jSj-HB-T2t.title" = "Minden képernyő módosítása"; /* Class = "NSButtonCell"; title = "Check for updates"; ObjectID = "jVH-oc-rUi"; */ "jVH-oc-rUi.title" = "Frissítések ellenőrzése"; +/* Class = "NSButtonCell"; title = "Start MonitorControl at Login"; ObjectID = "JWJ-OY-VtE"; */ +"JWJ-OY-VtE.title" = "Start MonitorControl at Login"; + /* Class = "NSTextFieldCell"; title = "Note: you can press Shift during startup for 'Safe mode' to restore defaults and avoid reading or setting anything."; ObjectID = "Jx2-gO-nq9"; */ "Jx2-gO-nq9.title" = "Megjegyzés: a Shift nyomvatartásával induláskor aktiválhatja a Biztonsági Módot az alapértelmezett értékek helyreállítására."; /* Class = "NSButtonCell"; title = "Enable for Apple branded and built-in displays as well"; ObjectID = "K6A-4z-1aQ"; */ "K6A-4z-1aQ.title" = "Engedélyezés Apple és beépített kijelzők esetén is"; +/* Class = "NSTextFieldCell"; title = "MonitorControl needs access to \"accessibility\" to use macOS native keys to control your display.\nYou can enable it by adding MonitorControl in System Preferences > Security and Privacy > Accessibility."; ObjectID = "kBJ-Zf-1k2"; */ +"kBJ-Zf-1k2.title" = "MonitorControl needs access to \"accessibility\" to use macOS native keys to control your display.\nYou can enable it by adding MonitorControl in System Preferences > Security and Privacy > Accessibility."; + /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "Kfj-WK-aSL"; */ "Kfj-WK-aSL.title" = "Vezérelt képernyő:"; @@ -217,6 +238,9 @@ /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "ltL-gR-K3Z"; */ "ltL-gR-K3Z.title" = "Vezérelt képernyő:"; +/* Class = "NSTextFieldCell"; title = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; ObjectID = "Mh5-1A-apq"; */ +"Mh5-1A-apq.title" = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; + /* Class = "NSButtonCell"; title = "Enable slider snapping"; ObjectID = "MlU-hl-d46"; */ "MlU-hl-d46.title" = "Csúszka igazítás engedélyezése"; @@ -235,6 +259,12 @@ /* Class = "NSButtonCell"; title = "Avoid gamma table manipulation"; ObjectID = "na6-mS-MPi"; */ "na6-mS-MPi.title" = "Gamma tábla módosítás kerülése"; +/* Class = "NSTextFieldCell"; title = "Ensure MonitorControl is always running when you need it by launching the app at startup."; ObjectID = "nk6-Gh-Mfs"; */ +"nk6-Gh-Mfs.title" = "Ensure MonitorControl is always running when you need it by launching the app at startup."; + +/* Class = "NSTextFieldCell"; title = "Brightness up"; ObjectID = "nty-g6-Sde"; */ +"nty-g6-Sde.title" = "Brightness up"; + /* Class = "NSButtonCell"; title = "Separate scales for combined hardware & software dimming"; ObjectID = "O8o-hI-8eR"; */ "O8o-hI-8eR.title" = "Külön skála kombinált hardver/szoftver sötétítésnál"; @@ -262,9 +292,15 @@ /* Class = "NSTextFieldCell"; title = "DDC max"; ObjectID = "psF-vX-AFB"; */ "psF-vX-AFB.title" = "DDC max"; +/* Class = "NSButtonCell"; title = "Open System Preferences…"; ObjectID = "pVc-wG-Bdh"; */ +"pVc-wG-Bdh.title" = "Open System Preferences…"; + /* Class = "NSTextFieldCell"; title = "Use software dimming after the display reached zero hardware brightness for extended range. Works for DDC controlled displays only."; ObjectID = "PyY-p9-3NP"; */ "PyY-p9-3NP.title" = "Szoftveres sötétítés alkalmazása, miután a kijelző elérte a minimális hardveres fényerőt. Csak hardveres (DDC) kijelzők esetén."; +/* Class = "NSTextFieldCell"; title = "Brightness down"; ObjectID = "q5a-Ix-Hjs"; */ +"q5a-Ix-Hjs.title" = "Brightness down"; + /* Class = "NSMenuItem"; title = "Both standard and custom shortcuts"; ObjectID = "QDG-SA-mRX"; */ "QDG-SA-mRX.title" = "Hagyományos és egyedi billentyűkombinációk"; @@ -283,6 +319,9 @@ /* Class = "NSButtonCell"; title = "Combine hardware and software dimming"; ObjectID = "r76-Zc-x09"; */ "r76-Zc-x09.title" = "Hardveres és szoftveres fényerővezérlés kombinálása"; +/* Class = "NSTextFieldCell"; title = "Enable Apple keyboard native key access"; ObjectID = "RBj-pU-aen"; */ +"RBj-pU-aen.title" = "Enable Apple keyboard native key access"; + /* Class = "NSMenuItem"; title = "Normal"; ObjectID = "Riq-uM-bTs"; */ "Riq-uM-bTs.title" = "Normál"; @@ -358,6 +397,9 @@ /* Class = "NSMenuItem"; title = "Depends on mouse pointer position"; ObjectID = "Ytd-mg-N5E"; */ "Ytd-mg-N5E.title" = "Az egérmutató helyzetétől függ"; +/* Class = "NSTextFieldCell"; title = "Volume up"; ObjectID = "Z3w-eR-qDF"; */ +"Z3w-eR-qDF.title" = "Volume up"; + /* Class = "NSButtonCell"; title = "Use hardware DDC control"; ObjectID = "ZdU-gV-V05"; */ "ZdU-gV-V05.title" = "Hardveres DDC vezérlés"; diff --git a/MonitorControl/UI/it.lproj/Main.strings b/MonitorControl/UI/it.lproj/Main.strings index 62a3bb83..c38a0597 100644 --- a/MonitorControl/UI/it.lproj/Main.strings +++ b/MonitorControl/UI/it.lproj/Main.strings @@ -13,6 +13,9 @@ /* Class = "NSTextFieldCell"; title = "DDC min"; ObjectID = "1zE-fg-xEm"; */ "1zE-fg-xEm.title" = "Min DDC"; +/* Class = "NSTextFieldCell"; title = "Volume down"; ObjectID = "21s-bv-GTK"; */ +"21s-bv-GTK.title" = "Volume down"; + /* Class = "NSMenuItem"; title = "Show separate controls for each display in menu"; ObjectID = "3eO-bN-ZRl"; */ "3eO-bN-ZRl.title" = "Mostra slider separati per ciascun monitor nel menu"; @@ -25,6 +28,9 @@ /* Class = "NSTextFieldCell"; title = "Using window focus might not work properly with full screen apps."; ObjectID = "4dX-o1-xAc"; */ "4dX-o1-xAc.title" = "L'utilizzo del focus sulla finestra potrebbe non funzionare sulle applicazioni a pieno schermo."; +/* Class = "NSTextFieldCell"; title = "Welcome to MonitorControl"; ObjectID = "5J0-BD-top"; */ +"5J0-BD-top.title" = "Welcome to MonitorControl"; + /* Class = "NSButtonCell"; title = "Reset Preferences"; ObjectID = "5yT-5F-X5R"; */ "5yT-5F-X5R.title" = "Resetta le Preferenze"; @@ -43,6 +49,9 @@ /* Class = "NSButtonCell"; title = "Use fine OSD scale for brightness and contrast"; ObjectID = "8Q8-57-xnT"; */ "8Q8-57-xnT.title" = "Utilizza la scala fine OSD"; +/* Class = "NSButtonCell"; title = "Start using MonitorControl"; ObjectID = "8WE-da-OZC"; */ +"8WE-da-OZC.title" = "Start using MonitorControl"; + /* Class = "NSButtonCell"; title = "Special thanks to our contributors!"; ObjectID = "95V-M4-2l5"; */ "95V-M4-2l5.title" = "Ringraziamento speciale ai contributors!"; @@ -61,6 +70,9 @@ /* Class = "NSMenuItem"; title = "Use audio device name to determine which display to control"; ObjectID = "AqF-uD-KCY"; */ "AqF-uD-KCY.title" = "Utilizza dispositivo audio per determinare il monitor da controllare"; +/* Class = "NSTextFieldCell"; title = "Start at Login ?"; ObjectID = "bA1-GF-Y2n"; */ +"bA1-GF-Y2n.title" = "Start at Login ?"; + /* Class = "NSMenuItem"; title = "Show sliders only for the display currently showing the menu"; ObjectID = "bbf-sS-uGv"; */ "bbf-sS-uGv.title" = "Mostra gli slider solo per il monitor che sta mostrando il menu"; @@ -187,18 +199,27 @@ /* Class = "NSButtonCell"; title = "Start at Login"; ObjectID = "j72-NF-zsW"; */ "j72-NF-zsW.title" = "Avvia automaticamente al Login"; +/* Class = "NSTextFieldCell"; title = "Toggle Mute"; ObjectID = "jK7-7w-uib"; */ +"jK7-7w-uib.title" = "Toggle Mute"; + /* Class = "NSMenuItem"; title = "Change for all screens"; ObjectID = "jSj-HB-T2t"; */ "jSj-HB-T2t.title" = "Modifica per tutti i monitor"; /* Class = "NSButtonCell"; title = "Check for updates"; ObjectID = "jVH-oc-rUi"; */ "jVH-oc-rUi.title" = "Controlla aggiornamenti"; +/* Class = "NSButtonCell"; title = "Start MonitorControl at Login"; ObjectID = "JWJ-OY-VtE"; */ +"JWJ-OY-VtE.title" = "Start MonitorControl at Login"; + /* Class = "NSTextFieldCell"; title = "Note: you can press Shift during startup for 'Safe mode' to restore defaults and avoid reading or setting anything."; ObjectID = "Jx2-gO-nq9"; */ "Jx2-gO-nq9.title" = "Nota: puoi premere Maiusc all'avvio per il 'Safe mode' in modo da impostare i valori di default."; /* Class = "NSButtonCell"; title = "Enable for Apple branded and built-in displays as well"; ObjectID = "K6A-4z-1aQ"; */ "K6A-4z-1aQ.title" = "Abilita anche per i monitor Apple ed incorporati"; +/* Class = "NSTextFieldCell"; title = "MonitorControl needs access to \"accessibility\" to use macOS native keys to control your display.\nYou can enable it by adding MonitorControl in System Preferences > Security and Privacy > Accessibility."; ObjectID = "kBJ-Zf-1k2"; */ +"kBJ-Zf-1k2.title" = "MonitorControl needs access to \"accessibility\" to use macOS native keys to control your display.\nYou can enable it by adding MonitorControl in System Preferences > Security and Privacy > Accessibility."; + /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "Kfj-WK-aSL"; */ "Kfj-WK-aSL.title" = "Monitor da controllare:"; @@ -217,6 +238,9 @@ /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "ltL-gR-K3Z"; */ "ltL-gR-K3Z.title" = "Monitor da controllare:"; +/* Class = "NSTextFieldCell"; title = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; ObjectID = "Mh5-1A-apq"; */ +"Mh5-1A-apq.title" = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; + /* Class = "NSButtonCell"; title = "Enable slider snapping"; ObjectID = "MlU-hl-d46"; */ "MlU-hl-d46.title" = "Abilita lo snap dello slider"; @@ -235,6 +259,12 @@ /* Class = "NSButtonCell"; title = "Avoid gamma table manipulation"; ObjectID = "na6-mS-MPi"; */ "na6-mS-MPi.title" = "Impedisci la manipolazione della tabella di gamma"; +/* Class = "NSTextFieldCell"; title = "Ensure MonitorControl is always running when you need it by launching the app at startup."; ObjectID = "nk6-Gh-Mfs"; */ +"nk6-Gh-Mfs.title" = "Ensure MonitorControl is always running when you need it by launching the app at startup."; + +/* Class = "NSTextFieldCell"; title = "Brightness up"; ObjectID = "nty-g6-Sde"; */ +"nty-g6-Sde.title" = "Brightness up"; + /* Class = "NSButtonCell"; title = "Separate scales for combined hardware & software dimming"; ObjectID = "O8o-hI-8eR"; */ "O8o-hI-8eR.title" = "Scale separate per controllo combinato della attenuazione hw/sw"; @@ -262,9 +292,15 @@ /* Class = "NSTextFieldCell"; title = "DDC max"; ObjectID = "psF-vX-AFB"; */ "psF-vX-AFB.title" = "Max DDC"; +/* Class = "NSButtonCell"; title = "Open System Preferences…"; ObjectID = "pVc-wG-Bdh"; */ +"pVc-wG-Bdh.title" = "Open System Preferences…"; + /* Class = "NSTextFieldCell"; title = "Use software dimming after the display reached zero hardware brightness for extended range. Works for DDC controlled displays only."; ObjectID = "PyY-p9-3NP"; */ "PyY-p9-3NP.title" = "Utilizza l'attenuazione software quando il monitor ha raggiunto lo zero della luminosità hardware per estendere il range. Funziona solo per i monitor controllati via DDC."; +/* Class = "NSTextFieldCell"; title = "Brightness down"; ObjectID = "q5a-Ix-Hjs"; */ +"q5a-Ix-Hjs.title" = "Brightness down"; + /* Class = "NSMenuItem"; title = "Both standard and custom shortcuts"; ObjectID = "QDG-SA-mRX"; */ "QDG-SA-mRX.title" = "Entrambe le abbreviazioni standard e personalizzate"; @@ -283,6 +319,9 @@ /* Class = "NSButtonCell"; title = "Combine hardware and software dimming"; ObjectID = "r76-Zc-x09"; */ "r76-Zc-x09.title" = "Combina l'attenuazione hardware e software"; +/* Class = "NSTextFieldCell"; title = "Enable Apple keyboard native key access"; ObjectID = "RBj-pU-aen"; */ +"RBj-pU-aen.title" = "Enable Apple keyboard native key access"; + /* Class = "NSMenuItem"; title = "Normal"; ObjectID = "Riq-uM-bTs"; */ "Riq-uM-bTs.title" = "Normale"; @@ -358,6 +397,9 @@ /* Class = "NSMenuItem"; title = "Depends on mouse pointer position"; ObjectID = "Ytd-mg-N5E"; */ "Ytd-mg-N5E.title" = "Dipende dalla posizione del puntatore del mouse"; +/* Class = "NSTextFieldCell"; title = "Volume up"; ObjectID = "Z3w-eR-qDF"; */ +"Z3w-eR-qDF.title" = "Volume up"; + /* Class = "NSButtonCell"; title = "Use hardware DDC control"; ObjectID = "ZdU-gV-V05"; */ "ZdU-gV-V05.title" = "Utilizza controllo hardware DDC"; diff --git a/MonitorControl/UI/ko.lproj/Main.strings b/MonitorControl/UI/ko.lproj/Main.strings index d523cbc0..0af11dbc 100644 --- a/MonitorControl/UI/ko.lproj/Main.strings +++ b/MonitorControl/UI/ko.lproj/Main.strings @@ -13,6 +13,9 @@ /* Class = "NSTextFieldCell"; title = "DDC min"; ObjectID = "1zE-fg-xEm"; */ "1zE-fg-xEm.title" = "DDC 최솟값"; +/* Class = "NSTextFieldCell"; title = "Volume down"; ObjectID = "21s-bv-GTK"; */ +"21s-bv-GTK.title" = "Volume down"; + /* Class = "NSMenuItem"; title = "Show separate controls for each display in menu"; ObjectID = "3eO-bN-ZRl"; */ "3eO-bN-ZRl.title" = "메뉴에서 각 디스플레이에 대해 각각의 컨트롤 표시"; @@ -25,6 +28,9 @@ /* Class = "NSTextFieldCell"; title = "Using window focus might not work properly with full screen apps."; ObjectID = "4dX-o1-xAc"; */ "4dX-o1-xAc.title" = "활성화된 창을 기준으로 하면 전체 화면 앱에서 제대로 동작하지 않을 수 있습니다."; +/* Class = "NSTextFieldCell"; title = "Welcome to MonitorControl"; ObjectID = "5J0-BD-top"; */ +"5J0-BD-top.title" = "Welcome to MonitorControl"; + /* Class = "NSButtonCell"; title = "Reset Preferences"; ObjectID = "5yT-5F-X5R"; */ "5yT-5F-X5R.title" = "환경 설정 초기화"; @@ -43,6 +49,9 @@ /* Class = "NSButtonCell"; title = "Use fine OSD scale for brightness and contrast"; ObjectID = "8Q8-57-xnT"; */ "8Q8-57-xnT.title" = "미세한 OSD 스케일 사용"; +/* Class = "NSButtonCell"; title = "Start using MonitorControl"; ObjectID = "8WE-da-OZC"; */ +"8WE-da-OZC.title" = "Start using MonitorControl"; + /* Class = "NSButtonCell"; title = "Special thanks to our contributors!"; ObjectID = "95V-M4-2l5"; */ "95V-M4-2l5.title" = "기여자에게 특별한 감사를 드립니다!"; @@ -61,6 +70,9 @@ /* Class = "NSMenuItem"; title = "Use audio device name to determine which display to control"; ObjectID = "AqF-uD-KCY"; */ "AqF-uD-KCY.title" = "오디오 장치 이름을 사용하여 제어할 디스플레이 결정"; +/* Class = "NSTextFieldCell"; title = "Start at Login ?"; ObjectID = "bA1-GF-Y2n"; */ +"bA1-GF-Y2n.title" = "Start at Login ?"; + /* Class = "NSMenuItem"; title = "Show sliders only for the display currently showing the menu"; ObjectID = "bbf-sS-uGv"; */ "bbf-sS-uGv.title" = "현재 메뉴를 보여주는 디스플레이에 대한 슬라이더만 표시"; @@ -187,18 +199,27 @@ /* Class = "NSButtonCell"; title = "Start at Login"; ObjectID = "j72-NF-zsW"; */ "j72-NF-zsW.title" = "로그인 시 시작"; +/* Class = "NSTextFieldCell"; title = "Toggle Mute"; ObjectID = "jK7-7w-uib"; */ +"jK7-7w-uib.title" = "Toggle Mute"; + /* Class = "NSMenuItem"; title = "Change for all screens"; ObjectID = "jSj-HB-T2t"; */ "jSj-HB-T2t.title" = "모든 화면에 대해 변경"; /* Class = "NSButtonCell"; title = "Check for updates"; ObjectID = "jVH-oc-rUi"; */ "jVH-oc-rUi.title" = "업데이트 확인"; +/* Class = "NSButtonCell"; title = "Start MonitorControl at Login"; ObjectID = "JWJ-OY-VtE"; */ +"JWJ-OY-VtE.title" = "Start MonitorControl at Login"; + /* Class = "NSTextFieldCell"; title = "Note: you can press Shift during startup for 'Safe mode' to restore defaults and avoid reading or setting anything."; ObjectID = "Jx2-gO-nq9"; */ "Jx2-gO-nq9.title" = "참고: 시작하는 동안 Shift 키를 눌러 '안전 모드'를 실행할 수 있으며, 이는 기본값을 복원하고 어떠한 것이든 읽거나 설정하지 않도록 할 수 있습니다."; /* Class = "NSButtonCell"; title = "Enable for Apple branded and built-in displays as well"; ObjectID = "K6A-4z-1aQ"; */ "K6A-4z-1aQ.title" = "Apple 전용 및 내장 디스플레이에도 활성화"; +/* Class = "NSTextFieldCell"; title = "MonitorControl needs access to \"accessibility\" to use macOS native keys to control your display.\nYou can enable it by adding MonitorControl in System Preferences > Security and Privacy > Accessibility."; ObjectID = "kBJ-Zf-1k2"; */ +"kBJ-Zf-1k2.title" = "MonitorControl needs access to \"accessibility\" to use macOS native keys to control your display.\nYou can enable it by adding MonitorControl in System Preferences > Security and Privacy > Accessibility."; + /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "Kfj-WK-aSL"; */ "Kfj-WK-aSL.title" = "제어할 화면:"; @@ -217,6 +238,9 @@ /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "ltL-gR-K3Z"; */ "ltL-gR-K3Z.title" = "제어할 화면:"; +/* Class = "NSTextFieldCell"; title = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; ObjectID = "Mh5-1A-apq"; */ +"Mh5-1A-apq.title" = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; + /* Class = "NSButtonCell"; title = "Enable slider snapping"; ObjectID = "MlU-hl-d46"; */ "MlU-hl-d46.title" = "슬라이더 정렬 활성화"; @@ -235,6 +259,12 @@ /* Class = "NSButtonCell"; title = "Avoid gamma table manipulation"; ObjectID = "na6-mS-MPi"; */ "na6-mS-MPi.title" = "감마 테이블 조절 방지"; +/* Class = "NSTextFieldCell"; title = "Ensure MonitorControl is always running when you need it by launching the app at startup."; ObjectID = "nk6-Gh-Mfs"; */ +"nk6-Gh-Mfs.title" = "Ensure MonitorControl is always running when you need it by launching the app at startup."; + +/* Class = "NSTextFieldCell"; title = "Brightness up"; ObjectID = "nty-g6-Sde"; */ +"nty-g6-Sde.title" = "Brightness up"; + /* Class = "NSButtonCell"; title = "Separate scales for combined hardware & software dimming"; ObjectID = "O8o-hI-8eR"; */ "O8o-hI-8eR.title" = "통합된 하드웨어 및 소프트웨어 밝기 조절을 위한 별도의 스케일"; @@ -262,9 +292,15 @@ /* Class = "NSTextFieldCell"; title = "DDC max"; ObjectID = "psF-vX-AFB"; */ "psF-vX-AFB.title" = "DDC 최댓값"; +/* Class = "NSButtonCell"; title = "Open System Preferences…"; ObjectID = "pVc-wG-Bdh"; */ +"pVc-wG-Bdh.title" = "Open System Preferences…"; + /* Class = "NSTextFieldCell"; title = "Use software dimming after the display reached zero hardware brightness for extended range. Works for DDC controlled displays only."; ObjectID = "PyY-p9-3NP"; */ "PyY-p9-3NP.title" = "디스플레이가 확장된 범위에 대해 하드웨어 밝기가 0에 도달한 후 소프트웨어 밝기 조절을 사용합니다. DDC 제어 디스플레이에서만 동작합니다."; +/* Class = "NSTextFieldCell"; title = "Brightness down"; ObjectID = "q5a-Ix-Hjs"; */ +"q5a-Ix-Hjs.title" = "Brightness down"; + /* Class = "NSMenuItem"; title = "Both standard and custom shortcuts"; ObjectID = "QDG-SA-mRX"; */ "QDG-SA-mRX.title" = "표준 및 사용자 정의 단축키 둘 다"; @@ -283,6 +319,9 @@ /* Class = "NSButtonCell"; title = "Combine hardware and software dimming"; ObjectID = "r76-Zc-x09"; */ "r76-Zc-x09.title" = "하드웨어 및 소프트웨어 밝기 조절 통합"; +/* Class = "NSTextFieldCell"; title = "Enable Apple keyboard native key access"; ObjectID = "RBj-pU-aen"; */ +"RBj-pU-aen.title" = "Enable Apple keyboard native key access"; + /* Class = "NSMenuItem"; title = "Normal"; ObjectID = "Riq-uM-bTs"; */ "Riq-uM-bTs.title" = "보통"; @@ -358,6 +397,9 @@ /* Class = "NSMenuItem"; title = "Depends on mouse pointer position"; ObjectID = "Ytd-mg-N5E"; */ "Ytd-mg-N5E.title" = "마우스 포인터 위치에 따라 다름"; +/* Class = "NSTextFieldCell"; title = "Volume up"; ObjectID = "Z3w-eR-qDF"; */ +"Z3w-eR-qDF.title" = "Volume up"; + /* Class = "NSButtonCell"; title = "Use hardware DDC control"; ObjectID = "ZdU-gV-V05"; */ "ZdU-gV-V05.title" = "하드웨어 DDC 제어 사용"; diff --git a/MonitorControl/UI/nl.lproj/Main.strings b/MonitorControl/UI/nl.lproj/Main.strings index f7afffd0..aeaf73a7 100644 --- a/MonitorControl/UI/nl.lproj/Main.strings +++ b/MonitorControl/UI/nl.lproj/Main.strings @@ -13,6 +13,9 @@ /* Class = "NSTextFieldCell"; title = "DDC min"; ObjectID = "1zE-fg-xEm"; */ "1zE-fg-xEm.title" = "DDC min"; +/* Class = "NSTextFieldCell"; title = "Volume down"; ObjectID = "21s-bv-GTK"; */ +"21s-bv-GTK.title" = "Volume down"; + /* Class = "NSMenuItem"; title = "Show separate controls for each display in menu"; ObjectID = "3eO-bN-ZRl"; */ "3eO-bN-ZRl.title" = "Toon afzonderlijke bedieningselementen voor elk scherm in het menu"; @@ -25,6 +28,9 @@ /* Class = "NSTextFieldCell"; title = "Using window focus might not work properly with full screen apps."; ObjectID = "4dX-o1-xAc"; */ "4dX-o1-xAc.title" = "Het gebruik van vensterfocus als alternatief werkt mogelijk niet goed bij fullscreen apps."; +/* Class = "NSTextFieldCell"; title = "Welcome to MonitorControl"; ObjectID = "5J0-BD-top"; */ +"5J0-BD-top.title" = "Welcome to MonitorControl"; + /* Class = "NSButtonCell"; title = "Reset Preferences"; ObjectID = "5yT-5F-X5R"; */ "5yT-5F-X5R.title" = "Reset voorkeuren"; @@ -43,6 +49,9 @@ /* Class = "NSButtonCell"; title = "Use fine OSD scale for brightness and contrast"; ObjectID = "8Q8-57-xnT"; */ "8Q8-57-xnT.title" = "Gebruik fijne OSD-schaal voor helderheid en contrast"; +/* Class = "NSButtonCell"; title = "Start using MonitorControl"; ObjectID = "8WE-da-OZC"; */ +"8WE-da-OZC.title" = "Start using MonitorControl"; + /* Class = "NSButtonCell"; title = "Special thanks to our contributors!"; ObjectID = "95V-M4-2l5"; */ "95V-M4-2l5.title" = "Speciale dank aan onze bijdragers!"; @@ -61,6 +70,9 @@ /* Class = "NSMenuItem"; title = "Use audio device name to determine which display to control"; ObjectID = "AqF-uD-KCY"; */ "AqF-uD-KCY.title" = "Gebruik Audioapparaat naam om te bepalen welk scherm u wilt bedienen"; +/* Class = "NSTextFieldCell"; title = "Start at Login ?"; ObjectID = "bA1-GF-Y2n"; */ +"bA1-GF-Y2n.title" = "Start at Login ?"; + /* Class = "NSMenuItem"; title = "Show sliders only for the display currently showing the menu"; ObjectID = "bbf-sS-uGv"; */ "bbf-sS-uGv.title" = "Enkel schuifregelaars tonen voor het scherm dat het menu toont"; @@ -187,18 +199,27 @@ /* Class = "NSButtonCell"; title = "Start at Login"; ObjectID = "j72-NF-zsW"; */ "j72-NF-zsW.title" = "Start bij Inloggen"; +/* Class = "NSTextFieldCell"; title = "Toggle Mute"; ObjectID = "jK7-7w-uib"; */ +"jK7-7w-uib.title" = "Toggle Mute"; + /* Class = "NSMenuItem"; title = "Change for all screens"; ObjectID = "jSj-HB-T2t"; */ "jSj-HB-T2t.title" = "Wijzigen voor alle schermen"; /* Class = "NSButtonCell"; title = "Check for updates"; ObjectID = "jVH-oc-rUi"; */ "jVH-oc-rUi.title" = "Controleren op updates"; +/* Class = "NSButtonCell"; title = "Start MonitorControl at Login"; ObjectID = "JWJ-OY-VtE"; */ +"JWJ-OY-VtE.title" = "Start MonitorControl at Login"; + /* Class = "NSTextFieldCell"; title = "Note: you can press Shift during startup for 'Safe mode' to restore defaults and avoid reading or setting anything."; ObjectID = "Jx2-gO-nq9"; */ "Jx2-gO-nq9.title" = "Opmerking: u kunt tijdens het opstarten op Shift drukken voor 'Veilige modus' om de standaardinstellingen te herstellen en niets te lezen of in te stellen."; /* Class = "NSButtonCell"; title = "Enable for Apple branded and built-in displays as well"; ObjectID = "K6A-4z-1aQ"; */ "K6A-4z-1aQ.title" = "Ook inschakelen voor Apple branded en ingebouwde schermen"; +/* Class = "NSTextFieldCell"; title = "MonitorControl needs access to \"accessibility\" to use macOS native keys to control your display.\nYou can enable it by adding MonitorControl in System Preferences > Security and Privacy > Accessibility."; ObjectID = "kBJ-Zf-1k2"; */ +"kBJ-Zf-1k2.title" = "MonitorControl needs access to \"accessibility\" to use macOS native keys to control your display.\nYou can enable it by adding MonitorControl in System Preferences > Security and Privacy > Accessibility."; + /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "Kfj-WK-aSL"; */ "Kfj-WK-aSL.title" = "Scherm om te bedienen:"; @@ -217,6 +238,9 @@ /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "ltL-gR-K3Z"; */ "ltL-gR-K3Z.title" = "Scherm om te bedienen:"; +/* Class = "NSTextFieldCell"; title = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; ObjectID = "Mh5-1A-apq"; */ +"Mh5-1A-apq.title" = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; + /* Class = "NSButtonCell"; title = "Enable slider snapping"; ObjectID = "MlU-hl-d46"; */ "MlU-hl-d46.title" = "Schuifregelaar snapping inschakelen"; @@ -235,6 +259,12 @@ /* Class = "NSButtonCell"; title = "Avoid gamma table manipulation"; ObjectID = "na6-mS-MPi"; */ "na6-mS-MPi.title" = "Voorkom gamma table manipulatie"; +/* Class = "NSTextFieldCell"; title = "Ensure MonitorControl is always running when you need it by launching the app at startup."; ObjectID = "nk6-Gh-Mfs"; */ +"nk6-Gh-Mfs.title" = "Ensure MonitorControl is always running when you need it by launching the app at startup."; + +/* Class = "NSTextFieldCell"; title = "Brightness up"; ObjectID = "nty-g6-Sde"; */ +"nty-g6-Sde.title" = "Brightness up"; + /* Class = "NSButtonCell"; title = "Separate scales for combined hardware & software dimming"; ObjectID = "O8o-hI-8eR"; */ "O8o-hI-8eR.title" = "Aparte schaal voor gecombineerd hardware & software dimmen"; @@ -262,9 +292,15 @@ /* Class = "NSTextFieldCell"; title = "DDC max"; ObjectID = "psF-vX-AFB"; */ "psF-vX-AFB.title" = "DDC max"; +/* Class = "NSButtonCell"; title = "Open System Preferences…"; ObjectID = "pVc-wG-Bdh"; */ +"pVc-wG-Bdh.title" = "Open System Preferences…"; + /* Class = "NSTextFieldCell"; title = "Use software dimming after the display reached zero hardware brightness for extended range. Works for DDC controlled displays only."; ObjectID = "PyY-p9-3NP"; */ "PyY-p9-3NP.title" = "Gebruik software-dimmen nadat het scherm de hardwarehelderheid 0 heeft bereikt voor een groter bereik. Werkt alleen voor DDC-gestuurde displays."; +/* Class = "NSTextFieldCell"; title = "Brightness down"; ObjectID = "q5a-Ix-Hjs"; */ +"q5a-Ix-Hjs.title" = "Brightness down"; + /* Class = "NSMenuItem"; title = "Both standard and custom shortcuts"; ObjectID = "QDG-SA-mRX"; */ "QDG-SA-mRX.title" = "Zowel standaard als aangepaste sneltoetsen"; @@ -283,6 +319,9 @@ /* Class = "NSButtonCell"; title = "Combine hardware and software dimming"; ObjectID = "r76-Zc-x09"; */ "r76-Zc-x09.title" = "Combineer hardware en software dimmen"; +/* Class = "NSTextFieldCell"; title = "Enable Apple keyboard native key access"; ObjectID = "RBj-pU-aen"; */ +"RBj-pU-aen.title" = "Enable Apple keyboard native key access"; + /* Class = "NSMenuItem"; title = "Normal"; ObjectID = "Riq-uM-bTs"; */ "Riq-uM-bTs.title" = "Normaal"; @@ -358,6 +397,9 @@ /* Class = "NSMenuItem"; title = "Depends on mouse pointer position"; ObjectID = "Ytd-mg-N5E"; */ "Ytd-mg-N5E.title" = "Afhankelijk van de positie van de muisaanwijzer"; +/* Class = "NSTextFieldCell"; title = "Volume up"; ObjectID = "Z3w-eR-qDF"; */ +"Z3w-eR-qDF.title" = "Volume up"; + /* Class = "NSButtonCell"; title = "Use hardware DDC control"; ObjectID = "ZdU-gV-V05"; */ "ZdU-gV-V05.title" = "Gebruik hardwarematige DDC-besturing"; diff --git a/MonitorControl/UI/pt-BR.lproj/Main.strings b/MonitorControl/UI/pt-BR.lproj/Main.strings index 909578fd..36bdcd49 100644 --- a/MonitorControl/UI/pt-BR.lproj/Main.strings +++ b/MonitorControl/UI/pt-BR.lproj/Main.strings @@ -13,6 +13,9 @@ /* Class = "NSTextFieldCell"; title = "DDC min"; ObjectID = "1zE-fg-xEm"; */ "1zE-fg-xEm.title" = "DDC min"; +/* Class = "NSTextFieldCell"; title = "Volume down"; ObjectID = "21s-bv-GTK"; */ +"21s-bv-GTK.title" = "Volume down"; + /* Class = "NSMenuItem"; title = "Show separate controls for each display in menu"; ObjectID = "3eO-bN-ZRl"; */ "3eO-bN-ZRl.title" = "Mostrar controles separados para cada monitor no menu"; @@ -25,6 +28,9 @@ /* Class = "NSTextFieldCell"; title = "Using window focus might not work properly with full screen apps."; ObjectID = "4dX-o1-xAc"; */ "4dX-o1-xAc.title" = "Usar o foco da janela pode não funcionar com aplicativos em tela cheia."; +/* Class = "NSTextFieldCell"; title = "Welcome to MonitorControl"; ObjectID = "5J0-BD-top"; */ +"5J0-BD-top.title" = "Welcome to MonitorControl"; + /* Class = "NSButtonCell"; title = "Reset Preferences"; ObjectID = "5yT-5F-X5R"; */ "5yT-5F-X5R.title" = "Redefinir preferências"; @@ -43,6 +49,9 @@ /* Class = "NSButtonCell"; title = "Use fine OSD scale for brightness and contrast"; ObjectID = "8Q8-57-xnT"; */ "8Q8-57-xnT.title" = "Use escala fina de OSD para brilho e contraste"; +/* Class = "NSButtonCell"; title = "Start using MonitorControl"; ObjectID = "8WE-da-OZC"; */ +"8WE-da-OZC.title" = "Start using MonitorControl"; + /* Class = "NSButtonCell"; title = "Special thanks to our contributors!"; ObjectID = "95V-M4-2l5"; */ "95V-M4-2l5.title" = "Agradecimento especial para nossos colaboradores!"; @@ -61,6 +70,9 @@ /* Class = "NSMenuItem"; title = "Use audio device name to determine which display to control"; ObjectID = "AqF-uD-KCY"; */ "AqF-uD-KCY.title" = "Usar nome do dispositivo de áudio para determinar qual monitor controlar"; +/* Class = "NSTextFieldCell"; title = "Start at Login ?"; ObjectID = "bA1-GF-Y2n"; */ +"bA1-GF-Y2n.title" = "Start at Login ?"; + /* Class = "NSMenuItem"; title = "Show sliders only for the display currently showing the menu"; ObjectID = "bbf-sS-uGv"; */ "bbf-sS-uGv.title" = "Mostrar os controles deslizantes apenas para o monitor apresentado no menu"; @@ -187,18 +199,27 @@ /* Class = "NSButtonCell"; title = "Start at Login"; ObjectID = "j72-NF-zsW"; */ "j72-NF-zsW.title" = "Iniciar ao entrar"; +/* Class = "NSTextFieldCell"; title = "Toggle Mute"; ObjectID = "jK7-7w-uib"; */ +"jK7-7w-uib.title" = "Toggle Mute"; + /* Class = "NSMenuItem"; title = "Change for all screens"; ObjectID = "jSj-HB-T2t"; */ "jSj-HB-T2t.title" = "Alterar para todos os monitores"; /* Class = "NSButtonCell"; title = "Check for updates"; ObjectID = "jVH-oc-rUi"; */ "jVH-oc-rUi.title" = "Verificar atualizações"; +/* Class = "NSButtonCell"; title = "Start MonitorControl at Login"; ObjectID = "JWJ-OY-VtE"; */ +"JWJ-OY-VtE.title" = "Start MonitorControl at Login"; + /* Class = "NSTextFieldCell"; title = "Note: you can press Shift during startup for 'Safe mode' to restore defaults and avoid reading or setting anything."; ObjectID = "Jx2-gO-nq9"; */ "Jx2-gO-nq9.title" = "Nota: você pode pressionar Shift durante a inicialização para 'Modo de segurança' para restaurar os padrões e evitar carregar as configurações."; /* Class = "NSButtonCell"; title = "Enable for Apple branded and built-in displays as well"; ObjectID = "K6A-4z-1aQ"; */ "K6A-4z-1aQ.title" = "Habilite para monitores integrados e da Apple"; +/* Class = "NSTextFieldCell"; title = "MonitorControl needs access to \"accessibility\" to use macOS native keys to control your display.\nYou can enable it by adding MonitorControl in System Preferences > Security and Privacy > Accessibility."; ObjectID = "kBJ-Zf-1k2"; */ +"kBJ-Zf-1k2.title" = "MonitorControl needs access to \"accessibility\" to use macOS native keys to control your display.\nYou can enable it by adding MonitorControl in System Preferences > Security and Privacy > Accessibility."; + /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "Kfj-WK-aSL"; */ "Kfj-WK-aSL.title" = "Monitor para controlar:"; @@ -217,6 +238,9 @@ /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "ltL-gR-K3Z"; */ "ltL-gR-K3Z.title" = "Monitor para controlar:"; +/* Class = "NSTextFieldCell"; title = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; ObjectID = "Mh5-1A-apq"; */ +"Mh5-1A-apq.title" = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; + /* Class = "NSButtonCell"; title = "Enable slider snapping"; ObjectID = "MlU-hl-d46"; */ "MlU-hl-d46.title" = "Ativar ajuste de controle deslizante"; @@ -235,6 +259,12 @@ /* Class = "NSButtonCell"; title = "Avoid gamma table manipulation"; ObjectID = "na6-mS-MPi"; */ "na6-mS-MPi.title" = "Evite a manipulação da tabela gama"; +/* Class = "NSTextFieldCell"; title = "Ensure MonitorControl is always running when you need it by launching the app at startup."; ObjectID = "nk6-Gh-Mfs"; */ +"nk6-Gh-Mfs.title" = "Ensure MonitorControl is always running when you need it by launching the app at startup."; + +/* Class = "NSTextFieldCell"; title = "Brightness up"; ObjectID = "nty-g6-Sde"; */ +"nty-g6-Sde.title" = "Brightness up"; + /* Class = "NSButtonCell"; title = "Separate scales for combined hardware & software dimming"; ObjectID = "O8o-hI-8eR"; */ "O8o-hI-8eR.title" = "Escalas separadas para escurecimento combinado de hardware e software"; @@ -262,12 +292,18 @@ /* Class = "NSTextFieldCell"; title = "DDC max"; ObjectID = "psF-vX-AFB"; */ "psF-vX-AFB.title" = "Máximo DCC"; +/* Class = "NSButtonCell"; title = "Open System Preferences…"; ObjectID = "pVc-wG-Bdh"; */ +"pVc-wG-Bdh.title" = "Open System Preferences…"; + /* Class = "NSTextFieldCell"; title = "Use software dimming after the display reached zero hardware brightness for extended range. Works for DDC controlled displays only."; ObjectID = "PyY-p9-3NP"; */ "PyY-p9-3NP.title" = "Use o escurecimento do software depois que a tela atingir o brilho zero do hardware para uma faixa estendida. Funciona apenas para monitores controlados por DDC." /* Class = "NSMenuItem"; title = "Both standard and custom shortcuts"; ObjectID = "QDG-SA-mRX"; */ "QDG-SA-mRX.title" = "Atalhos padrão e personalizados"; +/* Class = "NSTextFieldCell"; title = "Brightness down"; ObjectID = "q5a-Ix-Hjs"; */ +"q5a-Ix-Hjs.title" = "Brightness down"; + /* Class = "NSMenuItem"; title = "Both standard and custom shortcuts"; ObjectID = "QDG-SA-mRX"; */ "QDG-SA-mRX.title" = "Both standard and custom shortcuts"; @@ -286,6 +322,9 @@ /* Class = "NSButtonCell"; title = "Combine hardware and software dimming"; ObjectID = "r76-Zc-x09"; */ "r76-Zc-x09.title" = "Combine escurecimento de hardware e software"; +/* Class = "NSTextFieldCell"; title = "Enable Apple keyboard native key access"; ObjectID = "RBj-pU-aen"; */ +"RBj-pU-aen.title" = "Enable Apple keyboard native key access"; + /* Class = "NSMenuItem"; title = "Normal"; ObjectID = "Riq-uM-bTs"; */ "Riq-uM-bTs.title" = "Normal"; @@ -361,6 +400,9 @@ /* Class = "NSMenuItem"; title = "Depends on mouse pointer position"; ObjectID = "Ytd-mg-N5E"; */ "Ytd-mg-N5E.title" = "Depende da posição do ponteiro do mouse"; +/* Class = "NSTextFieldCell"; title = "Volume up"; ObjectID = "Z3w-eR-qDF"; */ +"Z3w-eR-qDF.title" = "Volume up"; + /* Class = "NSButtonCell"; title = "Use hardware DDC control"; ObjectID = "ZdU-gV-V05"; */ "ZdU-gV-V05.title" = "Use o controle de hardware DDC"; diff --git a/MonitorControl/UI/tr.lproj/Main.strings b/MonitorControl/UI/tr.lproj/Main.strings index 0ffac8a8..fd426f94 100644 --- a/MonitorControl/UI/tr.lproj/Main.strings +++ b/MonitorControl/UI/tr.lproj/Main.strings @@ -13,6 +13,9 @@ /* Class = "NSTextFieldCell"; title = "DDC min"; ObjectID = "1zE-fg-xEm"; */ "1zE-fg-xEm.title" = "DDC min"; +/* Class = "NSTextFieldCell"; title = "Volume down"; ObjectID = "21s-bv-GTK"; */ +"21s-bv-GTK.title" = "Volume down"; + /* Class = "NSMenuItem"; title = "Show separate controls for each display in menu"; ObjectID = "3eO-bN-ZRl"; */ "3eO-bN-ZRl.title" = "Menüdeki her ekran için ayrı kontroller göster"; @@ -25,6 +28,9 @@ /* Class = "NSTextFieldCell"; title = "Using window focus might not work properly with full screen apps."; ObjectID = "4dX-o1-xAc"; */ "4dX-o1-xAc.title" = "Bunun yerine pencere odağını kullanmak, tam ekran uygulamalarla iyi çalışmayabilir."; +/* Class = "NSTextFieldCell"; title = "Welcome to MonitorControl"; ObjectID = "5J0-BD-top"; */ +"5J0-BD-top.title" = "Welcome to MonitorControl"; + /* Class = "NSButtonCell"; title = "Reset Preferences"; ObjectID = "5yT-5F-X5R"; */ "5yT-5F-X5R.title" = "Ayarları Sıfırla"; @@ -43,6 +49,9 @@ /* Class = "NSButtonCell"; title = "Use fine OSD scale for brightness and contrast"; ObjectID = "8Q8-57-xnT"; */ "8Q8-57-xnT.title" = "Hassas OSD ölçeğini kullanın"; +/* Class = "NSButtonCell"; title = "Start using MonitorControl"; ObjectID = "8WE-da-OZC"; */ +"8WE-da-OZC.title" = "Start using MonitorControl"; + /* Class = "NSButtonCell"; title = "Special thanks to our contributors!"; ObjectID = "95V-M4-2l5"; */ "95V-M4-2l5.title" = "Katkıda bulunanlarımıza özel teşekkürler!"; @@ -61,6 +70,9 @@ /* Class = "NSMenuItem"; title = "Use audio device name to determine which display to control"; ObjectID = "AqF-uD-KCY"; */ "AqF-uD-KCY.title" = "Hangi ekranın kontrol edileceğini belirlemek için ses cihazı adını kullanın"; +/* Class = "NSTextFieldCell"; title = "Start at Login ?"; ObjectID = "bA1-GF-Y2n"; */ +"bA1-GF-Y2n.title" = "Start at Login ?"; + /* Class = "NSMenuItem"; title = "Show sliders only for the display currently showing the menu"; ObjectID = "bbf-sS-uGv"; */ "bbf-sS-uGv.title" = "Kaydırıcıları yalnızca o anda menüyü gösteren ekran için göster"; @@ -187,18 +199,27 @@ /* Class = "NSButtonCell"; title = "Start at Login"; ObjectID = "j72-NF-zsW"; */ "j72-NF-zsW.title" = "Başlangıçta çalıştır"; +/* Class = "NSTextFieldCell"; title = "Toggle Mute"; ObjectID = "jK7-7w-uib"; */ +"jK7-7w-uib.title" = "Toggle Mute"; + /* Class = "NSMenuItem"; title = "Change for all screens"; ObjectID = "jSj-HB-T2t"; */ "jSj-HB-T2t.title" = "Tüm ekranlarda değiştir"; /* Class = "NSButtonCell"; title = "Check for updates"; ObjectID = "jVH-oc-rUi"; */ "jVH-oc-rUi.title" = "Güncellemeleri denetle"; +/* Class = "NSButtonCell"; title = "Start MonitorControl at Login"; ObjectID = "JWJ-OY-VtE"; */ +"JWJ-OY-VtE.title" = "Start MonitorControl at Login"; + /* Class = "NSTextFieldCell"; title = "Note: you can press Shift during startup for 'Safe mode' to restore defaults and avoid reading or setting anything."; ObjectID = "Jx2-gO-nq9"; */ "Jx2-gO-nq9.title" = "Not: Varsayılanları geri yüklemek ve herhangi bir şeyi okumaktan veya ayarlamaktan kaçınmak için 'Güvenli mod' için başlatma sırasında Shift tuşuna basabilirsiniz."; /* Class = "NSButtonCell"; title = "Enable for Apple branded and built-in displays as well"; ObjectID = "K6A-4z-1aQ"; */ "K6A-4z-1aQ.title" = "Apple markalı ve yerleşik ekranlar için de etkinleştirin"; +/* Class = "NSTextFieldCell"; title = "MonitorControl needs access to \"accessibility\" to use macOS native keys to control your display.\nYou can enable it by adding MonitorControl in System Preferences > Security and Privacy > Accessibility."; ObjectID = "kBJ-Zf-1k2"; */ +"kBJ-Zf-1k2.title" = "MonitorControl needs access to \"accessibility\" to use macOS native keys to control your display.\nYou can enable it by adding MonitorControl in System Preferences > Security and Privacy > Accessibility."; + /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "Kfj-WK-aSL"; */ "Kfj-WK-aSL.title" = "Kontrol edilecek ekran:"; @@ -217,6 +238,9 @@ /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "ltL-gR-K3Z"; */ "ltL-gR-K3Z.title" = "Kontrol edilecek ekran:"; +/* Class = "NSTextFieldCell"; title = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; ObjectID = "Mh5-1A-apq"; */ +"Mh5-1A-apq.title" = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; + /* Class = "NSButtonCell"; title = "Enable slider snapping"; ObjectID = "MlU-hl-d46"; */ "MlU-hl-d46.title" = "Kaydırıcı yakalamayı etkinleştir"; @@ -235,6 +259,12 @@ /* Class = "NSButtonCell"; title = "Avoid gamma table manipulation"; ObjectID = "na6-mS-MPi"; */ "na6-mS-MPi.title" = "Gama tablosu manipülasyonundan kaçının"; +/* Class = "NSTextFieldCell"; title = "Ensure MonitorControl is always running when you need it by launching the app at startup."; ObjectID = "nk6-Gh-Mfs"; */ +"nk6-Gh-Mfs.title" = "Ensure MonitorControl is always running when you need it by launching the app at startup."; + +/* Class = "NSTextFieldCell"; title = "Brightness up"; ObjectID = "nty-g6-Sde"; */ +"nty-g6-Sde.title" = "Brightness up"; + /* Class = "NSButtonCell"; title = "Separate scales for combined hardware & software dimming"; ObjectID = "O8o-hI-8eR"; */ "O8o-hI-8eR.title" = "Birleşik donanım ve yazılım karartması için ayrı dengeler"; @@ -262,9 +292,15 @@ /* Class = "NSTextFieldCell"; title = "DDC max"; ObjectID = "psF-vX-AFB"; */ "psF-vX-AFB.title" = "En yüksek DDC"; +/* Class = "NSButtonCell"; title = "Open System Preferences…"; ObjectID = "pVc-wG-Bdh"; */ +"pVc-wG-Bdh.title" = "Open System Preferences…"; + /* Class = "NSTextFieldCell"; title = "Use software dimming after the display reached zero hardware brightness for extended range. Works for DDC controlled displays only."; ObjectID = "PyY-p9-3NP"; */ "PyY-p9-3NP.title" = "Genişletilmiş aralık için ekran sıfır donanım parlaklığına ulaştıktan sonra yazılım karartmasını kullanın. Yalnızca DDC kontrollü ekranlar için çalışır."; +/* Class = "NSTextFieldCell"; title = "Brightness down"; ObjectID = "q5a-Ix-Hjs"; */ +"q5a-Ix-Hjs.title" = "Brightness down"; + /* Class = "NSMenuItem"; title = "Both standard and custom shortcuts"; ObjectID = "QDG-SA-mRX"; */ "QDG-SA-mRX.title" = "Hem standart hem de özel kısayollar"; @@ -283,6 +319,9 @@ /* Class = "NSButtonCell"; title = "Combine hardware and software dimming"; ObjectID = "r76-Zc-x09"; */ "r76-Zc-x09.title" = "Donanım ve yazılım karartmasını birleştirin"; +/* Class = "NSTextFieldCell"; title = "Enable Apple keyboard native key access"; ObjectID = "RBj-pU-aen"; */ +"RBj-pU-aen.title" = "Enable Apple keyboard native key access"; + /* Class = "NSMenuItem"; title = "Normal"; ObjectID = "Riq-uM-bTs"; */ "Riq-uM-bTs.title" = "Normal"; @@ -358,6 +397,9 @@ /* Class = "NSMenuItem"; title = "Depends on mouse pointer position"; ObjectID = "Ytd-mg-N5E"; */ "Ytd-mg-N5E.title" = "Fare işaretçisinin konumuna bağlıdır"; +/* Class = "NSTextFieldCell"; title = "Volume up"; ObjectID = "Z3w-eR-qDF"; */ +"Z3w-eR-qDF.title" = "Volume up"; + /* Class = "NSButtonCell"; title = "Use hardware DDC control"; ObjectID = "ZdU-gV-V05"; */ "ZdU-gV-V05.title" = "Donanım DDC kontrolünü kullan"; diff --git a/MonitorControl/UI/zh-Hans.lproj/Main.strings b/MonitorControl/UI/zh-Hans.lproj/Main.strings index 58457e69..2372da12 100644 --- a/MonitorControl/UI/zh-Hans.lproj/Main.strings +++ b/MonitorControl/UI/zh-Hans.lproj/Main.strings @@ -13,6 +13,9 @@ /* Class = "NSTextFieldCell"; title = "DDC min"; ObjectID = "1zE-fg-xEm"; */ "1zE-fg-xEm.title" = "DDC最小值"; +/* Class = "NSTextFieldCell"; title = "Volume down"; ObjectID = "21s-bv-GTK"; */ +"21s-bv-GTK.title" = "Volume down"; + /* Class = "NSMenuItem"; title = "Show separate controls for each display in menu"; ObjectID = "3eO-bN-ZRl"; */ "3eO-bN-ZRl.title" = "显示各个显示器的控制滑杆"; @@ -25,6 +28,9 @@ /* Class = "NSTextFieldCell"; title = "Using window focus might not work properly with full screen apps."; ObjectID = "4dX-o1-xAc"; */ "4dX-o1-xAc.title" = "启用后软件全屏时效果可能不理想。"; +/* Class = "NSTextFieldCell"; title = "Welcome to MonitorControl"; ObjectID = "5J0-BD-top"; */ +"5J0-BD-top.title" = "Welcome to MonitorControl"; + /* Class = "NSButtonCell"; title = "Reset Preferences"; ObjectID = "5yT-5F-X5R"; */ "5yT-5F-X5R.title" = "重置设置"; @@ -43,6 +49,9 @@ /* Class = "NSButtonCell"; title = "Use fine OSD scale for brightness and contrast"; ObjectID = "8Q8-57-xnT"; */ "8Q8-57-xnT.title" = "使用精细的OSD刻度"; +/* Class = "NSButtonCell"; title = "Start using MonitorControl"; ObjectID = "8WE-da-OZC"; */ +"8WE-da-OZC.title" = "Start using MonitorControl"; + /* Class = "NSButtonCell"; title = "Special thanks to our contributors!"; ObjectID = "95V-M4-2l5"; */ "95V-M4-2l5.title" = "特别感谢我们的贡献者们!"; @@ -61,6 +70,9 @@ /* Class = "NSMenuItem"; title = "Use audio device name to determine which display to control"; ObjectID = "AqF-uD-KCY"; */ "AqF-uD-KCY.title" = "以音频设备名称判断控制哪个显示器"; +/* Class = "NSTextFieldCell"; title = "Start at Login ?"; ObjectID = "bA1-GF-Y2n"; */ +"bA1-GF-Y2n.title" = "Start at Login ?"; + /* Class = "NSMenuItem"; title = "Show sliders only for the display currently showing the menu"; ObjectID = "bbf-sS-uGv"; */ "bbf-sS-uGv.title" = "仅显示当前显示器的滑杆介面"; @@ -187,18 +199,27 @@ /* Class = "NSButtonCell"; title = "Start at Login"; ObjectID = "j72-NF-zsW"; */ "j72-NF-zsW.title" = "登录时启动"; +/* Class = "NSTextFieldCell"; title = "Toggle Mute"; ObjectID = "jK7-7w-uib"; */ +"jK7-7w-uib.title" = "Toggle Mute"; + /* Class = "NSMenuItem"; title = "Change for all screens"; ObjectID = "jSj-HB-T2t"; */ "jSj-HB-T2t.title" = "所有显示器"; /* Class = "NSButtonCell"; title = "Check for updates"; ObjectID = "jVH-oc-rUi"; */ "jVH-oc-rUi.title" = "检查更新"; +/* Class = "NSButtonCell"; title = "Start MonitorControl at Login"; ObjectID = "JWJ-OY-VtE"; */ +"JWJ-OY-VtE.title" = "Start MonitorControl at Login"; + /* Class = "NSTextFieldCell"; title = "Note: you can press Shift during startup for 'Safe mode' to restore defaults and avoid reading or setting anything."; ObjectID = "Jx2-gO-nq9"; */ "Jx2-gO-nq9.title" = "注:启动时按下Shift进入「安全模式」以恢复原始设置并避免读取或更动任何设置。"; /* Class = "NSButtonCell"; title = "Enable for Apple branded and built-in displays as well"; ObjectID = "K6A-4z-1aQ"; */ "K6A-4z-1aQ.title" = "苹果和内置的显示器"; +/* Class = "NSTextFieldCell"; title = "MonitorControl needs access to \"accessibility\" to use macOS native keys to control your display.\nYou can enable it by adding MonitorControl in System Preferences > Security and Privacy > Accessibility."; ObjectID = "kBJ-Zf-1k2"; */ +"kBJ-Zf-1k2.title" = "MonitorControl needs access to \"accessibility\" to use macOS native keys to control your display.\nYou can enable it by adding MonitorControl in System Preferences > Security and Privacy > Accessibility."; + /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "Kfj-WK-aSL"; */ "Kfj-WK-aSL.title" = "控制的显示器:"; @@ -217,6 +238,9 @@ /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "ltL-gR-K3Z"; */ "ltL-gR-K3Z.title" = "控制的显示器:"; +/* Class = "NSTextFieldCell"; title = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; ObjectID = "Mh5-1A-apq"; */ +"Mh5-1A-apq.title" = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; + /* Class = "NSButtonCell"; title = "Enable slider snapping"; ObjectID = "MlU-hl-d46"; */ "MlU-hl-d46.title" = "启用滑杆定位"; @@ -235,6 +259,12 @@ /* Class = "NSButtonCell"; title = "Avoid gamma table manipulation"; ObjectID = "na6-mS-MPi"; */ "na6-mS-MPi.title" = "避免设置伽马值"; +/* Class = "NSTextFieldCell"; title = "Ensure MonitorControl is always running when you need it by launching the app at startup."; ObjectID = "nk6-Gh-Mfs"; */ +"nk6-Gh-Mfs.title" = "Ensure MonitorControl is always running when you need it by launching the app at startup."; + +/* Class = "NSTextFieldCell"; title = "Brightness up"; ObjectID = "nty-g6-Sde"; */ +"nty-g6-Sde.title" = "Brightness up"; + /* Class = "NSButtonCell"; title = "Separate scales for combined hardware & software dimming"; ObjectID = "O8o-hI-8eR"; */ "O8o-hI-8eR.title" = "使用硬件结合软件调整时忽略软件调整的范围"; @@ -262,9 +292,15 @@ /* Class = "NSTextFieldCell"; title = "DDC max"; ObjectID = "psF-vX-AFB"; */ "psF-vX-AFB.title" = "DDC最大值"; +/* Class = "NSButtonCell"; title = "Open System Preferences…"; ObjectID = "pVc-wG-Bdh"; */ +"pVc-wG-Bdh.title" = "Open System Preferences…"; + /* Class = "NSTextFieldCell"; title = "Use software dimming after the display reached zero hardware brightness for extended range. Works for DDC controlled displays only."; ObjectID = "PyY-p9-3NP"; */ "PyY-p9-3NP.title" = "当显示器的硬件设置亮度为0时以软件进一步降低亮度(仅适用于以DDC控制的显示器)。"; +/* Class = "NSTextFieldCell"; title = "Brightness down"; ObjectID = "q5a-Ix-Hjs"; */ +"q5a-Ix-Hjs.title" = "Brightness down"; + /* Class = "NSMenuItem"; title = "Both standard and custom shortcuts"; ObjectID = "QDG-SA-mRX"; */ "QDG-SA-mRX.title" = "标准及自定义快捷键"; @@ -283,6 +319,9 @@ /* Class = "NSButtonCell"; title = "Combine hardware and software dimming"; ObjectID = "r76-Zc-x09"; */ "r76-Zc-x09.title" = "结合硬件与软件的亮度控制"; +/* Class = "NSTextFieldCell"; title = "Enable Apple keyboard native key access"; ObjectID = "RBj-pU-aen"; */ +"RBj-pU-aen.title" = "Enable Apple keyboard native key access"; + /* Class = "NSMenuItem"; title = "Normal"; ObjectID = "Riq-uM-bTs"; */ "Riq-uM-bTs.title" = "正常"; @@ -358,6 +397,9 @@ /* Class = "NSMenuItem"; title = "Depends on mouse pointer position"; ObjectID = "Ytd-mg-N5E"; */ "Ytd-mg-N5E.title" = "取决于鼠标指针位置"; +/* Class = "NSTextFieldCell"; title = "Volume up"; ObjectID = "Z3w-eR-qDF"; */ +"Z3w-eR-qDF.title" = "Volume up"; + /* Class = "NSButtonCell"; title = "Use hardware DDC control"; ObjectID = "ZdU-gV-V05"; */ "ZdU-gV-V05.title" = "使用硬件DDC控制"; diff --git a/MonitorControl/UI/zh-Hant-TW.lproj/Main.strings b/MonitorControl/UI/zh-Hant-TW.lproj/Main.strings index 1ab14876..145bfcbe 100644 --- a/MonitorControl/UI/zh-Hant-TW.lproj/Main.strings +++ b/MonitorControl/UI/zh-Hant-TW.lproj/Main.strings @@ -13,6 +13,9 @@ /* Class = "NSTextFieldCell"; title = "DDC min"; ObjectID = "1zE-fg-xEm"; */ "1zE-fg-xEm.title" = "DDC最小值"; +/* Class = "NSTextFieldCell"; title = "Volume down"; ObjectID = "21s-bv-GTK"; */ +"21s-bv-GTK.title" = "Volume down"; + /* Class = "NSMenuItem"; title = "Show separate controls for each display in menu"; ObjectID = "3eO-bN-ZRl"; */ "3eO-bN-ZRl.title" = "顯示各個螢幕的控制滑桿"; @@ -25,6 +28,9 @@ /* Class = "NSTextFieldCell"; title = "Using window focus might not work properly with full screen apps."; ObjectID = "4dX-o1-xAc"; */ "4dX-o1-xAc.title" = "啟用後當使用全螢幕Apps時效果可能不佳。"; +/* Class = "NSTextFieldCell"; title = "Welcome to MonitorControl"; ObjectID = "5J0-BD-top"; */ +"5J0-BD-top.title" = "Welcome to MonitorControl"; + /* Class = "NSButtonCell"; title = "Reset Preferences"; ObjectID = "5yT-5F-X5R"; */ "5yT-5F-X5R.title" = "重置設定"; @@ -43,6 +49,9 @@ /* Class = "NSButtonCell"; title = "Use fine OSD scale for brightness and contrast"; ObjectID = "8Q8-57-xnT"; */ "8Q8-57-xnT.title" = "使用精細的OSD刻度"; +/* Class = "NSButtonCell"; title = "Start using MonitorControl"; ObjectID = "8WE-da-OZC"; */ +"8WE-da-OZC.title" = "Start using MonitorControl"; + /* Class = "NSButtonCell"; title = "Special thanks to our contributors!"; ObjectID = "95V-M4-2l5"; */ "95V-M4-2l5.title" = "特別感謝我們的貢獻者們!"; @@ -61,6 +70,9 @@ /* Class = "NSMenuItem"; title = "Use audio device name to determine which display to control"; ObjectID = "AqF-uD-KCY"; */ "AqF-uD-KCY.title" = "以音訊裝置名稱判斷控制哪個螢幕"; +/* Class = "NSTextFieldCell"; title = "Start at Login ?"; ObjectID = "bA1-GF-Y2n"; */ +"bA1-GF-Y2n.title" = "Start at Login ?"; + /* Class = "NSMenuItem"; title = "Show sliders only for the display currently showing the menu"; ObjectID = "bbf-sS-uGv"; */ "bbf-sS-uGv.title" = "僅顯示當前螢幕的滑桿介面"; @@ -187,18 +199,27 @@ /* Class = "NSButtonCell"; title = "Start at Login"; ObjectID = "j72-NF-zsW"; */ "j72-NF-zsW.title" = "登入時啟動"; +/* Class = "NSTextFieldCell"; title = "Toggle Mute"; ObjectID = "jK7-7w-uib"; */ +"jK7-7w-uib.title" = "Toggle Mute"; + /* Class = "NSMenuItem"; title = "Change for all screens"; ObjectID = "jSj-HB-T2t"; */ "jSj-HB-T2t.title" = "所有螢幕"; /* Class = "NSButtonCell"; title = "Check for updates"; ObjectID = "jVH-oc-rUi"; */ "jVH-oc-rUi.title" = "檢查更新"; +/* Class = "NSButtonCell"; title = "Start MonitorControl at Login"; ObjectID = "JWJ-OY-VtE"; */ +"JWJ-OY-VtE.title" = "Start MonitorControl at Login"; + /* Class = "NSTextFieldCell"; title = "Note: you can press Shift during startup for 'Safe mode' to restore defaults and avoid reading or setting anything."; ObjectID = "Jx2-gO-nq9"; */ "Jx2-gO-nq9.title" = "註:啟動時按下Shift進入「安全模式」以恢復原始設定並避免讀取或更動任何設定。"; /* Class = "NSButtonCell"; title = "Enable for Apple branded and built-in displays as well"; ObjectID = "K6A-4z-1aQ"; */ "K6A-4z-1aQ.title" = "蘋果和內建的螢幕"; +/* Class = "NSTextFieldCell"; title = "MonitorControl needs access to \"accessibility\" to use macOS native keys to control your display.\nYou can enable it by adding MonitorControl in System Preferences > Security and Privacy > Accessibility."; ObjectID = "kBJ-Zf-1k2"; */ +"kBJ-Zf-1k2.title" = "MonitorControl needs access to \"accessibility\" to use macOS native keys to control your display.\nYou can enable it by adding MonitorControl in System Preferences > Security and Privacy > Accessibility."; + /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "Kfj-WK-aSL"; */ "Kfj-WK-aSL.title" = "控制的螢幕:"; @@ -217,6 +238,9 @@ /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "ltL-gR-K3Z"; */ "ltL-gR-K3Z.title" = "控制的螢幕:"; +/* Class = "NSTextFieldCell"; title = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; ObjectID = "Mh5-1A-apq"; */ +"Mh5-1A-apq.title" = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; + /* Class = "NSButtonCell"; title = "Enable slider snapping"; ObjectID = "MlU-hl-d46"; */ "MlU-hl-d46.title" = "啟用滑桿定位"; @@ -235,6 +259,12 @@ /* Class = "NSButtonCell"; title = "Avoid gamma table manipulation"; ObjectID = "na6-mS-MPi"; */ "na6-mS-MPi.title" = "避免調整伽瑪值"; +/* Class = "NSTextFieldCell"; title = "Ensure MonitorControl is always running when you need it by launching the app at startup."; ObjectID = "nk6-Gh-Mfs"; */ +"nk6-Gh-Mfs.title" = "Ensure MonitorControl is always running when you need it by launching the app at startup."; + +/* Class = "NSTextFieldCell"; title = "Brightness up"; ObjectID = "nty-g6-Sde"; */ +"nty-g6-Sde.title" = "Brightness up"; + /* Class = "NSButtonCell"; title = "Separate scales for combined hardware & software dimming"; ObjectID = "O8o-hI-8eR"; */ "O8o-hI-8eR.title" = "使用硬體結合軟體調整時忽略軟體調整的範圍"; @@ -262,9 +292,15 @@ /* Class = "NSTextFieldCell"; title = "DDC max"; ObjectID = "psF-vX-AFB"; */ "psF-vX-AFB.title" = "DDC最大值"; +/* Class = "NSButtonCell"; title = "Open System Preferences…"; ObjectID = "pVc-wG-Bdh"; */ +"pVc-wG-Bdh.title" = "Open System Preferences…"; + /* Class = "NSTextFieldCell"; title = "Use software dimming after the display reached zero hardware brightness for extended range. Works for DDC controlled displays only."; ObjectID = "PyY-p9-3NP"; */ "PyY-p9-3NP.title" = "當螢幕的硬體設定亮度為0時以軟體進一步降低亮度(僅適用於以DDC控制的螢幕)。"; +/* Class = "NSTextFieldCell"; title = "Brightness down"; ObjectID = "q5a-Ix-Hjs"; */ +"q5a-Ix-Hjs.title" = "Brightness down"; + /* Class = "NSMenuItem"; title = "Both standard and custom shortcuts"; ObjectID = "QDG-SA-mRX"; */ "QDG-SA-mRX.title" = "標準及自定義快捷鍵"; @@ -283,6 +319,9 @@ /* Class = "NSButtonCell"; title = "Combine hardware and software dimming"; ObjectID = "r76-Zc-x09"; */ "r76-Zc-x09.title" = "結合硬體與軟體的亮度控制"; +/* Class = "NSTextFieldCell"; title = "Enable Apple keyboard native key access"; ObjectID = "RBj-pU-aen"; */ +"RBj-pU-aen.title" = "Enable Apple keyboard native key access"; + /* Class = "NSMenuItem"; title = "Normal"; ObjectID = "Riq-uM-bTs"; */ "Riq-uM-bTs.title" = "正常"; @@ -358,6 +397,9 @@ /* Class = "NSMenuItem"; title = "Depends on mouse pointer position"; ObjectID = "Ytd-mg-N5E"; */ "Ytd-mg-N5E.title" = "取決於鼠標指針位置"; +/* Class = "NSTextFieldCell"; title = "Volume up"; ObjectID = "Z3w-eR-qDF"; */ +"Z3w-eR-qDF.title" = "Volume up"; + /* Class = "NSButtonCell"; title = "Use hardware DDC control"; ObjectID = "ZdU-gV-V05"; */ "ZdU-gV-V05.title" = "使用硬體DDC控制"; diff --git a/MonitorControl/View Controllers/Onboarding/OnboardingViewController.swift b/MonitorControl/View Controllers/Onboarding/OnboardingViewController.swift new file mode 100644 index 00000000..782fd85a --- /dev/null +++ b/MonitorControl/View Controllers/Onboarding/OnboardingViewController.swift @@ -0,0 +1,26 @@ +// Copyright © MonitorControl. @JoniVR, @theOneyouseek, @waydabber and others + +import Cocoa + +class OnboardingViewController: NSViewController { + override func viewDidLoad() { + super.viewDidLoad() + } + + // MARK: - Actions + + @IBAction func toggleStartAtLoginTouched(_ sender: NSButton) { + app.setStartAtLogin(enabled: sender.state == .on) + } + + @IBAction func askForPermissionsButtonTouched(_: NSButton) { + app.checkPermissions(firstAsk: true) + } + + @IBAction func closeButtonTouched(_: NSButton) { + self.view.window?.close() + DispatchQueue.main.async { + app.statusItem.button?.performClick(self) + } + } +} diff --git a/MonitorControl/View Controllers/AboutPrefsViewController.swift b/MonitorControl/View Controllers/Preferences/AboutPrefsViewController.swift similarity index 100% rename from MonitorControl/View Controllers/AboutPrefsViewController.swift rename to MonitorControl/View Controllers/Preferences/AboutPrefsViewController.swift diff --git a/MonitorControl/View Controllers/DisplaysPrefsCellView.swift b/MonitorControl/View Controllers/Preferences/DisplaysPrefsCellView.swift similarity index 100% rename from MonitorControl/View Controllers/DisplaysPrefsCellView.swift rename to MonitorControl/View Controllers/Preferences/DisplaysPrefsCellView.swift diff --git a/MonitorControl/View Controllers/DisplaysPrefsViewController.swift b/MonitorControl/View Controllers/Preferences/DisplaysPrefsViewController.swift similarity index 100% rename from MonitorControl/View Controllers/DisplaysPrefsViewController.swift rename to MonitorControl/View Controllers/Preferences/DisplaysPrefsViewController.swift diff --git a/MonitorControl/View Controllers/KeyboardPrefsViewController.swift b/MonitorControl/View Controllers/Preferences/KeyboardPrefsViewController.swift similarity index 100% rename from MonitorControl/View Controllers/KeyboardPrefsViewController.swift rename to MonitorControl/View Controllers/Preferences/KeyboardPrefsViewController.swift diff --git a/MonitorControl/View Controllers/MainPrefsViewController.swift b/MonitorControl/View Controllers/Preferences/MainPrefsViewController.swift similarity index 100% rename from MonitorControl/View Controllers/MainPrefsViewController.swift rename to MonitorControl/View Controllers/Preferences/MainPrefsViewController.swift diff --git a/MonitorControl/View Controllers/MenuslidersPrefsViewController.swift b/MonitorControl/View Controllers/Preferences/MenuslidersPrefsViewController.swift similarity index 100% rename from MonitorControl/View Controllers/MenuslidersPrefsViewController.swift rename to MonitorControl/View Controllers/Preferences/MenuslidersPrefsViewController.swift diff --git a/MonitorControl/main.swift b/MonitorControl/main.swift index dccb5395..a967f266 100644 --- a/MonitorControl/main.swift +++ b/MonitorControl/main.swift @@ -3,24 +3,30 @@ import Cocoa import Foundation +// Debug let DEBUG_SW = false let DEBUG_VIRTUAL = false let DEBUG_MACOS10 = false let DEBUG_GAMMA_ENFORCER = false let DDC_MAX_DETECT_LIMIT: Int = 100 +// Version let MIN_PREVIOUS_BUILD_NUMBER = 6262 +// App var app: AppDelegate! var menu: MenuHandler! let prefs = UserDefaults.standard -let storyboard = NSStoryboard(name: "Main", bundle: Bundle.main) + +// Views +private let storyboard = NSStoryboard(name: "Main", bundle: Bundle.main) let mainPrefsVc = storyboard.instantiateController(withIdentifier: "MainPrefsVC") as? MainPrefsViewController let displaysPrefsVc = storyboard.instantiateController(withIdentifier: "DisplaysPrefsVC") as? DisplaysPrefsViewController let menuslidersPrefsVc = storyboard.instantiateController(withIdentifier: "MenuslidersPrefsVC") as? MenuslidersPrefsViewController let keyboardPrefsVc = storyboard.instantiateController(withIdentifier: "KeyboardPrefsVC") as? KeyboardPrefsViewController let aboutPrefsVc = storyboard.instantiateController(withIdentifier: "AboutPrefsVC") as? AboutPrefsViewController +let onboardingVc = storyboard.instantiateController(withIdentifier: "onboardingViewController") as? NSWindowController autoreleasepool { () -> Void in let mc = NSApplication.shared diff --git a/MonitorControlHelper/Info.plist b/MonitorControlHelper/Info.plist index 7284ba43..cc964576 100644 --- a/MonitorControlHelper/Info.plist +++ b/MonitorControlHelper/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 6970 + 7000 LSApplicationCategoryType public.app-category.utilities LSBackgroundOnly From 24d17f5ae69e2fcc0071e505ad8c18511a573cfa Mon Sep 17 00:00:00 2001 From: Istvan Toth <37590873+waydabber@users.noreply.github.com> Date: Tue, 1 Feb 2022 15:18:29 +0100 Subject: [PATCH 023/101] Hungarian translation for onboarding + some minor translation fixes (#918) --- MonitorControl/Info.plist | 2 +- MonitorControl/UI/Base.lproj/Main.storyboard | 16 +++++----- MonitorControl/UI/de.lproj/Main.strings | 8 ++--- MonitorControl/UI/en.lproj/Main.strings | 8 ++--- MonitorControl/UI/es.lproj/Main.strings | 8 ++--- MonitorControl/UI/fr.lproj/Main.strings | 4 +-- .../UI/hu.lproj/Localizable.strings | 2 +- MonitorControl/UI/hu.lproj/Main.strings | 32 +++++++++---------- MonitorControl/UI/it.lproj/Main.strings | 8 ++--- MonitorControl/UI/ko.lproj/Main.strings | 8 ++--- MonitorControl/UI/nl.lproj/Main.strings | 8 ++--- MonitorControl/UI/pt-BR.lproj/Main.strings | 8 ++--- MonitorControl/UI/tr.lproj/Main.strings | 8 ++--- MonitorControl/UI/zh-Hans.lproj/Main.strings | 8 ++--- .../UI/zh-Hant-TW.lproj/Main.strings | 8 ++--- MonitorControlHelper/Info.plist | 2 +- 16 files changed, 69 insertions(+), 69 deletions(-) diff --git a/MonitorControl/Info.plist b/MonitorControl/Info.plist index a6276e04..c2c93332 100644 --- a/MonitorControl/Info.plist +++ b/MonitorControl/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 7000 + 7027 LSApplicationCategoryType public.app-category.utilities LSMinimumSystemVersion diff --git a/MonitorControl/UI/Base.lproj/Main.storyboard b/MonitorControl/UI/Base.lproj/Main.storyboard index 56bedbbf..1e30d126 100644 --- a/MonitorControl/UI/Base.lproj/Main.storyboard +++ b/MonitorControl/UI/Base.lproj/Main.storyboard @@ -1250,7 +1250,7 @@ - + @@ -2133,13 +2133,13 @@ - Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys. + Control your external displays brightness, contrast and volume directly from your Mac, using menulet sliders or the keyboard, including native Apple keys. - + @@ -2148,8 +2148,8 @@ - - + + @@ -2221,7 +2221,7 @@ - + @@ -2274,7 +2274,7 @@ DQ - + @@ -2296,7 +2296,7 @@ DQ - + diff --git a/MonitorControl/UI/de.lproj/Main.strings b/MonitorControl/UI/de.lproj/Main.strings index 3b1b0691..9569b043 100644 --- a/MonitorControl/UI/de.lproj/Main.strings +++ b/MonitorControl/UI/de.lproj/Main.strings @@ -70,8 +70,8 @@ /* Class = "NSMenuItem"; title = "Use audio device name to determine which display to control"; ObjectID = "AqF-uD-KCY"; */ "AqF-uD-KCY.title" = "Verwenden des Namens des Audiogeräts, um zu bestimmen, welcher Monitor gesteuert werden soll"; -/* Class = "NSTextFieldCell"; title = "Start at Login ?"; ObjectID = "bA1-GF-Y2n"; */ -"bA1-GF-Y2n.title" = "Start at Login ?"; +/* Class = "NSTextFieldCell"; title = "Start at Login?"; ObjectID = "bA1-GF-Y2n"; */ +"bA1-GF-Y2n.title" = "Start at Login?"; /* Class = "NSMenuItem"; title = "Show sliders only for the display currently showing the menu"; ObjectID = "bbf-sS-uGv"; */ "bbf-sS-uGv.title" = "Regler nur für den Monitor anzeigen, auf dem das Menü gerade angezeigt wird"; @@ -238,8 +238,8 @@ /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "ltL-gR-K3Z"; */ "ltL-gR-K3Z.title" = "Monitor für Steuerung:"; -/* Class = "NSTextFieldCell"; title = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; ObjectID = "Mh5-1A-apq"; */ -"Mh5-1A-apq.title" = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; +/* Class = "NSTextFieldCell"; title = "Control your external displays brightness, contrast and volume directly from your Mac, using menulet sliders or the keyboard, including native Apple keys."; ObjectID = "Mh5-1A-apq"; */ +"Mh5-1A-apq.title" = "Control your external displays brightness, contrast and volume directly from your Mac, using menulet sliders or the keyboard, including native Apple keys."; /* Class = "NSButtonCell"; title = "Enable slider snapping"; ObjectID = "MlU-hl-d46"; */ "MlU-hl-d46.title" = "Regler einrasten lassen"; diff --git a/MonitorControl/UI/en.lproj/Main.strings b/MonitorControl/UI/en.lproj/Main.strings index 524a3b0c..aa8526e1 100644 --- a/MonitorControl/UI/en.lproj/Main.strings +++ b/MonitorControl/UI/en.lproj/Main.strings @@ -70,8 +70,8 @@ /* Class = "NSMenuItem"; title = "Use audio device name to determine which display to control"; ObjectID = "AqF-uD-KCY"; */ "AqF-uD-KCY.title" = "Use audio device name to determine which display to control"; -/* Class = "NSTextFieldCell"; title = "Start at Login ?"; ObjectID = "bA1-GF-Y2n"; */ -"bA1-GF-Y2n.title" = "Start at Login ?"; +/* Class = "NSTextFieldCell"; title = "Start at Login?"; ObjectID = "bA1-GF-Y2n"; */ +"bA1-GF-Y2n.title" = "Start at Login?"; /* Class = "NSMenuItem"; title = "Show sliders only for the display currently showing the menu"; ObjectID = "bbf-sS-uGv"; */ "bbf-sS-uGv.title" = "Show sliders only for the display currently showing the menu"; @@ -238,8 +238,8 @@ /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "ltL-gR-K3Z"; */ "ltL-gR-K3Z.title" = "Screen to control:"; -/* Class = "NSTextFieldCell"; title = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; ObjectID = "Mh5-1A-apq"; */ -"Mh5-1A-apq.title" = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; +/* Class = "NSTextFieldCell"; title = "Control your external displays brightness, contrast and volume directly from your Mac, using menulet sliders or the keyboard, including native Apple keys."; ObjectID = "Mh5-1A-apq"; */ +"Mh5-1A-apq.title" = "Control your external displays brightness, contrast and volume directly from your Mac, using menulet sliders or the keyboard, including native Apple keys."; /* Class = "NSButtonCell"; title = "Enable slider snapping"; ObjectID = "MlU-hl-d46"; */ "MlU-hl-d46.title" = "Enable slider snapping"; diff --git a/MonitorControl/UI/es.lproj/Main.strings b/MonitorControl/UI/es.lproj/Main.strings index 76121f47..ca1fbb06 100644 --- a/MonitorControl/UI/es.lproj/Main.strings +++ b/MonitorControl/UI/es.lproj/Main.strings @@ -70,8 +70,8 @@ /* Class = "NSMenuItem"; title = "Use audio device name to determine which display to control"; ObjectID = "AqF-uD-KCY"; */ "AqF-uD-KCY.title" = "Usar nombre del dispositivo de audio para determinar qué pantalla controlar"; -/* Class = "NSTextFieldCell"; title = "Start at Login ?"; ObjectID = "bA1-GF-Y2n"; */ -"bA1-GF-Y2n.title" = "Start at Login ?"; +/* Class = "NSTextFieldCell"; title = "Start at Login?"; ObjectID = "bA1-GF-Y2n"; */ +"bA1-GF-Y2n.title" = "Start at Login?"; /* Class = "NSMenuItem"; title = "Show sliders only for the display currently showing the menu"; ObjectID = "bbf-sS-uGv"; */ "bbf-sS-uGv.title" = "Mostrar sliders solo para las pantallas que actualmente se muestran en el menú"; @@ -238,8 +238,8 @@ /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "ltL-gR-K3Z"; */ "ltL-gR-K3Z.title" = "Pantalla a controlar:"; -/* Class = "NSTextFieldCell"; title = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; ObjectID = "Mh5-1A-apq"; */ -"Mh5-1A-apq.title" = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; +/* Class = "NSTextFieldCell"; title = "Control your external displays brightness, contrast and volume directly from your Mac, using menulet sliders or the keyboard, including native Apple keys."; ObjectID = "Mh5-1A-apq"; */ +"Mh5-1A-apq.title" = "Control your external displays brightness, contrast and volume directly from your Mac, using menulet sliders or the keyboard, including native Apple keys."; /* Class = "NSButtonCell"; title = "Enable slider snapping"; ObjectID = "MlU-hl-d46"; */ "MlU-hl-d46.title" = "Habilitar ajuste por slider"; diff --git a/MonitorControl/UI/fr.lproj/Main.strings b/MonitorControl/UI/fr.lproj/Main.strings index e6a5d5ff..4c10dad4 100644 --- a/MonitorControl/UI/fr.lproj/Main.strings +++ b/MonitorControl/UI/fr.lproj/Main.strings @@ -70,7 +70,7 @@ /* Class = "NSMenuItem"; title = "Use audio device name to determine which display to control"; ObjectID = "AqF-uD-KCY"; */ "AqF-uD-KCY.title" = "Utiliser le nom du périphérique audio pour déterminer quel écran contrôler"; -/* Class = "NSTextFieldCell"; title = "Start at Login ?"; ObjectID = "bA1-GF-Y2n"; */ +/* Class = "NSTextFieldCell"; title = "Start at Login?"; ObjectID = "bA1-GF-Y2n"; */ "bA1-GF-Y2n.title" = "Lancer au démarrage ?"; /* Class = "NSMenuItem"; title = "Show sliders only for the display currently showing the menu"; ObjectID = "bbf-sS-uGv"; */ @@ -238,7 +238,7 @@ /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "ltL-gR-K3Z"; */ "ltL-gR-K3Z.title" = "Écran à contrôler :"; -/* Class = "NSTextFieldCell"; title = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; ObjectID = "Mh5-1A-apq"; */ +/* Class = "NSTextFieldCell"; title = "Control your external displays brightness, contrast and volume directly from your Mac, using menulet sliders or the keyboard, including native Apple keys."; ObjectID = "Mh5-1A-apq"; */ "Mh5-1A-apq.title" = "Contrôlez la luminosité, le contraste et le volume de vos écrans externes directement depuis votre Mac, à l'aide des curseurs du menu ou du clavier, y compris avec les touches Apple natives."; /* Class = "NSButtonCell"; title = "Enable slider snapping"; ObjectID = "MlU-hl-d46"; */ diff --git a/MonitorControl/UI/hu.lproj/Localizable.strings b/MonitorControl/UI/hu.lproj/Localizable.strings index 41089bf0..cc70e3ff 100644 --- a/MonitorControl/UI/hu.lproj/Localizable.strings +++ b/MonitorControl/UI/hu.lproj/Localizable.strings @@ -2,7 +2,7 @@ "About" = "Névjegy"; /* Shown in the alert dialog */ -"An other app seems to change the brightness or colors which causes issues.\n\nTo solve this, you need to quit the other app or disable gamma control for your displays in MonitorControl!" = "Úgy tűnik Egy másik alkalmazás módosítja a fényerőt vagy a színeket ami problémát okoz.\n\nEz megoldható a másik alkalmazás bezárásával vagy a MonitorControl-ban a kijelzők gamma vezérlésének letiltásával!"; +"An other app seems to change the brightness or colors which causes issues.\n\nTo solve this, you need to quit the other app or disable gamma control for your displays in MonitorControl!" = "Úgy tűnik, egy másik alkalmazás is módosítja a fényerőt vagy a színeket ami problémát okoz.\n\nEz megoldható a másik alkalmazás bezárásával vagy a MonitorControl-ban a kijelzők gamma vezérlésének letiltásával!"; /* Shown in the main prefs window */ "App menu" = "Menü"; diff --git a/MonitorControl/UI/hu.lproj/Main.strings b/MonitorControl/UI/hu.lproj/Main.strings index 980024f7..652409c2 100644 --- a/MonitorControl/UI/hu.lproj/Main.strings +++ b/MonitorControl/UI/hu.lproj/Main.strings @@ -14,7 +14,7 @@ "1zE-fg-xEm.title" = "DDC min"; /* Class = "NSTextFieldCell"; title = "Volume down"; ObjectID = "21s-bv-GTK"; */ -"21s-bv-GTK.title" = "Volume down"; +"21s-bv-GTK.title" = "Hangerő le"; /* Class = "NSMenuItem"; title = "Show separate controls for each display in menu"; ObjectID = "3eO-bN-ZRl"; */ "3eO-bN-ZRl.title" = "Külön vezérlő minden képernyő számára"; @@ -41,7 +41,7 @@ "75n-7M-1mS.title" = "Csúszka viselkedés:"; /* Class = "NSButtonCell"; title = "Show slider tick marks"; ObjectID = "7zf-m1-gJO"; */ -"7zf-m1-gJO.title" = "Mértékjelek mutatása mutatása"; +"7zf-m1-gJO.title" = "Mértékjelek mutatása"; /* Class = "NSTextFieldCell"; title = "Slider knob will snap to 0%, 25%, 50%, 75% and 100% when in proximity making setting these values easier. Disable for finer control."; ObjectID = "8Gx-Ya-zhp"; */ "8Gx-Ya-zhp.title" = "A csúszka fogantyú 0%, 25%, 50%, 75% és 100% pontokhoz ugrik, hogy ezek könnyebben beállíthatók legyenek."; @@ -65,13 +65,13 @@ "A8P-vn-DEJ.title" = "Mértékjelek mutatása 0%, 25%, 50%, 75% és 100% pontokon."; /* Class = "NSTextFieldCell"; title = "Use brightness, volume and other settings from last time or use defaults. Values will be applied to the display upon first change by the user."; ObjectID = "an7-Aj-3fZ"; */ -"an7-Aj-3fZ.title" = "Utolsó ismert, vagy alapértelmezett fényerő, hangerő és egyéb beálltások használata. A megváltoztatott értékek első változtatáskor érvényesülnek."; +"an7-Aj-3fZ.title" = "Korábban beállított vagy alapértelmezett fényerő, hangerő beálltások használata. A megváltoztatott értékek első változtatáskor érvényesülnek."; /* Class = "NSMenuItem"; title = "Use audio device name to determine which display to control"; ObjectID = "AqF-uD-KCY"; */ "AqF-uD-KCY.title" = "Hangeszköz nevének megfelelő kijelző vezérlése"; -/* Class = "NSTextFieldCell"; title = "Start at Login ?"; ObjectID = "bA1-GF-Y2n"; */ -"bA1-GF-Y2n.title" = "Start at Login ?"; +/* Class = "NSTextFieldCell"; title = "Start at Login?"; ObjectID = "bA1-GF-Y2n"; */ +"bA1-GF-Y2n.title" = "Automatikus indítás"; /* Class = "NSMenuItem"; title = "Show sliders only for the display currently showing the menu"; ObjectID = "bbf-sS-uGv"; */ "bbf-sS-uGv.title" = "Az aktuális kijelző csúszkáinak mutatása"; @@ -200,7 +200,7 @@ "j72-NF-zsW.title" = "Automatikus indítás bejelentkezéskor"; /* Class = "NSTextFieldCell"; title = "Toggle Mute"; ObjectID = "jK7-7w-uib"; */ -"jK7-7w-uib.title" = "Toggle Mute"; +"jK7-7w-uib.title" = "Némítás"; /* Class = "NSMenuItem"; title = "Change for all screens"; ObjectID = "jSj-HB-T2t"; */ "jSj-HB-T2t.title" = "Minden képernyő módosítása"; @@ -218,7 +218,7 @@ "K6A-4z-1aQ.title" = "Engedélyezés Apple és beépített kijelzők esetén is"; /* Class = "NSTextFieldCell"; title = "MonitorControl needs access to \"accessibility\" to use macOS native keys to control your display.\nYou can enable it by adding MonitorControl in System Preferences > Security and Privacy > Accessibility."; ObjectID = "kBJ-Zf-1k2"; */ -"kBJ-Zf-1k2.title" = "MonitorControl needs access to \"accessibility\" to use macOS native keys to control your display.\nYou can enable it by adding MonitorControl in System Preferences > Security and Privacy > Accessibility."; +"kBJ-Zf-1k2.title" = "A MonitorControlnak engedélyre van szüksége ahhoz, hogy a fényerő és hangerő gombokra reagálhasson. Ehhez hozzá kell adni a MonitorControl alkalmazást a Rendszerbeállítások > Biztonság és adatvédelem > Kisegítő lehetőségek alatt."; /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "Kfj-WK-aSL"; */ "Kfj-WK-aSL.title" = "Vezérelt képernyő:"; @@ -238,8 +238,8 @@ /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "ltL-gR-K3Z"; */ "ltL-gR-K3Z.title" = "Vezérelt képernyő:"; -/* Class = "NSTextFieldCell"; title = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; ObjectID = "Mh5-1A-apq"; */ -"Mh5-1A-apq.title" = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; +/* Class = "NSTextFieldCell"; title = "Control your external displays brightness, contrast and volume directly from your Mac, using menulet sliders or the keyboard, including native Apple keys."; ObjectID = "Mh5-1A-apq"; */ +"Mh5-1A-apq.title" = "Vezérleje külső kijelzője fényerejét, kontrasztját és hangerejét a Mac-ról - a menü csúszkákkal vagy billentyűk segítségével, beleértve a gyári Apple billentyűket is!"; /* Class = "NSButtonCell"; title = "Enable slider snapping"; ObjectID = "MlU-hl-d46"; */ "MlU-hl-d46.title" = "Csúszka igazítás engedélyezése"; @@ -260,10 +260,10 @@ "na6-mS-MPi.title" = "Gamma tábla módosítás kerülése"; /* Class = "NSTextFieldCell"; title = "Ensure MonitorControl is always running when you need it by launching the app at startup."; ObjectID = "nk6-Gh-Mfs"; */ -"nk6-Gh-Mfs.title" = "Ensure MonitorControl is always running when you need it by launching the app at startup."; +"nk6-Gh-Mfs.title" = "Biztosítsa, hogy a MonitorControl mindig fut amikor szüksége van rá, az automatikus indítás segítségével!"; /* Class = "NSTextFieldCell"; title = "Brightness up"; ObjectID = "nty-g6-Sde"; */ -"nty-g6-Sde.title" = "Brightness up"; +"nty-g6-Sde.title" = "Több fényerő"; /* Class = "NSButtonCell"; title = "Separate scales for combined hardware & software dimming"; ObjectID = "O8o-hI-8eR"; */ "O8o-hI-8eR.title" = "Külön skála kombinált hardver/szoftver sötétítésnál"; @@ -293,13 +293,13 @@ "psF-vX-AFB.title" = "DDC max"; /* Class = "NSButtonCell"; title = "Open System Preferences…"; ObjectID = "pVc-wG-Bdh"; */ -"pVc-wG-Bdh.title" = "Open System Preferences…"; +"pVc-wG-Bdh.title" = "Rendszerbeállítások megnyitása…"; /* Class = "NSTextFieldCell"; title = "Use software dimming after the display reached zero hardware brightness for extended range. Works for DDC controlled displays only."; ObjectID = "PyY-p9-3NP"; */ "PyY-p9-3NP.title" = "Szoftveres sötétítés alkalmazása, miután a kijelző elérte a minimális hardveres fényerőt. Csak hardveres (DDC) kijelzők esetén."; /* Class = "NSTextFieldCell"; title = "Brightness down"; ObjectID = "q5a-Ix-Hjs"; */ -"q5a-Ix-Hjs.title" = "Brightness down"; +"q5a-Ix-Hjs.title" = "Kevesebb fényerő"; /* Class = "NSMenuItem"; title = "Both standard and custom shortcuts"; ObjectID = "QDG-SA-mRX"; */ "QDG-SA-mRX.title" = "Hagyományos és egyedi billentyűkombinációk"; @@ -320,7 +320,7 @@ "r76-Zc-x09.title" = "Hardveres és szoftveres fényerővezérlés kombinálása"; /* Class = "NSTextFieldCell"; title = "Enable Apple keyboard native key access"; ObjectID = "RBj-pU-aen"; */ -"RBj-pU-aen.title" = "Enable Apple keyboard native key access"; +"RBj-pU-aen.title" = "Gyári Apple billentyűzet elérése"; /* Class = "NSMenuItem"; title = "Normal"; ObjectID = "Riq-uM-bTs"; */ "Riq-uM-bTs.title" = "Normál"; @@ -389,7 +389,7 @@ "YHZ-VL-QJ3.title" = "A teljes OSD skála elérhető a hardveres fényerővezérlés számára, majd a minimum elérése után további szoftveres csökkentés történik."; /* Class = "NSTextFieldCell"; title = "Warning! With this option enabled, you might find yourself in a position when you end up with a blank display. This, combined with disabled keyboard controls can be frustrating."; ObjectID = "yi3-e1-wsL"; */ -"yi3-e1-wsL.title" = "Warning! With this option enabled, you might find yourself in a position when you end up with a blank display. This, combined with disabled keyboard controls can be frustrating."; +"yi3-e1-wsL.title" = "Figyelem! Az opció engedélyezésével előfordulhat, hogy a kijelző teljesen sötétítésre kerül. Letiltott billentyűzet vezérlés mellett ez kellemetlen helyzetet eredményezhet."; /* Class = "NSTextFieldCell"; title = "Identifier:"; ObjectID = "YqZ-LS-YvR"; */ "YqZ-LS-YvR.title" = "Azonosító:"; @@ -398,7 +398,7 @@ "Ytd-mg-N5E.title" = "Az egérmutató helyzetétől függ"; /* Class = "NSTextFieldCell"; title = "Volume up"; ObjectID = "Z3w-eR-qDF"; */ -"Z3w-eR-qDF.title" = "Volume up"; +"Z3w-eR-qDF.title" = "Hangerő fel"; /* Class = "NSButtonCell"; title = "Use hardware DDC control"; ObjectID = "ZdU-gV-V05"; */ "ZdU-gV-V05.title" = "Hardveres DDC vezérlés"; diff --git a/MonitorControl/UI/it.lproj/Main.strings b/MonitorControl/UI/it.lproj/Main.strings index c38a0597..af93f64a 100644 --- a/MonitorControl/UI/it.lproj/Main.strings +++ b/MonitorControl/UI/it.lproj/Main.strings @@ -70,8 +70,8 @@ /* Class = "NSMenuItem"; title = "Use audio device name to determine which display to control"; ObjectID = "AqF-uD-KCY"; */ "AqF-uD-KCY.title" = "Utilizza dispositivo audio per determinare il monitor da controllare"; -/* Class = "NSTextFieldCell"; title = "Start at Login ?"; ObjectID = "bA1-GF-Y2n"; */ -"bA1-GF-Y2n.title" = "Start at Login ?"; +/* Class = "NSTextFieldCell"; title = "Start at Login?"; ObjectID = "bA1-GF-Y2n"; */ +"bA1-GF-Y2n.title" = "Start at Login?"; /* Class = "NSMenuItem"; title = "Show sliders only for the display currently showing the menu"; ObjectID = "bbf-sS-uGv"; */ "bbf-sS-uGv.title" = "Mostra gli slider solo per il monitor che sta mostrando il menu"; @@ -238,8 +238,8 @@ /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "ltL-gR-K3Z"; */ "ltL-gR-K3Z.title" = "Monitor da controllare:"; -/* Class = "NSTextFieldCell"; title = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; ObjectID = "Mh5-1A-apq"; */ -"Mh5-1A-apq.title" = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; +/* Class = "NSTextFieldCell"; title = "Control your external displays brightness, contrast and volume directly from your Mac, using menulet sliders or the keyboard, including native Apple keys."; ObjectID = "Mh5-1A-apq"; */ +"Mh5-1A-apq.title" = "Control your external displays brightness, contrast and volume directly from your Mac, using menulet sliders or the keyboard, including native Apple keys."; /* Class = "NSButtonCell"; title = "Enable slider snapping"; ObjectID = "MlU-hl-d46"; */ "MlU-hl-d46.title" = "Abilita lo snap dello slider"; diff --git a/MonitorControl/UI/ko.lproj/Main.strings b/MonitorControl/UI/ko.lproj/Main.strings index 0af11dbc..2b8e0884 100644 --- a/MonitorControl/UI/ko.lproj/Main.strings +++ b/MonitorControl/UI/ko.lproj/Main.strings @@ -70,8 +70,8 @@ /* Class = "NSMenuItem"; title = "Use audio device name to determine which display to control"; ObjectID = "AqF-uD-KCY"; */ "AqF-uD-KCY.title" = "오디오 장치 이름을 사용하여 제어할 디스플레이 결정"; -/* Class = "NSTextFieldCell"; title = "Start at Login ?"; ObjectID = "bA1-GF-Y2n"; */ -"bA1-GF-Y2n.title" = "Start at Login ?"; +/* Class = "NSTextFieldCell"; title = "Start at Login?"; ObjectID = "bA1-GF-Y2n"; */ +"bA1-GF-Y2n.title" = "Start at Login?"; /* Class = "NSMenuItem"; title = "Show sliders only for the display currently showing the menu"; ObjectID = "bbf-sS-uGv"; */ "bbf-sS-uGv.title" = "현재 메뉴를 보여주는 디스플레이에 대한 슬라이더만 표시"; @@ -238,8 +238,8 @@ /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "ltL-gR-K3Z"; */ "ltL-gR-K3Z.title" = "제어할 화면:"; -/* Class = "NSTextFieldCell"; title = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; ObjectID = "Mh5-1A-apq"; */ -"Mh5-1A-apq.title" = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; +/* Class = "NSTextFieldCell"; title = "Control your external displays brightness, contrast and volume directly from your Mac, using menulet sliders or the keyboard, including native Apple keys."; ObjectID = "Mh5-1A-apq"; */ +"Mh5-1A-apq.title" = "Control your external displays brightness, contrast and volume directly from your Mac, using menulet sliders or the keyboard, including native Apple keys."; /* Class = "NSButtonCell"; title = "Enable slider snapping"; ObjectID = "MlU-hl-d46"; */ "MlU-hl-d46.title" = "슬라이더 정렬 활성화"; diff --git a/MonitorControl/UI/nl.lproj/Main.strings b/MonitorControl/UI/nl.lproj/Main.strings index aeaf73a7..c428c30f 100644 --- a/MonitorControl/UI/nl.lproj/Main.strings +++ b/MonitorControl/UI/nl.lproj/Main.strings @@ -70,8 +70,8 @@ /* Class = "NSMenuItem"; title = "Use audio device name to determine which display to control"; ObjectID = "AqF-uD-KCY"; */ "AqF-uD-KCY.title" = "Gebruik Audioapparaat naam om te bepalen welk scherm u wilt bedienen"; -/* Class = "NSTextFieldCell"; title = "Start at Login ?"; ObjectID = "bA1-GF-Y2n"; */ -"bA1-GF-Y2n.title" = "Start at Login ?"; +/* Class = "NSTextFieldCell"; title = "Start at Login?"; ObjectID = "bA1-GF-Y2n"; */ +"bA1-GF-Y2n.title" = "Start at Login?"; /* Class = "NSMenuItem"; title = "Show sliders only for the display currently showing the menu"; ObjectID = "bbf-sS-uGv"; */ "bbf-sS-uGv.title" = "Enkel schuifregelaars tonen voor het scherm dat het menu toont"; @@ -238,8 +238,8 @@ /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "ltL-gR-K3Z"; */ "ltL-gR-K3Z.title" = "Scherm om te bedienen:"; -/* Class = "NSTextFieldCell"; title = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; ObjectID = "Mh5-1A-apq"; */ -"Mh5-1A-apq.title" = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; +/* Class = "NSTextFieldCell"; title = "Control your external displays brightness, contrast and volume directly from your Mac, using menulet sliders or the keyboard, including native Apple keys."; ObjectID = "Mh5-1A-apq"; */ +"Mh5-1A-apq.title" = "Control your external displays brightness, contrast and volume directly from your Mac, using menulet sliders or the keyboard, including native Apple keys."; /* Class = "NSButtonCell"; title = "Enable slider snapping"; ObjectID = "MlU-hl-d46"; */ "MlU-hl-d46.title" = "Schuifregelaar snapping inschakelen"; diff --git a/MonitorControl/UI/pt-BR.lproj/Main.strings b/MonitorControl/UI/pt-BR.lproj/Main.strings index 36bdcd49..41ac2bfe 100644 --- a/MonitorControl/UI/pt-BR.lproj/Main.strings +++ b/MonitorControl/UI/pt-BR.lproj/Main.strings @@ -70,8 +70,8 @@ /* Class = "NSMenuItem"; title = "Use audio device name to determine which display to control"; ObjectID = "AqF-uD-KCY"; */ "AqF-uD-KCY.title" = "Usar nome do dispositivo de áudio para determinar qual monitor controlar"; -/* Class = "NSTextFieldCell"; title = "Start at Login ?"; ObjectID = "bA1-GF-Y2n"; */ -"bA1-GF-Y2n.title" = "Start at Login ?"; +/* Class = "NSTextFieldCell"; title = "Start at Login?"; ObjectID = "bA1-GF-Y2n"; */ +"bA1-GF-Y2n.title" = "Start at Login?"; /* Class = "NSMenuItem"; title = "Show sliders only for the display currently showing the menu"; ObjectID = "bbf-sS-uGv"; */ "bbf-sS-uGv.title" = "Mostrar os controles deslizantes apenas para o monitor apresentado no menu"; @@ -238,8 +238,8 @@ /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "ltL-gR-K3Z"; */ "ltL-gR-K3Z.title" = "Monitor para controlar:"; -/* Class = "NSTextFieldCell"; title = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; ObjectID = "Mh5-1A-apq"; */ -"Mh5-1A-apq.title" = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; +/* Class = "NSTextFieldCell"; title = "Control your external displays brightness, contrast and volume directly from your Mac, using menulet sliders or the keyboard, including native Apple keys."; ObjectID = "Mh5-1A-apq"; */ +"Mh5-1A-apq.title" = "Control your external displays brightness, contrast and volume directly from your Mac, using menulet sliders or the keyboard, including native Apple keys."; /* Class = "NSButtonCell"; title = "Enable slider snapping"; ObjectID = "MlU-hl-d46"; */ "MlU-hl-d46.title" = "Ativar ajuste de controle deslizante"; diff --git a/MonitorControl/UI/tr.lproj/Main.strings b/MonitorControl/UI/tr.lproj/Main.strings index fd426f94..5fedcb5d 100644 --- a/MonitorControl/UI/tr.lproj/Main.strings +++ b/MonitorControl/UI/tr.lproj/Main.strings @@ -70,8 +70,8 @@ /* Class = "NSMenuItem"; title = "Use audio device name to determine which display to control"; ObjectID = "AqF-uD-KCY"; */ "AqF-uD-KCY.title" = "Hangi ekranın kontrol edileceğini belirlemek için ses cihazı adını kullanın"; -/* Class = "NSTextFieldCell"; title = "Start at Login ?"; ObjectID = "bA1-GF-Y2n"; */ -"bA1-GF-Y2n.title" = "Start at Login ?"; +/* Class = "NSTextFieldCell"; title = "Start at Login?"; ObjectID = "bA1-GF-Y2n"; */ +"bA1-GF-Y2n.title" = "Start at Login?"; /* Class = "NSMenuItem"; title = "Show sliders only for the display currently showing the menu"; ObjectID = "bbf-sS-uGv"; */ "bbf-sS-uGv.title" = "Kaydırıcıları yalnızca o anda menüyü gösteren ekran için göster"; @@ -238,8 +238,8 @@ /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "ltL-gR-K3Z"; */ "ltL-gR-K3Z.title" = "Kontrol edilecek ekran:"; -/* Class = "NSTextFieldCell"; title = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; ObjectID = "Mh5-1A-apq"; */ -"Mh5-1A-apq.title" = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; +/* Class = "NSTextFieldCell"; title = "Control your external displays brightness, contrast and volume directly from your Mac, using menulet sliders or the keyboard, including native Apple keys."; ObjectID = "Mh5-1A-apq"; */ +"Mh5-1A-apq.title" = "Control your external displays brightness, contrast and volume directly from your Mac, using menulet sliders or the keyboard, including native Apple keys."; /* Class = "NSButtonCell"; title = "Enable slider snapping"; ObjectID = "MlU-hl-d46"; */ "MlU-hl-d46.title" = "Kaydırıcı yakalamayı etkinleştir"; diff --git a/MonitorControl/UI/zh-Hans.lproj/Main.strings b/MonitorControl/UI/zh-Hans.lproj/Main.strings index 2372da12..6143f5e3 100644 --- a/MonitorControl/UI/zh-Hans.lproj/Main.strings +++ b/MonitorControl/UI/zh-Hans.lproj/Main.strings @@ -70,8 +70,8 @@ /* Class = "NSMenuItem"; title = "Use audio device name to determine which display to control"; ObjectID = "AqF-uD-KCY"; */ "AqF-uD-KCY.title" = "以音频设备名称判断控制哪个显示器"; -/* Class = "NSTextFieldCell"; title = "Start at Login ?"; ObjectID = "bA1-GF-Y2n"; */ -"bA1-GF-Y2n.title" = "Start at Login ?"; +/* Class = "NSTextFieldCell"; title = "Start at Login?"; ObjectID = "bA1-GF-Y2n"; */ +"bA1-GF-Y2n.title" = "Start at Login?"; /* Class = "NSMenuItem"; title = "Show sliders only for the display currently showing the menu"; ObjectID = "bbf-sS-uGv"; */ "bbf-sS-uGv.title" = "仅显示当前显示器的滑杆介面"; @@ -238,8 +238,8 @@ /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "ltL-gR-K3Z"; */ "ltL-gR-K3Z.title" = "控制的显示器:"; -/* Class = "NSTextFieldCell"; title = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; ObjectID = "Mh5-1A-apq"; */ -"Mh5-1A-apq.title" = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; +/* Class = "NSTextFieldCell"; title = "Control your external displays brightness, contrast and volume directly from your Mac, using menulet sliders or the keyboard, including native Apple keys."; ObjectID = "Mh5-1A-apq"; */ +"Mh5-1A-apq.title" = "Control your external displays brightness, contrast and volume directly from your Mac, using menulet sliders or the keyboard, including native Apple keys."; /* Class = "NSButtonCell"; title = "Enable slider snapping"; ObjectID = "MlU-hl-d46"; */ "MlU-hl-d46.title" = "启用滑杆定位"; diff --git a/MonitorControl/UI/zh-Hant-TW.lproj/Main.strings b/MonitorControl/UI/zh-Hant-TW.lproj/Main.strings index 145bfcbe..97afc1bb 100644 --- a/MonitorControl/UI/zh-Hant-TW.lproj/Main.strings +++ b/MonitorControl/UI/zh-Hant-TW.lproj/Main.strings @@ -70,8 +70,8 @@ /* Class = "NSMenuItem"; title = "Use audio device name to determine which display to control"; ObjectID = "AqF-uD-KCY"; */ "AqF-uD-KCY.title" = "以音訊裝置名稱判斷控制哪個螢幕"; -/* Class = "NSTextFieldCell"; title = "Start at Login ?"; ObjectID = "bA1-GF-Y2n"; */ -"bA1-GF-Y2n.title" = "Start at Login ?"; +/* Class = "NSTextFieldCell"; title = "Start at Login?"; ObjectID = "bA1-GF-Y2n"; */ +"bA1-GF-Y2n.title" = "Start at Login?"; /* Class = "NSMenuItem"; title = "Show sliders only for the display currently showing the menu"; ObjectID = "bbf-sS-uGv"; */ "bbf-sS-uGv.title" = "僅顯示當前螢幕的滑桿介面"; @@ -238,8 +238,8 @@ /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "ltL-gR-K3Z"; */ "ltL-gR-K3Z.title" = "控制的螢幕:"; -/* Class = "NSTextFieldCell"; title = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; ObjectID = "Mh5-1A-apq"; */ -"Mh5-1A-apq.title" = "Control your external displays brightness, contrast and volume directly from your mac, using menulet sliders or the keyboard, including native Apple keys."; +/* Class = "NSTextFieldCell"; title = "Control your external displays brightness, contrast and volume directly from your Mac, using menulet sliders or the keyboard, including native Apple keys."; ObjectID = "Mh5-1A-apq"; */ +"Mh5-1A-apq.title" = "Control your external displays brightness, contrast and volume directly from your Mac, using menulet sliders or the keyboard, including native Apple keys."; /* Class = "NSButtonCell"; title = "Enable slider snapping"; ObjectID = "MlU-hl-d46"; */ "MlU-hl-d46.title" = "啟用滑桿定位"; diff --git a/MonitorControlHelper/Info.plist b/MonitorControlHelper/Info.plist index cc964576..558f7212 100644 --- a/MonitorControlHelper/Info.plist +++ b/MonitorControlHelper/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 7000 + 7027 LSApplicationCategoryType public.app-category.utilities LSBackgroundOnly From 62e5578070954dd0137cac92c7d5d656ab16d530 Mon Sep 17 00:00:00 2001 From: jajoho Date: Wed, 9 Feb 2022 12:02:06 +0100 Subject: [PATCH 024/101] German translation update --- .../UI/de.lproj/Localizable.strings | 2 +- MonitorControl/UI/de.lproj/Main.strings | 36 +++++++++---------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/MonitorControl/UI/de.lproj/Localizable.strings b/MonitorControl/UI/de.lproj/Localizable.strings index bc8b5c09..df3a1905 100644 --- a/MonitorControl/UI/de.lproj/Localizable.strings +++ b/MonitorControl/UI/de.lproj/Localizable.strings @@ -41,7 +41,7 @@ "Displays" = "Monitore"; /* Shown in the alert dialog */ -"Enable Longer Delay?" = "Größere Verzögerung einschalten?"; +"Enable Longer Delay?" = "Längere Verzögerung einschalten?"; /* Shown in the Display Preferences */ "External Display" = "Externer Monitor"; diff --git a/MonitorControl/UI/de.lproj/Main.strings b/MonitorControl/UI/de.lproj/Main.strings index 9569b043..1d7683a9 100644 --- a/MonitorControl/UI/de.lproj/Main.strings +++ b/MonitorControl/UI/de.lproj/Main.strings @@ -14,7 +14,7 @@ "1zE-fg-xEm.title" = "DDC min"; /* Class = "NSTextFieldCell"; title = "Volume down"; ObjectID = "21s-bv-GTK"; */ -"21s-bv-GTK.title" = "Volume down"; +"21s-bv-GTK.title" = "Lautstärke verringern"; /* Class = "NSMenuItem"; title = "Show separate controls for each display in menu"; ObjectID = "3eO-bN-ZRl"; */ "3eO-bN-ZRl.title" = "Separate Steuerung für jeden Monitor im Menü anzeigen"; @@ -26,10 +26,10 @@ "4CG-0I-anB.title" = "Benutzerdefinierte Tastaturkürzel"; /* Class = "NSTextFieldCell"; title = "Using window focus might not work properly with full screen apps."; ObjectID = "4dX-o1-xAc"; */ -"4dX-o1-xAc.title" = "Verwenden des Fensterfokus könnte bei Vollbildanwendungen nicht gut funktionieren."; +"4dX-o1-xAc.title" = "Die Verwenden des Fensterfokus funktioniert bei Vollbildanwendungen möglicherweise nicht richtig."; /* Class = "NSTextFieldCell"; title = "Welcome to MonitorControl"; ObjectID = "5J0-BD-top"; */ -"5J0-BD-top.title" = "Welcome to MonitorControl"; +"5J0-BD-top.title" = "Willkommen bei MonitorControl"; /* Class = "NSButtonCell"; title = "Reset Preferences"; ObjectID = "5yT-5F-X5R"; */ "5yT-5F-X5R.title" = "Einstellungen zurücksetzen"; @@ -38,7 +38,7 @@ "6mo-7S-oOO.title" = "Immer ausblenden"; /* Class = "NSTextFieldCell"; title = "Slider behavior:"; ObjectID = "75n-7M-1mS"; */ -"75n-7M-1mS.title" = "Verhalten des Regler:"; +"75n-7M-1mS.title" = "Schieberegler-Verhalten:"; /* Class = "NSButtonCell"; title = "Show slider tick marks"; ObjectID = "7zf-m1-gJO"; */ "7zf-m1-gJO.title" = "Markierungen für Regler anzeigen"; @@ -50,7 +50,7 @@ "8Q8-57-xnT.title" = "Feine OSD-Skalierung verwenden"; /* Class = "NSButtonCell"; title = "Start using MonitorControl"; ObjectID = "8WE-da-OZC"; */ -"8WE-da-OZC.title" = "Start using MonitorControl"; +"8WE-da-OZC.title" = "Mit MonitorControl starten"; /* Class = "NSButtonCell"; title = "Special thanks to our contributors!"; ObjectID = "95V-M4-2l5"; */ "95V-M4-2l5.title" = "Besonderen Dank an unsere Mitwirkenden!"; @@ -71,7 +71,7 @@ "AqF-uD-KCY.title" = "Verwenden des Namens des Audiogeräts, um zu bestimmen, welcher Monitor gesteuert werden soll"; /* Class = "NSTextFieldCell"; title = "Start at Login?"; ObjectID = "bA1-GF-Y2n"; */ -"bA1-GF-Y2n.title" = "Start at Login?"; +"bA1-GF-Y2n.title" = "Bei der Anmeldung starten?"; /* Class = "NSMenuItem"; title = "Show sliders only for the display currently showing the menu"; ObjectID = "bbf-sS-uGv"; */ "bbf-sS-uGv.title" = "Regler nur für den Monitor anzeigen, auf dem das Menü gerade angezeigt wird"; @@ -176,7 +176,7 @@ "H9X-it-sXs.title" = "Name des Audiogeräts überschreiben:"; /* Class = "NSTextFieldCell"; title = "Relaunch the app to access Preferences if the menu option is not accessible. Use the button below to quit the app."; ObjectID = "hF7-fM-aKr"; */ -"hF7-fM-aKr.title" = "Starte die App neu, um auf die Einstellungen zuzugreifen, wenn die Menüoption nicht verfügbar ist. Verwende die Schaltfläche unten, um die App zu beenden."; +"hF7-fM-aKr.title" = "Starte die App neu, um auf die Einstellungen zuzugreifen, wenn die Menüoption nicht auswählbar ist. Benutze die Schaltfläche unten, um die App zu beenden."; /* Class = "NSButtonCell"; title = "Get current"; ObjectID = "hkC-vq-IcD"; */ "hkC-vq-IcD.title" = "Wert abrufen"; @@ -200,7 +200,7 @@ "j72-NF-zsW.title" = "Bei Anmeldung starten"; /* Class = "NSTextFieldCell"; title = "Toggle Mute"; ObjectID = "jK7-7w-uib"; */ -"jK7-7w-uib.title" = "Toggle Mute"; +"jK7-7w-uib.title" = "Umschalten der Stummschaltung"; /* Class = "NSMenuItem"; title = "Change for all screens"; ObjectID = "jSj-HB-T2t"; */ "jSj-HB-T2t.title" = "Für alle Monitore ändern"; @@ -209,7 +209,7 @@ "jVH-oc-rUi.title" = "Nach Updates suchen"; /* Class = "NSButtonCell"; title = "Start MonitorControl at Login"; ObjectID = "JWJ-OY-VtE"; */ -"JWJ-OY-VtE.title" = "Start MonitorControl at Login"; +"JWJ-OY-VtE.title" = "MonitorControl bei der Anmeldung starten"; /* Class = "NSTextFieldCell"; title = "Note: you can press Shift during startup for 'Safe mode' to restore defaults and avoid reading or setting anything."; ObjectID = "Jx2-gO-nq9"; */ "Jx2-gO-nq9.title" = "Hinweis: Du kannst während des Starts die Umschalttaste drücken, um den 'Abgesicherten Modus' zu aktivieren, damit die Standardeinstellungen wiederhergestellt werden und nichts gelesen oder eingestellt wird."; @@ -218,7 +218,7 @@ "K6A-4z-1aQ.title" = "Auch für Apple und eingebaute Monitore aktivieren"; /* Class = "NSTextFieldCell"; title = "MonitorControl needs access to \"accessibility\" to use macOS native keys to control your display.\nYou can enable it by adding MonitorControl in System Preferences > Security and Privacy > Accessibility."; ObjectID = "kBJ-Zf-1k2"; */ -"kBJ-Zf-1k2.title" = "MonitorControl needs access to \"accessibility\" to use macOS native keys to control your display.\nYou can enable it by adding MonitorControl in System Preferences > Security and Privacy > Accessibility."; +"kBJ-Zf-1k2.title" = "MonitorControl benötigt Zugriff auf \"Bedienungshilfen\", um die Tasten deines Macs zur Steuerung deines Bildschirms zu verwenden.\n Du kannst das aktivieren, indem du MonitorControl in Systemeinstellungen > Sicherheit und Datenschutz > Bedienungshilfen hinzufügst."; /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "Kfj-WK-aSL"; */ "Kfj-WK-aSL.title" = "Monitor für Steuerung:"; @@ -239,7 +239,7 @@ "ltL-gR-K3Z.title" = "Monitor für Steuerung:"; /* Class = "NSTextFieldCell"; title = "Control your external displays brightness, contrast and volume directly from your Mac, using menulet sliders or the keyboard, including native Apple keys."; ObjectID = "Mh5-1A-apq"; */ -"Mh5-1A-apq.title" = "Control your external displays brightness, contrast and volume directly from your Mac, using menulet sliders or the keyboard, including native Apple keys."; +"Mh5-1A-apq.title" = "Steuere die Helligkeit, den Kontrast und die Lautstärke deines externen Monitors direkt von deinem Mac aus, indem du die Schieberegler des Menüs oder die Tastatur, einschließlich der nativen Apple-Tasten, benutzt."; /* Class = "NSButtonCell"; title = "Enable slider snapping"; ObjectID = "MlU-hl-d46"; */ "MlU-hl-d46.title" = "Regler einrasten lassen"; @@ -260,10 +260,10 @@ "na6-mS-MPi.title" = "Manipulation der Gammatabelle vermeiden"; /* Class = "NSTextFieldCell"; title = "Ensure MonitorControl is always running when you need it by launching the app at startup."; ObjectID = "nk6-Gh-Mfs"; */ -"nk6-Gh-Mfs.title" = "Ensure MonitorControl is always running when you need it by launching the app at startup."; +"nk6-Gh-Mfs.title" = "Stelle sicher, dass MonitorControl immer läuft, wenn du es brauchst, indem sie beim Anmelden startet."; /* Class = "NSTextFieldCell"; title = "Brightness up"; ObjectID = "nty-g6-Sde"; */ -"nty-g6-Sde.title" = "Brightness up"; +"nty-g6-Sde.title" = "Helligkeit erhöhen"; /* Class = "NSButtonCell"; title = "Separate scales for combined hardware & software dimming"; ObjectID = "O8o-hI-8eR"; */ "O8o-hI-8eR.title" = "Getrennte Skalen für kombiniertes Dimmen von Hardware und Software"; @@ -293,13 +293,13 @@ "psF-vX-AFB.title" = "DDC max"; /* Class = "NSButtonCell"; title = "Open System Preferences…"; ObjectID = "pVc-wG-Bdh"; */ -"pVc-wG-Bdh.title" = "Open System Preferences…"; +"pVc-wG-Bdh.title" = "Systemeinstellungen öffnen…"; /* Class = "NSTextFieldCell"; title = "Use software dimming after the display reached zero hardware brightness for extended range. Works for DDC controlled displays only."; ObjectID = "PyY-p9-3NP"; */ "PyY-p9-3NP.title" = "Verwende die Software-Dimmung, nachdem der Monitor die Null-Hardware-Helligkeit erreicht hat, um die Bandbreite zu erweitern. Funktioniert nur bei DDC-gesteuerten Monitoren."; /* Class = "NSTextFieldCell"; title = "Brightness down"; ObjectID = "q5a-Ix-Hjs"; */ -"q5a-Ix-Hjs.title" = "Brightness down"; +"q5a-Ix-Hjs.title" = "Helligkeit verringern"; /* Class = "NSMenuItem"; title = "Both standard and custom shortcuts"; ObjectID = "QDG-SA-mRX"; */ "QDG-SA-mRX.title" = "Sowohl Standard- als auch benutzerdefinierte Tastenkombinationen"; @@ -320,13 +320,13 @@ "r76-Zc-x09.title" = "Hardware- und Software-Dimmung kombinieren"; /* Class = "NSTextFieldCell"; title = "Enable Apple keyboard native key access"; ObjectID = "RBj-pU-aen"; */ -"RBj-pU-aen.title" = "Enable Apple keyboard native key access"; +"RBj-pU-aen.title" = "Aktiviere den Zugriff auf die nativen Tasten der Apple-Tastatur"; /* Class = "NSMenuItem"; title = "Normal"; ObjectID = "Riq-uM-bTs"; */ "Riq-uM-bTs.title" = "Normal"; /* Class = "NSTextFieldCell"; title = "General menu items style:"; ObjectID = "thh-DG-ecH"; */ -"thh-DG-ecH.title" = "Stil der Menüpunkte:"; +"thh-DG-ecH.title" = "Stil der Menüsymbole:"; /* Class = "NSTextFieldCell"; title = "@the0neyouseek (Guillaume B.)\n@JoniVR (Joni Van Roost)\n@waydabber (István T.)"; ObjectID = "TKd-J8-Iyk"; */ "TKd-J8-Iyk.title" = "@the0neyouseek (Guillaume B.)\n@JoniVR (Joni Van Roost)\n@waydabber (István T.)"; @@ -398,7 +398,7 @@ "Ytd-mg-N5E.title" = "Abhängig von der Mauszeigerposition"; /* Class = "NSTextFieldCell"; title = "Volume up"; ObjectID = "Z3w-eR-qDF"; */ -"Z3w-eR-qDF.title" = "Volume up"; +"Z3w-eR-qDF.title" = "Lauter"; /* Class = "NSButtonCell"; title = "Use hardware DDC control"; ObjectID = "ZdU-gV-V05"; */ "ZdU-gV-V05.title" = "Hardware DDC Steuerung verwenden"; From 4a3d99404fc167114c22d8b88e229b330ff8b405 Mon Sep 17 00:00:00 2001 From: Rob Wells Date: Wed, 16 Feb 2022 08:05:32 +0000 Subject: [PATCH 025/101] Fix Gamma Activity Enforcer window title typo (#952) --- MonitorControl/Support/DisplayManager.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MonitorControl/Support/DisplayManager.swift b/MonitorControl/Support/DisplayManager.swift index 36064c51..b9d51df4 100644 --- a/MonitorControl/Support/DisplayManager.swift +++ b/MonitorControl/Support/DisplayManager.swift @@ -15,7 +15,7 @@ class DisplayManager { var gammaInterferenceWarningShown = false func createGammaActivityEnforcer() { - self.gammaActivityEnforcer.title = "Monior Control Gamma Activity Enforcer" + self.gammaActivityEnforcer.title = "Monitor Control Gamma Activity Enforcer" self.gammaActivityEnforcer.isMovableByWindowBackground = false self.gammaActivityEnforcer.backgroundColor = DEBUG_GAMMA_ENFORCER ? .red : .black self.gammaActivityEnforcer.ignoresMouseEvents = true From 2f8cca201932556bf07e322949d4b49bda1a8d95 Mon Sep 17 00:00:00 2001 From: jajoho Date: Wed, 16 Feb 2022 15:42:48 +0100 Subject: [PATCH 026/101] German translation: onboarding (#940) --- MonitorControl/Info.plist | 2 +- MonitorControl/UI/de.lproj/Main.strings | 8 ++++---- MonitorControlHelper/Info.plist | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/MonitorControl/Info.plist b/MonitorControl/Info.plist index c2c93332..ebb8008b 100644 --- a/MonitorControl/Info.plist +++ b/MonitorControl/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 7027 + 7028 LSApplicationCategoryType public.app-category.utilities LSMinimumSystemVersion diff --git a/MonitorControl/UI/de.lproj/Main.strings b/MonitorControl/UI/de.lproj/Main.strings index 1d7683a9..d19b8076 100644 --- a/MonitorControl/UI/de.lproj/Main.strings +++ b/MonitorControl/UI/de.lproj/Main.strings @@ -14,7 +14,7 @@ "1zE-fg-xEm.title" = "DDC min"; /* Class = "NSTextFieldCell"; title = "Volume down"; ObjectID = "21s-bv-GTK"; */ -"21s-bv-GTK.title" = "Lautstärke verringern"; +"21s-bv-GTK.title" = "Leiser"; /* Class = "NSMenuItem"; title = "Show separate controls for each display in menu"; ObjectID = "3eO-bN-ZRl"; */ "3eO-bN-ZRl.title" = "Separate Steuerung für jeden Monitor im Menü anzeigen"; @@ -200,7 +200,7 @@ "j72-NF-zsW.title" = "Bei Anmeldung starten"; /* Class = "NSTextFieldCell"; title = "Toggle Mute"; ObjectID = "jK7-7w-uib"; */ -"jK7-7w-uib.title" = "Umschalten der Stummschaltung"; +"jK7-7w-uib.title" = "Stummschalten"; /* Class = "NSMenuItem"; title = "Change for all screens"; ObjectID = "jSj-HB-T2t"; */ "jSj-HB-T2t.title" = "Für alle Monitore ändern"; @@ -218,7 +218,7 @@ "K6A-4z-1aQ.title" = "Auch für Apple und eingebaute Monitore aktivieren"; /* Class = "NSTextFieldCell"; title = "MonitorControl needs access to \"accessibility\" to use macOS native keys to control your display.\nYou can enable it by adding MonitorControl in System Preferences > Security and Privacy > Accessibility."; ObjectID = "kBJ-Zf-1k2"; */ -"kBJ-Zf-1k2.title" = "MonitorControl benötigt Zugriff auf \"Bedienungshilfen\", um die Tasten deines Macs zur Steuerung deines Bildschirms zu verwenden.\n Du kannst das aktivieren, indem du MonitorControl in Systemeinstellungen > Sicherheit und Datenschutz > Bedienungshilfen hinzufügst."; +"kBJ-Zf-1k2.title" = "MonitorControl benötigt Zugriff auf \"Bedienungshilfen\", um die Tasten deines Macs zur Steuerung deines Bildschirms zu verwenden.\nDu kannst die Steuerung akivieren, indem du MonitorControl in Systemeinstellungen > Sicherheit und Datenschutz > Bedienungshilfen hinzufügst."; /* Class = "NSTextFieldCell"; title = "Screen to control:"; ObjectID = "Kfj-WK-aSL"; */ "Kfj-WK-aSL.title" = "Monitor für Steuerung:"; @@ -260,7 +260,7 @@ "na6-mS-MPi.title" = "Manipulation der Gammatabelle vermeiden"; /* Class = "NSTextFieldCell"; title = "Ensure MonitorControl is always running when you need it by launching the app at startup."; ObjectID = "nk6-Gh-Mfs"; */ -"nk6-Gh-Mfs.title" = "Stelle sicher, dass MonitorControl immer läuft, wenn du es brauchst, indem sie beim Anmelden startet."; +"nk6-Gh-Mfs.title" = "Stelle sicher, dass MonitorControl immer läuft, wenn du es brauchst, indem du die App beim Anmelden startest."; /* Class = "NSTextFieldCell"; title = "Brightness up"; ObjectID = "nty-g6-Sde"; */ "nty-g6-Sde.title" = "Helligkeit erhöhen"; diff --git a/MonitorControlHelper/Info.plist b/MonitorControlHelper/Info.plist index 558f7212..6666372f 100644 --- a/MonitorControlHelper/Info.plist +++ b/MonitorControlHelper/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 7027 + 7028 LSApplicationCategoryType public.app-category.utilities LSBackgroundOnly From 3d97037a769b4f3f423306118bb815e8cf53c137 Mon Sep 17 00:00:00 2001 From: Guillaume B Date: Tue, 22 Feb 2022 18:09:44 +0100 Subject: [PATCH 027/101] Add check for permissions on onboarding (#955) --- .../Contents.json | 18 ++++++++++++++++++ .../checkmark.png | Bin 0 -> 1175 bytes .../checkmark@2x.png | Bin 0 -> 2087 bytes MonitorControl/UI/Base.lproj/Main.storyboard | 5 ++++- .../Onboarding/OnboardingViewController.swift | 13 +++++++++++++ 5 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 MonitorControl/Assets.xcassets/onboarding_icon_checkmark.imageset/Contents.json create mode 100644 MonitorControl/Assets.xcassets/onboarding_icon_checkmark.imageset/checkmark.png create mode 100644 MonitorControl/Assets.xcassets/onboarding_icon_checkmark.imageset/checkmark@2x.png diff --git a/MonitorControl/Assets.xcassets/onboarding_icon_checkmark.imageset/Contents.json b/MonitorControl/Assets.xcassets/onboarding_icon_checkmark.imageset/Contents.json new file mode 100644 index 00000000..24500270 --- /dev/null +++ b/MonitorControl/Assets.xcassets/onboarding_icon_checkmark.imageset/Contents.json @@ -0,0 +1,18 @@ +{ + "images" : [ + { + "filename" : "checkmark.png", + "idiom" : "mac", + "scale" : "1x" + }, + { + "filename" : "checkmark@2x.png", + "idiom" : "mac", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MonitorControl/Assets.xcassets/onboarding_icon_checkmark.imageset/checkmark.png b/MonitorControl/Assets.xcassets/onboarding_icon_checkmark.imageset/checkmark.png new file mode 100644 index 0000000000000000000000000000000000000000..93c1b4e73d5e912bdd552f837917cb396091d9b7 GIT binary patch literal 1175 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa#^NA%Cx&(BWL^R}EvXTnX}-P; zT0k}j11qBt12aeo5Hc`IF|dN!3=Ce3(r|VVqXtwB69YqgCIbspO%#v@0S_Ps>W0$H z3m6e5E?|PI=3BswV1u;zoeKF0q&N#aB8wRqxP?KOkzv*x37~0_nIRD+5xzcF$@#f@ zi7EL>sd^Q;1t47vHWgMtW^QUpqC!P(PF}H9g{=};g%ywu64qBz04piUwpEJo4N!2- zFG^J~(=*UBP_pAvP*AWbN=dT{a&d!d2l8x{GD=Dctn~HE%ggo3jrH=2()A53EiLs8 zjP#9+bb%^#i!1X=5-W7`ij^UTz|3(;Elw`VEGWs$&r<-Io0ybeT4JlD1hNPYAnq*5 zOhed|R}A$Q(1ZFQ8GS=N1AVyJK&>_)Q7iwV%v7MwAoJ}EZNMr~#Gv-r=z}araty?$ zU{Rn~?YM08;lXCdB^mdSoq>VL-P6S}L_^dx(APUOP~>j){NL|(|9W#+!{D$%To_y6 z7elTiC1M&H~RTW z>*i|y^z~b>C+RLLm=|AO^0-z0N72sx>G?K?j|k6-mK0v>v1-k>3Ari#`{V!axq7hZ zc~Meo&MnTn)AO#c*H!geyLWPunkL83w)K(gwqMt)sS>u3S++cEUCd*TXB+41T)nd3 z@C07t;Gn)6#eqqu9MAr7Q7HcT_Jl)?MHJfx{wX3iECkBm-2xE5=5 zD*Jxky;S*V-k$l(LiRp&dzNA3ROKv_af5fI)ym2V-#j#hvVZ(M_Uzm4OBbD|CfwaH z(>Wu}`2+uqiS4nEW=xOXdQGw~Lza8R&YQcKFWKt6+`R1k1JwtI6XoJ$S2tMoB!qM+ z*?qsf?nT*#opatknd+3kr$ehoK{0W%o}>Af&}`1uGQwLmj~7{7yW+AyZ$c}YQLiNVXV%{gYAUmr6_i!SNPihmaU g)&1(nrS`IK>JP^1ctpI)sR89qPgg&ebxsLQ010KHA^-pY literal 0 HcmV?d00001 diff --git a/MonitorControl/Assets.xcassets/onboarding_icon_checkmark.imageset/checkmark@2x.png b/MonitorControl/Assets.xcassets/onboarding_icon_checkmark.imageset/checkmark@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b32e2d081b0401e7a148744a89c539f977e0244f GIT binary patch literal 2087 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 literal 0 HcmV?d00001 diff --git a/MonitorControl/UI/Base.lproj/Main.storyboard b/MonitorControl/UI/Base.lproj/Main.storyboard index 1e30d126..c8a92644 100644 --- a/MonitorControl/UI/Base.lproj/Main.storyboard +++ b/MonitorControl/UI/Base.lproj/Main.storyboard @@ -2249,7 +2249,7 @@ You can enable it by adding MonitorControl in System Preferences > Security a - + @@ -1320,7 +1320,7 @@ - + @@ -1329,7 +1329,7 @@ - + @@ -1338,7 +1338,7 @@ - + @@ -1350,7 +1350,7 @@ - + @@ -1378,7 +1378,7 @@ - + @@ -1393,7 +1393,7 @@ - + @@ -1405,7 +1405,7 @@ - + @@ -1417,7 +1417,7 @@ - + @@ -1429,7 +1429,7 @@ - + @@ -1441,7 +1441,7 @@ - + @@ -1453,7 +1453,7 @@ - + @@ -1485,7 +1485,7 @@ - + @@ -1505,7 +1505,7 @@ - + @@ -1514,7 +1514,7 @@ - + @@ -1523,7 +1523,7 @@ - + @@ -1532,7 +1532,7 @@ - + @@ -1541,7 +1541,7 @@ - + @@ -1550,7 +1550,7 @@ - + @@ -1559,7 +1559,7 @@ - + @@ -1568,7 +1568,7 @@ - + @@ -1593,7 +1593,7 @@ - - - + @@ -1624,7 +1624,7 @@ - - - - + @@ -1669,7 +1669,7 @@ - + @@ -1681,7 +1681,7 @@ - + @@ -1693,7 +1693,7 @@ - + @@ -1705,7 +1705,7 @@ - + @@ -1714,7 +1714,7 @@ - + @@ -1750,7 +1750,7 @@ - + @@ -1759,7 +1759,7 @@ - + @@ -1783,7 +1783,7 @@ - - + @@ -1830,7 +1830,7 @@ - + @@ -1967,7 +1967,7 @@ - + @@ -1976,7 +1976,7 @@ - + @@ -1985,7 +1985,7 @@ - + @@ -2002,18 +2002,6 @@ - - - - - - @the0neyouseek (Guillaume B.) -@JoniVR (Joni Van Roost) -@waydabber (István T.) - - - - @@ -2031,7 +2019,7 @@ - + @@ -1320,7 +1320,7 @@ - + @@ -1329,7 +1329,7 @@ - + @@ -1338,7 +1338,7 @@ - + @@ -1350,7 +1350,7 @@ - + @@ -1378,7 +1378,7 @@ - + @@ -1393,7 +1393,7 @@ - + @@ -1405,7 +1405,7 @@ - + @@ -1417,7 +1417,7 @@ - + @@ -1429,7 +1429,7 @@ - + @@ -1441,7 +1441,7 @@ - + @@ -1453,7 +1453,7 @@ - + @@ -1485,7 +1485,7 @@ - + @@ -1505,7 +1505,7 @@ - + @@ -1514,7 +1514,7 @@ - + @@ -1523,7 +1523,7 @@ - + @@ -1532,7 +1532,7 @@ - + @@ -1541,7 +1541,7 @@ - + @@ -1550,7 +1550,7 @@ - + @@ -1559,7 +1559,7 @@ - + @@ -1568,7 +1568,7 @@ - + @@ -1593,7 +1593,7 @@ - - - + @@ -1624,7 +1624,7 @@ - - - - + @@ -1669,7 +1669,7 @@ - + @@ -1681,7 +1681,7 @@ - + @@ -1693,7 +1693,7 @@ - + @@ -1705,7 +1705,7 @@ - + @@ -1714,7 +1714,7 @@ - + @@ -1750,7 +1750,7 @@ - + @@ -1759,7 +1759,7 @@ - + @@ -1783,7 +1783,7 @@ - - + @@ -1830,7 +1830,7 @@ - + @@ -1967,7 +1967,7 @@ - + @@ -1976,7 +1976,7 @@ - + @@ -1985,7 +1985,7 @@ - + @@ -2002,18 +2002,6 @@ - - - - - - @the0neyouseek (Guillaume B.) -@JoniVR (Joni Van Roost) -@waydabber (István T.) - - - - @@ -2031,7 +2019,7 @@