From 81f493dbcdbb73864b8d4b98a9545053085fa3ee Mon Sep 17 00:00:00 2001 From: Sharker <1548742234@qq.com> Date: Wed, 7 Feb 2024 21:45:43 +0800 Subject: [PATCH] fix: shortcut bug https://github.com/tisfeng/Easydict/issues/391 --- Easydict.xcodeproj/project.pbxproj | 8 +++++ .../Feature/Shortcut/Shortcut+Menu.swift | 18 ++++++++++ .../Extensions/String/String+Localized.swift | 33 +++++++++++++++++++ .../View/MenuView/MainMenuCommand.swift | 2 -- .../Tabs/View/Shortcut/KeyHolderWrapper.swift | 3 ++ 5 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 Easydict/NewApp/Feature/Shortcut/Shortcut+Menu.swift create mode 100644 Easydict/NewApp/Utility/Extensions/String/String+Localized.swift diff --git a/Easydict.xcodeproj/project.pbxproj b/Easydict.xcodeproj/project.pbxproj index 4f0d47908..d4a4be7dc 100644 --- a/Easydict.xcodeproj/project.pbxproj +++ b/Easydict.xcodeproj/project.pbxproj @@ -283,6 +283,8 @@ 9643D9462B71D103000FBEA6 /* KeyHolderRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9643D9452B71D103000FBEA6 /* KeyHolderRowView.swift */; }; 9643D94A2B71EABE000FBEA6 /* KeyHolderAlterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9643D9492B71EABE000FBEA6 /* KeyHolderAlterView.swift */; }; 9643D94C2B71F74D000FBEA6 /* MainMenuShortcutCommandItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9643D94B2B71F74D000FBEA6 /* MainMenuShortcutCommandItem.swift */; }; + 9643D9562B73B3CD000FBEA6 /* Shortcut+Menu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9643D9552B73B3CD000FBEA6 /* Shortcut+Menu.swift */; }; + 9643D9592B73BAFD000FBEA6 /* String+Localized.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9643D9582B73BAFD000FBEA6 /* String+Localized.swift */; }; 9672D7D22B4008B40023B8FB /* MASShortcutBinder+EZMASShortcutBinder.m in Sources */ = {isa = PBXBuildFile; fileRef = 9672D7D12B4008B40023B8FB /* MASShortcutBinder+EZMASShortcutBinder.m */; }; 967712EA2B5B913600105E0F /* KeyHolder in Frameworks */ = {isa = PBXBuildFile; productRef = 967712E92B5B913600105E0F /* KeyHolder */; }; 967712EE2B5B943400105E0F /* Shortcut.swift in Sources */ = {isa = PBXBuildFile; fileRef = 967712ED2B5B943400105E0F /* Shortcut.swift */; }; @@ -806,6 +808,8 @@ 9643D9452B71D103000FBEA6 /* KeyHolderRowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyHolderRowView.swift; sourceTree = ""; }; 9643D9492B71EABE000FBEA6 /* KeyHolderAlterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyHolderAlterView.swift; sourceTree = ""; }; 9643D94B2B71F74D000FBEA6 /* MainMenuShortcutCommandItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainMenuShortcutCommandItem.swift; sourceTree = ""; }; + 9643D9552B73B3CD000FBEA6 /* Shortcut+Menu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Shortcut+Menu.swift"; sourceTree = ""; }; + 9643D9582B73BAFD000FBEA6 /* String+Localized.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Localized.swift"; sourceTree = ""; }; 9672D7D02B4008B40023B8FB /* MASShortcutBinder+EZMASShortcutBinder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MASShortcutBinder+EZMASShortcutBinder.h"; sourceTree = ""; }; 9672D7D12B4008B40023B8FB /* MASShortcutBinder+EZMASShortcutBinder.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "MASShortcutBinder+EZMASShortcutBinder.m"; sourceTree = ""; }; 967712ED2B5B943400105E0F /* Shortcut.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Shortcut.swift; sourceTree = ""; }; @@ -1262,6 +1266,7 @@ isa = PBXGroup; children = ( 038A723F2B62C0B9004995E3 /* String+Regex.swift */, + 9643D9582B73BAFD000FBEA6 /* String+Localized.swift */, ); path = String; sourceTree = ""; @@ -2273,6 +2278,7 @@ 9643D9432B6FEF5F000FBEA6 /* Shortcut+Default.swift */, 9643D9412B6FE4AF000FBEA6 /* Shortcut+Bind.swift */, 9608354F2B6791F200C6A931 /* Shortcut+Validator.swift */, + 9643D9552B73B3CD000FBEA6 /* Shortcut+Menu.swift */, ); path = Shortcut; sourceTree = ""; @@ -2927,6 +2933,7 @@ 0AC8A8412B695480006DA5CC /* DeepLTranslate+ConfigurableService.swift in Sources */, 039CC90D292F664E0037B91E /* NSObject+EZWindowType.m in Sources */, 03B0232229231FA6001C7E63 /* NSImage+MM.m in Sources */, + 9643D9592B73BAFD000FBEA6 /* String+Localized.swift in Sources */, 03BB2DEF29F59C8A00447EDD /* EZSymbolImageButton.m in Sources */, 0A2BA9642B4A3CCD002872A4 /* Notification+Name.swift in Sources */, C415C0AD2B450D4800A9D231 /* GeminiService.swift in Sources */, @@ -3031,6 +3038,7 @@ 03F639952AA6CFBB009B9914 /* EZBingConfig.m in Sources */, 0AC8A83F2B689E68006DA5CC /* ServiceSecretConfigreValidatable.swift in Sources */, 03D2A3E329F4C6F50035CED4 /* EZNetworkManager.m in Sources */, + 9643D9562B73B3CD000FBEA6 /* Shortcut+Menu.swift in Sources */, 0309E1ED292B439A00AFB76A /* EZTextView.m in Sources */, 03B0232B29231FA6001C7E63 /* NSMutableAttributedString+MM.m in Sources */, 03B022E829231FA6001C7E63 /* entry.m in Sources */, diff --git a/Easydict/NewApp/Feature/Shortcut/Shortcut+Menu.swift b/Easydict/NewApp/Feature/Shortcut/Shortcut+Menu.swift new file mode 100644 index 000000000..9de99817e --- /dev/null +++ b/Easydict/NewApp/Feature/Shortcut/Shortcut+Menu.swift @@ -0,0 +1,18 @@ +// +// Shortcut+Menu.swift +// Easydict +// +// Created by Sharker on 2024/2/7. +// Copyright © 2024 izual. All rights reserved. +// + +import SwiftUI + +extension Shortcut { + func updateMenu(_ type: ShortcutType) { // update shortcut menu + let shortcutTitle = String.localizedString(for: LocalizedStringKey(type.localizedStringKey()).stringKey ?? "") + let shortcutMenu = NSApp.mainMenu?.items.first(where: { $0.title == "Shortcut" }) + let clearInput = shortcutMenu?.submenu?.items.first(where: { $0.title == shortcutTitle }) + clearInput?.keyEquivalent = "" + } +} diff --git a/Easydict/NewApp/Utility/Extensions/String/String+Localized.swift b/Easydict/NewApp/Utility/Extensions/String/String+Localized.swift new file mode 100644 index 000000000..3cf38ee6c --- /dev/null +++ b/Easydict/NewApp/Utility/Extensions/String/String+Localized.swift @@ -0,0 +1,33 @@ +// +// String+Localized.swift +// Easydict +// +// Created by Sharker on 2024/2/7. +// Copyright © 2024 izual. All rights reserved. +// + +import SwiftUI + +// ref: https://stackoverflow.com/questions/60841915/how-to-change-localizedstringkey-to-string-in-swiftui +extension LocalizedStringKey { + // This will mirror the `LocalizedStringKey` so it can access its + // internal `key` property. Mirroring is rather expensive, but it + // should be fine performance-wise, unless you are + // using it too much or doing something out of the norm. + var stringKey: String? { + Mirror(reflecting: self).children.first(where: { $0.label == "key" })?.value as? String + } +} + +extension String { + static func localizedString(for key: String, + locale: Locale = .current) -> String + { + let language = locale.languageCode + let path = Bundle.main.path(forResource: language, ofType: "lproj")! + let bundle = Bundle(path: path)! + let localizedString = NSLocalizedString(key, bundle: bundle, comment: "") + + return localizedString + } +} diff --git a/Easydict/NewApp/View/MenuView/MainMenuCommand.swift b/Easydict/NewApp/View/MenuView/MainMenuCommand.swift index 84231b7bf..388caacd3 100644 --- a/Easydict/NewApp/View/MenuView/MainMenuCommand.swift +++ b/Easydict/NewApp/View/MenuView/MainMenuCommand.swift @@ -13,6 +13,4 @@ struct EasyDictMainMenu: Commands { // shortcut MainMenuShortcutCommand() } - - func showAPIWebSite() {} } diff --git a/Easydict/NewApp/View/SettingView/Tabs/View/Shortcut/KeyHolderWrapper.swift b/Easydict/NewApp/View/SettingView/Tabs/View/Shortcut/KeyHolderWrapper.swift index 80ef418be..61a0515ab 100644 --- a/Easydict/NewApp/View/SettingView/Tabs/View/Shortcut/KeyHolderWrapper.swift +++ b/Easydict/NewApp/View/SettingView/Tabs/View/Shortcut/KeyHolderWrapper.swift @@ -64,6 +64,9 @@ extension KeyHolderWrapper { func recordViewDidEndRecording(_: RecordView) {} func recordView(_ recordView: RecordView, didChangeKeyCombo keyCombo: KeyCombo?) { + if keyCombo == nil { // clear shortcut + Shortcut.shared.updateMenu(type) + } if let key = keyCombo { // shortcut validate confict if Shortcut.validateShortcut(key) {