diff --git a/Design/Icon.sketch b/Design/Icon.sketch index 405b69b..dbbf91f 100644 Binary files a/Design/Icon.sketch and b/Design/Icon.sketch differ diff --git a/LauncherApplication/Info.plist b/LauncherApplication/Info.plist index 69403fe..63285aa 100644 --- a/LauncherApplication/Info.plist +++ b/LauncherApplication/Info.plist @@ -2,8 +2,6 @@ - LSBackgroundOnly - CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleExecutable @@ -22,6 +20,10 @@ 1.0 CFBundleVersion 1 + LSApplicationCategoryType + public.app-category.utilities + LSBackgroundOnly + LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) NSHumanReadableCopyright diff --git a/README.md b/README.md index 8d54955..634b817 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Open the right application ASAP. ![Screenshots](./screenshot_list.png) -Thor is an OS X application that allows you to open other application immediately just by a shortcut. And it's avaliable in [Mac App Store](https://apps.apple.com/cn/app/thor/id1120999687?l=en&mt=12)! Feel free to enjoy the increased efficiency. +Thor is an OS X application that allows you to open other application immediately just by a shortcut. And it's available in [Mac App Store](https://apps.apple.com/cn/app/thor/id1120999687?l=en&mt=12)! Feel free to enjoy the increased efficiency. ![Screenshots](./screenshot_settings.png) diff --git a/Releases/Thor20-16.delta b/Releases/Thor20-16.delta new file mode 100644 index 0000000..5d0cc81 Binary files /dev/null and b/Releases/Thor20-16.delta differ diff --git a/Releases/Thor20-17.delta b/Releases/Thor20-17.delta new file mode 100644 index 0000000..72aba2a Binary files /dev/null and b/Releases/Thor20-17.delta differ diff --git a/Releases/Thor20-19.delta b/Releases/Thor20-19.delta new file mode 100644 index 0000000..09fa94b Binary files /dev/null and b/Releases/Thor20-19.delta differ diff --git a/Releases/Thor21-16.delta b/Releases/Thor21-16.delta new file mode 100644 index 0000000..56e8ff1 Binary files /dev/null and b/Releases/Thor21-16.delta differ diff --git a/Releases/Thor21-17.delta b/Releases/Thor21-17.delta new file mode 100644 index 0000000..f938b6b Binary files /dev/null and b/Releases/Thor21-17.delta differ diff --git a/Releases/Thor21-19.delta b/Releases/Thor21-19.delta new file mode 100644 index 0000000..386454e Binary files /dev/null and b/Releases/Thor21-19.delta differ diff --git a/Releases/Thor21-20.delta b/Releases/Thor21-20.delta new file mode 100644 index 0000000..10d9697 Binary files /dev/null and b/Releases/Thor21-20.delta differ diff --git a/Releases/Thor22-16.delta b/Releases/Thor22-16.delta new file mode 100644 index 0000000..449090f Binary files /dev/null and b/Releases/Thor22-16.delta differ diff --git a/Releases/Thor22-17.delta b/Releases/Thor22-17.delta new file mode 100644 index 0000000..3edfede Binary files /dev/null and b/Releases/Thor22-17.delta differ diff --git a/Releases/Thor22-19.delta b/Releases/Thor22-19.delta new file mode 100644 index 0000000..b51590f Binary files /dev/null and b/Releases/Thor22-19.delta differ diff --git a/Releases/Thor22-20.delta b/Releases/Thor22-20.delta new file mode 100644 index 0000000..f56bc7d Binary files /dev/null and b/Releases/Thor22-20.delta differ diff --git a/Releases/Thor23-16.delta b/Releases/Thor23-16.delta new file mode 100644 index 0000000..0a7d4ea Binary files /dev/null and b/Releases/Thor23-16.delta differ diff --git a/Releases/Thor23-17.delta b/Releases/Thor23-17.delta new file mode 100644 index 0000000..13af80a Binary files /dev/null and b/Releases/Thor23-17.delta differ diff --git a/Releases/Thor23-19.delta b/Releases/Thor23-19.delta new file mode 100644 index 0000000..eb27470 Binary files /dev/null and b/Releases/Thor23-19.delta differ diff --git a/Releases/Thor23-20.delta b/Releases/Thor23-20.delta new file mode 100644 index 0000000..188903e Binary files /dev/null and b/Releases/Thor23-20.delta differ diff --git a/Releases/Thor23-22.delta b/Releases/Thor23-22.delta new file mode 100644 index 0000000..506d9b9 Binary files /dev/null and b/Releases/Thor23-22.delta differ diff --git a/Releases/Thor24-16.delta b/Releases/Thor24-16.delta new file mode 100644 index 0000000..902c0cc Binary files /dev/null and b/Releases/Thor24-16.delta differ diff --git a/Releases/Thor24-17.delta b/Releases/Thor24-17.delta new file mode 100644 index 0000000..aed6fa6 Binary files /dev/null and b/Releases/Thor24-17.delta differ diff --git a/Releases/Thor24-19.delta b/Releases/Thor24-19.delta new file mode 100644 index 0000000..c5a0ba3 Binary files /dev/null and b/Releases/Thor24-19.delta differ diff --git a/Releases/Thor24-20.delta b/Releases/Thor24-20.delta new file mode 100644 index 0000000..3fb48ad Binary files /dev/null and b/Releases/Thor24-20.delta differ diff --git a/Releases/Thor24-22.delta b/Releases/Thor24-22.delta new file mode 100644 index 0000000..2416b89 Binary files /dev/null and b/Releases/Thor24-22.delta differ diff --git a/Releases/Thor24-23.delta b/Releases/Thor24-23.delta new file mode 100644 index 0000000..6dc7cd2 Binary files /dev/null and b/Releases/Thor24-23.delta differ diff --git a/Releases/Thor_1.5.3.zip b/Releases/Thor_1.5.3.zip new file mode 100644 index 0000000..e323c27 Binary files /dev/null and b/Releases/Thor_1.5.3.zip differ diff --git a/Releases/Thor_1.5.4.zip b/Releases/Thor_1.5.4.zip new file mode 100644 index 0000000..20488e1 Binary files /dev/null and b/Releases/Thor_1.5.4.zip differ diff --git a/Releases/Thor_1.5.5.zip b/Releases/Thor_1.5.5.zip new file mode 100644 index 0000000..82296a6 Binary files /dev/null and b/Releases/Thor_1.5.5.zip differ diff --git a/Releases/Thor_1.5.6.zip b/Releases/Thor_1.5.6.zip new file mode 100644 index 0000000..3d4f9da Binary files /dev/null and b/Releases/Thor_1.5.6.zip differ diff --git a/Releases/appcast.xml b/Releases/appcast.xml index d2f20c9..f0e7fd4 100644 --- a/Releases/appcast.xml +++ b/Releases/appcast.xml @@ -3,40 +3,79 @@ Thor - 1.2.1 - Wed, 22 Aug 2018 00:47:27 +0800 + 1.5.4 + Sat, 21 Nov 2020 16:27:46 +0800 10.10 - + + + + + + + - 1.3.0 - Mon, 01 Oct 2018 18:03:38 +0800 + 1.5.3 + Sat, 21 Nov 2020 15:13:51 +0800 10.10 - + - 1.3.0 - Mon, 01 Oct 2018 18:12:14 +0800 + 1.5.2 + Sat, 21 Nov 2020 12:34:36 +0800 10.10 - + - 1.3.1 - Wed, 10 Oct 2018 22:04:56 +0800 + 1.5.0 + Sat, 23 May 2020 17:44:50 +0800 10.10 - + 1.4.0 - 周六, 18 4月 2020 11:20:44 +0800 + Sat, 23 May 2020 17:44:50 +0800 10.10 - + - 1.5.0 - Mon, 04 May 2020 10:40:36 +0800 + 1.5.4 + Sat, 21 Nov 2020 20:03:29 +0800 10.10 - + + + + + + + + + + 1.5.5 + Sun, 13 Dec 2020 19:13:30 +0800 + 10.10 + + + + + + + + + + + 1.5.6 + 周六, 19 12月 2020 22:13:41 +0800 + 10.10 + + + + + + + + + 1.5.2 diff --git a/Thor/AppDelegate.swift b/Thor/AppDelegate.swift index 74a1ce5..384ff69 100644 --- a/Thor/AppDelegate.swift +++ b/Thor/AppDelegate.swift @@ -44,6 +44,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { shortcutEnableMonitor() handleLaunchAtLogin() + registerMenubarIconShortcut() MASShortcutValidator.shared().allowAnyShortcutWithOptionModifier = true ShortcutMonitor.register() @@ -145,4 +146,23 @@ class AppDelegate: NSObject, NSApplicationDelegate { } } + func registerMenubarIconShortcut() { + let modifierFlags = NSEvent.ModifierFlags.shift.rawValue + & NSEvent.ModifierFlags.control.rawValue + & NSEvent.ModifierFlags.option.rawValue + & NSEvent.ModifierFlags.command.rawValue + let shortcut = MASShortcut(keyCode: UInt(kVK_ANSI_T), modifierFlags: modifierFlags) + MASShortcutMonitor.shared().register(shortcut, withAction: { + defaults[.enableMenuBarIcon] = !defaults[.enableMenuBarIcon] + + if defaults[.enableMenuBarIcon] { + sharedAppDelegate?.statusItemController.showInMenuBar() + } else { + sharedAppDelegate?.statusItemController.hideInMenuBar() + } + + NotificationCenter.default.post(name: .updateMenuBarToggleState, object: nil) + }) + } + } diff --git a/Thor/AppModel.swift b/Thor/AppModel.swift index 4f704f7..1d60047 100644 --- a/Thor/AppModel.swift +++ b/Thor/AppModel.swift @@ -14,83 +14,66 @@ class AppModel: NSObject { let appBundleURL: URL let appName: String let appDisplayName: String - let appIconName: String - var shortcut: MASShortcut? - var bookmarkData: Data? + + private enum InfoKeys: String { + case appBundleURL, appName, appDisplayName, shortcut, bookmark + } var icon: NSImage? { - guard let bundle = Bundle(url: appBundleURL), let bundleIdentifier = bundle.bundleIdentifier else { + guard let bundle = Bundle(url: appBundleURL) else { return nil } - let compositeName = "\(bundleIdentifier):\(appIconName)" + var iconImage: NSImage? - guard let file = bundle.pathForImageResource(appIconName), - let bundleImage = NSImage(contentsOfFile: file) else { - return nil + if let iconFileName = (bundle.infoDictionary?["CFBundleIconFile"]) as? String, + let iconFilePath = bundle.pathForImageResource(iconFileName) { + iconImage = NSImage(contentsOfFile: iconFilePath) + } else if let iconName = (bundle.infoDictionary?["CFBundleIconName"]) as? String, + let image = bundle.image(forResource: iconName) { + iconImage = image } - bundleImage.setName(compositeName) - bundleImage.size = NSSize(width: 36, height: 36) + iconImage?.size = NSSize(width: 36, height: 36) - return bundleImage + return iconImage } init?(item: NSMetadataItem) { guard let path = item.value(forAttribute: kMDItemPath as String) as? String, - let displayName = item.value(forAttribute: kMDItemDisplayName as String) as? String, - let name = item.value(forKey: kMDItemFSName as String) as? String, - let appBundle = Bundle(path: path), - let iconName = (appBundle.infoDictionary?["CFBundleIconFile"]) as? String else { - return nil + let displayName = item.value(forAttribute: kMDItemDisplayName as String) as? String, + let name = item.value(forKey: kMDItemFSName as String) as? String, + let appBundle = Bundle(path: path) else { + return nil } self.appBundleURL = appBundle.bundleURL self.appName = name self.appDisplayName = displayName - self.appIconName = iconName - self.bookmarkData = try? appBundleURL.bookmarkData(options: .securityScopeAllowOnlyReadAccess, - includingResourceValuesForKeys: nil, - relativeTo: nil) } init?(dict: NSDictionary) { - var allowedURL: NSURL? - if let data = dict.object(forKey: "bookmark") as? Data { - allowedURL = try? NSURL(resolvingBookmarkData: data, - options: .withoutUI, - relativeTo: nil, - bookmarkDataIsStale: nil) - allowedURL?.startAccessingSecurityScopedResource() - - self.bookmarkData = data - } - - guard let appBundle = dict.object(forKey: "appBundleURL") as? String, - let bundleURL = URL(string: appBundle), Bundle(url: bundleURL) != nil, - let name = dict.object(forKey: "appName") as? String, - let displayName = dict.object(forKey: "appDisplayName") as? String, - let iconName = dict.object(forKey: "appIconName") as? String, - let shortcut = dict.object(forKey: "shortcut") as? MASShortcut else { - return nil + guard let appBundle = dict.object(forKey: InfoKeys.appBundleURL.rawValue) as? String, + let bundleURL = URL(string: appBundle), Bundle(url: bundleURL) != nil, + let name = dict.object(forKey: InfoKeys.appName.rawValue) as? String, + let displayName = dict.object(forKey: InfoKeys.appDisplayName.rawValue) as? String, + let shortcut = dict.object(forKey: InfoKeys.shortcut.rawValue) as? MASShortcut else { + return nil } self.appBundleURL = bundleURL self.appName = name self.appDisplayName = displayName - self.appIconName = iconName self.shortcut = shortcut } func encode() -> NSDictionary { var dict = [String: Any]() - dict["appBundleURL"] = appBundleURL.absoluteString - dict["appName"] = appName - dict["appDisplayName"] = appDisplayName - dict["appIconName"] = appIconName - dict["shortcut"] = shortcut ?? NSNull() - dict["bookmark"] = bookmarkData ?? NSNull() + dict[InfoKeys.appBundleURL.rawValue] = appBundleURL.absoluteString + dict[InfoKeys.appName.rawValue] = appName + dict[InfoKeys.appDisplayName.rawValue] = appDisplayName + dict[InfoKeys.shortcut.rawValue] = shortcut ?? NSNull() return dict as NSDictionary } diff --git a/Thor/Assets.xcassets/AppIcon.appiconset/Contents.json b/Thor/Assets.xcassets/AppIcon.appiconset/Contents.json index af6b856..9cccd21 100644 --- a/Thor/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/Thor/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,68 +1,68 @@ { "images" : [ { - "size" : "16x16", - "idiom" : "mac", "filename" : "MAS-16.png", - "scale" : "1x" + "idiom" : "mac", + "scale" : "1x", + "size" : "16x16" }, { - "size" : "16x16", - "idiom" : "mac", "filename" : "MAS-33.png", - "scale" : "2x" + "idiom" : "mac", + "scale" : "2x", + "size" : "16x16" }, { - "size" : "32x32", - "idiom" : "mac", "filename" : "MAS-32.png", - "scale" : "1x" + "idiom" : "mac", + "scale" : "1x", + "size" : "32x32" }, { - "size" : "32x32", - "idiom" : "mac", "filename" : "MAS-64.png", - "scale" : "2x" + "idiom" : "mac", + "scale" : "2x", + "size" : "32x32" }, { - "size" : "128x128", - "idiom" : "mac", "filename" : "MAS-128.png", - "scale" : "1x" + "idiom" : "mac", + "scale" : "1x", + "size" : "128x128" }, { - "size" : "128x128", - "idiom" : "mac", "filename" : "MAS-257.png", - "scale" : "2x" + "idiom" : "mac", + "scale" : "2x", + "size" : "128x128" }, { - "size" : "256x256", - "idiom" : "mac", "filename" : "MAS-256.png", - "scale" : "1x" + "idiom" : "mac", + "scale" : "1x", + "size" : "256x256" }, { - "size" : "256x256", - "idiom" : "mac", "filename" : "MAS-513.png", - "scale" : "2x" + "idiom" : "mac", + "scale" : "2x", + "size" : "256x256" }, { - "size" : "512x512", - "idiom" : "mac", "filename" : "MAS-512.png", - "scale" : "1x" + "idiom" : "mac", + "scale" : "1x", + "size" : "512x512" }, { - "size" : "512x512", - "idiom" : "mac", "filename" : "MAS.png", - "scale" : "2x" + "idiom" : "mac", + "scale" : "2x", + "size" : "512x512" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/Thor/Assets.xcassets/AppIcon.appiconset/MAS-128.png b/Thor/Assets.xcassets/AppIcon.appiconset/MAS-128.png index 79b192c..777325b 100644 Binary files a/Thor/Assets.xcassets/AppIcon.appiconset/MAS-128.png and b/Thor/Assets.xcassets/AppIcon.appiconset/MAS-128.png differ diff --git a/Thor/Assets.xcassets/AppIcon.appiconset/MAS-16.png b/Thor/Assets.xcassets/AppIcon.appiconset/MAS-16.png index e541d71..2480367 100644 Binary files a/Thor/Assets.xcassets/AppIcon.appiconset/MAS-16.png and b/Thor/Assets.xcassets/AppIcon.appiconset/MAS-16.png differ diff --git a/Thor/Assets.xcassets/AppIcon.appiconset/MAS-256.png b/Thor/Assets.xcassets/AppIcon.appiconset/MAS-256.png index f90f383..2596303 100644 Binary files a/Thor/Assets.xcassets/AppIcon.appiconset/MAS-256.png and b/Thor/Assets.xcassets/AppIcon.appiconset/MAS-256.png differ diff --git a/Thor/Assets.xcassets/AppIcon.appiconset/MAS-257.png b/Thor/Assets.xcassets/AppIcon.appiconset/MAS-257.png index f90f383..2596303 100644 Binary files a/Thor/Assets.xcassets/AppIcon.appiconset/MAS-257.png and b/Thor/Assets.xcassets/AppIcon.appiconset/MAS-257.png differ diff --git a/Thor/Assets.xcassets/AppIcon.appiconset/MAS-32.png b/Thor/Assets.xcassets/AppIcon.appiconset/MAS-32.png index 65451d5..df4ce8e 100644 Binary files a/Thor/Assets.xcassets/AppIcon.appiconset/MAS-32.png and b/Thor/Assets.xcassets/AppIcon.appiconset/MAS-32.png differ diff --git a/Thor/Assets.xcassets/AppIcon.appiconset/MAS-33.png b/Thor/Assets.xcassets/AppIcon.appiconset/MAS-33.png index 65451d5..df4ce8e 100644 Binary files a/Thor/Assets.xcassets/AppIcon.appiconset/MAS-33.png and b/Thor/Assets.xcassets/AppIcon.appiconset/MAS-33.png differ diff --git a/Thor/Assets.xcassets/AppIcon.appiconset/MAS-512.png b/Thor/Assets.xcassets/AppIcon.appiconset/MAS-512.png index ed97421..cc02b86 100644 Binary files a/Thor/Assets.xcassets/AppIcon.appiconset/MAS-512.png and b/Thor/Assets.xcassets/AppIcon.appiconset/MAS-512.png differ diff --git a/Thor/Assets.xcassets/AppIcon.appiconset/MAS-513.png b/Thor/Assets.xcassets/AppIcon.appiconset/MAS-513.png index ed97421..cc02b86 100644 Binary files a/Thor/Assets.xcassets/AppIcon.appiconset/MAS-513.png and b/Thor/Assets.xcassets/AppIcon.appiconset/MAS-513.png differ diff --git a/Thor/Assets.xcassets/AppIcon.appiconset/MAS-64.png b/Thor/Assets.xcassets/AppIcon.appiconset/MAS-64.png index 6a612e0..c92574b 100644 Binary files a/Thor/Assets.xcassets/AppIcon.appiconset/MAS-64.png and b/Thor/Assets.xcassets/AppIcon.appiconset/MAS-64.png differ diff --git a/Thor/Assets.xcassets/AppIcon.appiconset/MAS.png b/Thor/Assets.xcassets/AppIcon.appiconset/MAS.png index b015477..7fed244 100644 Binary files a/Thor/Assets.xcassets/AppIcon.appiconset/MAS.png and b/Thor/Assets.xcassets/AppIcon.appiconset/MAS.png differ diff --git a/Thor/Base.lproj/Main.storyboard b/Thor/Base.lproj/Main.storyboard index d576506..73f110c 100644 --- a/Thor/Base.lproj/Main.storyboard +++ b/Thor/Base.lproj/Main.storyboard @@ -1,8 +1,8 @@ - + - + @@ -83,6 +83,7 @@ + @@ -100,6 +101,12 @@ + + + + + + @@ -209,20 +216,20 @@ - + - + - + - + - + @@ -234,11 +241,19 @@ - + + + + + + + + + - + @@ -246,27 +261,19 @@ - + - + - - - - - - - - - - + + @@ -287,12 +294,15 @@ + + + @@ -303,7 +313,7 @@ - + @@ -317,7 +327,7 @@ - + @@ -325,11 +335,11 @@ - + - + @@ -351,7 +361,7 @@ - + @@ -362,7 +372,7 @@ - + @@ -393,7 +403,7 @@ - + @@ -401,7 +411,7 @@ - + @@ -409,7 +419,7 @@ - + @@ -434,7 +444,7 @@ + + + + + + + + @@ -463,10 +481,10 @@ + - @@ -476,6 +494,7 @@ + @@ -483,12 +502,15 @@ + + + @@ -506,8 +528,8 @@ - - - + + + diff --git a/Thor/Constant.swift b/Thor/Constant.swift index 2aa2771..9e31f80 100644 --- a/Thor/Constant.swift +++ b/Thor/Constant.swift @@ -26,4 +26,5 @@ let windowbackgroundColorName = "WindowBackgroundColor" // Notifications extension Notification.Name { static let killLauncher = Notification.Name("killLauncher") + static let updateMenuBarToggleState = Notification.Name("updateMenuBarToggleState") } diff --git a/Thor/SettingsViewController.swift b/Thor/SettingsViewController.swift index 7f1a506..ca686ac 100644 --- a/Thor/SettingsViewController.swift +++ b/Thor/SettingsViewController.swift @@ -37,6 +37,11 @@ class SettingsViewController: NSViewController { slider.doubleValue = defaults[.DelayInterval] slider.isEnabled = isEnableDeactivateKey + + NotificationCenter.default.addObserver(self, + selector: #selector(updateMenuBarToggleState), + name: .updateMenuBarToggleState, + object: nil) } @IBAction func toggleLaunchAtLogin(_ sender: Any) { @@ -84,4 +89,8 @@ class SettingsViewController: NSViewController { NSApp.terminate(self) } + @objc func updateMenuBarToggleState() { + btnEnableMenuBarIcon.state = defaults[.enableMenuBarIcon] ? .on : .off + } + } diff --git a/Thor/ShortcutMonitor.swift b/Thor/ShortcutMonitor.swift index 86bcd22..debc7f4 100644 --- a/Thor/ShortcutMonitor.swift +++ b/Thor/ShortcutMonitor.swift @@ -7,6 +7,7 @@ // import Foundation +import Cocoa import MASShortcut struct ShortcutMonitor { @@ -22,7 +23,18 @@ struct ShortcutMonitor { frontmostAppIdentifier == targetAppIdentifier { NSRunningApplication.runningApplications(withBundleIdentifier: frontmostAppIdentifier).first?.hide() } else { - NSWorkspace.shared.launchApplication(app.appName) + if #available(macOS 10.15, *) { + let configuration = NSWorkspace.OpenConfiguration() + configuration.activates = true + NSWorkspace.shared.openApplication(at: app.appBundleURL, + configuration: configuration) { _, error in + if let error = error { + NSLog("ERROR: \(error)") + } + } + } else { + NSWorkspace.shared.launchApplication(app.appName) + } } }) } diff --git a/Thor/zh-Hans.lproj/Main.strings b/Thor/zh-Hans.lproj/Main.strings index 150733a..70d4129 100644 --- a/Thor/zh-Hans.lproj/Main.strings +++ b/Thor/zh-Hans.lproj/Main.strings @@ -71,9 +71,6 @@ /* Class = "NSMenuItem"; title = "Check for updates"; ObjectID = "b8r-Yq-V8b"; */ "b8r-Yq-V8b.title" = "检查更新"; -/* Class = "NSMenuItem"; title = "Privacy Policy"; ObjectID = "NJs-cX-AgP"; */ -"NJs-cX-AgP.title" = "隐私政策"; - /* Class = "NSButtonCell"; title = "Enable shortcut"; ObjectID = "fya-Hu-agS"; */ "fya-Hu-agS.title" = "开启快捷键"; @@ -106,3 +103,6 @@ /* Class = "NSMenuItem"; title = "Show Thor in the menu bar"; ObjectID = "LbD-19-0Ga"; */ "LbD-19-0Ga.title" = "在状态栏显示 Thor 图标"; + +/* Class = "NSTextFieldCell"; title = "⇧⌃⌥ ⌘ + T to show/hide"; ObjectID = "Qub-BS-LhT"; */ +"Qub-BS-LhT.title" = "⇧⌃⌥ ⌘ + T 显示/隐藏";