From 590998c190de5580d1f4c0ef43a685f6eb09a7df Mon Sep 17 00:00:00 2001 From: Hiraku Date: Mon, 24 Jan 2022 22:19:17 +0800 Subject: [PATCH] Hiraku: MUI Selector // phase 1: Implementing function. --- Source/Base.lproj/preferences.xib | 4 ++ Source/PreferencesModule.swift | 5 +++ Source/PreferencesWindowController.swift | 48 ++++++++++++++++++++++++ 3 files changed, 57 insertions(+) diff --git a/Source/Base.lproj/preferences.xib b/Source/Base.lproj/preferences.xib index f5922a7b..8d6483fd 100644 --- a/Source/Base.lproj/preferences.xib +++ b/Source/Base.lproj/preferences.xib @@ -11,6 +11,7 @@ + @@ -106,6 +107,9 @@ + + + diff --git a/Source/PreferencesModule.swift b/Source/PreferencesModule.swift index ba583745..cd6267df 100644 --- a/Source/PreferencesModule.swift +++ b/Source/PreferencesModule.swift @@ -13,6 +13,7 @@ private let kBasisKeyboardLayoutPreferenceKey = "BasisKeyboardLayout" // alphan private let kFunctionKeyKeyboardLayoutPreferenceKey = "FunctionKeyKeyboardLayout" // alphanumeric ("ASCII") input basi private let kFunctionKeyKeyboardLayoutOverrideIncludeShiftKey = "FunctionKeyKeyboardLayoutOverrideIncludeShift" // whether include shif private let kCandidateListTextSizeKey = "CandidateListTextSize" +private let kAppleLanguagesPreferencesKey = "AppleLanguages" private let kSelectPhraseAfterCursorAsCandidatePreferenceKey = "SelectPhraseAfterCursorAsCandidate" private let kUseHorizontalCandidateListPreferenceKey = "UseHorizontalCandidateList" private let kComposingBufferSizePreferenceKey = "ComposingBufferSize" @@ -172,6 +173,7 @@ struct ComposingBufferSize { defaults.removeObject(forKey: kFunctionKeyKeyboardLayoutPreferenceKey) defaults.removeObject(forKey: kFunctionKeyKeyboardLayoutOverrideIncludeShiftKey) defaults.removeObject(forKey: kCandidateListTextSizeKey) + defaults.removeObject(forKey: kAppleLanguagesPreferencesKey) defaults.removeObject(forKey: kSelectPhraseAfterCursorAsCandidatePreferenceKey) defaults.removeObject(forKey: kUseHorizontalCandidateListPreferenceKey) defaults.removeObject(forKey: kComposingBufferSizePreferenceKey) @@ -189,6 +191,9 @@ struct ComposingBufferSize { defaults.removeObject(forKey: kMaxCandidateLength) defaults.removeObject(forKey: kShouldNotFartInLieuOfBeep) } + + @UserDefault(key: kAppleLanguagesPreferencesKey, defaultValue: []) + @objc static var appleLanguages: Array @UserDefault(key: kKeyboardLayoutPreferenceKey, defaultValue: 0) @objc static var keyboardLayout: Int diff --git a/Source/PreferencesWindowController.swift b/Source/PreferencesWindowController.swift index d2f41522..0da4c332 100644 --- a/Source/PreferencesWindowController.swift +++ b/Source/PreferencesWindowController.swift @@ -22,11 +22,40 @@ extension RangeReplaceableCollection where Element: Hashable { // the "InputMethodServerPreferencesWindowControllerClass" in Info.plist. @objc(PreferencesWindowController) class PreferencesWindowController: NSWindowController { @IBOutlet weak var fontSizePopUpButton: NSPopUpButton! + @IBOutlet weak var uiLanguageButton: NSPopUpButton! @IBOutlet weak var basisKeyboardLayoutButton: NSPopUpButton! @IBOutlet weak var selectionKeyComboBox: NSComboBox! @IBOutlet weak var clickedWhetherIMEShouldNotFartToggle: NSButton! + + var currentLanguageSelectItem: NSMenuItem? = nil override func awakeFromNib() { + let languages = ["auto", "en-US", "zh-CN", "zh-TW", "ja-JP"] + var autoSelectItem: NSMenuItem? = nil + var chosenLanguageItem: NSMenuItem? = nil + uiLanguageButton.menu?.removeAllItems() + + let appleLanguages = Preferences.appleLanguages + for language in languages { + let menuItem = NSMenuItem() + menuItem.title = NSLocalizedString(language, comment: "") + menuItem.representedObject = language + + if language == "auto" { + autoSelectItem = menuItem + } + + if !appleLanguages.isEmpty { + if appleLanguages[0] == language { + chosenLanguageItem = menuItem + } + } + uiLanguageButton.menu?.addItem(menuItem) + } + + currentLanguageSelectItem = chosenLanguageItem ?? autoSelectItem + uiLanguageButton.select(currentLanguageSelectItem) + let list = TISCreateInputSourceList(nil, true).takeRetainedValue() as! [TISInputSource] var usKeyboardLayoutItem: NSMenuItem? = nil var chosenItem: NSMenuItem? = nil @@ -124,6 +153,25 @@ extension RangeReplaceableCollection where Element: Hashable { Preferences.basisKeyboardLayout = sourceID } } + + @IBAction func updateUiLanguageAction(_ sender: Any) { + if let selectItem = uiLanguageButton.selectedItem { + if currentLanguageSelectItem == selectItem { + return + } + } + if let language = uiLanguageButton.selectedItem?.representedObject as? String { + if (language != "auto") { + Preferences.appleLanguages = [language] + } + else { + UserDefaults.standard.removeObject(forKey: "AppleLanguages") + } + + NSLog("vChewing App self-terminated due to UI language change.") + NSApplication.shared.terminate(nil) + } + } @IBAction func clickedWhetherIMEShouldNotFartToggleAction(_ sender: Any) { clsSFX.beep()