From 791b127a8180710f370b62ec9a6964e445eb3edc Mon Sep 17 00:00:00 2001 From: shay2000 Date: Sun, 13 Sep 2026 03:31:00 +0000 Subject: [PATCH 1/6] Refactor display/menu plumbing and fix crash-prone edge cases Fixes: - Arm64DDC retry loop trapped with arithmetic overflow when the retry count was 255 (exactly what OtherDisplay.readDDCValues clamps to); do the +1 in Int arithmetic. - IntelDDC.read trapped on an invalid 1...0 range when tries was 0; clamp to a single try instead. - Replace force-unwraps of Bundle.main.bundleIdentifier in AppDelegate.setStartAtLogin and MainPrefsViewController. - Remove the KVO observer MenuslidersPrefsViewController registers, and fix two log typos (Addig/destory). Refactors (no behavior change): - Remove dead DisplayManager.sortDisplays() and the misleading doc comment on getAllDisplays(); document why sortDisplaysByFriendlyName intentionally returns descending order. - Simplify addDisplayCounterSuffixes with Dictionary(grouping:by:). - Drop the duplicated default-volume assignment in OtherDisplay.setupCurrentAndMaxValues. - Use NSMenu.removeAllItems() in MenuHandler.clearMenu. - Replace manual min/max/count loops in SliderHandler.setValue and MediaKeyTapManager's hasExternalDisplay scan with stdlib calls. - Flatten trivial boolean if/else returns (Display.isBuiltIn, Display.isSwBrightnessNotDefault, OtherDisplay.isSw) and simplify Display.getKey, Arm64DDC.read, and UpdaterDelegate. - Remove IntelDDC.read's unused replyTransactionType parameter. --- MonitorControl/Model/Display.swift | 13 ++---- MonitorControl/Model/OtherDisplay.swift | 11 +---- MonitorControl/Support/AppDelegate.swift | 7 ++- MonitorControl/Support/Arm64DDC.swift | 21 +++++---- MonitorControl/Support/DisplayManager.swift | 43 +++++-------------- MonitorControl/Support/IntelDDC.swift | 5 ++- .../Support/MediaKeyTapManager.swift | 5 +-- MonitorControl/Support/MenuHandler.swift | 14 ++---- MonitorControl/Support/SliderHandler.swift | 14 ++---- MonitorControl/Support/UpdaterDelegate.swift | 2 +- .../Preferences/MainPrefsViewController.swift | 3 +- .../MenuslidersPrefsViewController.swift | 4 ++ 12 files changed, 49 insertions(+), 93 deletions(-) diff --git a/MonitorControl/Model/Display.swift b/MonitorControl/Model/Display.swift index 9d441c9..be9ec02 100644 --- a/MonitorControl/Model/Display.swift +++ b/MonitorControl/Model/Display.swift @@ -74,7 +74,7 @@ class Display: Equatable { } private func getKey(key: PrefKey? = nil, for command: Command? = nil) -> String { - (key ?? PrefKey.value).rawValue + (command != nil ? String((command ?? Command.none).rawValue) : "") + self.prefsId + (key ?? PrefKey.value).rawValue + (command.map { String($0.rawValue) } ?? "") + self.prefsId } init(_ identifier: CGDirectDisplayID, name: String, vendorNumber: UInt32?, modelNumber: UInt32?, serialNumber: UInt32?, isVirtual: Bool = false, isDummy: Bool = false) { @@ -359,10 +359,7 @@ class Display: Equatable { guard !self.isVirtual, !self.isDummy else { return false } - if self.getSwBrightness() < 1 { - return true - } - return false + return self.getSwBrightness() < 1 } func refreshBrightness() -> Float { @@ -370,10 +367,6 @@ class Display: Equatable { } func isBuiltIn() -> Bool { - if CGDisplayIsBuiltin(self.identifier) != 0 { - return true - } else { - return false - } + CGDisplayIsBuiltin(self.identifier) != 0 } } diff --git a/MonitorControl/Model/OtherDisplay.swift b/MonitorControl/Model/OtherDisplay.swift index 7c579c4..6a3a0e9 100644 --- a/MonitorControl/Model/OtherDisplay.swift +++ b/MonitorControl/Model/OtherDisplay.swift @@ -93,13 +93,10 @@ class OtherDisplay: Display { var maxDDCValue = UInt16(DDC_MAX_DETECT_LIMIT) var currentDDCValue: UInt16 switch command { - case .audioSpeakerVolume: currentDDCValue = UInt16(Float(DDC_MAX_DETECT_LIMIT) * 0.125) + case .audioSpeakerVolume: currentDDCValue = UInt16(Float(DDC_MAX_DETECT_LIMIT) * 0.125) // lower default audio value as high volume might rattle the user. 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(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() { if prefs.integer(forKey: PrefKey.startupAction.rawValue) == StartupAction.read.rawValue, self.pollingCount != 0, !app.safeMode { @@ -259,11 +256,7 @@ class OtherDisplay: Display { } func isSw() -> Bool { - if prefs.bool(forKey: PrefKey.forceSw.rawValue + self.prefsId) || self.isSwOnly() { - return true - } else { - return false - } + prefs.bool(forKey: PrefKey.forceSw.rawValue + self.prefsId) || self.isSwOnly() } let swAfterOsdAnimationSemaphore = DispatchSemaphore(value: 1) diff --git a/MonitorControl/Support/AppDelegate.swift b/MonitorControl/Support/AppDelegate.swift index d31b1cc..788be4f 100644 --- a/MonitorControl/Support/AppDelegate.swift +++ b/MonitorControl/Support/AppDelegate.swift @@ -400,8 +400,11 @@ class AppDelegate: NSObject, NSApplicationDelegate { } func setStartAtLogin(enabled: Bool) { - let identifier = "\(Bundle.main.bundleIdentifier!)Helper" as CFString - SMLoginItemSetEnabled(identifier, enabled) + guard let bundleID = Bundle.main.bundleIdentifier else { + os_log("Cannot toggle start at login without a bundle identifier.", type: .error) + return + } + SMLoginItemSetEnabled("\(bundleID)Helper" as CFString, enabled) } func getSystemSettings() -> [String: AnyObject]? { diff --git a/MonitorControl/Support/Arm64DDC.swift b/MonitorControl/Support/Arm64DDC.swift index d4390fa..d137d1e 100644 --- a/MonitorControl/Support/Arm64DDC.swift +++ b/MonitorControl/Support/Arm64DDC.swift @@ -70,17 +70,14 @@ class Arm64DDC: NSObject { } static func read(service: IOAVService?, command: UInt8, writeSleepTime: UInt32? = nil, numOfWriteCycles: UInt8? = nil, readSleepTime: UInt32? = nil, numOfRetryAttemps: UInt8? = nil, retrySleepTime: UInt32? = nil) -> (current: UInt16, max: UInt16)? { - var values: (UInt16, UInt16)? var send: [UInt8] = [command] var reply = [UInt8](repeating: 0, count: 11) - if Self.performDDCCommunication(service: service, send: &send, reply: &reply, writeSleepTime: writeSleepTime, numOfWriteCycles: numOfWriteCycles, readSleepTime: readSleepTime, numOfRetryAttemps: numOfRetryAttemps, retrySleepTime: retrySleepTime) { - let max = UInt16(reply[6]) * 256 + UInt16(reply[7]) - let current = UInt16(reply[8]) * 256 + UInt16(reply[9]) - values = (current, max) - } else { - values = nil + guard Self.performDDCCommunication(service: service, send: &send, reply: &reply, writeSleepTime: writeSleepTime, numOfWriteCycles: numOfWriteCycles, readSleepTime: readSleepTime, numOfRetryAttemps: numOfRetryAttemps, retrySleepTime: retrySleepTime) else { + return nil } - return values + let max = UInt16(reply[6]) * 256 + UInt16(reply[7]) + let current = UInt16(reply[8]) * 256 + UInt16(reply[9]) + return (current, max) } static func write(service: IOAVService?, command: UInt8, value: UInt16, writeSleepTime: UInt32? = nil, numOfWriteCycles: UInt8? = nil, numOfRetryAttemps: UInt8? = nil, retrySleepTime: UInt32? = nil) -> Bool { @@ -92,13 +89,15 @@ class Arm64DDC: NSObject { static func performDDCCommunication(service: IOAVService?, send: inout [UInt8], reply: inout [UInt8], writeSleepTime: UInt32? = nil, numOfWriteCycles: UInt8? = nil, readSleepTime: UInt32? = nil, numOfRetryAttemps: UInt8? = nil, retrySleepTime: UInt32? = nil) -> Bool { let dataAddress = ARM64_DDC_DATA_ADDRESS var success = false - guard service != nil else { + guard let service = service else { return success } var packet: [UInt8] = [UInt8(0x80 | (send.count + 1)), UInt8(send.count)] + send + [0] // Note: the last byte is the place of the checksum, see next line! packet[packet.count - 1] = self.checksum(chk: send.count == 1 ? ARM64_DDC_7BIT_ADDRESS << 1 : ARM64_DDC_7BIT_ADDRESS << 1 ^ dataAddress, data: &packet, start: 0, end: packet.count - 2) - for _ in 1 ... (numOfRetryAttemps ?? 4) + 1 { - for _ in 1 ... max((numOfWriteCycles ?? 2) + 0, 1) { + // Int arithmetic: a retry count of 255 (the clamp in OtherDisplay.readDDCValues allows + // exactly that) would overflow UInt8 on the `+ 1` and trap. + for _ in 1 ... Int(numOfRetryAttemps ?? 4) + 1 { + for _ in 1 ... max(numOfWriteCycles ?? 2, 1) { usleep(writeSleepTime ?? 10000) success = IOAVServiceWriteI2C(service, UInt32(ARM64_DDC_7BIT_ADDRESS), UInt32(dataAddress), &packet, UInt32(packet.count)) == 0 } diff --git a/MonitorControl/Support/DisplayManager.swift b/MonitorControl/Support/DisplayManager.swift index c92b24f..7a0b178 100644 --- a/MonitorControl/Support/DisplayManager.swift +++ b/MonitorControl/Support/DisplayManager.swift @@ -101,7 +101,7 @@ class DisplayManager { func destroyAllShades() -> Bool { var ret = false for displayID in self.shades.keys { - os_log("Attempting to destory shade for display %{public}@", type: .info, String(displayID)) + os_log("Attempting to destroy shade for display %{public}@", type: .info, String(displayID)) if self.destroyShade(displayID: displayID) { ret = true } @@ -240,23 +240,12 @@ class DisplayManager { self.displays.compactMap { $0 as? OtherDisplay } } - func sortDisplays() { - // Opsiyonel: sıralamadan önce log al - let before = displays.map { $0.name } - os_log("Displays before sorting: %{public}@", before) - - // In‑place sıralama - displays.sort { lhs, rhs in - lhs.name.localizedStandardCompare(rhs.name) == .orderedAscending - } - - // Opsiyonel: sıralamadan sonra log al - let after = displays.map { $0.name } - os_log("Displays after sorting: %{public}@", after) - } - /// Sorts the given displays by their friendly name. /// + /// The result is in descending name order on purpose: callers insert each display's + /// menu block at index 0, so the last display processed ends up at the top of the + /// menu. Feeding the blocks in descending order renders the menu in ascending order. + /// /// The list is passed in explicitly. An earlier version sorted `self.displays` and /// returned that, which silently discarded whatever filtering the caller had done — /// notably the "hide Apple displays from menu" preference. @@ -272,11 +261,8 @@ class DisplayManager { } } - - - /// displays dizisini sıralar ve döner func getAllDisplays() -> [Display] { - return displays + self.displays } func getDdcCapableDisplays() -> [OtherDisplay] { @@ -320,19 +306,10 @@ class DisplayManager { } func addDisplayCounterSuffixes() { - var nameDisplays: [String: [Display]] = [:] - for display in self.displays { - if nameDisplays[display.name] != nil { - nameDisplays[display.name]?.append(display) - } else { - nameDisplays[display.name] = [display] - } - } - for nameDisplayKey in nameDisplays.keys where nameDisplays[nameDisplayKey]?.count ?? 0 > 1 { - for i in 0 ... (nameDisplays[nameDisplayKey]?.count ?? 1) - 1 { - if let display = nameDisplays[nameDisplayKey]?[i] { - display.name = "" + display.name + " (" + String(i + 1) + ")" - } + let displaysByName = Dictionary(grouping: self.displays, by: { $0.name }) + for (_, sameNameDisplays) in displaysByName where sameNameDisplays.count > 1 { + for (index, display) in sameNameDisplays.enumerated() { + display.name = "\(display.name) (\(index + 1))" } } } diff --git a/MonitorControl/Support/IntelDDC.swift b/MonitorControl/Support/IntelDDC.swift index 93adc91..8f46bcf 100644 --- a/MonitorControl/Support/IntelDDC.swift +++ b/MonitorControl/Support/IntelDDC.swift @@ -70,7 +70,7 @@ public class IntelDDC { return success } - public func read(command: UInt8, tries: UInt = 1, replyTransactionType _: IOOptionBits? = nil, minReplyDelay: UInt64? = nil, errorRecoveryWaitTime: UInt32? = nil, writeSleepTime: UInt32 = 10000) -> (UInt16, UInt16)? { + public func read(command: UInt8, tries: UInt = 1, minReplyDelay: UInt64? = nil, errorRecoveryWaitTime: UInt32? = nil, writeSleepTime: UInt32 = 10000) -> (UInt16, UInt16)? { var data: [UInt8] = Array(repeating: 0, count: 5) var replyData: [UInt8] = Array(repeating: 0, count: 11) @@ -82,7 +82,8 @@ public class IntelDDC { let dataCount = UInt32(data.count) let replyDataCount = UInt32(replyData.count) - for i in 1 ... tries { + // A try count of zero would make `1 ... 0` an invalid range and trap, so treat it as a single try. + for i in 1 ... max(tries, 1) { usleep(writeSleepTime) usleep(errorRecoveryWaitTime ?? 0) let sent = data.withUnsafeMutableBytes { sendBuffer -> Bool in diff --git a/MonitorControl/Support/MediaKeyTapManager.swift b/MonitorControl/Support/MediaKeyTapManager.swift index c70fa83..ce68ac3 100644 --- a/MonitorControl/Support/MediaKeyTapManager.swift +++ b/MonitorControl/Support/MediaKeyTapManager.swift @@ -156,10 +156,7 @@ 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 hasExternalDisplay = false - for display in DisplayManager.shared.getAllDisplays() where !display.isBuiltIn() { - hasExternalDisplay = true - } + let hasExternalDisplay = DisplayManager.shared.getAllDisplays().contains { !$0.isBuiltIn() } // Disengage brightness keys on sleep so MacBook native screen can be controlled meanwhile let isTransient = app.sleepID != 0 || app.reconfigureID != 0 let disengageBrightness = !hasExternalDisplay || isTransient diff --git a/MonitorControl/Support/MenuHandler.swift b/MonitorControl/Support/MenuHandler.swift index 147c3e0..eb1e15b 100644 --- a/MonitorControl/Support/MenuHandler.swift +++ b/MonitorControl/Support/MenuHandler.swift @@ -9,13 +9,7 @@ class MenuHandler: NSMenu, NSMenuDelegate { var lastMenuRelevantDisplayId: CGDirectDisplayID = 0 func clearMenu() { - var items: [NSMenuItem] = [] - for i in 0 ..< self.items.count { - items.append(self.items[i]) - } - for item in items { - self.removeItem(item) - } + self.removeAllItems() self.combinedSliderHandler.removeAll() } @@ -41,7 +35,7 @@ class MenuHandler: NSMenu, NSMenuDelegate { let externalDisplays = DisplayManager.shared.displays.filter { CGDisplayIsBuiltin($0.identifier) == 0 } - if externalDisplays.count > 0 { + if !externalDisplays.isEmpty { showIcon = true } } @@ -72,7 +66,7 @@ class MenuHandler: NSMenu, NSMenuDelegate { } } if numOfDisplays != 0 { - let asSubMenu: Bool = (displays.count > 3 && !relevant && !combine && app.macOS10()) ? true : false + let asSubMenu = displays.count > 3 && !relevant && !combine && app.macOS10() var iterator = 0 for display in displays where (!relevant || DisplayManager.resolveEffectiveDisplayID(display.identifier) == relevantDisplayID) && !display.isDummy { iterator += 1 @@ -215,7 +209,7 @@ class MenuHandler: NSMenu, NSMenuDelegate { } func updateDisplayMenu(display: Display, asSubMenu: Bool, numOfDisplays: Int) { - os_log("Addig menu items for display %{public}@", type: .info, "\(display.identifier)") + os_log("Adding menu items for display %{public}@", type: .info, "\(display.identifier)") let monitorSubMenu: NSMenu = asSubMenu ? NSMenu() : self var addedSliderHandlers: [SliderHandler] = [] display.sliderHandler[.audioSpeakerVolume] = nil diff --git a/MonitorControl/Support/SliderHandler.swift b/MonitorControl/Support/SliderHandler.swift index 060a9b4..8f1e00d 100644 --- a/MonitorControl/Support/SliderHandler.swift +++ b/MonitorControl/Support/SliderHandler.swift @@ -525,16 +525,10 @@ class SliderHandler { self.values[displayID] = value slider.setHighlightItem(displayID, value: value) } - var maxVal: Float = 0 - var minVal: Float = .greatestFiniteMagnitude - var num = 0 - for key in self.values.keys { - if let val = values[key] { - maxVal = max(maxVal, val) - minVal = min(minVal, val) - num += 1 - } - } + let knownValues = self.values.values + let maxVal = knownValues.max() ?? 0 + let minVal = knownValues.min() ?? .greatestFiniteMagnitude + let num = knownValues.count let clampedValue = min(value, Float(slider.maxValue)) slider.floatValue = clampedValue self.updateIcon() diff --git a/MonitorControl/Support/UpdaterDelegate.swift b/MonitorControl/Support/UpdaterDelegate.swift index df108a5..98ccf05 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 { - prefs.bool(forKey: PrefKey.isBetaChannel.rawValue) ? Set(["beta"]) : Set([]) + prefs.bool(forKey: PrefKey.isBetaChannel.rawValue) ? ["beta"] : [] } } diff --git a/MonitorControl/View Controllers/Preferences/MainPrefsViewController.swift b/MonitorControl/View Controllers/Preferences/MainPrefsViewController.swift index 65f7ed7..02f3bcb 100644 --- a/MonitorControl/View Controllers/Preferences/MainPrefsViewController.swift +++ b/MonitorControl/View Controllers/Preferences/MainPrefsViewController.swift @@ -52,7 +52,8 @@ class MainPrefsViewController: NSViewController, SettingsPane { @available(macOS, deprecated: 10.10) func populateSettings() { // This is marked as deprectated but according to the function header it still does not have a replacement as of macOS 12 Monterey and is valid to use. - let startAtLogin = (SMCopyAllJobDictionaries(kSMDomainUserLaunchd).takeRetainedValue() as? [[String: AnyObject]])?.first { $0["Label"] as? String == "\(Bundle.main.bundleIdentifier!)Helper" }?["OnDemand"] as? Bool ?? false + let helperLabel = "\(Bundle.main.bundleIdentifier ?? "")Helper" + let startAtLogin = (SMCopyAllJobDictionaries(kSMDomainUserLaunchd).takeRetainedValue() as? [[String: AnyObject]])?.first { $0["Label"] as? String == helperLabel }?["OnDemand"] as? Bool ?? false self.startAtLogin.state = startAtLogin ? .on : .off self.combinedBrightness.state = prefs.bool(forKey: PrefKey.disableCombinedBrightness.rawValue) ? .off : .on self.allowZeroSwBrightness.state = prefs.bool(forKey: PrefKey.allowZeroSwBrightness.rawValue) ? .on : .off diff --git a/MonitorControl/View Controllers/Preferences/MenuslidersPrefsViewController.swift b/MonitorControl/View Controllers/Preferences/MenuslidersPrefsViewController.swift index 3d132ea..579ea1a 100644 --- a/MonitorControl/View Controllers/Preferences/MenuslidersPrefsViewController.swift +++ b/MonitorControl/View Controllers/Preferences/MenuslidersPrefsViewController.swift @@ -83,6 +83,10 @@ class MenuslidersPrefsViewController: NSViewController, SettingsPane { prefs.addObserver(self, forKeyPath: PrefKey.menuIcon.rawValue, context: nil) } + deinit { + prefs.removeObserver(self, forKeyPath: PrefKey.menuIcon.rawValue) + } + func populateSettings() { self.iconShow.selectItem(withTag: prefs.integer(forKey: PrefKey.menuIcon.rawValue)) self.menuItemStyle.selectItem(withTag: prefs.integer(forKey: PrefKey.menuItemStyle.rawValue)) From 81b79471875d1cf29038115e16c4f31ba2e2be0a Mon Sep 17 00:00:00 2001 From: shay2000 Date: Sun, 13 Sep 2026 04:01:47 +0000 Subject: [PATCH 2/6] Fix spelling and tighten wording in user-facing strings and comments User-facing (key changed in source and in all 19 Localizable.strings catalogs so no translation falls back to English): - 'An other app seems to change...' -> 'Another app seems to be changing..., which causes issues' in the gamma interference alert. - 'gammatable' -> 'gamma table' in the virtual display status text. - 'supports native Apple brightness protocol' -> 'supports Apple's native brightness protocol'. Comments and one log message: - PrefKey: fix two copy-pasted 'Show volume sliders' comments and two 'Disable slider snapping' comments that named the wrong setting; fix 'Is the specific control is set' grammar. - 'deprectated', 'orther' (MainPrefsViewController), 'Firendly name' (DisplaysPrefsViewController), 'more the 2 displays' (SliderHandler), 'Never let sound to mute accidentally' (OtherDisplay), 'why is the brightness suddenly changes' (DisplayManager), 'reconfigreID' log typo (AppDelegate), and 'MacOS 10' -> 'macOS 10'. --- MonitorControl/Enums/PrefKey.swift | 10 +++++----- MonitorControl/Model/Display.swift | 2 +- MonitorControl/Model/OtherDisplay.swift | 2 +- MonitorControl/Support/AppDelegate.swift | 2 +- MonitorControl/Support/DisplayManager.swift | 4 ++-- MonitorControl/Support/SliderHandler.swift | 2 +- MonitorControl/UI/cs.lproj/Localizable.strings | 6 +++--- MonitorControl/UI/de.lproj/Localizable.strings | 6 +++--- MonitorControl/UI/en.lproj/Localizable.strings | 6 +++--- MonitorControl/UI/es.lproj/Localizable.strings | 6 +++--- MonitorControl/UI/fr.lproj/Localizable.strings | 6 +++--- MonitorControl/UI/hi.lproj/Localizable.strings | 6 +++--- MonitorControl/UI/hu.lproj/Localizable.strings | 6 +++--- MonitorControl/UI/it.lproj/Localizable.strings | 6 +++--- MonitorControl/UI/ja.lproj/Localizable.strings | 6 +++--- MonitorControl/UI/ko.lproj/Localizable.strings | 6 +++--- MonitorControl/UI/nl.lproj/Localizable.strings | 6 +++--- MonitorControl/UI/pl.lproj/Localizable.strings | 6 +++--- MonitorControl/UI/pt-BR.lproj/Localizable.strings | 6 +++--- MonitorControl/UI/pt-PT.lproj/Localizable.strings | 6 +++--- MonitorControl/UI/ru.lproj/Localizable.strings | 6 +++--- MonitorControl/UI/sk.lproj/Localizable.strings | 6 +++--- MonitorControl/UI/tr.lproj/Localizable.strings | 6 +++--- MonitorControl/UI/zh-Hans.lproj/Localizable.strings | 6 +++--- MonitorControl/UI/zh-Hant-TW.lproj/Localizable.strings | 6 +++--- .../Preferences/DisplaysPrefsViewController.swift | 6 +++--- .../Preferences/MainPrefsViewController.swift | 4 ++-- 27 files changed, 73 insertions(+), 73 deletions(-) diff --git a/MonitorControl/Enums/PrefKey.swift b/MonitorControl/Enums/PrefKey.swift index 12d069f..5b1a936 100644 --- a/MonitorControl/Enums/PrefKey.swift +++ b/MonitorControl/Enums/PrefKey.swift @@ -33,10 +33,10 @@ enum PrefKey: String { // Hide brightness sliders case hideBrightness - // Show volume sliders + // Show contrast sliders case showContrast - // Show volume sliders + // Hide volume sliders case hideVolume // Lower via software after brightness @@ -48,10 +48,10 @@ enum PrefKey: String { // Do not show sliders for Apple displays (including built-in display) in menu case hideAppleFromMenu - // Disable slider snapping + // Enable slider snapping case enableSliderSnap - // Disable slider snapping + // Show percentage label next to sliders case enableSliderPercent // Show tick marks for sliders @@ -160,7 +160,7 @@ enum PrefKey: String { // Max command value display case curveDDC - // Is the specific control is set as unavailable for display? + // Is the specific control set as unavailable for the display? case unavailableDDC // Invert DDC scale? diff --git a/MonitorControl/Model/Display.swift b/MonitorControl/Model/Display.swift index be9ec02..57b2ae0 100644 --- a/MonitorControl/Model/Display.swift +++ b/MonitorControl/Model/Display.swift @@ -331,7 +331,7 @@ class Display: Equatable { DisplayManager.shared.gammaInterferenceWarningShown = true let alert = NSAlert() alert.messageText = NSLocalizedString("Is f.lux or similar running?", comment: "Shown in the alert dialog") - alert.informativeText = NSLocalizedString("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 LumaControl!", comment: "Shown in the alert dialog") + alert.informativeText = NSLocalizedString("Another app seems to be changing the brightness or colors, which causes issues.\n\nTo solve this, quit the other app or disable gamma control for your displays in LumaControl!", comment: "Shown in the alert dialog") alert.addButton(withTitle: NSLocalizedString("I'll quit the other app", comment: "Shown in the alert dialog")) alert.addButton(withTitle: NSLocalizedString("Disable gamma control for my displays", comment: "Shown in the alert dialog")) alert.alertStyle = NSAlert.Style.critical diff --git a/MonitorControl/Model/OtherDisplay.swift b/MonitorControl/Model/OtherDisplay.swift index 6a3a0e9..2665f8e 100644 --- a/MonitorControl/Model/OtherDisplay.swift +++ b/MonitorControl/Model/OtherDisplay.swift @@ -484,7 +484,7 @@ class OtherDisplay: Display { let deNormalizedValue = (maxDDCValue - minDDCValue) * curvedValue + minDDCValue var intDDCValue = UInt16(min(max(deNormalizedValue, minDDCValue), maxDDCValue)) if from > 0, command == Command.audioSpeakerVolume { - intDDCValue = max(1, intDDCValue) // Never let sound to mute accidentally, keep it digitally to at digital 1 if needed as muting breaks some displays + intDDCValue = max(1, intDDCValue) // Never let the volume mute accidentally; keep the digital value at 1 or higher if needed, as muting breaks some displays } return intDDCValue } diff --git a/MonitorControl/Support/AppDelegate.swift b/MonitorControl/Support/AppDelegate.swift index 788be4f..7668b83 100644 --- a/MonitorControl/Support/AppDelegate.swift +++ b/MonitorControl/Support/AppDelegate.swift @@ -214,7 +214,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { guard self.sleepID == 0, dispatchedReconfigureID == self.reconfigureID else { return } - os_log("Request for configuration with reconfigreID %{public}@", type: .info, String(dispatchedReconfigureID)) + os_log("Request for configuration with reconfigureID %{public}@", type: .info, String(dispatchedReconfigureID)) self.reconfigureID = 0 DisplayManager.shared.gammaInterferenceCounter = 0 DisplayManager.shared.configureDisplays() diff --git a/MonitorControl/Support/DisplayManager.swift b/MonitorControl/Support/DisplayManager.swift index 7a0b178..335b75c 100644 --- a/MonitorControl/Support/DisplayManager.swift +++ b/MonitorControl/Support/DisplayManager.swift @@ -363,7 +363,7 @@ class DisplayManager { if (otherDisplay.readPrefAsFloat(for: .brightness) == 0 && !prefs.bool(forKey: PrefKey.disableCombinedBrightness.rawValue)) || (otherDisplay.readPrefAsFloat(for: .brightness) < otherDisplay.combinedBrightnessSwitchingValue() && !prefs.bool(forKey: PrefKey.separateCombinedScale.rawValue) && !prefs.bool(forKey: PrefKey.disableCombinedBrightness.rawValue)) || otherDisplay.isSw() { let savedPrefValue = otherDisplay.readPrefAsFloat(key: .SwBrightness) if otherDisplay.getSwBrightness() != savedPrefValue { - OSDUtils.popEmptyOsd(displayID: otherDisplay.identifier, command: Command.brightness) // This will give the user a hint why is the brightness suddenly changes. + OSDUtils.popEmptyOsd(displayID: otherDisplay.identifier, command: Command.brightness) // This gives the user a hint why the brightness suddenly changed. } otherDisplay.savePref(otherDisplay.getSwBrightness(), key: .SwBrightness) os_log("Restoring sw brightness to %{public}@ on other display %{public}@", type: .info, String(savedPrefValue), String(otherDisplay.identifier)) @@ -530,7 +530,7 @@ class DisplayManager { return name } } - if let screen = getByDisplayID(displayID: displayID) { // MARK: This, and NSScreen+Extension.swift will not be needed when we drop MacOS 10 support. + if let screen = getByDisplayID(displayID: displayID) { // MARK: This, and NSScreen+Extension.swift will not be needed when we drop macOS 10 support. if #available(macOS 10.15, *) { return screen.localizedName diff --git a/MonitorControl/Support/SliderHandler.swift b/MonitorControl/Support/SliderHandler.swift index 8f1e00d..d2b9533 100644 --- a/MonitorControl/Support/SliderHandler.swift +++ b/MonitorControl/Support/SliderHandler.swift @@ -79,7 +79,7 @@ class SliderHandler { let barXDRMidColor = NSColor.systemOrange let barXDREndColor = NSColor.systemRed let xdrThresholdMarkerColor = NSColor.labelColor.withAlphaComponent(0.35) - let highlightDisplayIndicatorColor = NSColor.labelColor.withAlphaComponent(0.85) // This is visible if there is more the 2 displays + let highlightDisplayIndicatorColor = NSColor.labelColor.withAlphaComponent(0.85) // This is visible if there are more than 2 displays let tickMarkColor = NSColor.systemGray.withAlphaComponent(0.5) var isXDRSlider: Bool = false diff --git a/MonitorControl/UI/cs.lproj/Localizable.strings b/MonitorControl/UI/cs.lproj/Localizable.strings index 4ade995..430c1f1 100644 --- a/MonitorControl/UI/cs.lproj/Localizable.strings +++ b/MonitorControl/UI/cs.lproj/Localizable.strings @@ -2,7 +2,7 @@ "About" = "O aplikaci"; /* 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 LumaControl!" = "Zdá se, že jas a barvy ovládá ještě nějaká další aplikace, což způsobuje problémy.\n\nBuďto jinou aplikaci ukončete, nebo v LumaControl vypněte ovládání gamy pro Vaše displeje!"; +"Another app seems to be changing the brightness or colors, which causes issues.\n\nTo solve this, quit the other app or disable gamma control for your displays in LumaControl!" = "Zdá se, že jas a barvy ovládá ještě nějaká další aplikace, což způsobuje problémy.\n\nBuďto jinou aplikaci ukončete, nebo v LumaControl vypněte ovládání gamy pro Vaše displeje!"; /* Shown in the main prefs window */ "App menu" = "Nabídka"; @@ -128,10 +128,10 @@ "This display is reported to support hardware DDC control. If you encounter issues, you can disable hardware DDC control to force software control." = "Tento displej by měl podporovat hardwarové DDC ovládání. Pokud narazíte na problém, můžete hardwarové ovládání DDC vypnout a použít vynucené softwarové ovládání."; /* Shown in the Display Settings */ -"This display supports native Apple brightness protocol. This allows macOS to control this display without LumaControl as well." = "Tento displej podporuje nativní jasový protokol Apple. Díky tomu ho může macOS ovládat i bez LumaControl."; +"This display supports Apple's native brightness protocol. This allows macOS to control this display without LumaControl as well." = "Tento displej podporuje nativní jasový protokol Apple. Díky tomu ho může macOS ovládat i bez LumaControl."; /* Shown in the Display Settings */ -"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." = "Toto je virtuální displej (např. AirPlay, Sidecar, DisplayLink a podobně), který neumožňuje hardwarové, ani softwarové ovládání gamy. Jako náhrada slouží stínování, ale jen za předpokladu, že displej není nastaven na zrcadlení. Změny se neprojeví na ukazateli myši a můžou se objevit vizuální artefakty při přepínání režimu na celou obrazovku."; +"This is a virtual display (examples: AirPlay, Sidecar, display connected via a DisplayLink Dock or similar) which does not allow hardware or software gamma table 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." = "Toto je virtuální displej (např. AirPlay, Sidecar, DisplayLink a podobně), který neumožňuje hardwarové, ani softwarové ovládání gamy. Jako náhrada slouží stínování, ale jen za předpokladu, že displej není nastaven na zrcadlení. Změny se neprojeví na ukazateli myši a můžou se objevit vizuální artefakty při přepínání režimu na celou obrazovku."; /* Unknown display name */ "Unknown" = "Neznámý"; diff --git a/MonitorControl/UI/de.lproj/Localizable.strings b/MonitorControl/UI/de.lproj/Localizable.strings index 44ab6eb..e2ebbc0 100644 --- a/MonitorControl/UI/de.lproj/Localizable.strings +++ b/MonitorControl/UI/de.lproj/Localizable.strings @@ -2,7 +2,7 @@ "About" = "Über"; /* 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 LumaControl!" = "Eine andere App scheint die Helligkeit oder die Farben zu verändern, was zu Problemen führt.\n\nUm dieses Problem zu lösen, musst du die andere App beenden oder die Gamma-Steuerung für Deine Monitore in LumaControl deaktivieren!"; +"Another app seems to be changing the brightness or colors, which causes issues.\n\nTo solve this, quit the other app or disable gamma control for your displays in LumaControl!" = "Eine andere App scheint die Helligkeit oder die Farben zu verändern, was zu Problemen führt.\n\nUm dieses Problem zu lösen, musst du die andere App beenden oder die Gamma-Steuerung für Deine Monitore in LumaControl deaktivieren!"; /* Shown in the main prefs window */ "App menu" = "App Menü"; @@ -128,10 +128,10 @@ "This display is reported to support hardware DDC control. If you encounter issues, you can disable hardware DDC control to force software control." = "Dieser Monitor unterstützt anscheinend die Hardware-DDC-Steuerung. Wenn Probleme auftreten, kannst du die Hardware-DDC-Steuerung deaktivieren, um die Software-Steuerung zu erzwingen."; /* Shown in the Display Settings */ -"This display supports native Apple brightness protocol. This allows macOS to control this display without LumaControl as well." = "Dieser Monitor unterstützt das native Apple Helligkeitsprotokoll. Dies ermöglicht es macOS, diesen Monitor auch ohne LumaControl zu steuern."; +"This display supports Apple's native brightness protocol. This allows macOS to control this display without LumaControl as well." = "Dieser Monitor unterstützt das native Apple Helligkeitsprotokoll. Dies ermöglicht es macOS, diesen Monitor auch ohne LumaControl zu steuern."; /* Shown in the Display Settings */ -"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." = "Dies ist ein virtueller Monitor (Beispiele: AirPlay, Sidecar, über ein DisplayLink-Dock o.ä. angeschlossener Monitor), der keine hardware- oder softwareseitig gammierbare Steuerung erlaubt. Schattierung wird als Ersatz verwendet, aber nur in Nicht-Spiegelungs-Szenarien. Der Mauszeiger wird nicht beeinflusst und es können Artefakte auftreten, wenn der Vollbildmodus aktiviert oder verlassen wird."; +"This is a virtual display (examples: AirPlay, Sidecar, display connected via a DisplayLink Dock or similar) which does not allow hardware or software gamma table 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." = "Dies ist ein virtueller Monitor (Beispiele: AirPlay, Sidecar, über ein DisplayLink-Dock o.ä. angeschlossener Monitor), der keine hardware- oder softwareseitig gammierbare Steuerung erlaubt. Schattierung wird als Ersatz verwendet, aber nur in Nicht-Spiegelungs-Szenarien. Der Mauszeiger wird nicht beeinflusst und es können Artefakte auftreten, wenn der Vollbildmodus aktiviert oder verlassen wird."; /* unknown display name unknown model diff --git a/MonitorControl/UI/en.lproj/Localizable.strings b/MonitorControl/UI/en.lproj/Localizable.strings index 8eb9fbe..99e9164 100644 --- a/MonitorControl/UI/en.lproj/Localizable.strings +++ b/MonitorControl/UI/en.lproj/Localizable.strings @@ -2,7 +2,7 @@ "About" = "About"; /* 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 LumaControl!" = "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 LumaControl!"; +"Another app seems to be changing the brightness or colors, which causes issues.\n\nTo solve this, quit the other app or disable gamma control for your displays in LumaControl!" = "Another app seems to be changing the brightness or colors, which causes issues.\n\nTo solve this, quit the other app or disable gamma control for your displays in LumaControl!"; /* Shown in the main prefs window */ "App menu" = "App menu"; @@ -128,10 +128,10 @@ "This display is reported to support hardware DDC control. If you encounter issues, you can disable hardware DDC control to force software control." = "This display is reported to support hardware DDC control. If you encounter issues, you can disable hardware DDC control to force software control."; /* Shown in the Display Settings */ -"This display supports native Apple brightness protocol. This allows macOS to control this display without LumaControl as well." = "This display supports native Apple brightness protocol. This allows macOS to control this display without LumaControl as well."; +"This display supports Apple's native brightness protocol. This allows macOS to control this display without LumaControl as well." = "This display supports Apple's native brightness protocol. This allows macOS to control this display without LumaControl as well."; /* Shown in the Display Settings */ -"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." = "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."; +"This is a virtual display (examples: AirPlay, Sidecar, display connected via a DisplayLink Dock or similar) which does not allow hardware or software gamma table 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." = "This is a virtual display (examples: AirPlay, Sidecar, display connected via a DisplayLink Dock or similar) which does not allow hardware or software gamma table 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."; /* Unknown display name */ "Unknown" = "Unknown"; diff --git a/MonitorControl/UI/es.lproj/Localizable.strings b/MonitorControl/UI/es.lproj/Localizable.strings index bdd1b67..1248742 100644 --- a/MonitorControl/UI/es.lproj/Localizable.strings +++ b/MonitorControl/UI/es.lproj/Localizable.strings @@ -2,7 +2,7 @@ "About" = "Acerca de LumaControl"; /* 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 LumaControl!" = "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 LumaControl!"; +"Another app seems to be changing the brightness or colors, which causes issues.\n\nTo solve this, quit the other app or disable gamma control for your displays in LumaControl!" = "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 LumaControl!"; /* Shown in the main prefs window */ "App menu" = "Menú de la App"; @@ -129,10 +129,10 @@ "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 Settings */ -"This display supports native Apple brightness protocol. This allows macOS to control this display without LumaControl as well." = "Esta pantalla soporta el protocolo de brillo nativo de Apple. Esto le permite también a macOS controlar la pantalla sin LumaControl."; +"This display supports Apple's native brightness protocol. This allows macOS to control this display without LumaControl as well." = "Esta pantalla soporta el protocolo de brillo nativo de Apple. Esto le permite también a macOS controlar la pantalla sin LumaControl."; /* Shown in the Display Settings */ -"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 se verá afectado pero pueden aparecer objetos extraños cuando se entra/sale del modo pantalla completa."; +"This is a virtual display (examples: AirPlay, Sidecar, display connected via a DisplayLink Dock or similar) which does not allow hardware or software gamma table 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 se verá afectado pero pueden aparecer objetos extraños cuando se entra/sale del modo pantalla completa."; /* Unknown display name */ "Unknown" = "Desconocido"; diff --git a/MonitorControl/UI/fr.lproj/Localizable.strings b/MonitorControl/UI/fr.lproj/Localizable.strings index 44d94c9..d638eba 100644 --- a/MonitorControl/UI/fr.lproj/Localizable.strings +++ b/MonitorControl/UI/fr.lproj/Localizable.strings @@ -2,7 +2,7 @@ "About" = "À Propos"; /* 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 LumaControl!" = "Une autre application semble modifier la luminosité ou les couleurs, ce qui provoque des problèmes.\n\nPour résoudre ce problème, vous devez quitter l'autre application ou désactiver le contrôle gamma pour vos écrans dans LumaControl !"; +"Another app seems to be changing the brightness or colors, which causes issues.\n\nTo solve this, quit the other app or disable gamma control for your displays in LumaControl!" = "Une autre application semble modifier la luminosité ou les couleurs, ce qui provoque des problèmes.\n\nPour résoudre ce problème, vous devez quitter l'autre application ou désactiver le contrôle gamma pour vos écrans dans LumaControl !"; /* Shown in the main prefs window */ "App menu" = "Menu de l'app"; @@ -128,10 +128,10 @@ "This display is reported to support hardware DDC control. If you encounter issues, you can disable hardware DDC control to force software control." = "Cet écran signal prendre en charge le contrôle DDC matériel. Si vous rencontrez des problèmes, vous pouvez désactiver le contrôle DDC matériel pour forcer le contrôle logiciel."; /* Shown in the Display Settings */ -"This display supports native Apple brightness protocol. This allows macOS to control this display without LumaControl as well." = "Cet écran prend en charge le protocole de luminosité natif d'Apple. Cela permet à macOS de contrôler également cet affichage sans LumaControl."; +"This display supports Apple's native brightness protocol. This allows macOS to control this display without LumaControl as well." = "Cet écran prend en charge le protocole de luminosité natif d'Apple. Cela permet à macOS de contrôler également cet affichage sans LumaControl."; /* Shown in the Display Settings */ -"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." = "Il s'agit d'un écran virtuel (exemples : AirPlay, Sidecar, écran connecté via un dock DisplayLink ou similaire) qui ne permet pas un contrôle par table gamma matériel ou logiciel. Un voile est utilisé comme substitut, mais uniquement dans les scénarios sans mode \"miroir\". Le curseur de la souris ne sera pas affecté et des artefacts peuvent apparaître lors de l'entrée/sortie du mode plein écran."; +"This is a virtual display (examples: AirPlay, Sidecar, display connected via a DisplayLink Dock or similar) which does not allow hardware or software gamma table 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." = "Il s'agit d'un écran virtuel (exemples : AirPlay, Sidecar, écran connecté via un dock DisplayLink ou similaire) qui ne permet pas un contrôle par table gamma matériel ou logiciel. Un voile est utilisé comme substitut, mais uniquement dans les scénarios sans mode \"miroir\". Le curseur de la souris ne sera pas affecté et des artefacts peuvent apparaître lors de l'entrée/sortie du mode plein écran."; /* Unknown display name Unknown model diff --git a/MonitorControl/UI/hi.lproj/Localizable.strings b/MonitorControl/UI/hi.lproj/Localizable.strings index 09cda92..682e29f 100644 --- a/MonitorControl/UI/hi.lproj/Localizable.strings +++ b/MonitorControl/UI/hi.lproj/Localizable.strings @@ -2,7 +2,7 @@ "About" = "के बारे में"; /* 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 LumaControl!" = "ऐसा लगता है कि एक अन्य ऐप चमक या रंगों को बदल देता है जो समस्याओं का कारण बनता है।\n\n इसे हल करने के लिए आपको अन्य ऐप को छोड़ना होगा या मॉनिटरकंट्रोल में अपने डिस्प्ले के लिए गामा नियंत्रण को अक्षम करना होगा!"; +"Another app seems to be changing the brightness or colors, which causes issues.\n\nTo solve this, quit the other app or disable gamma control for your displays in LumaControl!" = "ऐसा लगता है कि एक अन्य ऐप चमक या रंगों को बदल देता है जो समस्याओं का कारण बनता है।\n\n इसे हल करने के लिए आपको अन्य ऐप को छोड़ना होगा या मॉनिटरकंट्रोल में अपने डिस्प्ले के लिए गामा नियंत्रण को अक्षम करना होगा!"; /* Shown in the main prefs window */ "App menu" = "ऐप मेन्यू"; @@ -128,10 +128,10 @@ "This display is reported to support hardware DDC control. If you encounter issues, you can disable hardware DDC control to force software control." = "यह प्रदर्शन हार्डवेयर डीडीसी नियंत्रण का समर्थन करता है। यदि आपको समस्याओं का सामना करना पड़ता है, तो आप सॉफ्टवेयर नियंत्रण को मजबूर करने के लिए हार्डवेयर डीडीसी नियंत्रण को अक्षम कर सकते हैं।"; /* Shown in the Display Settings */ -"This display supports native Apple brightness protocol. This allows macOS to control this display without LumaControl as well." = "यह डिस्प्ले नेटिव ऐप्पल ब्राइटनेस प्रोटोकॉल का समर्थन करता है। यह मैकोस को मॉनिटर कंट्रोल के बिना भी इस प्रदर्शन को नियंत्रित करने की अनुमति देता है।"; +"This display supports Apple's native brightness protocol. This allows macOS to control this display without LumaControl as well." = "यह डिस्प्ले नेटिव ऐप्पल ब्राइटनेस प्रोटोकॉल का समर्थन करता है। यह मैकोस को मॉनिटर कंट्रोल के बिना भी इस प्रदर्शन को नियंत्रित करने की अनुमति देता है।"; /* Shown in the Display Settings */ -"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." = "यह एक आभासी प्रदर्शन है (उदाहरणः एयरप्ले, साइडकार, डिस्प्ले लिंक डॉक या इसी तरह के माध्यम से जुड़ा हुआ प्रदर्शन) जो हार्डवेयर या सॉफ़्टवेयर गैमेटेबल नियंत्रण की अनुमति नहीं देता है। छायांकन का उपयोग एक विकल्प के रूप में किया जाता है लेकिन केवल गैर-दर्पण परिदृश्यों में। माउस कर्सर अप्रभावित रहेगा और पूर्ण स्क्रीन मोड में प्रवेश करते/छोड़ते समय कलाकृतियाँ दिखाई दे सकती हैं।"; +"This is a virtual display (examples: AirPlay, Sidecar, display connected via a DisplayLink Dock or similar) which does not allow hardware or software gamma table 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." = "यह एक आभासी प्रदर्शन है (उदाहरणः एयरप्ले, साइडकार, डिस्प्ले लिंक डॉक या इसी तरह के माध्यम से जुड़ा हुआ प्रदर्शन) जो हार्डवेयर या सॉफ़्टवेयर गैमेटेबल नियंत्रण की अनुमति नहीं देता है। छायांकन का उपयोग एक विकल्प के रूप में किया जाता है लेकिन केवल गैर-दर्पण परिदृश्यों में। माउस कर्सर अप्रभावित रहेगा और पूर्ण स्क्रीन मोड में प्रवेश करते/छोड़ते समय कलाकृतियाँ दिखाई दे सकती हैं।"; /* Unknown display name */ "Unknown" = "अज्ञात"; diff --git a/MonitorControl/UI/hu.lproj/Localizable.strings b/MonitorControl/UI/hu.lproj/Localizable.strings index a461848..522d51e 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 LumaControl!" = "Ú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 LumaControl-ban a kijelzők gamma vezérlésének letiltásával!"; +"Another app seems to be changing the brightness or colors, which causes issues.\n\nTo solve this, quit the other app or disable gamma control for your displays in LumaControl!" = "Ú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 LumaControl-ban a kijelzők gamma vezérlésének letiltásával!"; /* Shown in the main prefs window */ "App menu" = "Menü"; @@ -128,10 +128,10 @@ "This display is reported to support hardware DDC control. If you encounter issues, you can disable hardware DDC control to force software control." = "Ez a kijelző támogatja a hardveres vezérlést. Amennyiben problémákat tapasztal, kapcsolja ki a hardveres DDC vezérlést a szoftveres alternatíva érdekében!"; /* Shown in the Display Settings */ -"This display supports native Apple brightness protocol. This allows macOS to control this display without LumaControl as well." = "Ez a kijelző az Apple saját fényerőkezelő protokolját támogatja. Ez lehetővé teszi a macOS számára is a fényerő vezérlését, LumaControl nélkül is."; +"This display supports Apple's native brightness protocol. This allows macOS to control this display without LumaControl as well." = "Ez a kijelző az Apple saját fényerőkezelő protokolját támogatja. Ez lehetővé teszi a macOS számára is a fényerő vezérlését, LumaControl nélkül is."; /* Shown in the Display Settings */ -"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." = "Ez egy virtuális kijelző (AirPlay, Sidecar, DisplayLink állomás vagy hasonló), amely nem támogatja sem a hardveres, sem a szoftveres gamma táblázat alapú fényerőkezelést. Emiatt a program árnyékolást alkalmaz, amennyiben a kijelző nincs tükrözve. Az egérkurzorra az árnyékolás nincs hatással, valamint képernyőhibák jelentkezhetnek, amikor teljes képernyős ablakváltás történik."; +"This is a virtual display (examples: AirPlay, Sidecar, display connected via a DisplayLink Dock or similar) which does not allow hardware or software gamma table 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." = "Ez egy virtuális kijelző (AirPlay, Sidecar, DisplayLink állomás vagy hasonló), amely nem támogatja sem a hardveres, sem a szoftveres gamma táblázat alapú fényerőkezelést. Emiatt a program árnyékolást alkalmaz, amennyiben a kijelző nincs tükrözve. Az egérkurzorra az árnyékolás nincs hatással, valamint képernyőhibák jelentkezhetnek, amikor teljes képernyős ablakváltás történik."; /* Unknown display name Unknown model diff --git a/MonitorControl/UI/it.lproj/Localizable.strings b/MonitorControl/UI/it.lproj/Localizable.strings index dc587bd..0ef10c9 100644 --- a/MonitorControl/UI/it.lproj/Localizable.strings +++ b/MonitorControl/UI/it.lproj/Localizable.strings @@ -2,7 +2,7 @@ "About" = "Informazioni"; /* 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 LumaControl!" = "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 LumaControl!"; +"Another app seems to be changing the brightness or colors, which causes issues.\n\nTo solve this, quit the other app or disable gamma control for your displays in LumaControl!" = "Another app seems to be changing the brightness or colors, which causes issues.\n\nTo solve this, quit the other app or disable gamma control for your displays in LumaControl!"; /* Shown in the main prefs window */ "App menu" = "App menu"; @@ -128,10 +128,10 @@ "This display is reported to support hardware DDC control. If you encounter issues, you can disable hardware DDC control to force software control." = "Questo monitor supporta il controllo DDC hardware. Se rilevi dei problemi, puoi disabilitarlo e forzare il controllo software."; /* Shown in the Display Settings */ -"This display supports native Apple brightness protocol. This allows macOS to control this display without LumaControl as well." = "Questo monitor supporta il protocollo nativo Apple della luminosità. Questo permette al macOS di controllare il monitor anhe senza l'utilizzo di LumaControl."; +"This display supports Apple's native brightness protocol. This allows macOS to control this display without LumaControl as well." = "Questo monitor supporta il protocollo nativo Apple della luminosità. Questo permette al macOS di controllare il monitor anhe senza l'utilizzo di LumaControl."; /* Shown in the Display Settings */ -"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." = "Questo monitor è un di tipo virtuale (esempio: AirPlay, Sidecar, connessione via via DisplayLink Dock o simili) e non consente il controllo hardware o software della gammatable. La sfumatura è utilizzata in sostituzione ma solo in modalità non duplicazione. Il cursore del mouse non rimane invariato e si potrebbero verificare artefatti entrando/uscendo dalla modalità a pieno schermo."; +"This is a virtual display (examples: AirPlay, Sidecar, display connected via a DisplayLink Dock or similar) which does not allow hardware or software gamma table 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." = "Questo monitor è un di tipo virtuale (esempio: AirPlay, Sidecar, connessione via via DisplayLink Dock o simili) e non consente il controllo hardware o software della gammatable. La sfumatura è utilizzata in sostituzione ma solo in modalità non duplicazione. Il cursore del mouse non rimane invariato e si potrebbero verificare artefatti entrando/uscendo dalla modalità a pieno schermo."; /* Unknown display name */ "Unknown" = "Sconosciuto"; diff --git a/MonitorControl/UI/ja.lproj/Localizable.strings b/MonitorControl/UI/ja.lproj/Localizable.strings index 73f07e5..c51d6e2 100644 --- a/MonitorControl/UI/ja.lproj/Localizable.strings +++ b/MonitorControl/UI/ja.lproj/Localizable.strings @@ -2,7 +2,7 @@ "About" = "アプリについて"; /* 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 LumaControl!" = "他のアプリが明るさや色を変更して問題を引き起こしているようです。\n\nこれを解決するには、他のアプリを終了するか、LumaControlでディスプレイのガンマ制御を無効にする必要があります!"; +"Another app seems to be changing the brightness or colors, which causes issues.\n\nTo solve this, quit the other app or disable gamma control for your displays in LumaControl!" = "他のアプリが明るさや色を変更して問題を引き起こしているようです。\n\nこれを解決するには、他のアプリを終了するか、LumaControlでディスプレイのガンマ制御を無効にする必要があります!"; /* Shown in the main prefs window */ "App menu" = "アプリメニュー"; @@ -128,10 +128,10 @@ "This display is reported to support hardware DDC control. If you encounter issues, you can disable hardware DDC control to force software control." = "このディスプレイはハードウェアDDC制御をサポートしていると報告されています。問題が発生した場合は、ハードウェアDDC制御を無効にしてソフトウェア制御を強制することができます。"; /* Shown in the Display Settings */ -"This display supports native Apple brightness protocol. This allows macOS to control this display without LumaControl as well." = "このディスプレイは、ネイティブのApple輝度プロトコルをサポートしています。これにより、macOSはLumaControl なしでもこのディスプレイを制御できるようになります。"; +"This display supports Apple's native brightness protocol. This allows macOS to control this display without LumaControl as well." = "このディスプレイは、ネイティブのApple輝度プロトコルをサポートしています。これにより、macOSはLumaControl なしでもこのディスプレイを制御できるようになります。"; /* Shown in the Display Settings */ -"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." = "これは仮想ディスプレイ (例: AirPlay、Sidecar、DisplayLink Dock などを介して接続されたディスプレイ) であり、ハードウェアまたはソフトウェアのガンマテーブル制御を許可しません。代わりにシェーディングが使用されますが、ミラー以外のシナリオでのみ使用されます。マウスカーソルは影響を受けませんが、全画面モードを切り替える際にアーティファクトが表示される場合があります。"; +"This is a virtual display (examples: AirPlay, Sidecar, display connected via a DisplayLink Dock or similar) which does not allow hardware or software gamma table 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." = "これは仮想ディスプレイ (例: AirPlay、Sidecar、DisplayLink Dock などを介して接続されたディスプレイ) であり、ハードウェアまたはソフトウェアのガンマテーブル制御を許可しません。代わりにシェーディングが使用されますが、ミラー以外のシナリオでのみ使用されます。マウスカーソルは影響を受けませんが、全画面モードを切り替える際にアーティファクトが表示される場合があります。"; /* Unknown display name */ "Unknown" = "不明"; diff --git a/MonitorControl/UI/ko.lproj/Localizable.strings b/MonitorControl/UI/ko.lproj/Localizable.strings index e924978..2a0d438 100644 --- a/MonitorControl/UI/ko.lproj/Localizable.strings +++ b/MonitorControl/UI/ko.lproj/Localizable.strings @@ -2,7 +2,7 @@ "About" = "정보"; /* 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 LumaControl!" = "다른 앱이 밝기 또는 색상을 변경하여 문제를 일으키는 것 같습니다.\n\n이 문제를 해결하려면 다른 앱을 종료하거나 LumaControl에서 디스플레이에 대한 감마 제어를 비활성화해야 합니다!"; +"Another app seems to be changing the brightness or colors, which causes issues.\n\nTo solve this, quit the other app or disable gamma control for your displays in LumaControl!" = "다른 앱이 밝기 또는 색상을 변경하여 문제를 일으키는 것 같습니다.\n\n이 문제를 해결하려면 다른 앱을 종료하거나 LumaControl에서 디스플레이에 대한 감마 제어를 비활성화해야 합니다!"; /* Shown in the main prefs window */ "App menu" = "앱 메뉴"; @@ -128,10 +128,10 @@ "This display is reported to support hardware DDC control. If you encounter issues, you can disable hardware DDC control to force software control." = "이 디스플레이는 하드웨어 DDC 제어를 지원하는 것으로 보고되었습니다. 문제가 발생하면 하드웨어 DDC 제어를 비활성화하여 소프트웨어 제어를 강제 실행할 수 있습니다."; /* Shown in the Display Settings */ -"This display supports native Apple brightness protocol. This allows macOS to control this display without LumaControl as well." = "이 디스플레이는 기본 Apple 밝기 프로토콜을 지원합니다. 이를 통해 macOS는 LumaControl 없이도 이 디스플레이를 제어할 수 있습니다."; +"This display supports Apple's native brightness protocol. This allows macOS to control this display without LumaControl as well." = "이 디스플레이는 기본 Apple 밝기 프로토콜을 지원합니다. 이를 통해 macOS는 LumaControl 없이도 이 디스플레이를 제어할 수 있습니다."; /* Shown in the Display Settings */ -"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." = "하드웨어 또는 소프트웨어 감마 설정을 허용하지 않는 가상 디스플레이(예: AirPlay, Sidecar, DisplayLink Dock을 통해 연결된 디스플레이 등)입니다. 명암 조절이 대신 사용되지만 미러링이 아닌 경우에만 사용됩니다. 마우스 커서는 영향을 받지 않으며 전체 화면 모드에 들어가거나 나갈 때 아티팩트가 나타날 수 있습니다."; +"This is a virtual display (examples: AirPlay, Sidecar, display connected via a DisplayLink Dock or similar) which does not allow hardware or software gamma table 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." = "하드웨어 또는 소프트웨어 감마 설정을 허용하지 않는 가상 디스플레이(예: AirPlay, Sidecar, DisplayLink Dock을 통해 연결된 디스플레이 등)입니다. 명암 조절이 대신 사용되지만 미러링이 아닌 경우에만 사용됩니다. 마우스 커서는 영향을 받지 않으며 전체 화면 모드에 들어가거나 나갈 때 아티팩트가 나타날 수 있습니다."; /* Unknown display name */ "Unknown" = "알 수 없음"; diff --git a/MonitorControl/UI/nl.lproj/Localizable.strings b/MonitorControl/UI/nl.lproj/Localizable.strings index dc33639..4de612e 100644 --- a/MonitorControl/UI/nl.lproj/Localizable.strings +++ b/MonitorControl/UI/nl.lproj/Localizable.strings @@ -2,7 +2,7 @@ "About" = "Over"; /* 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 LumaControl!" = "Een andere app lijkt de helderheid of kleuren te veranderen, wat problemen veroorzaakt. Om dit op te lossen, moet u de andere app afsluiten of de gammaregeling voor uw beeldschermen uitschakelen in LumaControl!"; +"Another app seems to be changing the brightness or colors, which causes issues.\n\nTo solve this, quit the other app or disable gamma control for your displays in LumaControl!" = "Een andere app lijkt de helderheid of kleuren te veranderen, wat problemen veroorzaakt. Om dit op te lossen, moet u de andere app afsluiten of de gammaregeling voor uw beeldschermen uitschakelen in LumaControl!"; /* Shown in the main prefs window */ "App menu" = "App menu"; @@ -128,10 +128,10 @@ "This display is reported to support hardware DDC control. If you encounter issues, you can disable hardware DDC control to force software control." = "Dit scherm ondersteunt hardware DDC-besturing. Als u problemen ondervindt, kunt u de hardware DDC-besturing uitschakelen om softwarebesturing te forceren"; /* Shown in the Display Settings */ -"This display supports native Apple brightness protocol. This allows macOS to control this display without LumaControl as well." = "Dit scherm ondersteunt het native Apple-helderheidsprotocol. Hierdoor kan macOS dit scherm ook zonder LumaControl bedienen."; +"This display supports Apple's native brightness protocol. This allows macOS to control this display without LumaControl as well." = "Dit scherm ondersteunt het native Apple-helderheidsprotocol. Hierdoor kan macOS dit scherm ook zonder LumaControl bedienen."; /* Shown in the Display Settings */ -"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." = "Dit is een virtueel scherm (voorbeelden: AirPlay, Sidecar, scherm aangesloten via een DisplayLink Dock of gelijkaardig) dat geen hardware- of softwaregammabesturing toestaat. Shading wordt gebruikt als vervanging, maar alleen in scenario's zonder mirroring. De muiscursor wordt niet beïnvloed en er kunnen artefacten verschijnen bij het openen/verlaten van de fullscreen modus."; +"This is a virtual display (examples: AirPlay, Sidecar, display connected via a DisplayLink Dock or similar) which does not allow hardware or software gamma table 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." = "Dit is een virtueel scherm (voorbeelden: AirPlay, Sidecar, scherm aangesloten via een DisplayLink Dock of gelijkaardig) dat geen hardware- of softwaregammabesturing toestaat. Shading wordt gebruikt als vervanging, maar alleen in scenario's zonder mirroring. De muiscursor wordt niet beïnvloed en er kunnen artefacten verschijnen bij het openen/verlaten van de fullscreen modus."; /* unknown display name unknown model diff --git a/MonitorControl/UI/pl.lproj/Localizable.strings b/MonitorControl/UI/pl.lproj/Localizable.strings index e61d4ae..b966472 100644 --- a/MonitorControl/UI/pl.lproj/Localizable.strings +++ b/MonitorControl/UI/pl.lproj/Localizable.strings @@ -2,7 +2,7 @@ "About" = "O programie"; /* 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 LumaControl!" = "Inna aplikacja wydaje się zmieniać jasność lub kolory, co powoduje problemy.\n\nAby rozwiązać ten problem, należy zamknąć inną aplikację lub wyłączyć kontrolę gamma dla wyświetlaczy w programie LumaControl!"; +"Another app seems to be changing the brightness or colors, which causes issues.\n\nTo solve this, quit the other app or disable gamma control for your displays in LumaControl!" = "Inna aplikacja wydaje się zmieniać jasność lub kolory, co powoduje problemy.\n\nAby rozwiązać ten problem, należy zamknąć inną aplikację lub wyłączyć kontrolę gamma dla wyświetlaczy w programie LumaControl!"; /* Shown in the main prefs window */ "App menu" = "Menu aplikacji"; @@ -128,10 +128,10 @@ "This display is reported to support hardware DDC control. If you encounter issues, you can disable hardware DDC control to force software control." = "Ten wyświetlacz obsługuje podobno sprzętowe sterowanie DDC. Jeśli wystąpią problemy, można wyłączyć sprzętowe sterowanie DDC, aby wymusić sterowanie programowe."; /* Shown in the Display Settings */ -"This display supports native Apple brightness protocol. This allows macOS to control this display without LumaControl as well." = "Ten wyświetlacz obsługuje natywny protokół jasności firmy Apple. Dzięki temu system macOS może sterować tym monitorem także bez programu LumaControl."; +"This display supports Apple's native brightness protocol. This allows macOS to control this display without LumaControl as well." = "Ten wyświetlacz obsługuje natywny protokół jasności firmy Apple. Dzięki temu system macOS może sterować tym monitorem także bez programu LumaControl."; /* Shown in the Display Settings */ -"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." = "Jest to wirtualny wyświetlacz (typu: AirPlay, Sidecar, wyświetlacz podłączony za pomocą stacji dokującej DisplayLink Dock lub podobnej), który nie umożliwia sterowania gammatycznego sprzętowego ani programowego. Cieniowanie jest używane jako substytut, ale tylko w scenariuszach bez lustra. Nie ma to wpływu na kursor myszy, a artefakty mogą się pojawiać podczas wchodzenia i wychodzenia z trybu pełnoekranowego.."; +"This is a virtual display (examples: AirPlay, Sidecar, display connected via a DisplayLink Dock or similar) which does not allow hardware or software gamma table 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." = "Jest to wirtualny wyświetlacz (typu: AirPlay, Sidecar, wyświetlacz podłączony za pomocą stacji dokującej DisplayLink Dock lub podobnej), który nie umożliwia sterowania gammatycznego sprzętowego ani programowego. Cieniowanie jest używane jako substytut, ale tylko w scenariuszach bez lustra. Nie ma to wpływu na kursor myszy, a artefakty mogą się pojawiać podczas wchodzenia i wychodzenia z trybu pełnoekranowego.."; /* Unknown display name */ "Unknown" = "Nieznany"; diff --git a/MonitorControl/UI/pt-BR.lproj/Localizable.strings b/MonitorControl/UI/pt-BR.lproj/Localizable.strings index 8388a67..d3e2041 100644 --- a/MonitorControl/UI/pt-BR.lproj/Localizable.strings +++ b/MonitorControl/UI/pt-BR.lproj/Localizable.strings @@ -2,7 +2,7 @@ "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 LumaControl!" = "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 LumaControl"; +"Another app seems to be changing the brightness or colors, which causes issues.\n\nTo solve this, quit the other app or disable gamma control for your displays in LumaControl!" = "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 LumaControl"; /* Shown in the main prefs window */ "App menu" = "App menu"; @@ -128,10 +128,10 @@ "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 Settings */ -"This display supports native Apple brightness protocol. This allows macOS to control this display without LumaControl as well." = "Este monitor suport o protocolo nativo Apple. Permite o macOS controlar ele sem o LumaControl."; +"This display supports Apple's native brightness protocol. This allows macOS to control this display without LumaControl as well." = "Este monitor suport o protocolo nativo Apple. Permite o macOS controlar ele sem o LumaControl."; /* Shown in the Display Settings */ -"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."; +"This is a virtual display (examples: AirPlay, Sidecar, display connected via a DisplayLink Dock or similar) which does not allow hardware or software gamma table 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"; diff --git a/MonitorControl/UI/pt-PT.lproj/Localizable.strings b/MonitorControl/UI/pt-PT.lproj/Localizable.strings index 4860ef2..f03291e 100644 --- a/MonitorControl/UI/pt-PT.lproj/Localizable.strings +++ b/MonitorControl/UI/pt-PT.lproj/Localizable.strings @@ -2,7 +2,7 @@ "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 LumaControl!" = "Parece que outra aplicação está a alterar o brilho ou as cores, o que está a causar problemas.\n\nPara resolveres o problema, precisas de fechar a outra app ou desativar o controlo de gamma para os teus monitores no LumaControl!"; +"Another app seems to be changing the brightness or colors, which causes issues.\n\nTo solve this, quit the other app or disable gamma control for your displays in LumaControl!" = "Parece que outra aplicação está a alterar o brilho ou as cores, o que está a causar problemas.\n\nPara resolveres o problema, precisas de fechar a outra app ou desativar o controlo de gamma para os teus monitores no LumaControl!"; /* Shown in the main prefs window */ "App menu" = "Menu da aplicação"; @@ -128,10 +128,10 @@ "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 suporta o controlo de hardware DCC. Se tiveres problemas, podes desligar o controle de hardware DDC e forçar o controlo via software"; /* Shown in the Display Settings */ -"This display supports native Apple brightness protocol. This allows macOS to control this display without LumaControl as well." = "Este monitor suport o protocolo nativo Apple. Permite o macOS controlar ele sem o LumaControl."; +"This display supports Apple's native brightness protocol. This allows macOS to control this display without LumaControl as well." = "Este monitor suport o protocolo nativo Apple. Permite o macOS controlar ele sem o LumaControl."; /* Shown in the Display Settings */ -"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 semelhante) que não permite o controlo via hardware ou software. Shading é usado como um substituto mas somente em cenários não espelhados. O cursor do rato não será afetado e artefatos podem aparecer a entrar ou a sair do modo de tela cheia."; +"This is a virtual display (examples: AirPlay, Sidecar, display connected via a DisplayLink Dock or similar) which does not allow hardware or software gamma table 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 semelhante) que não permite o controlo via hardware ou software. Shading é usado como um substituto mas somente em cenários não espelhados. O cursor do rato não será afetado e artefatos podem aparecer a entrar ou a sair do modo de tela cheia."; /* Unknown display name */ "Unknown" = "Desconhecido"; diff --git a/MonitorControl/UI/ru.lproj/Localizable.strings b/MonitorControl/UI/ru.lproj/Localizable.strings index 856c5d9..79d5771 100644 --- a/MonitorControl/UI/ru.lproj/Localizable.strings +++ b/MonitorControl/UI/ru.lproj/Localizable.strings @@ -2,7 +2,7 @@ "About" = "О программе"; /* 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 LumaControl!" = "Похоже другое приложение изменяет яркость или цвета, что вызывает проблемы.\n\nДля решения этой проблемы вам нужно закрыть другое приложение или отключить управление гаммой для ваших дисплеев в LumaControl!"; +"Another app seems to be changing the brightness or colors, which causes issues.\n\nTo solve this, quit the other app or disable gamma control for your displays in LumaControl!" = "Похоже другое приложение изменяет яркость или цвета, что вызывает проблемы.\n\nДля решения этой проблемы вам нужно закрыть другое приложение или отключить управление гаммой для ваших дисплеев в LumaControl!"; /* Shown in the main prefs window */ "App menu" = "Меню"; @@ -128,10 +128,10 @@ "This display is reported to support hardware DDC control. If you encounter issues, you can disable hardware DDC control to force software control." = "Этот дисплей сообщает, что поддерживает аппаратное управление через DDC. В случае проблем, вы можете отключить аппаратное управление через DDC, чтобы принудительно использовать программное управление."; /* Shown in the Display Settings */ -"This display supports native Apple brightness protocol. This allows macOS to control this display without LumaControl as well." = "Этот дисплей поддерживает нативный протокол яркости Apple. Это позволяет macOS управлять этим дисплеем без использования LumaControl."; +"This display supports Apple's native brightness protocol. This allows macOS to control this display without LumaControl as well." = "Этот дисплей поддерживает нативный протокол яркости Apple. Это позволяет macOS управлять этим дисплеем без использования LumaControl."; /* Shown in the Display Settings */ -"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." = "Это виртуальный дисплей (например: AirPlay, Sidecar, дисплей подключенный через док-станцию DisplayLink или аналогичное устройство), который не поддерживает аппаратное или программное управление гаммой. Затенение используется в качестве замены, но только в режимах без видео-повтора. При этом курсор мыши останется неизменным и могут возникнуть артефакты при входе/выходе из полноэкранного режима."; +"This is a virtual display (examples: AirPlay, Sidecar, display connected via a DisplayLink Dock or similar) which does not allow hardware or software gamma table 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." = "Это виртуальный дисплей (например: AirPlay, Sidecar, дисплей подключенный через док-станцию DisplayLink или аналогичное устройство), который не поддерживает аппаратное или программное управление гаммой. Затенение используется в качестве замены, но только в режимах без видео-повтора. При этом курсор мыши останется неизменным и могут возникнуть артефакты при входе/выходе из полноэкранного режима."; /* Unknown display name */ "Unknown" = "Неизвестный"; diff --git a/MonitorControl/UI/sk.lproj/Localizable.strings b/MonitorControl/UI/sk.lproj/Localizable.strings index f506da0..8ba1999 100644 --- a/MonitorControl/UI/sk.lproj/Localizable.strings +++ b/MonitorControl/UI/sk.lproj/Localizable.strings @@ -2,7 +2,7 @@ "About" = "O aplikácii"; /* 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 LumaControl!" = "Zdá sa, že iná aplikácia mení jas alebo farby, čo spôsobuje problémy.\n\nPre vyriešenie musíte ukončiť druhú aplikáciu alebo zakázať ovládanie gama pre vaše displeje v LumaControl!"; +"Another app seems to be changing the brightness or colors, which causes issues.\n\nTo solve this, quit the other app or disable gamma control for your displays in LumaControl!" = "Zdá sa, že iná aplikácia mení jas alebo farby, čo spôsobuje problémy.\n\nPre vyriešenie musíte ukončiť druhú aplikáciu alebo zakázať ovládanie gama pre vaše displeje v LumaControl!"; /* Shown in the main prefs window */ "App menu" = "Menu aplikácie"; @@ -131,10 +131,10 @@ "This display is reported to support hardware DDC control. If you encounter issues, you can disable hardware DDC control to force software control." = "Tento displej údajne podporuje hardvérové ovládanie DDC. Ak sa vyskytnú problémy, môžete vypnúť hardvérové ovládanie DDC a vynútiť si softvérové ovládanie."; /* Shown in the Display Settings */ -"This display supports native Apple brightness protocol. This allows macOS to control this display without LumaControl as well." = "Tento displej podporuje natívny protokol jasu Apple. To umožňuje systému macOS ovládať tento displej aj bez LumaControl."; +"This display supports Apple's native brightness protocol. This allows macOS to control this display without LumaControl as well." = "Tento displej podporuje natívny protokol jasu Apple. To umožňuje systému macOS ovládať tento displej aj bez LumaControl."; /* Shown in the Display Settings */ -"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." = "Ide o virtuálny displej (napr.: AirPlay, Sidecar, displej pripojený cez DisplayLink Dock alebo podobné), ktorý neumožňuje hardvérové alebo softvérové ovládanie. Tieňovanie sa používa ako náhrada, ale iba okrem zrkadlenia. Kurzor myši nebude ovplyvnený a pri vstupe/opustení režimu celej obrazovky sa môžu objaviť artefakty."; +"This is a virtual display (examples: AirPlay, Sidecar, display connected via a DisplayLink Dock or similar) which does not allow hardware or software gamma table 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." = "Ide o virtuálny displej (napr.: AirPlay, Sidecar, displej pripojený cez DisplayLink Dock alebo podobné), ktorý neumožňuje hardvérové alebo softvérové ovládanie. Tieňovanie sa používa ako náhrada, ale iba okrem zrkadlenia. Kurzor myši nebude ovplyvnený a pri vstupe/opustení režimu celej obrazovky sa môžu objaviť artefakty."; /* Unknown display name */ "Unknown" = "Neznámy"; diff --git a/MonitorControl/UI/tr.lproj/Localizable.strings b/MonitorControl/UI/tr.lproj/Localizable.strings index 05c1748..12546e3 100644 --- a/MonitorControl/UI/tr.lproj/Localizable.strings +++ b/MonitorControl/UI/tr.lproj/Localizable.strings @@ -2,7 +2,7 @@ "About" = "Hakkında"; /* 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 LumaControl!" = "Başka bir uygulama, parlaklığı veya renkleri değiştirdiği için sorunlara neden oluyor gibi görünüyor.\n\nBunu çözmek için diğer uygulamadan çıkmanız veya LumaControl'deki ekranlarınız için gama kontrolünü devre dışı bırakmanız gerekiyor!"; +"Another app seems to be changing the brightness or colors, which causes issues.\n\nTo solve this, quit the other app or disable gamma control for your displays in LumaControl!" = "Başka bir uygulama, parlaklığı veya renkleri değiştirdiği için sorunlara neden oluyor gibi görünüyor.\n\nBunu çözmek için diğer uygulamadan çıkmanız veya LumaControl'deki ekranlarınız için gama kontrolünü devre dışı bırakmanız gerekiyor!"; /* Shown in the main prefs window */ "App menu" = "Uygulama Menüsü"; @@ -128,10 +128,10 @@ "This display is reported to support hardware DDC control. If you encounter issues, you can disable hardware DDC control to force software control." = "Bu ekranın donanım DDC kontrolünü desteklediği bildiriliyor. Sorunlarla karşılaşırsanız, yazılım kontrolünü zorlamak için donanım DDC kontrolünü devre dışı bırakabilirsiniz."; /* Shown in the Display Settings */ -"This display supports native Apple brightness protocol. This allows macOS to control this display without LumaControl as well." = "Bu ekran, yerel Apple parlaklık protokolünü destekler. Bu, macOS'un bu ekranı LumaControl olmadan da kontrol etmesini sağlar."; +"This display supports Apple's native brightness protocol. This allows macOS to control this display without LumaControl as well." = "Bu ekran, yerel Apple parlaklık protokolünü destekler. Bu, macOS'un bu ekranı LumaControl olmadan da kontrol etmesini sağlar."; /* Shown in the Display Settings */ -"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." = "Bu sanal bir ekrandır (örnekler: AirPlay, Sidecar, DisplayLink Dock veya benzeri aracılığıyla bağlanan ekran), donanım veya yazılımla oynanabilir kontrole izin vermez. Gölgeleme, bir yedek olarak kullanılır, ancak yalnızca ayna olmayan senaryolarda. Fare imleci etkilenmeyecektir ve tam ekran moduna girerken/çıkılırken eserler görünebilir."; +"This is a virtual display (examples: AirPlay, Sidecar, display connected via a DisplayLink Dock or similar) which does not allow hardware or software gamma table 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." = "Bu sanal bir ekrandır (örnekler: AirPlay, Sidecar, DisplayLink Dock veya benzeri aracılığıyla bağlanan ekran), donanım veya yazılımla oynanabilir kontrole izin vermez. Gölgeleme, bir yedek olarak kullanılır, ancak yalnızca ayna olmayan senaryolarda. Fare imleci etkilenmeyecektir ve tam ekran moduna girerken/çıkılırken eserler görünebilir."; /* Unknown display name */ "Unknown" = "Bilinmeyen"; diff --git a/MonitorControl/UI/zh-Hans.lproj/Localizable.strings b/MonitorControl/UI/zh-Hans.lproj/Localizable.strings index 4bef5ce..1e577a8 100644 --- a/MonitorControl/UI/zh-Hans.lproj/Localizable.strings +++ b/MonitorControl/UI/zh-Hans.lproj/Localizable.strings @@ -2,7 +2,7 @@ "About" = "关于"; /* 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 LumaControl!" = "另一个应用程序可能修改了亮度或者颜色所以导致了问题。\n\n如果要解决这个问题,您需要退出另一个应用程序或在LumaControl中为您的显示器禁用伽马值控制!"; +"Another app seems to be changing the brightness or colors, which causes issues.\n\nTo solve this, quit the other app or disable gamma control for your displays in LumaControl!" = "另一个应用程序可能修改了亮度或者颜色所以导致了问题。\n\n如果要解决这个问题,您需要退出另一个应用程序或在LumaControl中为您的显示器禁用伽马值控制!"; /* Shown in the main prefs window */ "App menu" = "App选项"; @@ -128,10 +128,10 @@ "This display is reported to support hardware DDC control. If you encounter issues, you can disable hardware DDC control to force software control." = "这个显示器报告支持DDC控制。如果使用遇到问题,您可以禁用硬件DDC控制以强制软件控制。"; /* Shown in the Display Settings */ -"This display supports native Apple brightness protocol. This allows macOS to control this display without LumaControl as well." = "这个显示器支持苹果原生的亮度设置,macOS无需通过LumaControl控制此屏幕。"; +"This display supports Apple's native brightness protocol. This allows macOS to control this display without LumaControl as well." = "这个显示器支持苹果原生的亮度设置,macOS无需通过LumaControl控制此屏幕。"; /* Shown in the Display Settings */ -"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." = "这个是虚拟显示器(例如:AirPlay、Sidecar、通过DisplayLink Dock或类似软件连接的屏幕),不允许硬件或软件伽马值控制。只能在非镜像的情况下以遮光(Shading)作为代替设置方案。进入/离开全屏幕模式时,鼠标将不受影响,并且可能会出现残影。"; +"This is a virtual display (examples: AirPlay, Sidecar, display connected via a DisplayLink Dock or similar) which does not allow hardware or software gamma table 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." = "这个是虚拟显示器(例如:AirPlay、Sidecar、通过DisplayLink Dock或类似软件连接的屏幕),不允许硬件或软件伽马值控制。只能在非镜像的情况下以遮光(Shading)作为代替设置方案。进入/离开全屏幕模式时,鼠标将不受影响,并且可能会出现残影。"; /* Unknown display name Unknown model diff --git a/MonitorControl/UI/zh-Hant-TW.lproj/Localizable.strings b/MonitorControl/UI/zh-Hant-TW.lproj/Localizable.strings index 6c13f60..a74184f 100644 --- a/MonitorControl/UI/zh-Hant-TW.lproj/Localizable.strings +++ b/MonitorControl/UI/zh-Hant-TW.lproj/Localizable.strings @@ -2,7 +2,7 @@ "About" = "關於"; /* 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 LumaControl!" = "因其他螢幕控制程式對亮度或顏色進行變更而導致錯誤。\n\n退出其他螢幕控制程式或停用LumaControl中的伽瑪控制以解決此問題!"; +"Another app seems to be changing the brightness or colors, which causes issues.\n\nTo solve this, quit the other app or disable gamma control for your displays in LumaControl!" = "因其他螢幕控制程式對亮度或顏色進行變更而導致錯誤。\n\n退出其他螢幕控制程式或停用LumaControl中的伽瑪控制以解決此問題!"; /* Shown in the main prefs window */ "App menu" = "App選單"; @@ -128,10 +128,10 @@ "This display is reported to support hardware DDC control. If you encounter issues, you can disable hardware DDC control to force software control." = "此螢幕經回報支援硬體DDC控制。若遭遇使用問題,您可停用硬體DDC控制以強制使用軟體控制。"; /* Shown in the Display Settings */ -"This display supports native Apple brightness protocol. This allows macOS to control this display without LumaControl as well." = "此螢幕支援蘋果原生的亮度協定。macOS也可不透過LumaControl控制此螢幕。"; +"This display supports Apple's native brightness protocol. This allows macOS to control this display without LumaControl as well." = "此螢幕支援蘋果原生的亮度協定。macOS也可不透過LumaControl控制此螢幕。"; /* Shown in the Display Settings */ -"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." = "此為虛擬螢幕(例如:AirPlay、Sidecar、透過DisplayLink Dock或類似硬體連接的螢幕),硬體或軟體伽碼值的控制不被允許。只能在非鏡像的情境下以遮光(Shading)作為替代調整方式。進入/離開全螢幕模式時,鼠標將不受影響,並且可能出現殘影。"; +"This is a virtual display (examples: AirPlay, Sidecar, display connected via a DisplayLink Dock or similar) which does not allow hardware or software gamma table 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." = "此為虛擬螢幕(例如:AirPlay、Sidecar、透過DisplayLink Dock或類似硬體連接的螢幕),硬體或軟體伽碼值的控制不被允許。只能在非鏡像的情境下以遮光(Shading)作為替代調整方式。進入/離開全螢幕模式時,鼠標將不受影響,並且可能出現殘影。"; /* Unknown display name Unknown model diff --git a/MonitorControl/View Controllers/Preferences/DisplaysPrefsViewController.swift b/MonitorControl/View Controllers/Preferences/DisplaysPrefsViewController.swift index 83d5a1c..7f86560 100644 --- a/MonitorControl/View Controllers/Preferences/DisplaysPrefsViewController.swift +++ b/MonitorControl/View Controllers/Preferences/DisplaysPrefsViewController.swift @@ -91,7 +91,7 @@ class DisplaysPrefsViewController: NSViewController, SettingsPane, NSTableViewDa displayType = NSLocalizedString("Virtual Display", comment: "Shown in the Display Settings") displayImage = "tv.and.mediabox" controlMethod = NSLocalizedString("Software (shade)", comment: "Shown in the Display Settings") + " ⚠️" - 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 Settings") + 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 gamma table 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 Settings") } else if display is OtherDisplay, !display.isDummy { displayType = NSLocalizedString("External Display", comment: "Shown in the Display Settings") displayImage = "display" @@ -131,7 +131,7 @@ class DisplaysPrefsViewController: NSViewController, SettingsPane, NSTableViewDa displayImage = "display" } controlMethod = NSLocalizedString("Hardware (Apple)", comment: "Shown in the Display Settings") - controlStatus = NSLocalizedString("This display supports native Apple brightness protocol. This allows macOS to control this display without LumaControl as well.", comment: "Shown in the Display Settings") + controlStatus = NSLocalizedString("This display supports Apple's native brightness protocol. This allows macOS to control this display without LumaControl as well.", comment: "Shown in the Display Settings") } return DisplayInfo(displayType: displayType, displayImage: displayImage, controlMethod: controlMethod, controlStatus: controlStatus) } @@ -147,7 +147,7 @@ class DisplaysPrefsViewController: NSViewController, SettingsPane, NSTableViewDa // ID cell.displayId.stringValue = String(display.identifier) - // Firendly name + // Friendly name cell.friendlyName.stringValue = (display.readPrefAsString(key: .friendlyName) != "" ? display.readPrefAsString(key: .friendlyName) : display.name) cell.friendlyName.isEditable = true // Enabled diff --git a/MonitorControl/View Controllers/Preferences/MainPrefsViewController.swift b/MonitorControl/View Controllers/Preferences/MainPrefsViewController.swift index 02f3bcb..b7a42e3 100644 --- a/MonitorControl/View Controllers/Preferences/MainPrefsViewController.swift +++ b/MonitorControl/View Controllers/Preferences/MainPrefsViewController.swift @@ -51,7 +51,7 @@ class MainPrefsViewController: NSViewController, SettingsPane { @available(macOS, deprecated: 10.10) func populateSettings() { - // This is marked as deprectated but according to the function header it still does not have a replacement as of macOS 12 Monterey and is valid to use. + // This is marked as deprecated but according to the function header it still does not have a replacement as of macOS 12 Monterey and is valid to use. let helperLabel = "\(Bundle.main.bundleIdentifier ?? "")Helper" let startAtLogin = (SMCopyAllJobDictionaries(kSMDomainUserLaunchd).takeRetainedValue() as? [[String: AnyObject]])?.first { $0["Label"] as? String == helperLabel }?["OnDemand"] as? Bool ?? false self.startAtLogin.state = startAtLogin ? .on : .off @@ -60,7 +60,7 @@ class MainPrefsViewController: NSViewController, SettingsPane { self.enableSmooth.state = prefs.bool(forKey: PrefKey.disableSmoothBrightness.rawValue) ? .off : .on self.enableBrightnessSync.state = prefs.bool(forKey: PrefKey.enableBrightnessSync.rawValue) ? .on : .off self.startupAction.selectItem(withTag: prefs.integer(forKey: PrefKey.startupAction.rawValue)) - // Preload Display settings to some extent to properly set up size in orther that animation won't fail + // Preload the other settings panes so their views are sized before the window animates open menuslidersPrefsVc?.view.layoutSubtreeIfNeeded() keyboardPrefsVc?.view.layoutSubtreeIfNeeded() displaysPrefsVc?.view.layoutSubtreeIfNeeded() From c33ffeb5ae0cc1f1e3a77c95f4ea61c74c1b810d Mon Sep 17 00:00:00 2001 From: shay2000 Date: Sun, 13 Sep 2026 12:02:06 +0000 Subject: [PATCH 3/6] Fix fatal crash on negative custom DDC polling count The custom polling count is a free-form text field in Settings > Displays, and its value was stored unvalidated. A negative number trapped the app at launch: setupCurrentAndMaxValues converts the count with UInt(self.pollingCount), and UInt(-1) is a fatal 'Negative value is not representable' crash (both on the startup DDC read path and on the mute setup path). - Clamp the value when saving in pollingCountValueChanged (negative becomes 0, matching the 'no polling' behaviour). - Guard readDDCValues as well, so a stale negative value already in preferences from an older version is contained instead of trapped. --- MonitorControl/Model/OtherDisplay.swift | 13 ++++++++++--- .../Preferences/DisplaysPrefsCellView.swift | 12 ++++++++---- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/MonitorControl/Model/OtherDisplay.swift b/MonitorControl/Model/OtherDisplay.swift index 2665f8e..4dc95e8 100644 --- a/MonitorControl/Model/OtherDisplay.swift +++ b/MonitorControl/Model/OtherDisplay.swift @@ -416,6 +416,13 @@ class OtherDisplay: Display { guard app.sleepID == 0, app.reconfigureID == 0, !self.readPrefAsBool(key: .forceSw), !self.readPrefAsBool(key: .unavailableDDC, for: command) else { return values } + // Guard the read against a bad stored count. `pollingCount` comes from a free-form + // text field, and a stale negative value (saved by an older version) would trap on + // the UInt conversions below; zero tries means "don't read". + let safeTries = max(tries, 0) + if safeTries == 0 { + return nil + } let controlCodes = self.getRemapControlCodes(command: command) let controlCode = controlCodes.count == 0 ? command.rawValue : controlCodes[0] if Arm64DDC.isArm64 { @@ -424,14 +431,14 @@ class OtherDisplay: Display { } DisplayManager.shared.globalDDCQueue.sync { if let unwrappedDelay = delay { - values = Arm64DDC.read(service: self.arm64avService, command: controlCode, readSleepTime: UInt32(unwrappedDelay / 1000), numOfRetryAttemps: UInt8(min(tries, 255))) + values = Arm64DDC.read(service: self.arm64avService, command: controlCode, readSleepTime: UInt32(unwrappedDelay / 1000), numOfRetryAttemps: UInt8(min(safeTries, 255))) } else { - values = Arm64DDC.read(service: self.arm64avService, command: controlCode, numOfRetryAttemps: UInt8(min(tries, 255))) + values = Arm64DDC.read(service: self.arm64avService, command: controlCode, numOfRetryAttemps: UInt8(min(safeTries, 255))) } } } else { DisplayManager.shared.globalDDCQueue.sync { - values = self.ddc?.read(command: controlCode, tries: tries, minReplyDelay: delay) + values = self.ddc?.read(command: controlCode, tries: safeTries, minReplyDelay: delay) } } return values diff --git a/MonitorControl/View Controllers/Preferences/DisplaysPrefsCellView.swift b/MonitorControl/View Controllers/Preferences/DisplaysPrefsCellView.swift index ef3fca4..069df75 100644 --- a/MonitorControl/View Controllers/Preferences/DisplaysPrefsCellView.swift +++ b/MonitorControl/View Controllers/Preferences/DisplaysPrefsCellView.swift @@ -73,15 +73,19 @@ class DisplaysPrefsCellView: NSTableCellView { if let display = display as? OtherDisplay { let newValue = sender.stringValue let originalValue = "\(display.pollingCount)" + // Clamp on save: a negative or zero count later reaches `UInt(self.pollingCount)` + // in setupCurrentAndMaxValues, where `UInt(-1)` is a fatal "Negative value is not + // representable" trap. + let clampedValue = Int(newValue).map { max(0, $0) } if newValue.isEmpty { self.pollingCount.stringValue = originalValue - } else if let intValue = Int(newValue) { - self.pollingCount.stringValue = String(intValue) + } else if let clamped = clampedValue { + self.pollingCount.stringValue = String(clamped) } else { self.pollingCount.stringValue = "" } - if newValue != originalValue, !newValue.isEmpty, let newValue = Int(newValue) { - display.pollingCount = newValue + if newValue != originalValue, let clamped = clampedValue { + display.pollingCount = clamped } } } From d1c4ed28f795bc28170135d660042e9e282f3de8 Mon Sep 17 00:00:00 2001 From: shay2000 Date: Sun, 13 Sep 2026 12:13:14 +0000 Subject: [PATCH 4/6] Clamp polling count at the getter to fully close the negative-value crash Review follow-up: the previous fix clamped in the Settings editor and guarded readDDCValues, but both setup paths convert the stored count with UInt(self.pollingCount) *before* readDDCValues is called, so a stale negative preference still trapped at startup. Clamp in the pollingCount getter (and setter) instead, which is the single source every consumer reads through: - UInt(self.pollingCount) at both call sites is now always safe. - A stale negative value reads back as 0, i.e. 'no polling'. The redundant safeTries clamp inside readDDCValues goes back to a plain zero-tries early return. --- MonitorControl/Model/OtherDisplay.swift | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/MonitorControl/Model/OtherDisplay.swift b/MonitorControl/Model/OtherDisplay.swift index 4dc95e8..b667fad 100644 --- a/MonitorControl/Model/OtherDisplay.swift +++ b/MonitorControl/Model/OtherDisplay.swift @@ -19,11 +19,14 @@ class OtherDisplay: Display { case PollingMode.minimal.rawValue: return 1 case PollingMode.normal.rawValue: return 5 case PollingMode.heavy.rawValue: return 20 - case PollingMode.custom.rawValue: return prefs.integer(forKey: PrefKey.pollingCount.rawValue + self.prefsId) + // Clamp at the source: a stale negative value saved by an older version must not + // reach `UInt(self.pollingCount)` in the setup paths, where the conversion is a + // fatal trap. Zero means "no polling", which is the sensible reading of a bad value. + case PollingMode.custom.rawValue: return max(0, prefs.integer(forKey: PrefKey.pollingCount.rawValue + self.prefsId)) default: return PollingMode.none.rawValue } } - set { prefs.set(newValue, forKey: PrefKey.pollingCount.rawValue + self.prefsId) } + set { prefs.set(max(0, newValue), forKey: PrefKey.pollingCount.rawValue + self.prefsId) } } override init(_ identifier: CGDirectDisplayID, name: String, vendorNumber: UInt32?, modelNumber: UInt32?, serialNumber: UInt32?, isVirtual: Bool = false, isDummy: Bool = false) { @@ -416,11 +419,10 @@ class OtherDisplay: Display { guard app.sleepID == 0, app.reconfigureID == 0, !self.readPrefAsBool(key: .forceSw), !self.readPrefAsBool(key: .unavailableDDC, for: command) else { return values } - // Guard the read against a bad stored count. `pollingCount` comes from a free-form - // text field, and a stale negative value (saved by an older version) would trap on - // the UInt conversions below; zero tries means "don't read". - let safeTries = max(tries, 0) - if safeTries == 0 { + // `pollingCount` is clamped at its getter, so callers should never pass a bad value + // here. This is defense in depth: zero tries means "don't read", and the loops below + // would otherwise also clamp it themselves. + if tries == 0 { return nil } let controlCodes = self.getRemapControlCodes(command: command) @@ -431,14 +433,14 @@ class OtherDisplay: Display { } DisplayManager.shared.globalDDCQueue.sync { if let unwrappedDelay = delay { - values = Arm64DDC.read(service: self.arm64avService, command: controlCode, readSleepTime: UInt32(unwrappedDelay / 1000), numOfRetryAttemps: UInt8(min(safeTries, 255))) + values = Arm64DDC.read(service: self.arm64avService, command: controlCode, readSleepTime: UInt32(unwrappedDelay / 1000), numOfRetryAttemps: UInt8(min(tries, 255))) } else { - values = Arm64DDC.read(service: self.arm64avService, command: controlCode, numOfRetryAttemps: UInt8(min(safeTries, 255))) + values = Arm64DDC.read(service: self.arm64avService, command: controlCode, numOfRetryAttemps: UInt8(min(tries, 255))) } } } else { DisplayManager.shared.globalDDCQueue.sync { - values = self.ddc?.read(command: controlCode, tries: safeTries, minReplyDelay: delay) + values = self.ddc?.read(command: controlCode, tries: tries, minReplyDelay: delay) } } return values From 47958c7c54f863816d3ccea8c8224b95e4d87e89 Mon Sep 17 00:00:00 2001 From: shay2000 Date: Sun, 13 Sep 2026 13:11:57 +0000 Subject: [PATCH 5/6] Close remaining polling count holes found in second-opinion review - The getter's default arm returned PollingMode.none.rawValue (-2) for an out-of-range stored polling mode. That passed the '!= 0' guards and still trapped at UInt(-2). Return 0 ('no polling') instead. - Add an upper bound of 255 to the custom count, matching the Arm64 retry cap, so a huge stored value cannot hang the Intel DDC read loop (1 ... tries) for minutes at startup. --- MonitorControl/Model/OtherDisplay.swift | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/MonitorControl/Model/OtherDisplay.swift b/MonitorControl/Model/OtherDisplay.swift index b667fad..d3c05d8 100644 --- a/MonitorControl/Model/OtherDisplay.swift +++ b/MonitorControl/Model/OtherDisplay.swift @@ -21,9 +21,13 @@ class OtherDisplay: Display { case PollingMode.heavy.rawValue: return 20 // Clamp at the source: a stale negative value saved by an older version must not // reach `UInt(self.pollingCount)` in the setup paths, where the conversion is a - // fatal trap. Zero means "no polling", which is the sensible reading of a bad value. - case PollingMode.custom.rawValue: return max(0, prefs.integer(forKey: PrefKey.pollingCount.rawValue + self.prefsId)) - default: return PollingMode.none.rawValue + // fatal trap. The upper bound matches the Arm64 path's 255-retry cap, so a huge + // value cannot hang the Intel read loop for minutes on end. Zero means "no polling", + // which is the sensible reading of a bad value. The default arm must also return 0, + // NOT `PollingMode.none.rawValue` (-2): an out-of-range stored polling mode falls + // through here, and -2 would trap the same way. + case PollingMode.custom.rawValue: return min(255, max(0, prefs.integer(forKey: PrefKey.pollingCount.rawValue + self.prefsId))) + default: return 0 } } set { prefs.set(max(0, newValue), forKey: PrefKey.pollingCount.rawValue + self.prefsId) } From 5bcf4161a014bcfb844ad1d82152d11fade8237b Mon Sep 17 00:00:00 2001 From: shay2000 Date: Mon, 14 Sep 2026 00:30:50 +0000 Subject: [PATCH 6/6] Fix observer removal crash when pane view never loaded --- .../Preferences/MenuslidersPrefsViewController.swift | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/MonitorControl/View Controllers/Preferences/MenuslidersPrefsViewController.swift b/MonitorControl/View Controllers/Preferences/MenuslidersPrefsViewController.swift index 579ea1a..9939621 100644 --- a/MonitorControl/View Controllers/Preferences/MenuslidersPrefsViewController.swift +++ b/MonitorControl/View Controllers/Preferences/MenuslidersPrefsViewController.swift @@ -84,7 +84,13 @@ class MenuslidersPrefsViewController: NSViewController, SettingsPane { } deinit { - prefs.removeObserver(self, forKeyPath: PrefKey.menuIcon.rawValue) + // The observer is only registered in viewDidLoad, so it must only be removed when + // the view was actually loaded. Instantiating the controller from the storyboard + // without ever accessing `view` leaves the observer unregistered, and removing an + // unregistered observer throws NSRangeException. + if isViewLoaded { + prefs.removeObserver(self, forKeyPath: PrefKey.menuIcon.rawValue) + } } func populateSettings() {