From 3d97dd97599871f0eaa2bc88858c452a30de85ae Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Fri, 12 Aug 2022 10:39:40 +0800 Subject: [PATCH 01/20] ctlIME // Stop clearInlineDisplay() from being crashed by nil. --- .../ControllerModules/ctlInputMethod_HandleStates.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Source/Modules/ControllerModules/ctlInputMethod_HandleStates.swift b/Source/Modules/ControllerModules/ctlInputMethod_HandleStates.swift index c4fd77ec..16f1028e 100644 --- a/Source/Modules/ControllerModules/ctlInputMethod_HandleStates.swift +++ b/Source/Modules/ControllerModules/ctlInputMethod_HandleStates.swift @@ -103,7 +103,8 @@ extension ctlInputMethod { /// 在處理不受 .NotEmpty() 管轄的狀態時可能要用到的函式,會清空螢幕上顯示的內文組字區。 /// 當 setInlineDisplayWithCursor() 在錯誤的狀態下被呼叫時,也會觸發這個函式。 private func clearInlineDisplay() { - client().setMarkedText( + guard let theClient = client() else { return } + theClient.setMarkedText( "", selectionRange: NSRange(location: 0, length: 0), replacementRange: NSRange(location: NSNotFound, length: NSNotFound) ) From ab685149e7eeee7573eae38954bc096b8e82320d Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Fri, 12 Aug 2022 14:12:21 +0800 Subject: [PATCH 02/20] KeyHandler // Suppress event log when retrieving blank UOM suggestions. --- Source/Modules/ControllerModules/KeyHandler_Core.swift | 2 -- 1 file changed, 2 deletions(-) diff --git a/Source/Modules/ControllerModules/KeyHandler_Core.swift b/Source/Modules/ControllerModules/KeyHandler_Core.swift index 85f98a89..7c8f8fe7 100644 --- a/Source/Modules/ControllerModules/KeyHandler_Core.swift +++ b/Source/Modules/ControllerModules/KeyHandler_Core.swift @@ -229,8 +229,6 @@ public class KeyHandler { ) } walk() - } else { - IME.prtDebugIntel("UOM: Blank suggestion retrieved, dismissing.") } } arrResult = arrResult.stableSort { $0.1.score > $1.1.score } From 15308a1148c20f7338455318a5ddf65d6e5fe12b Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Fri, 12 Aug 2022 15:29:27 +0800 Subject: [PATCH 03/20] UOM // Remove decayCallback(). --- .../SubLMs/lmUserOverride.swift | 28 ++++++------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/Source/Modules/LangModelRelated/SubLMs/lmUserOverride.swift b/Source/Modules/LangModelRelated/SubLMs/lmUserOverride.swift index c13e4833..1b1e8a02 100644 --- a/Source/Modules/LangModelRelated/SubLMs/lmUserOverride.swift +++ b/Source/Modules/LangModelRelated/SubLMs/lmUserOverride.swift @@ -278,26 +278,19 @@ extension vChewing.LMUserOverride { saveCallback() return } - // TODO: 降低磁碟寫入次數。唯有失憶的情況下才會更新觀察且記憶。 + // 這裡還是不要做 decayCallback 判定「是否不急著更新觀察」了,不然會在嘗試覆寫掉錯誤的記憶時失敗。 if var theNeta = mutLRUMap[key] { - _ = getSuggestion( - key: key, timestamp: timestamp, headReading: "", - decayCallback: { - theNeta.observation.update( - candidate: candidate, timestamp: timestamp, forceHighScoreOverride: forceHighScoreOverride - ) - self.mutLRUList.insert(theNeta, at: 0) - self.mutLRUMap[key] = theNeta - IME.prtDebugIntel("UOM: Observation finished with existing observation: \(key)") - saveCallback() - } + theNeta.observation.update( + candidate: candidate, timestamp: timestamp, forceHighScoreOverride: forceHighScoreOverride ) + mutLRUList.insert(theNeta, at: 0) + mutLRUMap[key] = theNeta + IME.prtDebugIntel("UOM: Observation finished with existing observation: \(key)") + saveCallback() } } - private func getSuggestion( - key: String, timestamp: Double, headReading: String, decayCallback: @escaping () -> Void = {} - ) -> Suggestion { + private func getSuggestion(key: String, timestamp: Double, headReading: String) -> Suggestion { guard !key.isEmpty, let kvPair = mutLRUMap[key] else { return .init() } let observation: Observation = kvPair.observation var candidates: [(String, Megrez.Unigram)] = .init() @@ -309,11 +302,6 @@ extension vChewing.LMUserOverride { eventTimestamp: theObservation.timestamp, timestamp: timestamp, lambda: mutDecayExponent ) if (0...currentHighScore).contains(overrideScore) { continue } - let overrideDetectionScore: Double = getScore( - eventCount: theObservation.count, totalCount: observation.count, - eventTimestamp: theObservation.timestamp, timestamp: timestamp, lambda: mutDecayExponent * 2 - ) - if (0...currentHighScore).contains(overrideDetectionScore) { decayCallback() } candidates.append((headReading, .init(value: i, score: overrideScore))) forceHighScoreOverride = theObservation.forceHighScoreOverride From 6fcf4356ea0447f9052de82caa9380a3b4d7d410 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Thu, 11 Aug 2022 17:05:30 +0800 Subject: [PATCH 04/20] Repo // ctlCandidateIMK, continued. --- .../ControllerModules/InputSignal.swift | 5 + .../ctlInputMethod_Core.swift | 65 ++++++- .../ctlInputMethod_Delegates.swift | 65 ++++++- .../ctlInputMethod_HandleDisplay.swift | 8 +- Source/Modules/SFX/clsSFX.swift | 8 + Source/UI/CandidateUI/ctlCandidateIMK.swift | 166 +++++++++++++++--- 6 files changed, 281 insertions(+), 36 deletions(-) diff --git a/Source/Modules/ControllerModules/InputSignal.swift b/Source/Modules/ControllerModules/InputSignal.swift index 180d7cb8..a1cc8b96 100644 --- a/Source/Modules/ControllerModules/InputSignal.swift +++ b/Source/Modules/ControllerModules/InputSignal.swift @@ -214,6 +214,11 @@ struct InputSignal: CustomStringConvertible { 18: "1", 19: "2", 20: "3", 21: "4", 23: "5", 22: "6", 26: "7", 28: "8", 25: "9", 29: "0", ] + var isCandidateKey: Bool { + mgrPrefs.candidateKeys.contains(inputText) + || mgrPrefs.candidateKeys.contains(inputTextIgnoringModifiers ?? "114514") + } + /// 單獨用 flags 來判定數字小鍵盤輸入的方法已經失效了,所以必須再增補用 KeyCode 判定的方法。 var isNumericPadKey: Bool { arrNumpadKeyCodes.contains(keyCode) } var isMainAreaNumKey: Bool { arrMainAreaNumKey.contains(keyCode) } diff --git a/Source/Modules/ControllerModules/ctlInputMethod_Core.swift b/Source/Modules/ControllerModules/ctlInputMethod_Core.swift index 02c59768..2393b1e4 100644 --- a/Source/Modules/ControllerModules/ctlInputMethod_Core.swift +++ b/Source/Modules/ControllerModules/ctlInputMethod_Core.swift @@ -25,7 +25,7 @@ class ctlInputMethod: IMKInputController { static var areWeNerfing = false /// 目前在用的的選字窗副本。 - static var ctlCandidateCurrent: ctlCandidateProtocol = ctlCandidateUniversal.init(.horizontal) + static var ctlCandidateCurrent: ctlCandidateProtocol = ctlCandidateIMK.init(.horizontal) /// 工具提示視窗的副本。 static let tooltipController = TooltipController() @@ -47,7 +47,7 @@ class ctlInputMethod: IMKInputController { } /// `handle(event:)` 會利用這個參數判定某次 Shift 按鍵是否用來切換中英文輸入。 - private var rencentKeyHandledByKeyHandler = false + var rencentKeyHandledByKeyHandler = false // MARK: - 工具函式 @@ -205,6 +205,12 @@ class ctlInputMethod: IMKInputController { } } + /// IMK 選字窗處理,當且僅當啟用了 IMK 選字窗的時候才會生效。 + if let ctlCandidateCurrent = ctlInputMethod.ctlCandidateCurrent as? ctlCandidateIMK, ctlCandidateCurrent.visible { + ctlCandidateCurrent.interpretKeyEvents([event]) + return true + } + /// 這裡仍舊需要判斷 flags。之前使輸入法狀態卡住無法敲漢字的問題已在 KeyHandler 內修復。 /// 這裡不判斷 flags 的話,用方向鍵前後定位光標之後,再次試圖觸發組字區時、反而會在首次按鍵時失敗。 /// 同時注意:必須在 event.type == .flagsChanged 結尾插入 return false, @@ -270,14 +276,12 @@ class ctlInputMethod: IMKInputController { let theConverted = IME.kanjiConversionIfRequired(theCandidate.1) return (theCandidate.1 == theConverted) ? theCandidate.1 : "\(theConverted)(\(theCandidate.1))" } - } - if let state = state as? InputState.ChoosingCandidate { + } else if let state = state as? InputState.SymbolTable { return state.candidates.map { theCandidate -> String in let theConverted = IME.kanjiConversionIfRequired(theCandidate.1) return (theCandidate.1 == theConverted) ? theCandidate.1 : "\(theConverted)(\(theCandidate.1))" } - } - if let state = state as? InputState.SymbolTable { + } else if let state = state as? InputState.ChoosingCandidate { return state.candidates.map { theCandidate -> String in let theConverted = IME.kanjiConversionIfRequired(theCandidate.1) return (theCandidate.1 == theConverted) ? theCandidate.1 : "\(theConverted)(\(theCandidate.1))" @@ -285,4 +289,53 @@ class ctlInputMethod: IMKInputController { } return .init() } + + override open func candidateSelectionChanged(_: NSAttributedString!) { + // 暫時不需要擴充這個函數。 + } + + override open func candidateSelected(_ candidateString: NSAttributedString!) { + if state is InputState.AssociatedPhrases { + if !mgrPrefs.alsoConfirmAssociatedCandidatesByEnter { + handle(state: InputState.EmptyIgnoringPreviousState()) + handle(state: InputState.Empty()) + return + } + } + + var indexDeducted = 0 + if let state = state as? InputState.AssociatedPhrases { + for (i, neta) in state.candidates.map(\.1).enumerated() { + let theConverted = IME.kanjiConversionIfRequired(neta) + let netaShown = (neta == theConverted) ? neta : "\(theConverted)(\(neta))" + if candidateString.string == netaShown { + indexDeducted = i + break + } + } + } else if let state = state as? InputState.SymbolTable { + for (i, neta) in state.candidates.map(\.1).enumerated() { + let theConverted = IME.kanjiConversionIfRequired(neta) + let netaShown = (neta == theConverted) ? neta : "\(theConverted)(\(neta))" + if candidateString.string == netaShown { + indexDeducted = i + break + } + } + } else if let state = state as? InputState.ChoosingCandidate { + for (i, neta) in state.candidates.map(\.1).enumerated() { + let theConverted = IME.kanjiConversionIfRequired(neta) + let netaShown = (neta == theConverted) ? neta : "\(theConverted)(\(neta))" + if candidateString.string == netaShown { + indexDeducted = i + break + } + } + } + keyHandler( + keyHandler, + didSelectCandidateAt: indexDeducted, + ctlCandidate: ctlInputMethod.ctlCandidateCurrent + ) + } } diff --git a/Source/Modules/ControllerModules/ctlInputMethod_Delegates.swift b/Source/Modules/ControllerModules/ctlInputMethod_Delegates.swift index ead447f3..755e7d4b 100644 --- a/Source/Modules/ControllerModules/ctlInputMethod_Delegates.swift +++ b/Source/Modules/ControllerModules/ctlInputMethod_Delegates.swift @@ -49,7 +49,70 @@ extension ctlInputMethod: KeyHandlerDelegate { // MARK: - Candidate Controller Delegate extension ctlInputMethod: ctlCandidateDelegate { - func handleDelegateEvent(_ event: NSEvent!) -> Bool { handle(event, client: client()) } + func handleDelegateEvent(_ event: NSEvent!) -> Bool { + // 用 Shift 開關半形英數模式,僅對 macOS 10.15 及之後的 macOS 有效。 + if #available(macOS 10.15, *) { + if ShiftKeyUpChecker.check(event) { + if !rencentKeyHandledByKeyHandler { + NotifierController.notify( + message: String( + format: "%@%@%@", NSLocalizedString("Alphanumerical Mode", comment: ""), "\n", + toggleASCIIMode() + ? NSLocalizedString("NotificationSwitchON", comment: "") + : NSLocalizedString("NotificationSwitchOFF", comment: "") + ) + ) + } + rencentKeyHandledByKeyHandler = false + return false + } + } + + /// 這裡仍舊需要判斷 flags。之前使輸入法狀態卡住無法敲漢字的問題已在 KeyHandler 內修復。 + /// 這裡不判斷 flags 的話,用方向鍵前後定位光標之後,再次試圖觸發組字區時、反而會在首次按鍵時失敗。 + /// 同時注意:必須在 event.type == .flagsChanged 結尾插入 return false, + /// 否則,每次處理這種判斷時都會觸發 NSInternalInconsistencyException。 + if event.type == .flagsChanged { return false } + + // 準備修飾鍵,用來判定要新增的詞彙是否需要賦以非常低的權重。 + ctlInputMethod.areWeNerfing = event.modifierFlags.contains([.shift, .command]) + + var textFrame = NSRect.zero + + let attributes: [AnyHashable: Any]? = client().attributes( + forCharacterIndex: 0, lineHeightRectangle: &textFrame + ) + + let isTypingVertical = + (attributes?["IMKTextOrientation"] as? NSNumber)?.intValue == 0 || false + + if client().bundleIdentifier() + == "org.atelierInmu.vChewing.vChewingPhraseEditor" + { + IME.areWeUsingOurOwnPhraseEditor = true + } else { + IME.areWeUsingOurOwnPhraseEditor = false + } + + var input = InputSignal(event: event, isVerticalTyping: isTypingVertical) + input.isASCIIModeInput = isASCIIMode + + // 無法列印的訊號輸入,一概不作處理。 + // 這個過程不能放在 KeyHandler 內,否則不會起作用。 + if !input.charCode.isPrintable { + return false + } + + /// 將按鍵行為與當前輸入法狀態結合起來、交給按鍵調度模組來處理。 + /// 再根據返回的 result bool 數值來告知 IMK「這個按鍵事件是被處理了還是被放行了」。 + let result = keyHandler.handleCandidate(state: state, input: input) { newState in + self.handle(state: newState) + } errorCallback: { + clsSFX.beep() + } + rencentKeyHandledByKeyHandler = result + return result + } func candidateCountForController(_ controller: ctlCandidateProtocol) -> Int { _ = controller // 防止格式整理工具毀掉與此對應的參數。 diff --git a/Source/Modules/ControllerModules/ctlInputMethod_HandleDisplay.swift b/Source/Modules/ControllerModules/ctlInputMethod_HandleDisplay.swift index 4ec14a69..942f53c7 100644 --- a/Source/Modules/ControllerModules/ctlInputMethod_HandleDisplay.swift +++ b/Source/Modules/ControllerModules/ctlInputMethod_HandleDisplay.swift @@ -46,6 +46,8 @@ extension ctlInputMethod { candidates = state.candidates } if isTypingVertical { return true } + // 接下來的判斷並非適用於 IMK 選字窗,所以先插入排除語句。 + guard ctlInputMethod.ctlCandidateCurrent is ctlCandidateUniversal else { return false } // 以上是通用情形。接下來決定橫排輸入時是否使用縱排選字窗。 // 因為在拿候選字陣列時已經排序過了,所以這裡不用再多排序。 // 測量每頁顯示候選字的累計總長度。如果太長的話就強制使用縱排候選字窗。 @@ -65,11 +67,11 @@ extension ctlInputMethod { /// 該問題徹底解決的價值並不大,直接等到 macOS 10.x 全線淘汰之後用 SwiftUI 重寫選字窗吧。 if isCandidateWindowVertical { // 縱排輸入時強制使用縱排選字窗 - ctlInputMethod.ctlCandidateCurrent = ctlCandidateUniversal.init(.vertical) + ctlInputMethod.ctlCandidateCurrent = ctlCandidateIMK.init(.vertical) } else if mgrPrefs.useHorizontalCandidateList { - ctlInputMethod.ctlCandidateCurrent = ctlCandidateUniversal.init(.horizontal) + ctlInputMethod.ctlCandidateCurrent = ctlCandidateIMK.init(.horizontal) } else { - ctlInputMethod.ctlCandidateCurrent = ctlCandidateUniversal.init(.vertical) + ctlInputMethod.ctlCandidateCurrent = ctlCandidateIMK.init(.vertical) } // set the attributes for the candidate panel (which uses NSAttributedString) diff --git a/Source/Modules/SFX/clsSFX.swift b/Source/Modules/SFX/clsSFX.swift index e0260e47..ab7d3bbd 100644 --- a/Source/Modules/SFX/clsSFX.swift +++ b/Source/Modules/SFX/clsSFX.swift @@ -18,6 +18,14 @@ public enum clsSFX { AudioServicesPlaySystemSound(soundID) } + static func fart() { + let filePath = Bundle.main.path(forResource: "Fart", ofType: "m4a")! + let fileURL = URL(fileURLWithPath: filePath) + var soundID: SystemSoundID = 0 + AudioServicesCreateSystemSoundID(fileURL as CFURL, &soundID) + AudioServicesPlaySystemSound(soundID) + } + static func beep(count: Int = 1) { if count <= 1 { clsSFX.beep() diff --git a/Source/UI/CandidateUI/ctlCandidateIMK.swift b/Source/UI/CandidateUI/ctlCandidateIMK.swift index 4d5a415b..1ac5a04e 100644 --- a/Source/UI/CandidateUI/ctlCandidateIMK.swift +++ b/Source/UI/CandidateUI/ctlCandidateIMK.swift @@ -18,8 +18,6 @@ public class ctlCandidateIMK: IMKCandidates, ctlCandidateProtocol { } } - public var selectedCandidateIndex: Int = .max - public var visible: Bool = false { didSet { if visible { @@ -30,10 +28,14 @@ public class ctlCandidateIMK: IMKCandidates, ctlCandidateProtocol { } } - public var windowTopLeftPoint: NSPoint = .init(x: 0, y: 0) { - didSet { + public var windowTopLeftPoint: NSPoint { + get { + let frameRect = candidateFrame() + return NSPoint(x: frameRect.minX, y: frameRect.maxY) + } + set { DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()) { - self.set(windowTopLeftPoint: self.windowTopLeftPoint, bottomOutOfScreenAdjustmentHeight: 0) + self.set(windowTopLeftPoint: newValue, bottomOutOfScreenAdjustmentHeight: 0) } } } @@ -60,7 +62,8 @@ public class ctlCandidateIMK: IMKCandidates, ctlCandidateProtocol { case .vertical: setPanelType(kIMKSingleColumnScrollingCandidatePanel) } - setAttributes([IMKCandidatesSendServerKeyEventFirst: false]) + // 設為 true 表示先交給 ctlIME 處理 + setAttributes([IMKCandidatesSendServerKeyEventFirst: true]) } public required init(_ layout: CandidateLayout = .horizontal) { @@ -86,40 +89,151 @@ public class ctlCandidateIMK: IMKCandidates, ctlCandidateProtocol { update() } + /// 幹話:這裡很多函式內容亂寫也都無所謂了,因為都被 IMKCandidates 代管執行。 + /// 對於所有 IMK 選字窗的選字判斷動作,不是在 keyHandler 中,而是在 `ctlIME_Core` 中。 + + private var currentPageIndex: Int = 0 + + private var pageCount: Int { + guard let delegate = delegate else { + return 0 + } + let totalCount = delegate.candidateCountForController(self) + let keyLabelCount = keyLabels.count + return totalCount / keyLabelCount + ((totalCount % keyLabelCount) != 0 ? 1 : 0) + } + public func showNextPage() -> Bool { + guard delegate != nil else { return false } + if pageCount == 1 { return highlightNextCandidate() } + if currentPageIndex + 1 >= pageCount { clsSFX.beep() } + currentPageIndex = (currentPageIndex + 1 >= pageCount) ? 0 : currentPageIndex + 1 if selectedCandidateIndex == candidates(self).count - 1 { return false } selectedCandidateIndex = min(selectedCandidateIndex + keyCount, candidates(self).count - 1) - return selectCandidate(withIdentifier: selectedCandidateIndex) + pageDownAndModifySelection(self) + return true } public func showPreviousPage() -> Bool { + guard delegate != nil else { return false } + if pageCount == 1 { return highlightPreviousCandidate() } + if currentPageIndex == 0 { clsSFX.beep() } + currentPageIndex = (currentPageIndex == 0) ? pageCount - 1 : currentPageIndex - 1 if selectedCandidateIndex == 0 { return true } selectedCandidateIndex = max(selectedCandidateIndex - keyCount, 0) - return selectCandidate(withIdentifier: selectedCandidateIndex) + pageUpAndModifySelection(self) + return true } public func highlightNextCandidate() -> Bool { - if selectedCandidateIndex == candidates(self).count - 1 { return false } - selectedCandidateIndex = min(selectedCandidateIndex + 1, candidates(self).count - 1) - return selectCandidate(withIdentifier: selectedCandidateIndex) + guard let delegate = delegate else { return false } + selectedCandidateIndex = + (selectedCandidateIndex + 1 >= delegate.candidateCountForController(self)) + ? 0 : selectedCandidateIndex + 1 + switch currentLayout { + case .horizontal: + moveRight(self) + return true + case .vertical: + moveDown(self) + return true + } } public func highlightPreviousCandidate() -> Bool { - if selectedCandidateIndex == 0 { return true } - selectedCandidateIndex = max(selectedCandidateIndex - 1, 0) - return selectCandidate(withIdentifier: selectedCandidateIndex) - } - - public func candidateIndexAtKeyLabelIndex(_: Int) -> Int { - selectedCandidateIndex - } - - public func set(windowTopLeftPoint: NSPoint, bottomOutOfScreenAdjustmentHeight _: CGFloat = 0) { - setCandidateFrameTopLeft(windowTopLeftPoint) - } - - override public func handle(_ event: NSEvent!, client _: Any!) -> Bool { guard let delegate = delegate else { return false } - return delegate.handleDelegateEvent(event) + selectedCandidateIndex = + (selectedCandidateIndex == 0) + ? delegate.candidateCountForController(self) - 1 : selectedCandidateIndex - 1 + switch currentLayout { + case .horizontal: + moveLeft(self) + return true + case .vertical: + moveUp(self) + return true + } + } + + public func candidateIndexAtKeyLabelIndex(_ index: Int) -> Int { + guard let delegate = delegate else { + return Int.max + } + + let result = currentPageIndex * keyLabels.count + index + return result < delegate.candidateCountForController(self) ? result : Int.max + } + + public var selectedCandidateIndex: Int { + get { + selectedCandidate() + } + set { + selectCandidate(withIdentifier: newValue) + } + } + + public func set(windowTopLeftPoint: NSPoint, bottomOutOfScreenAdjustmentHeight height: CGFloat) { + DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()) { + self.doSet( + windowTopLeftPoint: windowTopLeftPoint, bottomOutOfScreenAdjustmentHeight: height + ) + } + } + + func doSet(windowTopLeftPoint: NSPoint, bottomOutOfScreenAdjustmentHeight height: CGFloat) { + var adjustedPoint = windowTopLeftPoint + var adjustedHeight = height + + var screenFrame = NSScreen.main?.visibleFrame ?? NSRect.zero + for screen in NSScreen.screens { + let frame = screen.visibleFrame + if windowTopLeftPoint.x >= frame.minX, windowTopLeftPoint.x <= frame.maxX, + windowTopLeftPoint.y >= frame.minY, windowTopLeftPoint.y <= frame.maxY + { + screenFrame = frame + break + } + } + + if adjustedHeight > screenFrame.size.height / 2.0 { + adjustedHeight = 0.0 + } + + let windowSize = candidateFrame().size + + // bottom beneath the screen? + if adjustedPoint.y - windowSize.height < screenFrame.minY { + adjustedPoint.y = windowTopLeftPoint.y + adjustedHeight + windowSize.height + } + + // top over the screen? + if adjustedPoint.y >= screenFrame.maxY { + adjustedPoint.y = screenFrame.maxY - 1.0 + } + + // right + if adjustedPoint.x + windowSize.width >= screenFrame.maxX { + adjustedPoint.x = screenFrame.maxX - windowSize.width + } + + // left + if adjustedPoint.x < screenFrame.minX { + adjustedPoint.x = screenFrame.minX + } + + setCandidateFrameTopLeft(adjustedPoint) + } + + override public func interpretKeyEvents(_ eventArray: [NSEvent]) { + guard !eventArray.isEmpty else { return } + let event = eventArray[0] + let input = InputSignal(event: event) + guard let delegate = delegate else { return } + if input.isEsc || input.isBackSpace || input.isDelete || input.isShiftHold { + _ = delegate.handleDelegateEvent(event) + } else { + super.interpretKeyEvents(eventArray) + } } } From 50593ff1f03801044d536ea410a503d31d8ddb32 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Fri, 12 Aug 2022 08:55:37 +0800 Subject: [PATCH 05/20] PrefUI // Icon update & Add DangerZone page. --- .../Resources/Base.lproj/Localizable.strings | 2 + .../Contents.json | 22 ++++++++ .../DangerZone.png | Bin 0 -> 2531 bytes .../DangerZone@2x.png | Bin 0 -> 3433 bytes .../icon_32x32.png | Bin 572 -> 0 bytes .../icon_32x32@2x.png | Bin 879 -> 0 bytes .../Contents.json | 22 ++++++++ .../Dictionary.png | Bin 0 -> 2245 bytes .../Dictionary@2x.png | Bin 0 -> 2582 bytes .../icon_32x32.png | Bin 749 -> 0 bytes .../icon_32x32@2x.png | Bin 1176 -> 0 bytes .../Contents.json | 22 ++++++++ .../Experiences.png | Bin 0 -> 2362 bytes .../Experiences@2x.png | Bin 0 -> 2926 bytes .../icon_32x32.png | Bin 1164 -> 0 bytes .../icon_32x32@2x.png | Bin 2022 -> 0 bytes .../Contents.json | 22 ++++++++ .../PrefToolbar-General.imageset/General.png | Bin 0 -> 2736 bytes .../General@2x.png | Bin 0 -> 3964 bytes .../icon_32x32.png | Bin 942 -> 0 bytes .../icon_32x32@2x.png | Bin 1383 -> 0 bytes .../Contents.json | 22 ++++++++ .../Keyboard.png | Bin 0 -> 2384 bytes .../Keyboard@2x.png | Bin 0 -> 3035 bytes Source/Resources/en.lproj/Localizable.strings | 2 + Source/Resources/ja.lproj/Localizable.strings | 2 + .../zh-Hans.lproj/Localizable.strings | 2 + .../zh-Hant.lproj/Localizable.strings | 2 + Source/UI/PrefUI/ctlPrefUI.swift | 11 ++++ Source/UI/PrefUI/suiPrefPaneDangerZone.swift | 47 ++++++++++++++++++ vChewing.xcodeproj/project.pbxproj | 4 ++ 31 files changed, 182 insertions(+) create mode 100644 Source/Resources/Images/Images.xcassets/PrefToolbar-DangerZone.imageset/Contents.json create mode 100644 Source/Resources/Images/Images.xcassets/PrefToolbar-DangerZone.imageset/DangerZone.png create mode 100644 Source/Resources/Images/Images.xcassets/PrefToolbar-DangerZone.imageset/DangerZone@2x.png delete mode 100644 Source/Resources/Images/Images.xcassets/PrefToolbar-Dictionary.iconset/icon_32x32.png delete mode 100644 Source/Resources/Images/Images.xcassets/PrefToolbar-Dictionary.iconset/icon_32x32@2x.png create mode 100644 Source/Resources/Images/Images.xcassets/PrefToolbar-Dictionary.imageset/Contents.json create mode 100644 Source/Resources/Images/Images.xcassets/PrefToolbar-Dictionary.imageset/Dictionary.png create mode 100644 Source/Resources/Images/Images.xcassets/PrefToolbar-Dictionary.imageset/Dictionary@2x.png delete mode 100644 Source/Resources/Images/Images.xcassets/PrefToolbar-Experiences.iconset/icon_32x32.png delete mode 100644 Source/Resources/Images/Images.xcassets/PrefToolbar-Experiences.iconset/icon_32x32@2x.png create mode 100644 Source/Resources/Images/Images.xcassets/PrefToolbar-Experiences.imageset/Contents.json create mode 100644 Source/Resources/Images/Images.xcassets/PrefToolbar-Experiences.imageset/Experiences.png create mode 100644 Source/Resources/Images/Images.xcassets/PrefToolbar-Experiences.imageset/Experiences@2x.png delete mode 100644 Source/Resources/Images/Images.xcassets/PrefToolbar-General.iconset/icon_32x32.png delete mode 100644 Source/Resources/Images/Images.xcassets/PrefToolbar-General.iconset/icon_32x32@2x.png create mode 100644 Source/Resources/Images/Images.xcassets/PrefToolbar-General.imageset/Contents.json create mode 100644 Source/Resources/Images/Images.xcassets/PrefToolbar-General.imageset/General.png create mode 100644 Source/Resources/Images/Images.xcassets/PrefToolbar-General.imageset/General@2x.png delete mode 100644 Source/Resources/Images/Images.xcassets/PrefToolbar-Keyboard.iconset/icon_32x32.png delete mode 100644 Source/Resources/Images/Images.xcassets/PrefToolbar-Keyboard.iconset/icon_32x32@2x.png create mode 100644 Source/Resources/Images/Images.xcassets/PrefToolbar-Keyboard.imageset/Contents.json create mode 100644 Source/Resources/Images/Images.xcassets/PrefToolbar-Keyboard.imageset/Keyboard.png create mode 100644 Source/Resources/Images/Images.xcassets/PrefToolbar-Keyboard.imageset/Keyboard@2x.png create mode 100644 Source/UI/PrefUI/suiPrefPaneDangerZone.swift diff --git a/Source/Resources/Base.lproj/Localizable.strings b/Source/Resources/Base.lproj/Localizable.strings index 37153273..7c7bd334 100644 --- a/Source/Resources/Base.lproj/Localizable.strings +++ b/Source/Resources/Base.lproj/Localizable.strings @@ -122,6 +122,7 @@ "Cursor Selection:" = "Cursor Selection:"; "Dachen (Microsoft Standard / Wang / 01, etc.)" = "Dachen (Microsoft Standard / Wang / 01, etc.)"; "Dachen 26 (libChewing)" = "Dachen 26 (libChewing)"; +"DangerZone" = "DangerZone"; "Debug Mode" = "Debug Mode"; "Dictionary" = "Dictionary"; "Directly commit lowercased letters" = "Directly commit lowercased letters"; @@ -173,4 +174,5 @@ "Universal Pinyin with Numeral Intonation" = "Universal Pinyin with Numeral Intonation"; "Use ESC key to clear the entire input buffer" = "Use ESC key to clear the entire input buffer"; "Vertical" = "Vertical"; +"Warning: This page is for testing future features. \nFeatures listed here may not work as expected." = "Warning: This page is for testing future features. \nFeatures listed here may not work as expected."; "Yale Pinyin with Numeral Intonation" = "Yale Pinyin with Numeral Intonation"; diff --git a/Source/Resources/Images/Images.xcassets/PrefToolbar-DangerZone.imageset/Contents.json b/Source/Resources/Images/Images.xcassets/PrefToolbar-DangerZone.imageset/Contents.json new file mode 100644 index 00000000..f8fc6606 --- /dev/null +++ b/Source/Resources/Images/Images.xcassets/PrefToolbar-DangerZone.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "DangerZone.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "DangerZone@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Source/Resources/Images/Images.xcassets/PrefToolbar-DangerZone.imageset/DangerZone.png b/Source/Resources/Images/Images.xcassets/PrefToolbar-DangerZone.imageset/DangerZone.png new file mode 100644 index 0000000000000000000000000000000000000000..226a023336b991248237b9f77a3190962b8329af GIT binary patch literal 2531 zcmai0X;@Qd7LG`r3Z;UIBB)$11A>qh0SO6P!jeFcH3W)6NN&QFBsU~C53bHG-Ob1!4jvMnOAVSrdA2+$@d(U~#@||;%{K$w9 z3o~0Y0)b$`31vrvZ^-a`JPUlPv$IDDgpbysu>xGc3#W@PIY}tSQW26?t^_!N!0^*5 zg`#u>hf)zKs$jx{=WAgI6*J*@4<3c5WFcv2XtoN8$&QE>Wv7e0#ju~R8AD441abry zLRz^@p{8q@u#uMz-VMiO7&5Bh=}cI_i-cI13V}RG9wZ9vYX&h?VhKH(9Xw$SBqp4O z<4QW2oSB(P%5*1TDk+)j?d?sb(8x3z5oi$ASqfaJB`VYo28wYGHlh}(P$iCH3dq1I zOvN-f6NUi}O^}O4liW&;N@iphi^zx!ks}IRO{S8lNqO-fVu&BM_rkQ;g~uNQ%(jo&BY}Ajv*-b`%Sb$<@=O*y#K8(mrqMWjR&m`wawnD7CRg~>2g z3}`}x2~&+WhRV@7a-kH7N5y#BB-h*Xa6}>fBVdS3rZKcaoB{>8jQcm*2;O2$*o#J< z;wIs}(BwVPjnVNiF$m7x7~ETk!(v6MFbOIHm^wNn5aI-}JgMHEoitg@7r>=AbFBFQA*{BU>M=ZpJ|4-jA0T4qhqT?toLyXe+ zLt<28fl%qlcnu98+aYaUX+ZOm}abLGZ*o~ioJp~pXd2-_cVRC083a}_uU?YZaXuClm%=jDyJ@HO25D3minxe+Az<~KX z{7#47q}7YctC!e@2tB&n)uJ;$kzQD%lSc; z#7a$6d2#F670yNO|JaA+y7wu6T6BDS3^x(8*@in+=e=Be?@D)Z^)J>wpYGprR98{G z`*O!{P+<^KRua%l_=V z0sFOyR=anf^GM;1#8tgB)60*$MqO>PfS$(NNr7j8dGwXwf=`_#;9TZ9|z?Sh9)Ww(^2RnL#vUv4?npZDD(U(>z?NlEdi z`ONq;h8}w+h;={nC$1U17ZbvzugVcmB!8g)8piyD5CPTznf<) zGp#h=Dr=8XTOoEwVUujiDv)H}T%)C!6E7;b9@;Q@_)?NrjD zFsq?^+vkS5@KTmC!%w?yio8no`Xc)NR{bhn?GTfHvnDDPr?|#HToc}H>-!g7 z$KT5RxxcKsRIjheo8!HW*?Cb5)cqm#S5wRD`2V_kLig;z zBcForpDliR;#k#O*6b2fzitaRcKzP6jaGx5w1^&!sqZe`@={G-@1{Q6_MN)xPm(^f zHG7=Ec^&pMXGv?LO(*5i<7oMsIknxEzDxF`S#K`6<2gF?@$y*+`HZ>CLCh}nSRk8G zmp`{UIknIU>KJiJ%GZ^a$-N{Ej*+2mjUgTduX-%|_h8KbWK(p_N9>&L1*GT?Nndva zM{|9YGpwvOow2fs+iYi%pWKk%lE2%rVWIU4lU>cJ$Er-^TI7c|=x5U6>s#+;-@ zRCpbZLhoz|O7Q>v<}Foer{e|3ymlLr@W=VmLGo-R*93#d2J^ z&CgGMTTs&TjhXYOYR5VTpZk5&o(ryijFD@ZirDy-5n-MVU-v9aXeQ;{FSb})6M-x~ z9YsvYtKW9GZ(~ApuuxQf$F@j*^1yo6t?5@3fu*)}xXbY0j1v^WJ{p*^ F<-Z53zGeUb literal 0 HcmV?d00001 diff --git a/Source/Resources/Images/Images.xcassets/PrefToolbar-DangerZone.imageset/DangerZone@2x.png b/Source/Resources/Images/Images.xcassets/PrefToolbar-DangerZone.imageset/DangerZone@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3983f2a1155fd3b068b294cad4b1c59575b8563d GIT binary patch literal 3433 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 ULAs^eRsWDEzComFZ~Er{0{=v0W&i*H literal 0 HcmV?d00001 diff --git a/Source/Resources/Images/Images.xcassets/PrefToolbar-Dictionary.iconset/icon_32x32.png b/Source/Resources/Images/Images.xcassets/PrefToolbar-Dictionary.iconset/icon_32x32.png deleted file mode 100644 index b7cb8877a5d534aa7a5c7d7b0c381e1ee31d1b19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 572 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaNN1^9%xx)=EL^z=-bGNrMxap}^feSLkCCr@r|Z3T+-_V)Jo_jh!3Oq@7z z!h{L`|NpP9u3o%&F;J?#y}i4;d;a|Sot>R+ZEfY{68B?cD z1sbwx(h-{H4zG#)0GI>%Z5(n!A3FFwyf6VKx^m+!Lte68AJYZ{tVq&c|QYUHSPc_?M=J zTJcT2eW~w?mjVqt?&;zfVsZNDzoboFyt=akR{0HARMq5uE@ diff --git a/Source/Resources/Images/Images.xcassets/PrefToolbar-Dictionary.iconset/icon_32x32@2x.png b/Source/Resources/Images/Images.xcassets/PrefToolbar-Dictionary.iconset/icon_32x32@2x.png deleted file mode 100644 index edee48a6f3507cdc50735d8e3ad7d74def8a9fbd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 879 zcmX9*4KR~&7=M{en;LGVIwdZlautbnUCrWHYDw;rE{Z5QBE&wj51+4Ln~m7!R+;U{ z9LvoVit3^d$|)|TRpes6t4qmxx}LlD`TzdU^Lu{J^FDtxgci68w*iMB$SP`(e<+;f zf1ecwd{qnA2#3W5zoUK#(j>qyom&BSv((T)3ewQ)@D;FU$dRysz~m#PrKMahx1^*b zGc&WexR}r9i$o$0hXX(;6qc2hK{g{JgTY{EwOSw)6%{F!N*<4=P$<-DHAKW>G0?yy z63KsGQ&R&Nlb8~ac%gez-90Y;c+S&>oRVoz}f)y4P zYBU-c05E9g<>j&2Y?(~PVzD3sB_Im}NTt&J{CtRHXJfB+cu;Roq-I+TE+C<HjsP1eR?nb{^vJtWXy5iYU5!=xt{eb#g_fVt`Xxo_hZk(%7&OeVa`yPG7}kDW3dtK~xv z{#ecva=~@o_~>FlZ5kP+U5?w?IQEw0okM!cowWC{t_*W^I@>1;IPUaVL z2*%S>K2A~2PMz2|jaDq=SPhL~sPUU0VsZVPF6`Z92ODD&O4*3~A;?AgZ3IcH*EzbO zDU~P3!P;6ycF9eefiGZvG!30diI0y;Ec(H6Y$x5;tvl|FV6|F(6 zV;NEF0gjGfOQnO>g5yC4#IcG;)u~RY+Iow(h=^8g?Uw{OJla1t+4ue4`@Q$QD_NO5 zW9k6kKwk)g1}NmR6z~l@pMHJ7C!3eo4nf{?DV2uPD5qltV;0~#CX*D{%@%+|P|Rez z1t+pd4$dSE6fHp>9jr%SN+&_mBa}j=MM@eed7hO_&6}Yj^0J6%9WpuAH^z{8*fB#1_t3`-d+2}cMb1VSX%7ml&&^jL~4vC|kx62!=H z77Rsma&iPYVgX|{pyAQc(Wp>_ibQ;%!Dn-64!84ZcBGTS%^@RM!b({Kvv2 zfVvZTN8Ms%IEFPcmad?Bx#)u5F$C#;zlj~UyiZxF{BL!$xz{yVE+HEvuCoZeVtV6% zRpnYpG=*dto0T9FvO)Gnx)SHi3zkgTNs~rKfuypa8WKb-dJCNO0Z_`A7;7qMLQ;Z+ zyKJ19!xU!RK&DeV&e+A(eLkI}4Q~U^$V@h8E2wD-+{NwRWuxiFBuJD9?crwDd!ep6 zV6Nztj1B}Rb_LfBDWuY5E2F1O0Ao|8PJtB((#Y`W$Vk3O;PwEDh5=hjpDV*Tpd}K5 zUKUQ|hl^CgiI_MNi--yXFG8V<*`*C;M~8Fx|LHp?0FKcS7)Nm?(j~bkBHqNgCAVmz zoMV8QaM~b2?0g-m$89DKiOrT8$sCF{@Kp?B%EYY-f}vwj=LngoPBxeHhAsx}?yGD z(5{UKgsz=Q(qK_q!AAUHXyHW&;uTP!C*J7=2ntzaTXQ05O8npzlWXP2g_Q}i{ytgc zSMR|c~sES3peMDt}vfT3n{wLu01zD`QkR)z`+Rv`Q^5mr6m{lhlZ>X zpDbe*i(4$e4BK6pI!((AUCxcEa=e=NTjRBosyjm_eY|Z&bhT21KDEi-Pen-;4d{gp<)xLPIQ%KaLP0|La;uM+Eme=+BY`uyB)r1T$}#&>kf5s@kblVC)J&K zo;ft=r!zI4N0#CFLBkUtdznsK)_?b6SJ0v6Z*Mzx-iq~V@t-p%z4rEqIkdE8ZQxmC zbkmp15w4GFkT8 z5|z53d@*#t@@{BTSn_n@mS?MX-BIX9fp@_Cpn}as_m6n1pF))#ei^gXV~gf5-Lq=b zCvhX1+xDR;d)X`L>v*q*6@-iPp9TiVUk)kbd7r*!zEYQ7;L+NTOSzTPZ%NA+acbGa zJl;O9NZE~G@-ZEC-i!8`eL(YjN8GcDN!jCQ)u{XzVT1l^_cm_KN>I;@x)RaqF}`X+ zMp8}0j$C5GfSQw+5}qtS+ToY%zoxXZqFDkX%ua1^{)(iA?IYvTuWPg~m?6Ka<@XC- R);s@wC=zDKs;6Wu`xjU3BYpq? literal 0 HcmV?d00001 diff --git a/Source/Resources/Images/Images.xcassets/PrefToolbar-Dictionary.imageset/Dictionary@2x.png b/Source/Resources/Images/Images.xcassets/PrefToolbar-Dictionary.imageset/Dictionary@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5f4a7907029a49d76dbf4a8b47d6ab01a5f74b52 GIT binary patch literal 2582 zcmai0dsq`!79Rq*kf4R4fVj#yD&iv#g1iC&LJ}lu*nkNHib_Z(VI;|<$wUH6TW|%T zJ`l94D6aVWbfF)mRa_AF1M#!sDg}x>YFz}13yXGPfp%B4%iaX!;bZrY$=q{)=lssO z=bm#W`J$-J3(4+e2!a+0B6%_39cF&)7J%O}?89ydvfY7+rG!+tjU~r5G?@ZVMrkIE z4&V?J9BR_Zkt@Iu#q@lAw#I+qA6Hph92FX5ha#qq{;&oNN5N- z*u(+^8kCU1CXHHaV42v6g_i}^=50CxTU3ZtHX;>@U@oplVPBdrje&%a;b6T&$%^4c zOdA7^ewT4w@iYX2rYLM$O z9f9Fm*vu(Q#*G9UK>!X8KjjpjyH}_ojK%=jx*-Y&IILVLDwP zada~R)EV>C2~7D8bu;pYx-JDLa6<~Nn+a;3iy8P0Ly+#bo0w#}w27VtVDkAWqkz^cd8D8})LOzXxP*l_hcJys$)=2~|sZ7)YuC+y)!*+w>Y3 z{|=Cgt8x8yP=qKO@wV8QGshBWWGXZcQxGXLT(kSzP_629z#N&{Xf6eb76WHt&T>g- zF*f4Qq|b2^|5j+`9$1#>gt!6(=VKw9g#=u#NRKNqHNXrpo5NuNpX=ux=;ude(xyCs zOJf0BOqtG;5kQN{0JY2rpn5aKi~yF8Kg&CC16VK^7G{e!=pBWOko`Y>a|gh|3OS3w z2sLVvraFS7CZ?n*QH`0~fTfmcRcypWRiH|lQB5Erd$=iR8m3iI#W=1`mgxm@TpLU` zw~!i}X0u4I=z{63|f^z^PO*$mVyGpcPExU_cX7f z3#Pvj|J32<%oAWYwFl-D7kt{0rkUpGUDzMO&@U`Ej;L;g!mk)bsux*$S)TK9XJPCZq*A^KLUdu&lcf^_|z(@{^3Z3$7XIV@FvTp?x? z=bal0TwQ&(^~#T}{2KMRct*CMpSOJSX3^xvr+wv(6-Arnhin92nRrct@e^IugWkpK zMwOG3KT8S<9FCt4y3z9QWH*mLw_LTpy;qj$u`J@BHtJ^GXMddd!sBMwrNNxCzlGQg zxFjaVRSm94)N%)oy0;>0?t0#HFSzw$=~Y_z3+g8N@!!VQ42(N9oEnw*SAGJ0G}>J= zN?F^Wx_d3pvmJcd>~)dx1_+`!n;$FaWQiLDk=g`2j@VT4n7+v{$QT5`DnF>xoPLi{zwISw6NjNVj%kJk8$BnjU;A|!jQtq)$ix?re4bP{p(B1g0gm&vTHl4 zcX#wUGfH+G=lACyI1va*c90Tn4p$Ebj8dw}C60x-OSa4YZ<$Rtsqx;A`C-QELTrlpE)Mn8~K(zUvwR^uRdG0?vth%K>u(7ak#(8n!xcxDxAN;~GXK5Ks|Y&7!2t)?&(8(x6R+4WJR$kuN~W%kqR|_*!aeH&zVG&FBAcd+9Z)xyl-Umb*S z@2E&a&)Ul6(%+{pb1V#sZhFb2q9duoCWkxzw~Ev-G;3|EC)9 zpT4_POq$3Jae5vtzW?NNT`1f!u|Ox_9d@Pa<87m?I+qW9bfr6{|A*>K|8{Ph=DVtg jlD2wS!lvI6;x#X;^) z4C~IxyackP0(?ST-3xrCPMzA)(lTk%q^72(`Sa%kxznai`~UxcMMcHp#fvv>+O%QA zhJ_0ku3ELKt*s5HpuWDowzhWe+__VxOsT4>>hA9D?Cb=}0>y!PfuN(KW8%b#K-rly zX9A7t@9zh)fn;xQ@3LjffEEF{%a<<)inO-2E?BStsCV+@$w2YO#zvr2U0oee*MtcZ zfZ{+B2zq*YfU-dCKsH1r#C#wZXkAxV7f=^aWXX~xKoOuLf#jk^i-2|kO#nI=A`5g( zO-&6@3g~j6y+AYD+uMQ00tJC)R##U8mF?WQ6DYoP>C*D@@|E9I*?>V7TN30K%y9Zc z@<)yt*^K|xxp>tiUTZM@P~!Rh{23cd`>Yq&>vawNYV96K70;1%e=jW>fAn+VH{+X} zHn$&}c?I?yzuoDo_iA0Pe8k(kisEt#XVZ*+-Ozvc^p)+;4Zmu*9||5ke|{A(IygLC z978NlCnrd3acIz0ak?{|IW!tzc&5Wn^S_ zP1tjutr*h`m4-PN3Iy5M9^Sa&pu*}Cz`D^bfRXc9grZ~19zGwtFis@_Wijbz?I{gR zF^zIA3KnK3xNmmenPb4ZE5R;4XN~zP^`i+~I}XHz)wyk1VAv{^c&1VN! z*FAf;$}TQ;Yj^4DJdNX~X4Ay;Q$B34oGeuzGws?ookxCW#MB~|ww`^!n7X3#C4X3H zg+XIO55q2|V-X<=OB%KG#k={oR7`kUnQYi-vWbaVhbv-&=!%3ufz@409C&AQo`@5j klAh+yd`hWVOPGm4Gd1pE*J7FNz`$qlboFyt=akR{01Adt{Qv*} diff --git a/Source/Resources/Images/Images.xcassets/PrefToolbar-Experiences.iconset/icon_32x32@2x.png b/Source/Resources/Images/Images.xcassets/PrefToolbar-Experiences.iconset/icon_32x32@2x.png deleted file mode 100644 index 06c51e4a659d78316115ba8d5882395245663b82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1176 zcmX9+3ox5m6#f&h)}z(#AmUYQF{@~I7>d?olZIA3f@znkY8CCUeZ*9}BFRd;UrDH> zUJ3EYOh~nql9cN0EpGf24iX{5@c1Xix;6a5HFR zWQ4_HwY0R9l#~<~7pv9k?CfkZnOsm%z~OM1OlCzz1&v1Ia=CES+uNI;pP!YLC6P#g z!{_tA(12N9UQVG7$LLBmf797AI2+#$cPKO8p7|?E{rXkuJX*oyI3(g?e*7!YwW9HXF#w{Ym&@=I6`SnU#t{T56Om zoueIE9G~xQsWy(tltWY$`jYj*WjvP`s098xE*?T>k_GYAMf`YpIX)?b_LI53uijcd#Uhoo zFhHmc(6ORs7;ZX~&?m!?@8=>NP0Q!B`wnSfdr&*^Kksv=ZkWxm=SRZt5>rSN+|;Ba ie>UddC&b@gFCARIXB;%xhP1-Jiv;3>aqa$>=>GxL3P(o( diff --git a/Source/Resources/Images/Images.xcassets/PrefToolbar-Experiences.imageset/Contents.json b/Source/Resources/Images/Images.xcassets/PrefToolbar-Experiences.imageset/Contents.json new file mode 100644 index 00000000..18f84fe1 --- /dev/null +++ b/Source/Resources/Images/Images.xcassets/PrefToolbar-Experiences.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "Experiences.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Experiences@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Source/Resources/Images/Images.xcassets/PrefToolbar-Experiences.imageset/Experiences.png b/Source/Resources/Images/Images.xcassets/PrefToolbar-Experiences.imageset/Experiences.png new file mode 100644 index 0000000000000000000000000000000000000000..ce7dd38788d97a3c70aa01e6dca5c5a2a7708538 GIT binary patch literal 2362 zcmai0eOwcD7(Yb$=*$vPK&&{=L_)V4TY$_B8GDf_BZL8C8Fp;9ac;YtyPFI`OM+OM zA!sUzp9u1!NFkY8T6{_%iiCt-5bPB&!M6{BWG|-l+lC0K^~Y`Z{JzigeV*U*w!M-N zzhVX}fCWL&3`MLo5q!hWXQ~(Yq;qnHA!y38gi6h*m2mX7A8ETLTh2+TNx z!FIEWqy=^n;^Gy6cjqyRz%CWWC_>cA1Xw~@aX5?<#^EASELdpO=>>^W`KU3FL`WvX zSOh4Vm6gTG;&Ujg0S%3ej6}ISl*eNO4K|%kGMJrB(hHmvZVo92}Q^2<96b1G$cKmE|56Xi2!x(1a*ec zKS14y+@o&Eq!^0Mq%31WO>i*=-(v{UeSZ@>X1SlTQu*KNX7hw=(2Q&YNZe=mu&#qTi{BZGcSS!!j7BNQUWBE2GtNDeBQsnvkOChfk^ zSRDke=#-QW1jly;cNbDfBnehZPnZBkC$5Nr6*5V9Xk>Ueo5yi`07Vl3TSA{L#TcN) zyygzT7r*wrnQ5(zbeU$@eEh zf{XbrWz;5qpXIB$wJ#^F)KLEUOi*>f-|1)TdrGP=&ROFUvf_wc+Nv1d)A?b4Xz7zf`jL?v$wfsE?XFz* zaoZmm{(*IEM?F8w!*T=X$p&N#Blu zc4T35(CL7phMRMba$;_>pF(#(pK_va*t>r3P;x}=3(&@)pH2)-UsP{sKJEzm4*arB zv&5#+5H#J#`FKEYl=*`K{jQLTRqBGP9m|X=Y-ZEo+NXSj4$4?l+T*=F#l_NjGI3ts zIY;29)6=(zx5Mgn3)7?L)+P)uZmfs5I0{navnsrl*!+y>uMZXEtFN%Sb!W?3n^wK| zbmaAq`6CTw{DHUj@6xQh7+8JvY2Py~GdlAg@!#qQRC?$xSg)K45;nw2TfV(!>z&`x z$|~xPmBzK);1K11rpIAZ&knLGOS_V<9qaYz_~nV?J-#`Xchw)vj@FZ(Z)9dCitIZ} z_r0INw-@?&uU~}7*FXME=jwNUO!tEN+R_$%FyoegzGF|*?YzF=T|Lb)9vgOl@rdtB zrCl#C_D`7G72VDsn96(K^V#d29UZT{Srz_RV~yjFAGp!d+=hPPaX(wnt&oAni|h79 zhTNPZysaeV+qzP0J_nGVRdo%x2d66c_hU>rl76;XS+(S?lOc5u9zBKATmEIs+Maaj z4>i5i;YshrWJzD$eKpxjk1KxO*7E2fvTY=3zkGXXUB4_MTpJd2&9~Pc;Jst(!`n;e zCEvKcIr~y>a@x|=1wA(_Al-#2YZ{MuUE0{#?eHgAFu$mq^xS4J&f4fbNQj}*uEM^6 z=Z7lfZO_#0*;K9B+Hc>{TJ^VQ%ZZ%Rldc$#{E5yveEw@_z;9Z)YM*Arv#{3ZvR|h? ipuu}kzqxOuX49l5XiIS{d~$*FFONbNFRh7rF7F@ImT8p$ literal 0 HcmV?d00001 diff --git a/Source/Resources/Images/Images.xcassets/PrefToolbar-Experiences.imageset/Experiences@2x.png b/Source/Resources/Images/Images.xcassets/PrefToolbar-Experiences.imageset/Experiences@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4e21e4d198f558c8a0fc859d19ae515f80143c94 GIT binary patch literal 2926 zcmai0c|a3)79NfOf(Mt1s1OHGP)R}p0)apwfP|~a8Bj4HnZT4J6O#!95e*8JF1AXr zMGh<1st6*A2Z~C>Ygv(N)hgbo;H?D|0bM!?ic)p=kIBrN@4fFGzxUqcr_hk4Q}oUC z0RWi7@b?MB?%$~{Jss?KFTDCT0N_@_5loaB97N?H0s@H4}EtT6(bNpC>t*m z@P!hpj0UQCso1mXH4((CRnR0F$P5m}(-AR*cOp0uNT7#4-d)V)QNw)vJ{V&X4NOE) z5tT?xNl783PzZ=Pf#~4s>PjS$iDa@preQBh6{2jJy-;GMq8Q`wfg~I;EJ9&Kh*xp4 z;}I!J13?VOe<0^_#<@jOF<;Hh2}X2qhoNg%ysdLNImG z1a%bVeM4P^e4#E%L{LPMh=|66n&4s_{=yI|_t#BiY|+=0gMvP|LLnH0PoJ_P*E7= zLuzSkBE0zMm^3ExVbvH=`D|eV4V2k)As$=GM?sHddLonp3lr=k5QHDk7Be`A(4D9n zAwK+pO)Y(-b0<#l<&MP~98C3xB`6|J{mgwhw0fd@^(5l)>i(j#IjZBKfg&-&m2x1i zI&CbGF;s%^&=j^9@=Cy3iw1h}crbR5sd#M2;RGQh#$%&OA~;PnN=bw;!fzLr_<1%T zqjM*I5&u~7pY0ROZtNYlr?7=b9N&1DFupS(A+{*R*haL-OvE;@h8)Iv;)`AY0NY$? z?!`cFFVjt)hyDLe+T-hEFewS@&?;Nv6~M&LT76UE?rinxN&TuZ7!vy7+FW@6}8T){V_Zs7BS02=T~LDi~FOgTT%6Ry4%!} zO*PqNRe7gb^5gfPYUIE#hc7W--+AvA8^t-UIiulKX4wxh_uzXnIV_^HW`bQ20 zc743j(KnG>woJ}1cRSJkHr~wgWcwkla~s%eEob}vsm*T_{aQJ^-}3ae-H)>N_IPOb z&RDS``tT!*6+(J%o_Pmo(>(v8`Ia*yvknowN9-Mm`DszddIyY}iuxj*Yu5wmeYcPG z87yc@Xg-oX{|feHnJ3|6p+6Z;iJ>P;)3(=1Ukdh9Brl3jGW#|8RLmpr>&t3~&?+~}_8&k?`QKSTGy2J!-_zd5q3+(c%;oU)?h?6bwSahVjNU2AjGOt&^~K&z?YevgdN0iHQrR_Q-VxKc8rKYN zPP@6;;LTwrnKk=WQGwu>t+%|=dzZ@d<&nyMr5CHL=UtsL+@s@xm9oVGcUz-oYIWa| z+K^5kiWa3|s#(v@Hx{@Tih;n5w{&j)y7R$u#zo>o_s4pqIvb@$liRdcj;}Uc;7vB$ zH`KW6KtJxi@>t=0Uyt5q&Cr&il#Hr?h&w#q#ljui95vlFCIgGC)32XJXS^;SKGC*% zY0x5CwayFMn4?;c&Pl}q*3Wg{q@io}Sf<|@nzOrDv+WRb^gw(~epAa;V84?oGI%AB ztl7fX5q+OSrep~3<{6(_r4v_ecM9PDHc+{L-CjG9)x(~3R!7g8%^cjJaksg!o1%sJYuHr8b~*uvD{B)9~H1=l2r#loqVis@`Wu&0Ib&<9qw7cV?#I1~nSB?khtW z_{VxeQ#7C}wiD^Pw6)-t!CJqytW~)WZcK~tp5Aae?&eje zh!H^e*gR)|VtGw-vGy?C1pl*jo38(wxkugK&tjc2khvV`$2DXG*I&7tPHCvi^mCe& z+x^30APyJeTx_B10sI!&$K&s6YT;?6IGcKg?b`Prg^6R`F{S%mGf~Bro2=3yquPTm z#lVb!VTY*RgDv`6+poW_Uwa>9eb*T+5Qg;}tWemocsZ+wG6*GgZ!evH`1;4yMY}om z7kc*x)@U;Pjpd--0pond@oC#Sqm?Ce@txpa|2W;@H=`%70Ub?-3d9^`Ls%Dk8Y4ppdE9n(!CUefX-drHI l)S@d0M@pv@w5-o<1TJ^ZCg|PJ4^;h4X84Bq)OfQt`~@yIZVmtd literal 0 HcmV?d00001 diff --git a/Source/Resources/Images/Images.xcassets/PrefToolbar-General.iconset/icon_32x32.png b/Source/Resources/Images/Images.xcassets/PrefToolbar-General.iconset/icon_32x32.png deleted file mode 100644 index ae3e418639c06ed4fb3970b25557f4ce7c1cf0ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1164 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 literal 0 HcmV?d00001 diff --git a/Source/Resources/Images/Images.xcassets/PrefToolbar-General.imageset/General@2x.png b/Source/Resources/Images/Images.xcassets/PrefToolbar-General.imageset/General@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b379d1cde146875533f70230de1238589a46fc5e GIT binary patch literal 3964 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 literal 0 HcmV?d00001 diff --git a/Source/Resources/Images/Images.xcassets/PrefToolbar-Keyboard.iconset/icon_32x32.png b/Source/Resources/Images/Images.xcassets/PrefToolbar-Keyboard.iconset/icon_32x32.png deleted file mode 100644 index c58382efd50197aa4b7a26a11020bcff4ddf41e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 942 zcmX9+3rvzx6#fOwN407xL|JLp!m_s&wp?Ktkwrw>JIy(3y*BNoDaxYrFHbXO z`T6-5#|!}s`O9OLmX@Z~YK1~!O-+qLp-`z*MMXs!85wnTb%14NW`YfXL?QvDpr8Pn zB9SOHHC3%vkB*L-&1P%?b2ln2EzQl%g;Zr_Wm8iVzy^b%wzk%4wL%9mU{Es}jR44G zvXYV#Xrd8jL0+j;B1Q%VeMkY109?$Olaqs3EEXf_wz9G^%#0)i(F@#)iVDn+Dh`4S zST>tYE|)_AbbwI;3zKJMWdRQiGB};ZVgaSNxES7KGG%9HV;%rdg+9Fd9^lK%%k_GF zVPPS_>FMbx!QAcK1Gp!_6`eh>BO7lcJ}uzwAQFTxUfu5NFECryu}04R^6hS2{(HP; z_(bCOq!o85t`_oa($Cd5W^MJG}oK zu;j}8&fSY+tAZCb$A!73e%jZ&KArCILls{;IFCP<7u55p-qx1V_T&(4VOYq>5k+`| zbf(gt;i5F**NEV1^hAbV9F-~NZDu&1_py#Hqzs2X zC4Ci;L&-~{i+x#A&#s@Ant*|r0kexjy6>vmOz37*zZ+ug;gp2fC*K^$c-P-a_|IL* z*U;ZCyUJDg1g#1WOwOXOa|Y=aeKcs*!nJh&bJ2Is_y6eKXjgCepx0Pm|7mr;x~3sJ zlC2FsGXobiOgYiAi)!p9lJpE~S#IP g&WTc<5e>H8^Ef#{=^xPO^$?FraHDu^TjW9MKeun!<^TWy diff --git a/Source/Resources/Images/Images.xcassets/PrefToolbar-Keyboard.iconset/icon_32x32@2x.png b/Source/Resources/Images/Images.xcassets/PrefToolbar-Keyboard.iconset/icon_32x32@2x.png deleted file mode 100644 index 0306e75eced015dc2d6346a3a5321c6426814fc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1383 zcmX|A2~d+)5dH&%fL!G)1w<^+YFoJjL_rb=AjMD#FluRw$Tf-*tU{1G+~FobxI(#- z0Kp^>lqy513QT37LM=g3h&Z*V+=nPP>2{duoB8+c+uiT`cHf(ye$K~J?U2DC1VPli z&JfA4AAE1?w-+SYieqk zOy=#|x0{=ri;9X$N=g_EMnORVm&;8{OG{2pPEAdXi;F8OD=RNAPfSd#uC6XFE`}N^ zm70>0Qd?V_l$7+~!2_901`I$2DOfxnud1pFcnS*(^*v5`)vH#IfEEIBzj z5X{KPfKCz;5}+%9AFu%sW&{b4gBnPI5I{H_4m1pR1@{9Hs22)_kUfw96fCHREYyIL zo}La7xG|UrBw$kL3Kpae9tD8l!}vfBig20WfG9Ni{}fOl5C|YUJUk4qlk>R#v>-!FsTUJiadvcbWD)NUNPYr0;yzt*SzKwdPu*B4V7BD)e zV%7 zTe}t8-EiY`g08QR;e(zNf7A3f`r;qmkH*qe!)T8_{jz5@?MZ33FfJ4{3nxnwUQ!T&G*g(eWP*3JBvnNANF`u&N zvmCRXHZ9>=v~ApVTjhpeI+q(`jy}v;QyvZevrSZo8tB##wjxhd^?w1Qe@o70P4M!AGHQ%;R&pzTm%{}UK{298DwolmtE{fIZYDX$(&#v(pErW_~K z5HX*9k5`k}D6UwgdTXzg@hl%&Nj|@nx?mfqMB1Z~_*1wxEGj+N!c{{*C;HVbAyN9> zH1%a$b`3kv^!iL$m75XOr7lEOMN6g_H{!kPxH4g>Z2j_HP<4Ie+^fLj<%(SM*1h;b zYi5Ujq~5^WZK`!)dutHG851uV8+q~r;ugA>ul-Cx!MlG#$4XcGcdz;caw2gH?J+R9 zesR5a!aeq)PTm^MW5dlGvsf`n8EhHTt(RPG&E2<0=dKoxn;ZS18R8LEu&Nl)*GZXF zZ47DY=?KK4%9U@X6!#3Vd}GZ?om;M4(!y@3PM5Flb2UdRnPEgH*?3&Vk$nrx<9HsQ zFWugz?z9eS`OnwRsc$Uc`eyE!if?e5gR^4C-%d(xJ-sX)J>d%f4C3YPLln4PO8Xa5Hnc?m diff --git a/Source/Resources/Images/Images.xcassets/PrefToolbar-Keyboard.imageset/Contents.json b/Source/Resources/Images/Images.xcassets/PrefToolbar-Keyboard.imageset/Contents.json new file mode 100644 index 00000000..419f277b --- /dev/null +++ b/Source/Resources/Images/Images.xcassets/PrefToolbar-Keyboard.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "Keyboard.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Keyboard@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Source/Resources/Images/Images.xcassets/PrefToolbar-Keyboard.imageset/Keyboard.png b/Source/Resources/Images/Images.xcassets/PrefToolbar-Keyboard.imageset/Keyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..d566f1b5681b06877c2b3e206d08e55bc8c138aa GIT binary patch literal 2384 zcmai0dsGu=79V_-YN=(5fb1f15Q{=GArX)v!G$D1l(5J%L_~*V5{5h`W+o(|RM=J& zj>o2gEmEOXS#1~2BCg6p>#h(%mx>CzEmiB*CxjMXSk~iGJnWYQ5vuO~G0EKTckk~$ zzI$&{k&>L?G2d@K1VJ9+L}4oUW;h=AdEk>ODjJ2Lxf_XeDJ_*Gp>k5o!W3j4&N6HD z0EZyn8nYggt8to59iag9z_t7$;2{oS)@UQghfR~A#4u9;V^*)ld|Y&%*@nLfes26hY+Xa20~90 zq>ka>#PUcZ&4*!tGbYIu@+oe;(V%fME93~S!L_)KrjRgJ7&2WSHxtjI(NUA-0);~y z2vBFwP^SsyOVl06bL#qhk|wEqQa=^c3>Q=IbB3VYFE%k_`WGonB>!7otDTVsMT-hS z;U+I(Modo~Q0W#uj-=ugX*9@jQ6Z>aptEp}x}Yh98P`aK1Sl#6Zi5eVIlln2Ujhn9 z4QWUNO^Ea1FsF^9a;R8~sqid9LFZ3#Jv&drb*f(ij>t4dM=NCL2#|}*ztcwg4CBL* z9AuiC>=!~)_kcR1laLA!9M>7#Ge|5Dq!>sgp#d0`nh?hjiv$s2Q4tYL4$I{MTp9{& z38h7d(LjsC2EEK)%?#tDvsa_s2$UNY0$$i`C$m!<%#H%1vHz#q2ZW9K|XFGbSh>#Now*igIG@Lc!*rE-&?Ki&RC3=Hd zZ(P5x^1HT`!MnLVwd7W=U4LP5^Y*m0GSYV&y}Yq(Joj7M&C13f7Dd0le@9dK!N#hN z&81)58g|=B+#fqH{r9ye(XveW7qh&-e6a0cLG}&eMtgi_xFxGqAdb&0yI98mcv)~U z`C}jFR84L0Pu6bP>f5u``&?5A0bRqYQdqs@&R?&Zq0&v{`+8 zxJftUdzPNT0}g$P&ATo1pXjKZ2pzuJ`1hvD1o^Hx;y;^(=f$IYFSQPZ)vS1^oS1l& zVYR+iT_1h2_i>(Yz+Zch&+d8`D-QT|{Ky>5Mg50=96J)wap|+6vWCH!Id<=yoU9W= zOLBAqdzD`w9Mrx1oS*gd&x?<<;(lhXLaN`+Y_pGg+V(xnh-@x_-g)?a+rtHK*;L&v z<;%YTzihAS6SFA@TJWahaf3dt^@X5W9%5l^y0q+W|GM(uVZLWa7G}5Jx!uytfLF96 zR@EIkQJxw)bU8R;ZD*X#mKJ;{{yi^m?@F&->sUC}rMT+7_v(V99XC&&ejLf2_~*FF zKGFD>pK9$qyX9~92Ts}#{i)?j!Enj9dk-v84CaJ(T=G_r#|7LIb$)gjs%i5|INI7} z+cj32;kkv{Pc?t{8J{k^fsG9@TvnpUxfZafjv& zF7e)++IH_uNK&UKZ^ejei)kBF<>!BEyL<7@vw@+UJ%jRsjin);M+;Xqs+2zctHw4w z>6G=S1U^Wpx%{3^b2jidwxFxFv0wF93`i@q($aT^%F8WGx9gu2@W+E6QN^snYo&WH znh(hKUpp6lYhTb2?%WL@c#bR@*2loPo5OY0EhzlSty%q|PM>8F)_Lt|wO{r8(6How zcTZ4P?k3r$k-IA&y;f^GrtBV0>cB>?S2bj1_3o569LTzpo6|L?xHF2U`RL>Y_gaBT zIR3yCne+LT4-S7=*z$Pmfn%M8)utU8b)K!(;hHwLg$2Kz=;^6h{r;kcy5m8m67ynD zl0yX^UR6=z<9UQj1tdqVi}7ub?D_FjMR}9kqYA(FCrAI~(RBH-?3L?FKf(uducn;0 zg!t`zJ+!M1g*IfAobqRS>%M;b8`giU+oLPbuU~IHv-^(6y@iF#)WebgP}IdzuiQl) Pe}u%MWMNa>=6C-K=`nm+ literal 0 HcmV?d00001 diff --git a/Source/Resources/Images/Images.xcassets/PrefToolbar-Keyboard.imageset/Keyboard@2x.png b/Source/Resources/Images/Images.xcassets/PrefToolbar-Keyboard.imageset/Keyboard@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2619ca68a94e0368a2114c16a15b836febffc5a4 GIT binary patch literal 3035 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 literal 0 HcmV?d00001 diff --git a/Source/Resources/en.lproj/Localizable.strings b/Source/Resources/en.lproj/Localizable.strings index 37153273..7c7bd334 100644 --- a/Source/Resources/en.lproj/Localizable.strings +++ b/Source/Resources/en.lproj/Localizable.strings @@ -122,6 +122,7 @@ "Cursor Selection:" = "Cursor Selection:"; "Dachen (Microsoft Standard / Wang / 01, etc.)" = "Dachen (Microsoft Standard / Wang / 01, etc.)"; "Dachen 26 (libChewing)" = "Dachen 26 (libChewing)"; +"DangerZone" = "DangerZone"; "Debug Mode" = "Debug Mode"; "Dictionary" = "Dictionary"; "Directly commit lowercased letters" = "Directly commit lowercased letters"; @@ -173,4 +174,5 @@ "Universal Pinyin with Numeral Intonation" = "Universal Pinyin with Numeral Intonation"; "Use ESC key to clear the entire input buffer" = "Use ESC key to clear the entire input buffer"; "Vertical" = "Vertical"; +"Warning: This page is for testing future features. \nFeatures listed here may not work as expected." = "Warning: This page is for testing future features. \nFeatures listed here may not work as expected."; "Yale Pinyin with Numeral Intonation" = "Yale Pinyin with Numeral Intonation"; diff --git a/Source/Resources/ja.lproj/Localizable.strings b/Source/Resources/ja.lproj/Localizable.strings index 2bc3c170..267cb3fa 100644 --- a/Source/Resources/ja.lproj/Localizable.strings +++ b/Source/Resources/ja.lproj/Localizable.strings @@ -122,6 +122,7 @@ "Cursor Selection:" = "カーソル候補呼出:"; "Dachen (Microsoft Standard / Wang / 01, etc.)" = "大千配列 (Microsoft 標準・王安・零壹など)"; "Dachen 26 (libChewing)" = "酷音大千 26 キー配列"; +"DangerZone" = "開発道場"; "Debug Mode" = "欠陥辿着モード"; "Dictionary" = "辞書設定"; "Directly commit lowercased letters" = "ローマ字(小文字)を直接出力"; @@ -173,4 +174,5 @@ "Universal Pinyin with Numeral Intonation" = "汎用弁音 (ローマ字+数字音調)"; "Use ESC key to clear the entire input buffer" = "ESC キーで入力緩衝列を消す"; "Vertical" = "縦型陳列"; +"Warning: This page is for testing future features. \nFeatures listed here may not work as expected." = "警告:これからの新機能テストのために作ったページですから、\nここで陳列されている諸機能は予想通り動けるだと思わないでください。"; "Yale Pinyin with Numeral Intonation" = "イェール弁音 (ローマ字+数字音調)"; diff --git a/Source/Resources/zh-Hans.lproj/Localizable.strings b/Source/Resources/zh-Hans.lproj/Localizable.strings index 20a43804..6f6c4ce8 100644 --- a/Source/Resources/zh-Hans.lproj/Localizable.strings +++ b/Source/Resources/zh-Hans.lproj/Localizable.strings @@ -122,6 +122,7 @@ "Cursor Selection:" = "选字游标:"; "Dachen (Microsoft Standard / Wang / 01, etc.)" = "大千排列 (微软标准/王安/零壹/仲鼎/国乔)"; "Dachen 26 (libChewing)" = "酷音大千二十六键排列"; +"DangerZone" = "禁区"; "Debug Mode" = "侦错模式"; "Dictionary" = "辞典"; "Directly commit lowercased letters" = "直接递交小写字母"; @@ -175,4 +176,5 @@ "Universal Pinyin with Numeral Intonation" = "通用拼音+数字标调"; "Use ESC key to clear the entire input buffer" = "敲 ESC 键以清空整个组字缓冲区"; "Vertical" = "纵向布局"; +"Warning: This page is for testing future features. \nFeatures listed here may not work as expected." = "警告:该页面仅作未来功能测试所用。\n在此列出的功能并非处于完全可用之状态。"; "Yale Pinyin with Numeral Intonation" = "耶鲁拼音+数字标调"; diff --git a/Source/Resources/zh-Hant.lproj/Localizable.strings b/Source/Resources/zh-Hant.lproj/Localizable.strings index 5a0f9e68..a9b2d3aa 100644 --- a/Source/Resources/zh-Hant.lproj/Localizable.strings +++ b/Source/Resources/zh-Hant.lproj/Localizable.strings @@ -122,6 +122,7 @@ "Cursor Selection:" = "選字游標:"; "Dachen (Microsoft Standard / Wang / 01, etc.)" = "大千排列 (微軟標準/王安/零壹/仲鼎/國喬)"; "Dachen 26 (libChewing)" = "酷音大千二十六鍵排列"; +"DangerZone" = "禁區"; "Debug Mode" = "偵錯模式"; "Dictionary" = "辭典"; "Directly commit lowercased letters" = "直接遞交小寫字母"; @@ -173,4 +174,5 @@ "Universal Pinyin with Numeral Intonation" = "通用拼音+數字標調"; "Use ESC key to clear the entire input buffer" = "敲 ESC 鍵以清空整個組字緩衝區"; "Vertical" = "縱向佈局"; +"Warning: This page is for testing future features. \nFeatures listed here may not work as expected." = "警告:該頁面僅作未來功能測試所用。\n在此列出的功能並非處於完全可用之狀態。"; "Yale Pinyin with Numeral Intonation" = "耶魯拼音+數字標調"; diff --git a/Source/UI/PrefUI/ctlPrefUI.swift b/Source/UI/PrefUI/ctlPrefUI.swift index 40464b82..b618153f 100644 --- a/Source/UI/PrefUI/ctlPrefUI.swift +++ b/Source/UI/PrefUI/ctlPrefUI.swift @@ -15,6 +15,7 @@ class ctlPrefUI { private(set) var tabImageExperiences: NSImage! = NSImage(named: "PrefToolbar-Experiences") private(set) var tabImageDictionary: NSImage! = NSImage(named: "PrefToolbar-Dictionary") private(set) var tabImageKeyboard: NSImage! = NSImage(named: "PrefToolbar-Keyboard") + private(set) var tabImageDangerZone: NSImage! = NSImage(named: "PrefToolbar-DangerZone") init() { if #available(macOS 11.0, *) { @@ -30,6 +31,9 @@ class ctlPrefUI { tabImageKeyboard = NSImage( systemSymbolName: "keyboard.macwindow", accessibilityDescription: "Keyboard Preferences" ) + tabImageDangerZone = NSImage( + systemSymbolName: "hand.raised.circle", accessibilityDescription: "DangerZone Preferences" + ) } } @@ -63,6 +67,13 @@ class ctlPrefUI { ) { suiPrefPaneKeyboard() }, + Preferences.Pane( + identifier: Preferences.PaneIdentifier(rawValue: "DangerZone"), + title: NSLocalizedString("DangerZone", comment: ""), + toolbarIcon: tabImageDangerZone + ) { + suiPrefPaneDangerZone() + }, ], style: .toolbarItems ) diff --git a/Source/UI/PrefUI/suiPrefPaneDangerZone.swift b/Source/UI/PrefUI/suiPrefPaneDangerZone.swift new file mode 100644 index 00000000..e2326534 --- /dev/null +++ b/Source/UI/PrefUI/suiPrefPaneDangerZone.swift @@ -0,0 +1,47 @@ +// Copyright (c) 2021 and onwards The vChewing Project (MIT-NTL License). +// ==================== +// This code is released under the MIT license (SPDX-License-Identifier: MIT) +// ... with NTL restriction stating that: +// No trademark license is granted to use the trade names, trademarks, service +// marks, or product names of Contributor, except as required to fulfill notice +// requirements defined in MIT License. + +import SwiftUI + +@available(macOS 10.15, *) +struct suiPrefPaneDangerZone: View { + @State private var selUseIMKCandidateWindow: Bool = UserDefaults.standard.bool( + forKey: UserDef.kUseIMKCandidateWindow.rawValue) + private let contentWidth: Double = { + switch mgrPrefs.appleLanguages[0] { + case "ja": + return 520 + default: + if mgrPrefs.appleLanguages[0].contains("zh-Han") { + return 480 + } else { + return 550 + } + } + }() + + var body: some View { + Preferences.Container(contentWidth: contentWidth) { + Preferences.Section(title: "", bottomDivider: true) { + Text( + LocalizedStringKey( + "Warning: This page is for testing future features. \nFeatures listed here may not work as expected.") + ) + .fixedSize(horizontal: false, vertical: true) + Divider() + } + } + } +} + +@available(macOS 11.0, *) +struct suiPrefPaneDangerZone_Previews: PreviewProvider { + static var previews: some View { + suiPrefPaneDangerZone() + } +} diff --git a/vChewing.xcodeproj/project.pbxproj b/vChewing.xcodeproj/project.pbxproj index 5a015025..485bb6af 100644 --- a/vChewing.xcodeproj/project.pbxproj +++ b/vChewing.xcodeproj/project.pbxproj @@ -40,6 +40,7 @@ 5B62A35327AE89C400A19448 /* InputSourceHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B62A33127AE792F00A19448 /* InputSourceHelper.swift */; }; 5B73FB5E27B2BE1300E9BF49 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5B73FB6027B2BE1300E9BF49 /* InfoPlist.strings */; }; 5B782EC4280C243C007276DE /* KeyHandler_HandleCandidate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B782EC3280C243C007276DE /* KeyHandler_HandleCandidate.swift */; }; + 5B78EE0D28A562B4009456C1 /* suiPrefPaneDangerZone.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B78EE0C28A562B4009456C1 /* suiPrefPaneDangerZone.swift */; }; 5B7BC4B027AFFBE800F66C24 /* frmPrefWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5B7BC4AE27AFFBE800F66C24 /* frmPrefWindow.xib */; }; 5B7F225D2808501000DDD3CB /* KeyHandler_HandleInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B7F225C2808501000DDD3CB /* KeyHandler_HandleInput.swift */; }; 5B84579E2871AD2200C93B01 /* convdict.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5B84579C2871AD2200C93B01 /* convdict.plist */; }; @@ -246,6 +247,7 @@ 5B73FB5427B2BD6900E9BF49 /* PhraseEditor-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "PhraseEditor-Info.plist"; path = "UserPhraseEditor/PhraseEditor-Info.plist"; sourceTree = SOURCE_ROOT; }; 5B73FB5F27B2BE1300E9BF49 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 5B782EC3280C243C007276DE /* KeyHandler_HandleCandidate.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = KeyHandler_HandleCandidate.swift; sourceTree = ""; tabWidth = 2; usesTabs = 0; }; + 5B78EE0C28A562B4009456C1 /* suiPrefPaneDangerZone.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = suiPrefPaneDangerZone.swift; sourceTree = ""; }; 5B7BC4AF27AFFBE800F66C24 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/frmPrefWindow.xib; sourceTree = ""; }; 5B7BC4B227AFFC0B00F66C24 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/frmPrefWindow.strings; sourceTree = ""; }; 5B7F225C2808501000DDD3CB /* KeyHandler_HandleInput.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = KeyHandler_HandleInput.swift; sourceTree = ""; tabWidth = 2; usesTabs = 0; }; @@ -652,6 +654,7 @@ isa = PBXGroup; children = ( 5BA9FD0C27FEDB6B002DE248 /* ctlPrefUI.swift */, + 5B78EE0C28A562B4009456C1 /* suiPrefPaneDangerZone.swift */, 5BA9FD0E27FEDB6B002DE248 /* suiPrefPaneDictionary.swift */, 5BA9FD0D27FEDB6B002DE248 /* suiPrefPaneExperience.swift */, 5BA9FD0A27FEDB6B002DE248 /* suiPrefPaneGeneral.swift */, @@ -1184,6 +1187,7 @@ 5B3A87BC28597CDB0090E163 /* LMSymbolNode.swift in Sources */, 5BA9FD4327FEF3C8002DE248 /* Preferences.swift in Sources */, 5BA9FD4427FEF3C8002DE248 /* SegmentedControlStyleViewController.swift in Sources */, + 5B78EE0D28A562B4009456C1 /* suiPrefPaneDangerZone.swift in Sources */, D47F7DCE278BFB57002F9DD7 /* ctlPrefWindow.swift in Sources */, 5BD0113D2818543900609769 /* KeyHandler_Core.swift in Sources */, 5B2170E4289FACAD00BE7304 /* 2_Walker.swift in Sources */, From ba054059e8d79aaf873d1520d396c3488e596cef Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Fri, 12 Aug 2022 00:25:26 +0800 Subject: [PATCH 06/20] mgrPrefs // +useIMKCandidateWindow. --- Source/Modules/IMEModules/mgrPrefs.swift | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Source/Modules/IMEModules/mgrPrefs.swift b/Source/Modules/IMEModules/mgrPrefs.swift index c766ad1a..51498665 100644 --- a/Source/Modules/IMEModules/mgrPrefs.swift +++ b/Source/Modules/IMEModules/mgrPrefs.swift @@ -49,6 +49,7 @@ public enum UserDef: String, CaseIterable { case kKeepReadingUponCompositionError = "KeepReadingUponCompositionError" case kTogglingAlphanumericalModeWithLShift = "TogglingAlphanumericalModeWithLShift" case kUpperCaseLetterKeyBehavior = "UpperCaseLetterKeyBehavior" + case kUseIMKCandidateWindow = "UseIMKCandidateWindow" case kCandidateTextFontName = "CandidateTextFontName" case kCandidateKeyLabelFontName = "CandidateKeyLabelFontName" @@ -275,6 +276,9 @@ public enum mgrPrefs { UserDefaults.standard.setDefault( mgrPrefs.upperCaseLetterKeyBehavior, forKey: UserDef.kUpperCaseLetterKeyBehavior.rawValue ) + UserDefaults.standard.setDefault( + mgrPrefs.useIMKCandidateWindow, forKey: UserDef.kUseIMKCandidateWindow.rawValue + ) UserDefaults.standard.setDefault(mgrPrefs.usingHotKeySCPC, forKey: UserDef.kUsingHotKeySCPC.rawValue) UserDefaults.standard.setDefault(mgrPrefs.usingHotKeyAssociates, forKey: UserDef.kUsingHotKeyAssociates.rawValue) @@ -379,6 +383,14 @@ public enum mgrPrefs { @UserDefault(key: UserDef.kUpperCaseLetterKeyBehavior.rawValue, defaultValue: 0) static var upperCaseLetterKeyBehavior: Int + @UserDefault(key: UserDef.kUseIMKCandidateWindow.rawValue, defaultValue: false) + static var useIMKCandidateWindow: Bool { + didSet { + NSLog("vChewing App self-terminated due to enabling / disabling IMK candidate window.") + NSApplication.shared.terminate(nil) + } + } + // MARK: - Settings (Tier 2) @UserDefault(key: UserDef.kTogglingAlphanumericalModeWithLShift.rawValue, defaultValue: true) From fdad75434e7492225a90614ebe1c600b1a494bc9 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Fri, 12 Aug 2022 00:32:32 +0800 Subject: [PATCH 07/20] ctlIME // +useIMKCandidateWindow. --- .../ControllerModules/ctlInputMethod_Core.swift | 3 ++- .../ctlInputMethod_HandleDisplay.swift | 15 ++++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/Source/Modules/ControllerModules/ctlInputMethod_Core.swift b/Source/Modules/ControllerModules/ctlInputMethod_Core.swift index 2393b1e4..84c0584b 100644 --- a/Source/Modules/ControllerModules/ctlInputMethod_Core.swift +++ b/Source/Modules/ControllerModules/ctlInputMethod_Core.swift @@ -25,7 +25,8 @@ class ctlInputMethod: IMKInputController { static var areWeNerfing = false /// 目前在用的的選字窗副本。 - static var ctlCandidateCurrent: ctlCandidateProtocol = ctlCandidateIMK.init(.horizontal) + static var ctlCandidateCurrent: ctlCandidateProtocol = + mgrPrefs.useIMKCandidateWindow ? ctlCandidateIMK.init(.horizontal) : ctlCandidateUniversal.init(.horizontal) /// 工具提示視窗的副本。 static let tooltipController = TooltipController() diff --git a/Source/Modules/ControllerModules/ctlInputMethod_HandleDisplay.swift b/Source/Modules/ControllerModules/ctlInputMethod_HandleDisplay.swift index 942f53c7..2ee724b1 100644 --- a/Source/Modules/ControllerModules/ctlInputMethod_HandleDisplay.swift +++ b/Source/Modules/ControllerModules/ctlInputMethod_HandleDisplay.swift @@ -66,13 +66,14 @@ extension ctlInputMethod { /// layoutCandidateView 在這裡無法起到糾正作用。 /// 該問題徹底解決的價值並不大,直接等到 macOS 10.x 全線淘汰之後用 SwiftUI 重寫選字窗吧。 - if isCandidateWindowVertical { // 縱排輸入時強制使用縱排選字窗 - ctlInputMethod.ctlCandidateCurrent = ctlCandidateIMK.init(.vertical) - } else if mgrPrefs.useHorizontalCandidateList { - ctlInputMethod.ctlCandidateCurrent = ctlCandidateIMK.init(.horizontal) - } else { - ctlInputMethod.ctlCandidateCurrent = ctlCandidateIMK.init(.vertical) - } + let candidateLayout: CandidateLayout = + ((isCandidateWindowVertical || !mgrPrefs.useHorizontalCandidateList) + ? CandidateLayout.vertical + : CandidateLayout.horizontal) + + ctlInputMethod.ctlCandidateCurrent = + mgrPrefs.useIMKCandidateWindow + ? ctlCandidateIMK.init(candidateLayout) : ctlCandidateUniversal.init(candidateLayout) // set the attributes for the candidate panel (which uses NSAttributedString) let textSize = mgrPrefs.candidateListTextSize From 1b639e94f52e9209025af8cb4020bfcb74575eb7 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Fri, 12 Aug 2022 09:56:02 +0800 Subject: [PATCH 08/20] PrefUI // +useIMKCandidateWindow. --- Source/Resources/Base.lproj/Localizable.strings | 2 ++ Source/Resources/en.lproj/Localizable.strings | 2 ++ Source/Resources/ja.lproj/Localizable.strings | 2 ++ Source/Resources/zh-Hans.lproj/Localizable.strings | 2 ++ Source/Resources/zh-Hant.lproj/Localizable.strings | 2 ++ Source/UI/PrefUI/suiPrefPaneDangerZone.swift | 8 ++++++++ 6 files changed, 18 insertions(+) diff --git a/Source/Resources/Base.lproj/Localizable.strings b/Source/Resources/Base.lproj/Localizable.strings index 7c7bd334..898f577e 100644 --- a/Source/Resources/Base.lproj/Localizable.strings +++ b/Source/Resources/Base.lproj/Localizable.strings @@ -106,6 +106,7 @@ "Automatically reload user data files if changes detected" = "Automatically reload user data files if changes detected"; "Basic Keyboard Layout:" = "Basic Keyboard Layout:"; "Candidate Layout:" = "Candidate Layout:"; +"Candidate selection keys are not yet available in IMK candidate window." = "Candidate selection keys are not yet available in IMK candidate window."; "Candidate Size:" = "Candidate Size:"; "Change user interface language (will reboot the IME)." = "Change user interface language (will reboot the IME)."; "Check for updates automatically" = "Check for updates automatically"; @@ -173,6 +174,7 @@ "UI Language:" = "UI Language:"; "Universal Pinyin with Numeral Intonation" = "Universal Pinyin with Numeral Intonation"; "Use ESC key to clear the entire input buffer" = "Use ESC key to clear the entire input buffer"; +"Use IMK Candidate Window instead (will reboot the IME)" = "Use IMK Candidate Window instead (will reboot the IME)"; "Vertical" = "Vertical"; "Warning: This page is for testing future features. \nFeatures listed here may not work as expected." = "Warning: This page is for testing future features. \nFeatures listed here may not work as expected."; "Yale Pinyin with Numeral Intonation" = "Yale Pinyin with Numeral Intonation"; diff --git a/Source/Resources/en.lproj/Localizable.strings b/Source/Resources/en.lproj/Localizable.strings index 7c7bd334..898f577e 100644 --- a/Source/Resources/en.lproj/Localizable.strings +++ b/Source/Resources/en.lproj/Localizable.strings @@ -106,6 +106,7 @@ "Automatically reload user data files if changes detected" = "Automatically reload user data files if changes detected"; "Basic Keyboard Layout:" = "Basic Keyboard Layout:"; "Candidate Layout:" = "Candidate Layout:"; +"Candidate selection keys are not yet available in IMK candidate window." = "Candidate selection keys are not yet available in IMK candidate window."; "Candidate Size:" = "Candidate Size:"; "Change user interface language (will reboot the IME)." = "Change user interface language (will reboot the IME)."; "Check for updates automatically" = "Check for updates automatically"; @@ -173,6 +174,7 @@ "UI Language:" = "UI Language:"; "Universal Pinyin with Numeral Intonation" = "Universal Pinyin with Numeral Intonation"; "Use ESC key to clear the entire input buffer" = "Use ESC key to clear the entire input buffer"; +"Use IMK Candidate Window instead (will reboot the IME)" = "Use IMK Candidate Window instead (will reboot the IME)"; "Vertical" = "Vertical"; "Warning: This page is for testing future features. \nFeatures listed here may not work as expected." = "Warning: This page is for testing future features. \nFeatures listed here may not work as expected."; "Yale Pinyin with Numeral Intonation" = "Yale Pinyin with Numeral Intonation"; diff --git a/Source/Resources/ja.lproj/Localizable.strings b/Source/Resources/ja.lproj/Localizable.strings index 267cb3fa..33f4df5b 100644 --- a/Source/Resources/ja.lproj/Localizable.strings +++ b/Source/Resources/ja.lproj/Localizable.strings @@ -106,6 +106,7 @@ "Automatically reload user data files if changes detected" = "ユーザー辞書データの変更を自動検出し、自動的に再読込"; "Basic Keyboard Layout:" = "基礎キーボード:"; "Candidate Layout:" = "入力候補陳列の仕様"; +"Candidate selection keys are not yet available in IMK candidate window." = "IMK 候補陳列ウィンドウで言選り用キーは現時点で利用不可。"; "Candidate Size:" = "候補文字の字号:"; "Change user interface language (will reboot the IME)." = "アプリ表示用言語をご指定下さい、そして入力アプリは自動的に再起動。"; "Check for updates automatically" = "アプリの更新通知を受く"; @@ -173,6 +174,7 @@ "UI Language:" = "表示用言語:"; "Universal Pinyin with Numeral Intonation" = "汎用弁音 (ローマ字+数字音調)"; "Use ESC key to clear the entire input buffer" = "ESC キーで入力緩衝列を消す"; +"Use IMK Candidate Window instead (will reboot the IME)" = "IMK 候補陳列ウィンドウを起用(入力アプリは自動的に再起動)"; "Vertical" = "縦型陳列"; "Warning: This page is for testing future features. \nFeatures listed here may not work as expected." = "警告:これからの新機能テストのために作ったページですから、\nここで陳列されている諸機能は予想通り動けるだと思わないでください。"; "Yale Pinyin with Numeral Intonation" = "イェール弁音 (ローマ字+数字音調)"; diff --git a/Source/Resources/zh-Hans.lproj/Localizable.strings b/Source/Resources/zh-Hans.lproj/Localizable.strings index 6f6c4ce8..4e234a95 100644 --- a/Source/Resources/zh-Hans.lproj/Localizable.strings +++ b/Source/Resources/zh-Hans.lproj/Localizable.strings @@ -106,6 +106,7 @@ "Automatically reload user data files if changes detected" = "自动检测并载入使用者语汇档案变更"; "Basic Keyboard Layout:" = "基础键盘布局:"; "Candidate Layout:" = "候选字窗布局:"; +"Candidate selection keys are not yet available in IMK candidate window." = "IMK 选字窗目前暂时无法正常使用选字键。"; "Candidate Size:" = "候选字窗字号:"; "Change user interface language (will reboot the IME)." = "变更输入法介面语言,会自动重启输入法。"; "Check for updates automatically" = "自动检查软体更新"; @@ -175,6 +176,7 @@ "Universal Pinyin with Numeral Intonation" = "通用拼音+数字标调"; "Universal Pinyin with Numeral Intonation" = "通用拼音+数字标调"; "Use ESC key to clear the entire input buffer" = "敲 ESC 键以清空整个组字缓冲区"; +"Use IMK Candidate Window instead (will reboot the IME)" = "启用 IMK 选字窗(会自动重启输入法)"; "Vertical" = "纵向布局"; "Warning: This page is for testing future features. \nFeatures listed here may not work as expected." = "警告:该页面仅作未来功能测试所用。\n在此列出的功能并非处于完全可用之状态。"; "Yale Pinyin with Numeral Intonation" = "耶鲁拼音+数字标调"; diff --git a/Source/Resources/zh-Hant.lproj/Localizable.strings b/Source/Resources/zh-Hant.lproj/Localizable.strings index a9b2d3aa..84408810 100644 --- a/Source/Resources/zh-Hant.lproj/Localizable.strings +++ b/Source/Resources/zh-Hant.lproj/Localizable.strings @@ -106,6 +106,7 @@ "Automatically reload user data files if changes detected" = "自動檢測並載入使用者語彙檔案變更"; "Basic Keyboard Layout:" = "基礎鍵盤佈局:"; "Candidate Layout:" = "候選字窗佈局:"; +"Candidate selection keys are not yet available in IMK candidate window." = "IMK 選字窗目前暫時無法正常使用選字鍵。"; "Candidate Size:" = "候選字窗字號:"; "Change user interface language (will reboot the IME)." = "變更輸入法介面語言,會自動重啟輸入法。"; "Check for updates automatically" = "自動檢查軟體更新"; @@ -173,6 +174,7 @@ "UI Language:" = "介面語言:"; "Universal Pinyin with Numeral Intonation" = "通用拼音+數字標調"; "Use ESC key to clear the entire input buffer" = "敲 ESC 鍵以清空整個組字緩衝區"; +"Use IMK Candidate Window instead (will reboot the IME)" = "啟用 IMK 選字窗(會自動重啟輸入法)"; "Vertical" = "縱向佈局"; "Warning: This page is for testing future features. \nFeatures listed here may not work as expected." = "警告:該頁面僅作未來功能測試所用。\n在此列出的功能並非處於完全可用之狀態。"; "Yale Pinyin with Numeral Intonation" = "耶魯拼音+數字標調"; diff --git a/Source/UI/PrefUI/suiPrefPaneDangerZone.swift b/Source/UI/PrefUI/suiPrefPaneDangerZone.swift index e2326534..52efdb79 100644 --- a/Source/UI/PrefUI/suiPrefPaneDangerZone.swift +++ b/Source/UI/PrefUI/suiPrefPaneDangerZone.swift @@ -34,6 +34,14 @@ struct suiPrefPaneDangerZone: View { ) .fixedSize(horizontal: false, vertical: true) Divider() + Toggle( + LocalizedStringKey("Use IMK Candidate Window instead (will reboot the IME)"), + isOn: $selUseIMKCandidateWindow.onChange { + mgrPrefs.useIMKCandidateWindow = selUseIMKCandidateWindow + } + ) + Text(LocalizedStringKey("Candidate selection keys are not yet available in IMK candidate window.")) + .preferenceDescription() } } } From 58b730a876b30e2fc8907991020ec3a741390bb4 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Fri, 12 Aug 2022 18:04:29 +0800 Subject: [PATCH 09/20] ctlCandUniv // Make it look more resemble to IMKCandidates. --- .../CandidateUI/ctlCandidateUniversal.swift | 42 +++++++++---------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/Source/UI/CandidateUI/ctlCandidateUniversal.swift b/Source/UI/CandidateUI/ctlCandidateUniversal.swift index b82cf7e8..efc09fa5 100644 --- a/Source/UI/CandidateUI/ctlCandidateUniversal.swift +++ b/Source/UI/CandidateUI/ctlCandidateUniversal.swift @@ -82,7 +82,7 @@ private class vwrCandidateUniversal: NSView { switch isVerticalLayout { case true: if calculatedWindowWidth < rctCandidate.size.width { - calculatedWindowWidth = rctCandidate.size.width + cellPadding + calculatedWindowWidth = rctCandidate.size.width + cellPadding * 2 } case false: if cellWidth < cellHeight * 1.35 { @@ -137,46 +137,40 @@ private class vwrCandidateUniversal: NSView { NSColor.controlBackgroundColor.setFill() // Candidate list panel base background NSBezierPath.fill(bounds) - NSColor.systemGray.withAlphaComponent(0.75).setStroke() - - NSBezierPath.strokeLine( - from: NSPoint(x: bounds.size.width, y: 0.0), - to: NSPoint(x: bounds.size.width, y: bounds.size.height) - ) - switch isVerticalLayout { case true: var accuHeight: CGFloat = 0 for (index, elementHeight) in elementHeights.enumerated() { let currentHeight = elementHeight let rctCandidateArea = NSRect( - x: 0.0, y: accuHeight, width: windowWidth, height: candidateTextHeight + cellPadding + x: 3.0, y: accuHeight + 3.0, width: windowWidth - 6.0, + height: candidateTextHeight + cellPadding - 6.0 ) let rctLabel = NSRect( - x: cellPadding / 2 - 1, y: accuHeight + cellPadding / 2, width: keyLabelWidth, + x: cellPadding / 2 + 2, y: accuHeight + cellPadding / 2, width: keyLabelWidth, height: keyLabelHeight * 2.0 ) let rctCandidatePhrase = NSRect( - x: cellPadding / 2 - 1 + keyLabelWidth, y: accuHeight + cellPadding / 2 - 1, + x: cellPadding / 2 + 2 + keyLabelWidth, y: accuHeight + cellPadding / 2 - 1, width: windowWidth - keyLabelWidth, height: candidateTextHeight ) var activeCandidateIndexAttr = keyLabelAttrDict var activeCandidateAttr = candidateAttrDict if index == highlightedIndex { - let colorBlendAmount: CGFloat = IME.isDarkMode() ? 0.25 : 0 + let colorBlendAmount: CGFloat = IME.isDarkMode() ? 0.3 : 0 // The background color of the highlightened candidate switch IME.currentInputMode { case InputMode.imeModeCHS: NSColor.systemRed.blended( withFraction: colorBlendAmount, - of: NSColor.controlBackgroundColor + of: NSColor.black )! .setFill() case InputMode.imeModeCHT: NSColor.systemBlue.blended( withFraction: colorBlendAmount, - of: NSColor.controlBackgroundColor + of: NSColor.black )! .setFill() default: @@ -190,7 +184,8 @@ private class vwrCandidateUniversal: NSView { } else { NSColor.controlBackgroundColor.setFill() } - NSBezierPath.fill(rctCandidateArea) + let path: NSBezierPath = .init(roundedRect: rctCandidateArea, xRadius: 5, yRadius: 5) + path.fill() (keyLabels[index] as NSString).draw( in: rctLabel, withAttributes: activeCandidateIndexAttr ) @@ -204,8 +199,8 @@ private class vwrCandidateUniversal: NSView { for (index, elementWidth) in elementWidths.enumerated() { let currentWidth = elementWidth let rctCandidateArea = NSRect( - x: accuWidth, y: 0.0, width: currentWidth + 1.0, - height: candidateTextHeight + cellPadding + x: accuWidth + 3.0, y: 3.0, width: currentWidth + 1.0 - 6.0, + height: candidateTextHeight + cellPadding - 6.0 ) let rctLabel = NSRect( x: accuWidth + cellPadding / 2 - 1, y: cellPadding / 2, width: keyLabelWidth, @@ -220,19 +215,19 @@ private class vwrCandidateUniversal: NSView { var activeCandidateIndexAttr = keyLabelAttrDict var activeCandidateAttr = candidateAttrDict if index == highlightedIndex { - let colorBlendAmount: CGFloat = IME.isDarkMode() ? 0.25 : 0 + let colorBlendAmount: CGFloat = IME.isDarkMode() ? 0.3 : 0 // The background color of the highlightened candidate switch IME.currentInputMode { case InputMode.imeModeCHS: NSColor.systemRed.blended( withFraction: colorBlendAmount, - of: NSColor.controlBackgroundColor + of: NSColor.black )! .setFill() case InputMode.imeModeCHT: NSColor.systemBlue.blended( withFraction: colorBlendAmount, - of: NSColor.controlBackgroundColor + of: NSColor.black )! .setFill() default: @@ -246,7 +241,8 @@ private class vwrCandidateUniversal: NSView { } else { NSColor.controlBackgroundColor.setFill() } - NSBezierPath.fill(rctCandidateArea) + let path: NSBezierPath = .init(roundedRect: rctCandidateArea, xRadius: 5, yRadius: 5) + path.fill() (keyLabels[index] as NSString).draw( in: rctLabel, withAttributes: activeCandidateIndexAttr ) @@ -352,10 +348,10 @@ public class ctlCandidateUniversal: ctlCandidate { candidateView.wantsLayer = true candidateView.layer?.borderColor = - NSColor.selectedMenuItemTextColor.withAlphaComponent(0.10).cgColor + NSColor.selectedMenuItemTextColor.withAlphaComponent(0.20).cgColor candidateView.layer?.borderWidth = 1.0 if #available(macOS 10.13, *) { - candidateView.layer?.cornerRadius = 6.0 + candidateView.layer?.cornerRadius = 8.0 } panel.contentView?.addSubview(candidateView) From 3d5f24c01171b89a8a6cc5b8f957d108691fbf8c Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Fri, 12 Aug 2022 19:35:33 +0800 Subject: [PATCH 10/20] mgrPrefs // +handleDefaultCandidateFontsByLangIdentifier. --- Source/Modules/IMEModules/mgrPrefs.swift | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Source/Modules/IMEModules/mgrPrefs.swift b/Source/Modules/IMEModules/mgrPrefs.swift index 51498665..c7ecb77b 100644 --- a/Source/Modules/IMEModules/mgrPrefs.swift +++ b/Source/Modules/IMEModules/mgrPrefs.swift @@ -50,6 +50,7 @@ public enum UserDef: String, CaseIterable { case kTogglingAlphanumericalModeWithLShift = "TogglingAlphanumericalModeWithLShift" case kUpperCaseLetterKeyBehavior = "UpperCaseLetterKeyBehavior" case kUseIMKCandidateWindow = "UseIMKCandidateWindow" + case kHandleDefaultCandidateFontsByLangIdentifier = "HandleDefaultCandidateFontsByLangIdentifier" case kCandidateTextFontName = "CandidateTextFontName" case kCandidateKeyLabelFontName = "CandidateKeyLabelFontName" @@ -279,6 +280,10 @@ public enum mgrPrefs { UserDefaults.standard.setDefault( mgrPrefs.useIMKCandidateWindow, forKey: UserDef.kUseIMKCandidateWindow.rawValue ) + UserDefaults.standard.setDefault( + mgrPrefs.handleDefaultCandidateFontsByLangIdentifier, + forKey: UserDef.kHandleDefaultCandidateFontsByLangIdentifier.rawValue + ) UserDefaults.standard.setDefault(mgrPrefs.usingHotKeySCPC, forKey: UserDef.kUsingHotKeySCPC.rawValue) UserDefaults.standard.setDefault(mgrPrefs.usingHotKeyAssociates, forKey: UserDef.kUsingHotKeyAssociates.rawValue) @@ -391,6 +396,9 @@ public enum mgrPrefs { } } + @UserDefault(key: UserDef.kHandleDefaultCandidateFontsByLangIdentifier.rawValue, defaultValue: false) + static var handleDefaultCandidateFontsByLangIdentifier: Bool + // MARK: - Settings (Tier 2) @UserDefault(key: UserDef.kTogglingAlphanumericalModeWithLShift.rawValue, defaultValue: true) From 2777d316e09f032b59035c081901091b8ceb6e14 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Fri, 12 Aug 2022 20:22:55 +0800 Subject: [PATCH 11/20] ctlCandUniv // Add .langIdentifier back but disabled by default. --- .../CandidateUI/ctlCandidateUniversal.swift | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/Source/UI/CandidateUI/ctlCandidateUniversal.swift b/Source/UI/CandidateUI/ctlCandidateUniversal.swift index efc09fa5..f123cd46 100644 --- a/Source/UI/CandidateUI/ctlCandidateUniversal.swift +++ b/Source/UI/CandidateUI/ctlCandidateUniversal.swift @@ -184,6 +184,22 @@ private class vwrCandidateUniversal: NSView { } else { NSColor.controlBackgroundColor.setFill() } + if mgrPrefs.handleDefaultCandidateFontsByLangIdentifier { + switch IME.currentInputMode { + case InputMode.imeModeCHS: + if #available(macOS 12.0, *) { + activeCandidateAttr[.languageIdentifier] = "zh-Hans" as AnyObject + } + case InputMode.imeModeCHT: + if #available(macOS 12.0, *) { + activeCandidateAttr[.languageIdentifier] = + (mgrPrefs.shiftJISShinjitaiOutputEnabled || mgrPrefs.chineseConversionEnabled) + ? "ja" as AnyObject : "zh-Hant" as AnyObject + } + default: + break + } + } let path: NSBezierPath = .init(roundedRect: rctCandidateArea, xRadius: 5, yRadius: 5) path.fill() (keyLabels[index] as NSString).draw( @@ -241,6 +257,22 @@ private class vwrCandidateUniversal: NSView { } else { NSColor.controlBackgroundColor.setFill() } + if mgrPrefs.handleDefaultCandidateFontsByLangIdentifier { + switch IME.currentInputMode { + case InputMode.imeModeCHS: + if #available(macOS 12.0, *) { + activeCandidateAttr[.languageIdentifier] = "zh-Hans" as AnyObject + } + case InputMode.imeModeCHT: + if #available(macOS 12.0, *) { + activeCandidateAttr[.languageIdentifier] = + (mgrPrefs.shiftJISShinjitaiOutputEnabled || mgrPrefs.chineseConversionEnabled) + ? "ja" as AnyObject : "zh-Hant" as AnyObject + } + default: + break + } + } let path: NSBezierPath = .init(roundedRect: rctCandidateArea, xRadius: 5, yRadius: 5) path.fill() (keyLabels[index] as NSString).draw( From 4633cc53859a46ba04564a4764622e5f50b28c61 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Fri, 12 Aug 2022 20:48:37 +0800 Subject: [PATCH 12/20] PrefUI // +handleDefaultCandidateFontsByLangIdentifier. --- Source/Resources/Base.lproj/Localizable.strings | 2 ++ Source/Resources/en.lproj/Localizable.strings | 2 ++ Source/Resources/ja.lproj/Localizable.strings | 2 ++ Source/Resources/zh-Hans.lproj/Localizable.strings | 2 ++ Source/Resources/zh-Hant.lproj/Localizable.strings | 2 ++ Source/UI/PrefUI/suiPrefPaneDangerZone.swift | 12 +++++++++++- 6 files changed, 21 insertions(+), 1 deletion(-) diff --git a/Source/Resources/Base.lproj/Localizable.strings b/Source/Resources/Base.lproj/Localizable.strings index 898f577e..ba459844 100644 --- a/Source/Resources/Base.lproj/Localizable.strings +++ b/Source/Resources/Base.lproj/Localizable.strings @@ -168,11 +168,13 @@ "Space to +cycle pages, Shift+Space to +cycle candidates" = "Space to +cycle pages, Shift+Space to +cycle candidates"; "Starlight" = "Starlight"; "Stop farting (when typed phonetic combination is invalid, etc.)" = "Stop farting (when typed phonetic combination is invalid, etc.)"; +"This only works since macOS 12 with non-IMK candidate window as an alternative wordaround of Apple Bug Report #FB10978412. Apple should patch that for macOS 11 and later." = "This only works since macOS 12 with non-IMK candidate window as an alternative wordaround of Apple Bug Report #FB10978412. Apple should patch that for macOS 11 and later."; "Traditional Chinese" = "Traditional Chinese"; "Type them into inline composition buffer" = "Type them into inline composition buffer"; "Typing Style:" = "Typing Style:"; "UI Language:" = "UI Language:"; "Universal Pinyin with Numeral Intonation" = "Universal Pinyin with Numeral Intonation"; +"Use .langIdentifier to handle UI font in candidate window" = "Use .langIdentifier to handle UI font in candidate window"; "Use ESC key to clear the entire input buffer" = "Use ESC key to clear the entire input buffer"; "Use IMK Candidate Window instead (will reboot the IME)" = "Use IMK Candidate Window instead (will reboot the IME)"; "Vertical" = "Vertical"; diff --git a/Source/Resources/en.lproj/Localizable.strings b/Source/Resources/en.lproj/Localizable.strings index 898f577e..ba459844 100644 --- a/Source/Resources/en.lproj/Localizable.strings +++ b/Source/Resources/en.lproj/Localizable.strings @@ -168,11 +168,13 @@ "Space to +cycle pages, Shift+Space to +cycle candidates" = "Space to +cycle pages, Shift+Space to +cycle candidates"; "Starlight" = "Starlight"; "Stop farting (when typed phonetic combination is invalid, etc.)" = "Stop farting (when typed phonetic combination is invalid, etc.)"; +"This only works since macOS 12 with non-IMK candidate window as an alternative wordaround of Apple Bug Report #FB10978412. Apple should patch that for macOS 11 and later." = "This only works since macOS 12 with non-IMK candidate window as an alternative wordaround of Apple Bug Report #FB10978412. Apple should patch that for macOS 11 and later."; "Traditional Chinese" = "Traditional Chinese"; "Type them into inline composition buffer" = "Type them into inline composition buffer"; "Typing Style:" = "Typing Style:"; "UI Language:" = "UI Language:"; "Universal Pinyin with Numeral Intonation" = "Universal Pinyin with Numeral Intonation"; +"Use .langIdentifier to handle UI font in candidate window" = "Use .langIdentifier to handle UI font in candidate window"; "Use ESC key to clear the entire input buffer" = "Use ESC key to clear the entire input buffer"; "Use IMK Candidate Window instead (will reboot the IME)" = "Use IMK Candidate Window instead (will reboot the IME)"; "Vertical" = "Vertical"; diff --git a/Source/Resources/ja.lproj/Localizable.strings b/Source/Resources/ja.lproj/Localizable.strings index 33f4df5b..3a2d2a6d 100644 --- a/Source/Resources/ja.lproj/Localizable.strings +++ b/Source/Resources/ja.lproj/Localizable.strings @@ -168,11 +168,13 @@ "Space to +cycle pages, Shift+Space to +cycle candidates" = "Space で次のページ、Shift+Space で次の候補文字を"; "Starlight" = "星光配列"; "Stop farting (when typed phonetic combination is invalid, etc.)" = "マナーモード // 外すと入力間違った時に変な声が出る"; +"This only works since macOS 12 with non-IMK candidate window as an alternative wordaround of Apple Bug Report #FB10978412. Apple should patch that for macOS 11 and later." = "これは Apple Bug Report #FB10978412 の臨時対策であり、macOS 12 からの macOS に効き、IMK 以外の候補陳列ウィンドウに作用する。Apple は macOS 11 からの macOS のために該当 Bug を修復すべきである。"; "Traditional Chinese" = "繁体中国語"; "Type them into inline composition buffer" = "入力緩衝列にローマ字入力"; "Typing Style:" = "入力習慣:"; "UI Language:" = "表示用言語:"; "Universal Pinyin with Numeral Intonation" = "汎用弁音 (ローマ字+数字音調)"; +"Use .langIdentifier to handle UI font in candidate window" = "「.langIdentifier」を使って候補陳列ウィンドウのフォントを取り扱う"; "Use ESC key to clear the entire input buffer" = "ESC キーで入力緩衝列を消す"; "Use IMK Candidate Window instead (will reboot the IME)" = "IMK 候補陳列ウィンドウを起用(入力アプリは自動的に再起動)"; "Vertical" = "縦型陳列"; diff --git a/Source/Resources/zh-Hans.lproj/Localizable.strings b/Source/Resources/zh-Hans.lproj/Localizable.strings index 4e234a95..58e3c2db 100644 --- a/Source/Resources/zh-Hans.lproj/Localizable.strings +++ b/Source/Resources/zh-Hans.lproj/Localizable.strings @@ -169,12 +169,14 @@ "Space to +cycle pages, Shift+Space to +cycle candidates" = "空格键 换下一页,Shift+空格键 换选下一个后选字"; "Starlight" = "星光排列"; "Stop farting (when typed phonetic combination is invalid, etc.)" = "廉耻模式 // 取消勾选的话,敲错字时会有异音"; +"This only works since macOS 12 with non-IMK candidate window as an alternative wordaround of Apple Bug Report #FB10978412. Apple should patch that for macOS 11 and later." = "该方法是 Apple Bug Report #FB10978412 的保守治疗方案,用来仅针对 macOS 12 开始的系统,且仅对非 IMK 选字窗起作用。Apple 应该对 macOS 11 开始的系统修复这个 Bug。"; "Traditional Chinese" = "繁体中文"; "Type them into inline composition buffer" = "直接键入内文组字区"; "Typing Style:" = "输入风格:"; "UI Language:" = "介面语言:"; "Universal Pinyin with Numeral Intonation" = "通用拼音+数字标调"; "Universal Pinyin with Numeral Intonation" = "通用拼音+数字标调"; +"Use .langIdentifier to handle UI font in candidate window" = "使用 .langIdentifier 来管理选字窗的预设介面字型"; "Use ESC key to clear the entire input buffer" = "敲 ESC 键以清空整个组字缓冲区"; "Use IMK Candidate Window instead (will reboot the IME)" = "启用 IMK 选字窗(会自动重启输入法)"; "Vertical" = "纵向布局"; diff --git a/Source/Resources/zh-Hant.lproj/Localizable.strings b/Source/Resources/zh-Hant.lproj/Localizable.strings index 84408810..02c1e75a 100644 --- a/Source/Resources/zh-Hant.lproj/Localizable.strings +++ b/Source/Resources/zh-Hant.lproj/Localizable.strings @@ -168,11 +168,13 @@ "Space to +cycle pages, Shift+Space to +cycle candidates" = "空格鍵 換下一頁,Shift+空格鍵 換選下一個後選字"; "Starlight" = "星光排列"; "Stop farting (when typed phonetic combination is invalid, etc.)" = "廉恥模式 // 取消勾選的話,敲錯字時會有異音"; +"This only works since macOS 12 with non-IMK candidate window as an alternative wordaround of Apple Bug Report #FB10978412. Apple should patch that for macOS 11 and later." = "該方法是 Apple Bug Report #FB10978412 的保守治療方案,用來僅針對 macOS 12 開始的系統,且僅對非 IMK 選字窗起作用。Apple 應該對 macOS 11 開始的系統修復這個 Bug。"; "Traditional Chinese" = "繁體中文"; "Type them into inline composition buffer" = "直接鍵入內文組字區"; "Typing Style:" = "輸入風格:"; "UI Language:" = "介面語言:"; "Universal Pinyin with Numeral Intonation" = "通用拼音+數字標調"; +"Use .langIdentifier to handle UI font in candidate window" = "使用 .langIdentifier 來管理選字窗的預設介面字型"; "Use ESC key to clear the entire input buffer" = "敲 ESC 鍵以清空整個組字緩衝區"; "Use IMK Candidate Window instead (will reboot the IME)" = "啟用 IMK 選字窗(會自動重啟輸入法)"; "Vertical" = "縱向佈局"; diff --git a/Source/UI/PrefUI/suiPrefPaneDangerZone.swift b/Source/UI/PrefUI/suiPrefPaneDangerZone.swift index 52efdb79..b9622194 100644 --- a/Source/UI/PrefUI/suiPrefPaneDangerZone.swift +++ b/Source/UI/PrefUI/suiPrefPaneDangerZone.swift @@ -12,6 +12,8 @@ import SwiftUI struct suiPrefPaneDangerZone: View { @State private var selUseIMKCandidateWindow: Bool = UserDefaults.standard.bool( forKey: UserDef.kUseIMKCandidateWindow.rawValue) + @State private var selHandleDefaultCandidateFontsByLangIdentifier: Bool = UserDefaults.standard.bool( + forKey: UserDef.kHandleDefaultCandidateFontsByLangIdentifier.rawValue) private let contentWidth: Double = { switch mgrPrefs.appleLanguages[0] { case "ja": @@ -41,7 +43,15 @@ struct suiPrefPaneDangerZone: View { } ) Text(LocalizedStringKey("Candidate selection keys are not yet available in IMK candidate window.")) - .preferenceDescription() + .preferenceDescription().fixedSize(horizontal: false, vertical: true) + Toggle( + LocalizedStringKey("Use .langIdentifier to handle UI font in candidate window"), + isOn: $selHandleDefaultCandidateFontsByLangIdentifier.onChange { + mgrPrefs.handleDefaultCandidateFontsByLangIdentifier = selHandleDefaultCandidateFontsByLangIdentifier + } + ) + Text(LocalizedStringKey("This only works since macOS 12 with non-IMK candidate window as an alternative wordaround of Apple Bug Report #FB10978412. Apple should patch that for macOS 11 and later.")) + .preferenceDescription().fixedSize(horizontal: false, vertical: true) } } } From 74bd927426f9e2b78e0c50ca7c8cbc262339f2bf Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Fri, 12 Aug 2022 22:53:17 +0800 Subject: [PATCH 13/20] PrefWIndow // Add DangerZone page support. --- Source/UI/PrefUI/suiPrefPaneDangerZone.swift | 8 +- Source/WindowControllers/ctlPrefWindow.swift | 30 ++++++- .../WindowNIBs/Base.lproj/frmPrefWindow.xib | 89 +++++++++++++++++++ .../WindowNIBs/en.lproj/frmPrefWindow.strings | 5 ++ .../WindowNIBs/ja.lproj/frmPrefWindow.strings | 5 ++ .../zh-Hans.lproj/frmPrefWindow.strings | 5 ++ .../zh-Hant.lproj/frmPrefWindow.strings | 5 ++ 7 files changed, 142 insertions(+), 5 deletions(-) diff --git a/Source/UI/PrefUI/suiPrefPaneDangerZone.swift b/Source/UI/PrefUI/suiPrefPaneDangerZone.swift index b9622194..45965ca7 100644 --- a/Source/UI/PrefUI/suiPrefPaneDangerZone.swift +++ b/Source/UI/PrefUI/suiPrefPaneDangerZone.swift @@ -50,8 +50,12 @@ struct suiPrefPaneDangerZone: View { mgrPrefs.handleDefaultCandidateFontsByLangIdentifier = selHandleDefaultCandidateFontsByLangIdentifier } ) - Text(LocalizedStringKey("This only works since macOS 12 with non-IMK candidate window as an alternative wordaround of Apple Bug Report #FB10978412. Apple should patch that for macOS 11 and later.")) - .preferenceDescription().fixedSize(horizontal: false, vertical: true) + Text( + LocalizedStringKey( + "This only works since macOS 12 with non-IMK candidate window as an alternative wordaround of Apple Bug Report #FB10978412. Apple should patch that for macOS 11 and later." + ) + ) + .preferenceDescription().fixedSize(horizontal: false, vertical: true) } } } diff --git a/Source/WindowControllers/ctlPrefWindow.swift b/Source/WindowControllers/ctlPrefWindow.swift index fe1d8d14..ef930057 100644 --- a/Source/WindowControllers/ctlPrefWindow.swift +++ b/Source/WindowControllers/ctlPrefWindow.swift @@ -18,6 +18,7 @@ extension NSToolbarItem.Identifier { fileprivate static let ofExperience = NSToolbarItem.Identifier(rawValue: "tabExperience") fileprivate static let ofDictionary = NSToolbarItem.Identifier(rawValue: "tabDictionary") fileprivate static let ofKeyboard = NSToolbarItem.Identifier(rawValue: "tabKeyboard") + fileprivate static let ofDangerZone = NSToolbarItem.Identifier(rawValue: "tabDangerZone") } // Please note that the class should be exposed using the same class name @@ -32,11 +33,13 @@ class ctlPrefWindow: NSWindowController { @IBOutlet var chkTrad2KangXi: NSButton! @IBOutlet var chkTrad2JISShinjitai: NSButton! @IBOutlet var lblCurrentlySpecifiedUserDataFolder: NSTextFieldCell! + @IBOutlet var tglControlDangerZoneIMKCandidate: NSButton! @IBOutlet var vwrGeneral: NSView! @IBOutlet var vwrExperience: NSView! @IBOutlet var vwrDictionary: NSView! @IBOutlet var vwrKeyboard: NSView! + @IBOutlet var vwrDangerZone: NSView! var currentLanguageSelectItem: NSMenuItem? @@ -236,6 +239,10 @@ class ctlPrefWindow: NSWindowController { } } + @IBAction func updateIMKCandidateEnableStatusAction(_: Any) { + NSApplication.shared.terminate(nil) + } + @IBAction func clickedWhetherIMEShouldNotFartToggleAction(_: Any) { clsSFX.beep() } @@ -329,15 +336,15 @@ extension ctlPrefWindow: NSToolbarDelegate { } func toolbarDefaultItemIdentifiers(_: NSToolbar) -> [NSToolbarItem.Identifier] { - [.ofGeneral, .ofExperience, .ofDictionary, .ofKeyboard] + [.ofGeneral, .ofExperience, .ofDictionary, .ofKeyboard, .ofDangerZone] } func toolbarAllowedItemIdentifiers(_: NSToolbar) -> [NSToolbarItem.Identifier] { - [.ofGeneral, .ofExperience, .ofDictionary, .ofKeyboard] + [.ofGeneral, .ofExperience, .ofDictionary, .ofKeyboard, .ofDangerZone] } func toolbarSelectableItemIdentifiers(_: NSToolbar) -> [NSToolbarItem.Identifier] { - [.ofGeneral, .ofExperience, .ofDictionary, .ofKeyboard] + [.ofGeneral, .ofExperience, .ofDictionary, .ofKeyboard, .ofDangerZone] } @objc func showGeneralView(_: Any?) { @@ -360,6 +367,11 @@ extension ctlPrefWindow: NSToolbarDelegate { window?.toolbar?.selectedItemIdentifier = .ofKeyboard } + @objc func showDangerZOneView(_: Any?) { + use(view: vwrDangerZone) + window?.toolbar?.selectedItemIdentifier = .ofDangerZone + } + func toolbar( _: NSToolbar, itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier, willBeInsertedIntoToolbar _: Bool @@ -413,6 +425,18 @@ extension ctlPrefWindow: NSToolbarDelegate { } item.action = #selector(showKeyboardView(_:)) + case .ofDangerZone: + let title = NSLocalizedString("DangerZone", comment: "") + item.label = title + if #available(macOS 11.0, *) { + item.image = NSImage( + systemSymbolName: "hand.raised.circle", accessibilityDescription: "DangerZone Preferences" + ) + } else { + item.image = NSImage(named: "PrefToolbar-DangerZone") + } + item.action = #selector(showDangerZOneView(_:)) + default: return nil } diff --git a/Source/WindowNIBs/Base.lproj/frmPrefWindow.xib b/Source/WindowNIBs/Base.lproj/frmPrefWindow.xib index b9b3661b..ca62144d 100644 --- a/Source/WindowNIBs/Base.lproj/frmPrefWindow.xib +++ b/Source/WindowNIBs/Base.lproj/frmPrefWindow.xib @@ -14,7 +14,9 @@ + + @@ -1054,5 +1056,92 @@ + + + + + + + + + Warning: This page is for testing future features. +Features listed here may not work as expected. + + + + + + + + + + + + + + + + + + + + + + + + + This only works since macOS 12 with non-IMK candidate window as an alternative wordaround of Apple Bug Report #FB10978412. Apple should patch that for macOS 11 and later. + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/WindowNIBs/en.lproj/frmPrefWindow.strings b/Source/WindowNIBs/en.lproj/frmPrefWindow.strings index ffdd4664..7cbe385e 100644 --- a/Source/WindowNIBs/en.lproj/frmPrefWindow.strings +++ b/Source/WindowNIBs/en.lproj/frmPrefWindow.strings @@ -102,3 +102,8 @@ "XqL-rf-X6d.title" = "Space to +cycle pages, Shift+Space to +cycle candidates"; "xrE-8T-WKO.label" = "Advanced"; "ZEv-Q2-mYL.title" = "Change user interface language (will reboot the IME)."; +"lblDangerZoneTitleDescription.title" = "Warning: This page is for testing future features. \nFeatures listed here may not work as expected."; +"tglDangerZoneIMKCandidate.title" = "Use IMK Candidate Window instead (will reboot the IME)"; +"lblDangerZoneIMKCandidate.title" = "Candidate selection keys are not yet available in IMK candidate window."; +"tglDangerZoneCandidateFont.title" = "Use .langIdentifier to handle UI font in candidate window"; +"lblDangerZoneCandidateFont.title" = "This only works since macOS 12 with non-IMK candidate window as an alternative wordaround of Apple Bug Report #FB10978412. Apple should patch that for macOS 11 and later."; diff --git a/Source/WindowNIBs/ja.lproj/frmPrefWindow.strings b/Source/WindowNIBs/ja.lproj/frmPrefWindow.strings index 6246c14b..c6a77218 100644 --- a/Source/WindowNIBs/ja.lproj/frmPrefWindow.strings +++ b/Source/WindowNIBs/ja.lproj/frmPrefWindow.strings @@ -102,3 +102,8 @@ "XqL-rf-X6d.title" = "Space で次のページ、Shift+Space で次の候補文字を"; "xrE-8T-WKO.label" = "詳細"; "ZEv-Q2-mYL.title" = "アプリ表示用言語をご指定ください、そして入力アプリは自動的に再起動。"; +"lblDangerZoneTitleDescription.title" = "警告:これからの新機能テストのために作ったページですから、\nここで陳列されている諸機能は予想通り動けるだと思わないでください。"; +"tglDangerZoneIMKCandidate.title" = "IMK 候補陳列ウィンドウを起用(入力アプリは自動的に再起動)"; +"lblDangerZoneIMKCandidate.title" = "IMK 候補陳列ウィンドウで言選り用キーは現時点で利用不可。"; +"tglDangerZoneCandidateFont.title" = "「.langIdentifier」を使って候補陳列ウィンドウのフォントを取り扱う"; +"lblDangerZoneCandidateFont.title" = "これは Apple Bug Report #FB10978412 の臨時対策であり、macOS 12 からの macOS に効き、IMK 以外の候補陳列ウィンドウに作用する。Apple は macOS 11 からの macOS のために該当 Bug を修復すべきである。"; diff --git a/Source/WindowNIBs/zh-Hans.lproj/frmPrefWindow.strings b/Source/WindowNIBs/zh-Hans.lproj/frmPrefWindow.strings index 0653a16e..dba709be 100644 --- a/Source/WindowNIBs/zh-Hans.lproj/frmPrefWindow.strings +++ b/Source/WindowNIBs/zh-Hans.lproj/frmPrefWindow.strings @@ -102,3 +102,8 @@ "XqL-rf-X6d.title" = "Space 换下一页,Shift+Space 换选下一个候选字。"; "xrE-8T-WKO.label" = "进阶"; "ZEv-Q2-mYL.title" = "变更使用者界面语言,会自动重新启动输入法。"; +"lblDangerZoneTitleDescription.title" = "警告:该页面仅作未来功能测试所用。\n在此列出的功能并非处于完全可用之状态。"; +"tglDangerZoneIMKCandidate.title" = "启用 IMK 选字窗(会自动重启输入法)"; +"lblDangerZoneIMKCandidate.title" = "IMK 选字窗目前暂时无法正常使用选字键。"; +"tglDangerZoneCandidateFont.title" = "使用 .langIdentifier 来管理选字窗的预设介面字型"; +"lblDangerZoneCandidateFont.title" = "该方法是 Apple Bug Report #FB10978412 的保守治疗方案,用来仅针对 macOS 12 开始的系统,且仅对非 IMK 选字窗起作用。Apple 应该对 macOS 11 开始的系统修复这个 Bug。"; diff --git a/Source/WindowNIBs/zh-Hant.lproj/frmPrefWindow.strings b/Source/WindowNIBs/zh-Hant.lproj/frmPrefWindow.strings index 31fca5da..c0018f65 100644 --- a/Source/WindowNIBs/zh-Hant.lproj/frmPrefWindow.strings +++ b/Source/WindowNIBs/zh-Hant.lproj/frmPrefWindow.strings @@ -102,3 +102,8 @@ "XqL-rf-X6d.title" = "Space 換下一頁,Shift+Space 換選下一個候選字"; "xrE-8T-WKO.label" = "進階"; "ZEv-Q2-mYL.title" = "變更使用者介面語言,會自動重新啟動輸入法。"; +"lblDangerZoneTitleDescription.title" = "警告:該頁面僅作未來功能測試所用。\n在此列出的功能並非處於完全可用之狀態。"; +"tglDangerZoneIMKCandidate.title" = "啟用 IMK 選字窗(會自動重啟輸入法)"; +"lblDangerZoneIMKCandidate.title" = "IMK 選字窗目前暫時無法正常使用選字鍵。"; +"tglDangerZoneCandidateFont.title" = "使用 .langIdentifier 來管理選字窗的預設介面字型"; +"lblDangerZoneCandidateFont.title" = "該方法是 Apple Bug Report #FB10978412 的保守治療方案,用來僅針對 macOS 12 開始的系統,且僅對非 IMK 選字窗起作用。Apple 應該對 macOS 11 開始的系統修復這個 Bug。"; From aefb5878d1787bce2715568829be5536571c908e Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sat, 13 Aug 2022 00:03:49 +0800 Subject: [PATCH 14/20] InputState // Again disable inline userphrase operation when mismatch. --- Source/Modules/ControllerModules/InputState.swift | 12 +++++------- .../ControllerModules/ctlInputMethod_Delegates.swift | 1 + Source/Resources/Base.lproj/Localizable.strings | 2 +- Source/Resources/en.lproj/Localizable.strings | 2 +- Source/Resources/ja.lproj/Localizable.strings | 2 +- Source/Resources/zh-Hans.lproj/Localizable.strings | 2 +- Source/Resources/zh-Hant.lproj/Localizable.strings | 2 +- 7 files changed, 11 insertions(+), 12 deletions(-) diff --git a/Source/Modules/ControllerModules/InputState.swift b/Source/Modules/ControllerModules/InputState.swift index d75ec67a..77d25bef 100644 --- a/Source/Modules/ControllerModules/InputState.swift +++ b/Source/Modules/ControllerModules/InputState.swift @@ -280,9 +280,9 @@ public enum InputState { private var markedTargetExists = false var tooltip: String { if composingBuffer.count != readings.count { - ctlInputMethod.tooltipController.setColor(state: .denialOverflow) + ctlInputMethod.tooltipController.setColor(state: .redAlert) return NSLocalizedString( - "⚠︎ Beware: Chars and Readings in buffer doesn't match.", comment: "" + "⚠︎ Unhandlable: Chars and Readings in buffer doesn't match.", comment: "" ) } if mgrPrefs.phraseReplacementEnabled { @@ -398,11 +398,9 @@ public enum InputState { return state } - var validToFilter: Bool { - /// 與小麥注音不同,威注音會自動解消「游標插斷字符」的異常狀態,所以允許在字音長度不相符的情況下加詞。 - /// 這裡的 deleteTargetExists 是防止使用者排除「詞庫內尚未存在的詞」。 - markedTargetExists ? allowedMarkRange.contains(literalMarkedRange.count) : false - } + var validToFilter: Bool { markedTargetExists ? allowedMarkRange.contains(literalMarkedRange.count) : false } + + var bufferReadingCountMisMatch: Bool { composingBuffer.count != readings.count } var chkIfUserPhraseExists: Bool { let text = composingBuffer.utf16SubString(with: markedRange) diff --git a/Source/Modules/ControllerModules/ctlInputMethod_Delegates.swift b/Source/Modules/ControllerModules/ctlInputMethod_Delegates.swift index 755e7d4b..6b7a47a4 100644 --- a/Source/Modules/ControllerModules/ctlInputMethod_Delegates.swift +++ b/Source/Modules/ControllerModules/ctlInputMethod_Delegates.swift @@ -26,6 +26,7 @@ extension ctlInputMethod: KeyHandlerDelegate { -> Bool { guard let state = state as? InputState.Marking else { return false } + if state.bufferReadingCountMisMatch { return false } let refInputModeReversed: InputMode = (keyHandler.inputMode == InputMode.imeModeCHT) ? InputMode.imeModeCHS : InputMode.imeModeCHT diff --git a/Source/Resources/Base.lproj/Localizable.strings b/Source/Resources/Base.lproj/Localizable.strings index ba459844..173a3877 100644 --- a/Source/Resources/Base.lproj/Localizable.strings +++ b/Source/Resources/Base.lproj/Localizable.strings @@ -39,7 +39,7 @@ "Please specify at least 4 candidate keys." = "Please specify at least 4 candidate keys."; "Maximum 15 candidate keys allowed." = "Maximum 15 candidate keys allowed."; "⚠︎ Phrase replacement mode enabled, interfering user phrase entry." = "⚠︎ Phrase replacement mode enabled, interfering user phrase entry."; -"⚠︎ Beware: Chars and Readings in buffer doesn't match." = "⚠︎ Beware: Chars and Readings in buffer doesn't match."; +"⚠︎ Unhandlable: Chars and Readings in buffer doesn't match." = "⚠︎ Unhandlable: Chars and Readings in buffer doesn't match."; "Per-Char Select Mode" = "Per-Char Select Mode"; "CNS11643 Mode" = "CNS11643 Mode"; "JIS Shinjitai Output" = "JIS Shinjitai Output"; diff --git a/Source/Resources/en.lproj/Localizable.strings b/Source/Resources/en.lproj/Localizable.strings index ba459844..173a3877 100644 --- a/Source/Resources/en.lproj/Localizable.strings +++ b/Source/Resources/en.lproj/Localizable.strings @@ -39,7 +39,7 @@ "Please specify at least 4 candidate keys." = "Please specify at least 4 candidate keys."; "Maximum 15 candidate keys allowed." = "Maximum 15 candidate keys allowed."; "⚠︎ Phrase replacement mode enabled, interfering user phrase entry." = "⚠︎ Phrase replacement mode enabled, interfering user phrase entry."; -"⚠︎ Beware: Chars and Readings in buffer doesn't match." = "⚠︎ Beware: Chars and Readings in buffer doesn't match."; +"⚠︎ Unhandlable: Chars and Readings in buffer doesn't match." = "⚠︎ Unhandlable: Chars and Readings in buffer doesn't match."; "Per-Char Select Mode" = "Per-Char Select Mode"; "CNS11643 Mode" = "CNS11643 Mode"; "JIS Shinjitai Output" = "JIS Shinjitai Output"; diff --git a/Source/Resources/ja.lproj/Localizable.strings b/Source/Resources/ja.lproj/Localizable.strings index 3a2d2a6d..7fadadcb 100644 --- a/Source/Resources/ja.lproj/Localizable.strings +++ b/Source/Resources/ja.lproj/Localizable.strings @@ -39,7 +39,7 @@ "Please specify at least 4 candidate keys." = "言選り用キー陣列に少なくとも4つのキーをご登録ください。"; "Maximum 15 candidate keys allowed." = "言選り用キー陣列には最多15つキー登録できます。"; "⚠︎ Phrase replacement mode enabled, interfering user phrase entry." = "⚠︎ 言葉置換機能稼働中、新添付言葉にも影響。"; -"⚠︎ Beware: Chars and Readings in buffer doesn't match." = "⚠︎ 注意:緩衝列の字数は読みの数と不同等。"; +"⚠︎ Unhandlable: Chars and Readings in buffer doesn't match." = "⚠︎ 対処不可:緩衝列の字数は読みの数と不同等。"; "Per-Char Select Mode" = "全候補入力モード"; "CNS11643 Mode" = "全字庫モード"; "JIS Shinjitai Output" = "JIS 新字体モード"; diff --git a/Source/Resources/zh-Hans.lproj/Localizable.strings b/Source/Resources/zh-Hans.lproj/Localizable.strings index 58e3c2db..0fe1a8d8 100644 --- a/Source/Resources/zh-Hans.lproj/Localizable.strings +++ b/Source/Resources/zh-Hans.lproj/Localizable.strings @@ -39,7 +39,7 @@ "Please specify at least 4 candidate keys." = "请至少指定四个选字键。"; "Maximum 15 candidate keys allowed." = "选字键最多只能指定十五个。"; "⚠︎ Phrase replacement mode enabled, interfering user phrase entry." = "⚠︎ 语汇置换功能已启用,会波及语汇自订。"; -"⚠︎ Beware: Chars and Readings in buffer doesn't match." = "⚠︎ 注意:组字区字数与读音数不对应。"; +"⚠︎ Unhandlable: Chars and Readings in buffer doesn't match." = "⚠︎ 无法处理:组字区字数与读音数不对应。"; "Per-Char Select Mode" = "仿真逐字选字输入"; "CNS11643 Mode" = "全字库模式"; "JIS Shinjitai Output" = "JIS 新字体模式"; diff --git a/Source/Resources/zh-Hant.lproj/Localizable.strings b/Source/Resources/zh-Hant.lproj/Localizable.strings index 02c1e75a..65393b85 100644 --- a/Source/Resources/zh-Hant.lproj/Localizable.strings +++ b/Source/Resources/zh-Hant.lproj/Localizable.strings @@ -39,7 +39,7 @@ "Please specify at least 4 candidate keys." = "請至少指定四個選字鍵。"; "Maximum 15 candidate keys allowed." = "選字鍵最多只能指定十五個。"; "⚠︎ Phrase replacement mode enabled, interfering user phrase entry." = "⚠︎ 語彙置換功能已啟用,會波及語彙自訂。"; -"⚠︎ Beware: Chars and Readings in buffer doesn't match." = "⚠︎ 注意:組字區字數與讀音數不對應。"; +"⚠︎ Unhandlable: Chars and Readings in buffer doesn't match." = "⚠︎ 無法處理:組字區字數與讀音數不對應。"; "Per-Char Select Mode" = "模擬逐字選字輸入"; "CNS11643 Mode" = "全字庫模式"; "JIS Shinjitai Output" = "JIS 新字體模式"; From c503443b54ccc279210862e3cffdc666522dbea4 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sat, 13 Aug 2022 14:25:53 +0800 Subject: [PATCH 15/20] i18n // Unify Chinese translations of preferences tab names. --- Source/Resources/zh-Hans.lproj/Localizable.strings | 10 +++++----- Source/Resources/zh-Hant.lproj/Localizable.strings | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Source/Resources/zh-Hans.lproj/Localizable.strings b/Source/Resources/zh-Hans.lproj/Localizable.strings index 0fe1a8d8..eef40180 100644 --- a/Source/Resources/zh-Hans.lproj/Localizable.strings +++ b/Source/Resources/zh-Hans.lproj/Localizable.strings @@ -123,9 +123,9 @@ "Cursor Selection:" = "选字游标:"; "Dachen (Microsoft Standard / Wang / 01, etc.)" = "大千排列 (微软标准/王安/零壹/仲鼎/国乔)"; "Dachen 26 (libChewing)" = "酷音大千二十六键排列"; -"DangerZone" = "禁区"; +"DangerZone" = "开发道场"; "Debug Mode" = "侦错模式"; -"Dictionary" = "辞典"; +"Dictionary" = "辞典设定"; "Directly commit lowercased letters" = "直接递交小写字母"; "Directly commit uppercased letters" = "直接递交大写字母"; "Emulating select-candidate-per-character mode" = "模拟 90 年代前期注音逐字选字输入风格"; @@ -135,12 +135,12 @@ "English" = "英语"; "Eten 26" = "倚天忘形排列 (26 键)"; "Eten Traditional" = "倚天传统排列"; -"Experience" = "体验"; +"Experience" = "体验设定"; "Fake Seigyou" = "伪精业排列"; "Follow OS settings" = "依系统设定"; "for cycling candidates" = "轮替候选字"; "for cycling pages" = "轮替页面"; -"General" = "通用"; +"General" = "通用设定"; "Hanyu Pinyin with Numeral Intonation" = "汉语拼音+数字标调"; "Horizontal" = "横向布局"; "Hsu" = "许氏国音自然排列"; @@ -150,7 +150,7 @@ "in front of the phrase (like macOS built-in Zhuyin IME)" = "将游标置于词语前方 // macOS 内建注音风格"; "Japanese" = "和语"; "Keyboard Shortcuts:" = "键盘快捷键:"; -"Keyboard" = "键盘"; +"Keyboard" = "键盘设定"; "Misc Settings:" = "杂项:"; "MiTAC" = "神通排列"; "Non-QWERTY alphanumerical keyboard layouts are for Hanyu Pinyin parser only." = "QWERTY 以外的英数布局是为了汉语拼音排列使用者而准备的。"; diff --git a/Source/Resources/zh-Hant.lproj/Localizable.strings b/Source/Resources/zh-Hant.lproj/Localizable.strings index 65393b85..c8efb011 100644 --- a/Source/Resources/zh-Hant.lproj/Localizable.strings +++ b/Source/Resources/zh-Hant.lproj/Localizable.strings @@ -123,9 +123,9 @@ "Cursor Selection:" = "選字游標:"; "Dachen (Microsoft Standard / Wang / 01, etc.)" = "大千排列 (微軟標準/王安/零壹/仲鼎/國喬)"; "Dachen 26 (libChewing)" = "酷音大千二十六鍵排列"; -"DangerZone" = "禁區"; +"DangerZone" = "開發道場"; "Debug Mode" = "偵錯模式"; -"Dictionary" = "辭典"; +"Dictionary" = "辭典設定"; "Directly commit lowercased letters" = "直接遞交小寫字母"; "Directly commit uppercased letters" = "直接遞交大寫字母"; "Emulating select-candidate-per-character mode" = "模擬 90 年代前期注音逐字選字輸入風格"; @@ -135,12 +135,12 @@ "English" = "英語"; "Eten 26" = "倚天忘形排列 (26 鍵)"; "Eten Traditional" = "倚天傳統排列"; -"Experience" = "體驗"; +"Experience" = "體驗設定"; "Fake Seigyou" = "偽精業排列"; "Follow OS settings" = "依系統設定"; "for cycling candidates" = "輪替候選字"; "for cycling pages" = "輪替頁面"; -"General" = "通用"; +"General" = "通用設定"; "Hanyu Pinyin with Numeral Intonation" = "漢語拼音+數字標調"; "Horizontal" = "橫向佈局"; "Hsu" = "許氏國音自然排列"; @@ -149,7 +149,7 @@ "in front of the phrase (like macOS built-in Zhuyin IME)" = "將游標置於詞語前方 // macOS 內建注音風格"; "Japanese" = "和語"; "Keyboard Shortcuts:" = "鍵盤快速鍵:"; -"Keyboard" = "鍵盤"; +"Keyboard" = "鍵盤設定"; "Misc Settings:" = "雜項:"; "MiTAC" = "神通排列"; "Non-QWERTY alphanumerical keyboard layouts are for Hanyu Pinyin parser only." = "QWERTY 以外的英數佈局是為了漢語拼音排列使用者而準備的。"; From 58facbb8d30096c96c1f8c6976611ada5cc5f3d4 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sat, 13 Aug 2022 14:52:36 +0800 Subject: [PATCH 16/20] Repo // DangerZone -> DevZone. --- .../Resources/Base.lproj/Localizable.strings | 2 +- .../Contents.json | 4 +- .../DevZone.png} | Bin .../DevZone@2x.png} | Bin Source/Resources/en.lproj/Localizable.strings | 2 +- Source/Resources/ja.lproj/Localizable.strings | 2 +- .../zh-Hans.lproj/Localizable.strings | 2 +- .../zh-Hant.lproj/Localizable.strings | 2 +- Source/UI/PrefUI/ctlPrefUI.swift | 14 ++-- ...gerZone.swift => suiPrefPaneDevZone.swift} | 6 +- Source/WindowControllers/ctlPrefWindow.swift | 28 ++++---- .../WindowNIBs/Base.lproj/frmPrefWindow.xib | 63 +++++++++--------- .../WindowNIBs/en.lproj/frmPrefWindow.strings | 10 +-- .../WindowNIBs/ja.lproj/frmPrefWindow.strings | 10 +-- .../zh-Hans.lproj/frmPrefWindow.strings | 10 +-- .../zh-Hant.lproj/frmPrefWindow.strings | 10 +-- vChewing.xcodeproj/project.pbxproj | 8 +-- 17 files changed, 86 insertions(+), 87 deletions(-) rename Source/Resources/Images/Images.xcassets/{PrefToolbar-DangerZone.imageset => PrefToolbar-DevZone.imageset}/Contents.json (77%) rename Source/Resources/Images/Images.xcassets/{PrefToolbar-DangerZone.imageset/DangerZone.png => PrefToolbar-DevZone.imageset/DevZone.png} (100%) rename Source/Resources/Images/Images.xcassets/{PrefToolbar-DangerZone.imageset/DangerZone@2x.png => PrefToolbar-DevZone.imageset/DevZone@2x.png} (100%) rename Source/UI/PrefUI/{suiPrefPaneDangerZone.swift => suiPrefPaneDevZone.swift} (95%) diff --git a/Source/Resources/Base.lproj/Localizable.strings b/Source/Resources/Base.lproj/Localizable.strings index 173a3877..2c932b7a 100644 --- a/Source/Resources/Base.lproj/Localizable.strings +++ b/Source/Resources/Base.lproj/Localizable.strings @@ -123,8 +123,8 @@ "Cursor Selection:" = "Cursor Selection:"; "Dachen (Microsoft Standard / Wang / 01, etc.)" = "Dachen (Microsoft Standard / Wang / 01, etc.)"; "Dachen 26 (libChewing)" = "Dachen 26 (libChewing)"; -"DangerZone" = "DangerZone"; "Debug Mode" = "Debug Mode"; +"DevZone" = "DevZone"; "Dictionary" = "Dictionary"; "Directly commit lowercased letters" = "Directly commit lowercased letters"; "Directly commit uppercased letters" = "Directly commit uppercased letters"; diff --git a/Source/Resources/Images/Images.xcassets/PrefToolbar-DangerZone.imageset/Contents.json b/Source/Resources/Images/Images.xcassets/PrefToolbar-DevZone.imageset/Contents.json similarity index 77% rename from Source/Resources/Images/Images.xcassets/PrefToolbar-DangerZone.imageset/Contents.json rename to Source/Resources/Images/Images.xcassets/PrefToolbar-DevZone.imageset/Contents.json index f8fc6606..cc110c92 100644 --- a/Source/Resources/Images/Images.xcassets/PrefToolbar-DangerZone.imageset/Contents.json +++ b/Source/Resources/Images/Images.xcassets/PrefToolbar-DevZone.imageset/Contents.json @@ -1,12 +1,12 @@ { "images" : [ { - "filename" : "DangerZone.png", + "filename" : "DevZone.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "DangerZone@2x.png", + "filename" : "DevZone@2x.png", "idiom" : "universal", "scale" : "2x" }, diff --git a/Source/Resources/Images/Images.xcassets/PrefToolbar-DangerZone.imageset/DangerZone.png b/Source/Resources/Images/Images.xcassets/PrefToolbar-DevZone.imageset/DevZone.png similarity index 100% rename from Source/Resources/Images/Images.xcassets/PrefToolbar-DangerZone.imageset/DangerZone.png rename to Source/Resources/Images/Images.xcassets/PrefToolbar-DevZone.imageset/DevZone.png diff --git a/Source/Resources/Images/Images.xcassets/PrefToolbar-DangerZone.imageset/DangerZone@2x.png b/Source/Resources/Images/Images.xcassets/PrefToolbar-DevZone.imageset/DevZone@2x.png similarity index 100% rename from Source/Resources/Images/Images.xcassets/PrefToolbar-DangerZone.imageset/DangerZone@2x.png rename to Source/Resources/Images/Images.xcassets/PrefToolbar-DevZone.imageset/DevZone@2x.png diff --git a/Source/Resources/en.lproj/Localizable.strings b/Source/Resources/en.lproj/Localizable.strings index 173a3877..2c932b7a 100644 --- a/Source/Resources/en.lproj/Localizable.strings +++ b/Source/Resources/en.lproj/Localizable.strings @@ -123,8 +123,8 @@ "Cursor Selection:" = "Cursor Selection:"; "Dachen (Microsoft Standard / Wang / 01, etc.)" = "Dachen (Microsoft Standard / Wang / 01, etc.)"; "Dachen 26 (libChewing)" = "Dachen 26 (libChewing)"; -"DangerZone" = "DangerZone"; "Debug Mode" = "Debug Mode"; +"DevZone" = "DevZone"; "Dictionary" = "Dictionary"; "Directly commit lowercased letters" = "Directly commit lowercased letters"; "Directly commit uppercased letters" = "Directly commit uppercased letters"; diff --git a/Source/Resources/ja.lproj/Localizable.strings b/Source/Resources/ja.lproj/Localizable.strings index 7fadadcb..fa828be0 100644 --- a/Source/Resources/ja.lproj/Localizable.strings +++ b/Source/Resources/ja.lproj/Localizable.strings @@ -123,8 +123,8 @@ "Cursor Selection:" = "カーソル候補呼出:"; "Dachen (Microsoft Standard / Wang / 01, etc.)" = "大千配列 (Microsoft 標準・王安・零壹など)"; "Dachen 26 (libChewing)" = "酷音大千 26 キー配列"; -"DangerZone" = "開発道場"; "Debug Mode" = "欠陥辿着モード"; +"DevZone" = "開発道場"; "Dictionary" = "辞書設定"; "Directly commit lowercased letters" = "ローマ字(小文字)を直接出力"; "Directly commit uppercased letters" = "ローマ字(大文字)を直接出力"; diff --git a/Source/Resources/zh-Hans.lproj/Localizable.strings b/Source/Resources/zh-Hans.lproj/Localizable.strings index eef40180..89d3bbac 100644 --- a/Source/Resources/zh-Hans.lproj/Localizable.strings +++ b/Source/Resources/zh-Hans.lproj/Localizable.strings @@ -123,8 +123,8 @@ "Cursor Selection:" = "选字游标:"; "Dachen (Microsoft Standard / Wang / 01, etc.)" = "大千排列 (微软标准/王安/零壹/仲鼎/国乔)"; "Dachen 26 (libChewing)" = "酷音大千二十六键排列"; -"DangerZone" = "开发道场"; "Debug Mode" = "侦错模式"; +"DevZone" = "开发道场"; "Dictionary" = "辞典设定"; "Directly commit lowercased letters" = "直接递交小写字母"; "Directly commit uppercased letters" = "直接递交大写字母"; diff --git a/Source/Resources/zh-Hant.lproj/Localizable.strings b/Source/Resources/zh-Hant.lproj/Localizable.strings index c8efb011..929528f3 100644 --- a/Source/Resources/zh-Hant.lproj/Localizable.strings +++ b/Source/Resources/zh-Hant.lproj/Localizable.strings @@ -123,8 +123,8 @@ "Cursor Selection:" = "選字游標:"; "Dachen (Microsoft Standard / Wang / 01, etc.)" = "大千排列 (微軟標準/王安/零壹/仲鼎/國喬)"; "Dachen 26 (libChewing)" = "酷音大千二十六鍵排列"; -"DangerZone" = "開發道場"; "Debug Mode" = "偵錯模式"; +"DevZone" = "開發道場"; "Dictionary" = "辭典設定"; "Directly commit lowercased letters" = "直接遞交小寫字母"; "Directly commit uppercased letters" = "直接遞交大寫字母"; diff --git a/Source/UI/PrefUI/ctlPrefUI.swift b/Source/UI/PrefUI/ctlPrefUI.swift index b618153f..e78588e0 100644 --- a/Source/UI/PrefUI/ctlPrefUI.swift +++ b/Source/UI/PrefUI/ctlPrefUI.swift @@ -15,7 +15,7 @@ class ctlPrefUI { private(set) var tabImageExperiences: NSImage! = NSImage(named: "PrefToolbar-Experiences") private(set) var tabImageDictionary: NSImage! = NSImage(named: "PrefToolbar-Dictionary") private(set) var tabImageKeyboard: NSImage! = NSImage(named: "PrefToolbar-Keyboard") - private(set) var tabImageDangerZone: NSImage! = NSImage(named: "PrefToolbar-DangerZone") + private(set) var tabImageDevZone: NSImage! = NSImage(named: "PrefToolbar-DevZone") init() { if #available(macOS 11.0, *) { @@ -31,8 +31,8 @@ class ctlPrefUI { tabImageKeyboard = NSImage( systemSymbolName: "keyboard.macwindow", accessibilityDescription: "Keyboard Preferences" ) - tabImageDangerZone = NSImage( - systemSymbolName: "hand.raised.circle", accessibilityDescription: "DangerZone Preferences" + tabImageDevZone = NSImage( + systemSymbolName: "hand.raised.circle", accessibilityDescription: "DevZone Preferences" ) } } @@ -68,11 +68,11 @@ class ctlPrefUI { suiPrefPaneKeyboard() }, Preferences.Pane( - identifier: Preferences.PaneIdentifier(rawValue: "DangerZone"), - title: NSLocalizedString("DangerZone", comment: ""), - toolbarIcon: tabImageDangerZone + identifier: Preferences.PaneIdentifier(rawValue: "DevZone"), + title: NSLocalizedString("DevZone", comment: ""), + toolbarIcon: tabImageDevZone ) { - suiPrefPaneDangerZone() + suiPrefPaneDevZone() }, ], style: .toolbarItems diff --git a/Source/UI/PrefUI/suiPrefPaneDangerZone.swift b/Source/UI/PrefUI/suiPrefPaneDevZone.swift similarity index 95% rename from Source/UI/PrefUI/suiPrefPaneDangerZone.swift rename to Source/UI/PrefUI/suiPrefPaneDevZone.swift index 45965ca7..e6c125a4 100644 --- a/Source/UI/PrefUI/suiPrefPaneDangerZone.swift +++ b/Source/UI/PrefUI/suiPrefPaneDevZone.swift @@ -9,7 +9,7 @@ import SwiftUI @available(macOS 10.15, *) -struct suiPrefPaneDangerZone: View { +struct suiPrefPaneDevZone: View { @State private var selUseIMKCandidateWindow: Bool = UserDefaults.standard.bool( forKey: UserDef.kUseIMKCandidateWindow.rawValue) @State private var selHandleDefaultCandidateFontsByLangIdentifier: Bool = UserDefaults.standard.bool( @@ -62,8 +62,8 @@ struct suiPrefPaneDangerZone: View { } @available(macOS 11.0, *) -struct suiPrefPaneDangerZone_Previews: PreviewProvider { +struct suiPrefPaneDevZone_Previews: PreviewProvider { static var previews: some View { - suiPrefPaneDangerZone() + suiPrefPaneDevZone() } } diff --git a/Source/WindowControllers/ctlPrefWindow.swift b/Source/WindowControllers/ctlPrefWindow.swift index ef930057..01d01f3a 100644 --- a/Source/WindowControllers/ctlPrefWindow.swift +++ b/Source/WindowControllers/ctlPrefWindow.swift @@ -18,7 +18,7 @@ extension NSToolbarItem.Identifier { fileprivate static let ofExperience = NSToolbarItem.Identifier(rawValue: "tabExperience") fileprivate static let ofDictionary = NSToolbarItem.Identifier(rawValue: "tabDictionary") fileprivate static let ofKeyboard = NSToolbarItem.Identifier(rawValue: "tabKeyboard") - fileprivate static let ofDangerZone = NSToolbarItem.Identifier(rawValue: "tabDangerZone") + fileprivate static let ofDevZone = NSToolbarItem.Identifier(rawValue: "tabDevZone") } // Please note that the class should be exposed using the same class name @@ -33,13 +33,13 @@ class ctlPrefWindow: NSWindowController { @IBOutlet var chkTrad2KangXi: NSButton! @IBOutlet var chkTrad2JISShinjitai: NSButton! @IBOutlet var lblCurrentlySpecifiedUserDataFolder: NSTextFieldCell! - @IBOutlet var tglControlDangerZoneIMKCandidate: NSButton! + @IBOutlet var tglControlDevZoneIMKCandidate: NSButton! @IBOutlet var vwrGeneral: NSView! @IBOutlet var vwrExperience: NSView! @IBOutlet var vwrDictionary: NSView! @IBOutlet var vwrKeyboard: NSView! - @IBOutlet var vwrDangerZone: NSView! + @IBOutlet var vwrDevZone: NSView! var currentLanguageSelectItem: NSMenuItem? @@ -336,15 +336,15 @@ extension ctlPrefWindow: NSToolbarDelegate { } func toolbarDefaultItemIdentifiers(_: NSToolbar) -> [NSToolbarItem.Identifier] { - [.ofGeneral, .ofExperience, .ofDictionary, .ofKeyboard, .ofDangerZone] + [.ofGeneral, .ofExperience, .ofDictionary, .ofKeyboard, .ofDevZone] } func toolbarAllowedItemIdentifiers(_: NSToolbar) -> [NSToolbarItem.Identifier] { - [.ofGeneral, .ofExperience, .ofDictionary, .ofKeyboard, .ofDangerZone] + [.ofGeneral, .ofExperience, .ofDictionary, .ofKeyboard, .ofDevZone] } func toolbarSelectableItemIdentifiers(_: NSToolbar) -> [NSToolbarItem.Identifier] { - [.ofGeneral, .ofExperience, .ofDictionary, .ofKeyboard, .ofDangerZone] + [.ofGeneral, .ofExperience, .ofDictionary, .ofKeyboard, .ofDevZone] } @objc func showGeneralView(_: Any?) { @@ -367,9 +367,9 @@ extension ctlPrefWindow: NSToolbarDelegate { window?.toolbar?.selectedItemIdentifier = .ofKeyboard } - @objc func showDangerZOneView(_: Any?) { - use(view: vwrDangerZone) - window?.toolbar?.selectedItemIdentifier = .ofDangerZone + @objc func showDevZoneView(_: Any?) { + use(view: vwrDevZone) + window?.toolbar?.selectedItemIdentifier = .ofDevZone } func toolbar( @@ -425,17 +425,17 @@ extension ctlPrefWindow: NSToolbarDelegate { } item.action = #selector(showKeyboardView(_:)) - case .ofDangerZone: - let title = NSLocalizedString("DangerZone", comment: "") + case .ofDevZone: + let title = NSLocalizedString("DevZone", comment: "") item.label = title if #available(macOS 11.0, *) { item.image = NSImage( - systemSymbolName: "hand.raised.circle", accessibilityDescription: "DangerZone Preferences" + systemSymbolName: "hand.raised.circle", accessibilityDescription: "DevZone Preferences" ) } else { - item.image = NSImage(named: "PrefToolbar-DangerZone") + item.image = NSImage(named: "PrefToolbar-DevZone") } - item.action = #selector(showDangerZOneView(_:)) + item.action = #selector(showDevZoneView(_:)) default: return nil diff --git a/Source/WindowNIBs/Base.lproj/frmPrefWindow.xib b/Source/WindowNIBs/Base.lproj/frmPrefWindow.xib index ca62144d..ae6f1947 100644 --- a/Source/WindowNIBs/Base.lproj/frmPrefWindow.xib +++ b/Source/WindowNIBs/Base.lproj/frmPrefWindow.xib @@ -1,7 +1,6 @@ - @@ -14,9 +13,9 @@ - + - + @@ -1056,13 +1055,13 @@ - + - + - + Warning: This page is for testing future features. Features listed here may not work as expected. @@ -1073,12 +1072,12 @@ Features listed here may not work as expected. - - + - + - - + - + This only works since macOS 12 with non-IMK candidate window as an alternative wordaround of Apple Bug Report #FB10978412. Apple should patch that for macOS 11 and later. @@ -1122,24 +1121,24 @@ Features listed here may not work as expected. - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + diff --git a/Source/WindowNIBs/en.lproj/frmPrefWindow.strings b/Source/WindowNIBs/en.lproj/frmPrefWindow.strings index 7cbe385e..de36ffdf 100644 --- a/Source/WindowNIBs/en.lproj/frmPrefWindow.strings +++ b/Source/WindowNIBs/en.lproj/frmPrefWindow.strings @@ -63,6 +63,9 @@ "jQC-12-UuK.ibShadowedObjectValues[0]" = "Item 1"; "jQC-12-UuK.ibShadowedObjectValues[1]" = "Item 2"; "jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3"; +"lblDevZoneCandidateFont.title" = "This only works since macOS 12 with non-IMK candidate window as an alternative wordaround of Apple Bug Report #FB10978412. Apple should patch that for macOS 11 and later."; +"lblDevZoneIMKCandidate.title" = "Candidate selection keys are not yet available in IMK candidate window."; +"lblDevZoneTitleDescription.title" = "Warning: This page is for testing future features. \nFeatures listed here may not work as expected."; "lblUpperCaseLetterKeyBehavior.title" = "Choose the behavior of Shift+Letter key with letter inputs."; "Parser11.title" = "Secondary Pinyin with Numeral Intonation"; "Parser12.title" = "Yale Pinyin with Numeral Intonation"; @@ -78,6 +81,8 @@ "rVQ-Hx-cGi.title" = "Japanese"; "s7u-Fm-dVg.title" = "Cycling Pages"; "shc-Nu-UsM.title" = "Show page buttons in candidate list"; +"tglDevZoneCandidateFont.title" = "Use .langIdentifier to handle UI font in candidate window"; +"tglDevZoneIMKCandidate.title" = "Use IMK Candidate Window instead (will reboot the IME)"; "TXr-FF-ehw.title" = "Traditional Chinese"; "ueU-Rz-a1C.title" = "Choose the behavior of (Shift+)Tab key in the candidate window."; "VdT-fw-7pQ.title" = "Debug Mode"; @@ -102,8 +107,3 @@ "XqL-rf-X6d.title" = "Space to +cycle pages, Shift+Space to +cycle candidates"; "xrE-8T-WKO.label" = "Advanced"; "ZEv-Q2-mYL.title" = "Change user interface language (will reboot the IME)."; -"lblDangerZoneTitleDescription.title" = "Warning: This page is for testing future features. \nFeatures listed here may not work as expected."; -"tglDangerZoneIMKCandidate.title" = "Use IMK Candidate Window instead (will reboot the IME)"; -"lblDangerZoneIMKCandidate.title" = "Candidate selection keys are not yet available in IMK candidate window."; -"tglDangerZoneCandidateFont.title" = "Use .langIdentifier to handle UI font in candidate window"; -"lblDangerZoneCandidateFont.title" = "This only works since macOS 12 with non-IMK candidate window as an alternative wordaround of Apple Bug Report #FB10978412. Apple should patch that for macOS 11 and later."; diff --git a/Source/WindowNIBs/ja.lproj/frmPrefWindow.strings b/Source/WindowNIBs/ja.lproj/frmPrefWindow.strings index c6a77218..df2afb7e 100644 --- a/Source/WindowNIBs/ja.lproj/frmPrefWindow.strings +++ b/Source/WindowNIBs/ja.lproj/frmPrefWindow.strings @@ -63,6 +63,9 @@ "jQC-12-UuK.ibShadowedObjectValues[0]" = "Item 1"; "jQC-12-UuK.ibShadowedObjectValues[1]" = "Item 2"; "jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3"; +"lblDevZoneCandidateFont.title" = "これは Apple Bug Report #FB10978412 の臨時対策であり、macOS 12 からの macOS に効き、IMK 以外の候補陳列ウィンドウに作用する。Apple は macOS 11 からの macOS のために該当 Bug を修復すべきである。"; +"lblDevZoneIMKCandidate.title" = "IMK 候補陳列ウィンドウで言選り用キーは現時点で利用不可。"; +"lblDevZoneTitleDescription.title" = "警告:これからの新機能テストのために作ったページですから、\nここで陳列されている諸機能は予想通り動けるだと思わないでください。"; "lblUpperCaseLetterKeyBehavior.title" = "Shift+文字キーの行為をご指定ください。"; "Parser11.title" = "国音二式 (ローマ字+数字音調)"; "Parser12.title" = "イェール弁音 (ローマ字+数字音調)"; @@ -78,6 +81,8 @@ "rVQ-Hx-cGi.title" = "和語"; "s7u-Fm-dVg.title" = "ページ"; "shc-Nu-UsM.title" = "ページボタンを表示"; +"tglDevZoneCandidateFont.title" = "「.langIdentifier」を使って候補陳列ウィンドウのフォントを取り扱う"; +"tglDevZoneIMKCandidate.title" = "IMK 候補陳列ウィンドウを起用(入力アプリは自動的に再起動)"; "TXr-FF-ehw.title" = "繁体中国語"; "ueU-Rz-a1C.title" = "入力候補陳列での (Shift+)Tab キーの輪番切替対象をご指定ください。"; "VdT-fw-7pQ.title" = "欠陥辿着モード"; @@ -102,8 +107,3 @@ "XqL-rf-X6d.title" = "Space で次のページ、Shift+Space で次の候補文字を"; "xrE-8T-WKO.label" = "詳細"; "ZEv-Q2-mYL.title" = "アプリ表示用言語をご指定ください、そして入力アプリは自動的に再起動。"; -"lblDangerZoneTitleDescription.title" = "警告:これからの新機能テストのために作ったページですから、\nここで陳列されている諸機能は予想通り動けるだと思わないでください。"; -"tglDangerZoneIMKCandidate.title" = "IMK 候補陳列ウィンドウを起用(入力アプリは自動的に再起動)"; -"lblDangerZoneIMKCandidate.title" = "IMK 候補陳列ウィンドウで言選り用キーは現時点で利用不可。"; -"tglDangerZoneCandidateFont.title" = "「.langIdentifier」を使って候補陳列ウィンドウのフォントを取り扱う"; -"lblDangerZoneCandidateFont.title" = "これは Apple Bug Report #FB10978412 の臨時対策であり、macOS 12 からの macOS に効き、IMK 以外の候補陳列ウィンドウに作用する。Apple は macOS 11 からの macOS のために該当 Bug を修復すべきである。"; diff --git a/Source/WindowNIBs/zh-Hans.lproj/frmPrefWindow.strings b/Source/WindowNIBs/zh-Hans.lproj/frmPrefWindow.strings index dba709be..ac6836ef 100644 --- a/Source/WindowNIBs/zh-Hans.lproj/frmPrefWindow.strings +++ b/Source/WindowNIBs/zh-Hans.lproj/frmPrefWindow.strings @@ -63,6 +63,9 @@ "jQC-12-UuK.ibShadowedObjectValues[0]" = "Item 1"; "jQC-12-UuK.ibShadowedObjectValues[1]" = "Item 2"; "jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3"; +"lblDevZoneCandidateFont.title" = "该方法是 Apple Bug Report #FB10978412 的保守治疗方案,用来仅针对 macOS 12 开始的系统,且仅对非 IMK 选字窗起作用。Apple 应该对 macOS 11 开始的系统修复这个 Bug。"; +"lblDevZoneIMKCandidate.title" = "IMK 选字窗目前暂时无法正常使用选字键。"; +"lblDevZoneTitleDescription.title" = "警告:该页面仅作未来功能测试所用。\n在此列出的功能并非处于完全可用之状态。"; "lblUpperCaseLetterKeyBehavior.title" = "指定 Shift+字母键 的行为。"; "Parser11.title" = "国音二式+数字标调"; "Parser12.title" = "耶鲁拼音+数字标调"; @@ -78,6 +81,8 @@ "rVQ-Hx-cGi.title" = "和语"; "s7u-Fm-dVg.title" = "轮替页面"; "shc-Nu-UsM.title" = "在选字窗内显示翻页按钮"; +"tglDevZoneCandidateFont.title" = "使用 .langIdentifier 来管理选字窗的预设介面字型"; +"tglDevZoneIMKCandidate.title" = "启用 IMK 选字窗(会自动重启输入法)"; "TXr-FF-ehw.title" = "繁体中文"; "ueU-Rz-a1C.title" = "指定 (Shift+)Tab 热键在选字窗内的轮替操作对象。"; "VdT-fw-7pQ.title" = "侦错模式"; @@ -102,8 +107,3 @@ "XqL-rf-X6d.title" = "Space 换下一页,Shift+Space 换选下一个候选字。"; "xrE-8T-WKO.label" = "进阶"; "ZEv-Q2-mYL.title" = "变更使用者界面语言,会自动重新启动输入法。"; -"lblDangerZoneTitleDescription.title" = "警告:该页面仅作未来功能测试所用。\n在此列出的功能并非处于完全可用之状态。"; -"tglDangerZoneIMKCandidate.title" = "启用 IMK 选字窗(会自动重启输入法)"; -"lblDangerZoneIMKCandidate.title" = "IMK 选字窗目前暂时无法正常使用选字键。"; -"tglDangerZoneCandidateFont.title" = "使用 .langIdentifier 来管理选字窗的预设介面字型"; -"lblDangerZoneCandidateFont.title" = "该方法是 Apple Bug Report #FB10978412 的保守治疗方案,用来仅针对 macOS 12 开始的系统,且仅对非 IMK 选字窗起作用。Apple 应该对 macOS 11 开始的系统修复这个 Bug。"; diff --git a/Source/WindowNIBs/zh-Hant.lproj/frmPrefWindow.strings b/Source/WindowNIBs/zh-Hant.lproj/frmPrefWindow.strings index c0018f65..d3e56850 100644 --- a/Source/WindowNIBs/zh-Hant.lproj/frmPrefWindow.strings +++ b/Source/WindowNIBs/zh-Hant.lproj/frmPrefWindow.strings @@ -63,6 +63,9 @@ "jQC-12-UuK.ibShadowedObjectValues[0]" = "Item 1"; "jQC-12-UuK.ibShadowedObjectValues[1]" = "Item 2"; "jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3"; +"lblDevZoneCandidateFont.title" = "該方法是 Apple Bug Report #FB10978412 的保守治療方案,用來僅針對 macOS 12 開始的系統,且僅對非 IMK 選字窗起作用。Apple 應該對 macOS 11 開始的系統修復這個 Bug。"; +"lblDevZoneIMKCandidate.title" = "IMK 選字窗目前暫時無法正常使用選字鍵。"; +"lblDevZoneTitleDescription.title" = "警告:該頁面僅作未來功能測試所用。\n在此列出的功能並非處於完全可用之狀態。"; "lblUpperCaseLetterKeyBehavior.title" = "指定 Shift+字母鍵 的行為。"; "Parser11.title" = "國音二式+數字標調"; "Parser12.title" = "耶魯拼音+數字標調"; @@ -78,6 +81,8 @@ "rVQ-Hx-cGi.title" = "和語"; "s7u-Fm-dVg.title" = "輪替頁面"; "shc-Nu-UsM.title" = "在選字窗內顯示翻頁按鈕"; +"tglDevZoneCandidateFont.title" = "使用 .langIdentifier 來管理選字窗的預設介面字型"; +"tglDevZoneIMKCandidate.title" = "啟用 IMK 選字窗(會自動重啟輸入法)"; "TXr-FF-ehw.title" = "繁體中文"; "ueU-Rz-a1C.title" = "指定 (Shift+)Tab 熱鍵在選字窗內的輪替操作對象。"; "VdT-fw-7pQ.title" = "偵錯模式"; @@ -102,8 +107,3 @@ "XqL-rf-X6d.title" = "Space 換下一頁,Shift+Space 換選下一個候選字"; "xrE-8T-WKO.label" = "進階"; "ZEv-Q2-mYL.title" = "變更使用者介面語言,會自動重新啟動輸入法。"; -"lblDangerZoneTitleDescription.title" = "警告:該頁面僅作未來功能測試所用。\n在此列出的功能並非處於完全可用之狀態。"; -"tglDangerZoneIMKCandidate.title" = "啟用 IMK 選字窗(會自動重啟輸入法)"; -"lblDangerZoneIMKCandidate.title" = "IMK 選字窗目前暫時無法正常使用選字鍵。"; -"tglDangerZoneCandidateFont.title" = "使用 .langIdentifier 來管理選字窗的預設介面字型"; -"lblDangerZoneCandidateFont.title" = "該方法是 Apple Bug Report #FB10978412 的保守治療方案,用來僅針對 macOS 12 開始的系統,且僅對非 IMK 選字窗起作用。Apple 應該對 macOS 11 開始的系統修復這個 Bug。"; diff --git a/vChewing.xcodeproj/project.pbxproj b/vChewing.xcodeproj/project.pbxproj index 485bb6af..6cb45a0f 100644 --- a/vChewing.xcodeproj/project.pbxproj +++ b/vChewing.xcodeproj/project.pbxproj @@ -40,7 +40,7 @@ 5B62A35327AE89C400A19448 /* InputSourceHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B62A33127AE792F00A19448 /* InputSourceHelper.swift */; }; 5B73FB5E27B2BE1300E9BF49 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5B73FB6027B2BE1300E9BF49 /* InfoPlist.strings */; }; 5B782EC4280C243C007276DE /* KeyHandler_HandleCandidate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B782EC3280C243C007276DE /* KeyHandler_HandleCandidate.swift */; }; - 5B78EE0D28A562B4009456C1 /* suiPrefPaneDangerZone.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B78EE0C28A562B4009456C1 /* suiPrefPaneDangerZone.swift */; }; + 5B78EE0D28A562B4009456C1 /* suiPrefPaneDevZone.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B78EE0C28A562B4009456C1 /* suiPrefPaneDevZone.swift */; }; 5B7BC4B027AFFBE800F66C24 /* frmPrefWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5B7BC4AE27AFFBE800F66C24 /* frmPrefWindow.xib */; }; 5B7F225D2808501000DDD3CB /* KeyHandler_HandleInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B7F225C2808501000DDD3CB /* KeyHandler_HandleInput.swift */; }; 5B84579E2871AD2200C93B01 /* convdict.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5B84579C2871AD2200C93B01 /* convdict.plist */; }; @@ -247,7 +247,7 @@ 5B73FB5427B2BD6900E9BF49 /* PhraseEditor-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "PhraseEditor-Info.plist"; path = "UserPhraseEditor/PhraseEditor-Info.plist"; sourceTree = SOURCE_ROOT; }; 5B73FB5F27B2BE1300E9BF49 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 5B782EC3280C243C007276DE /* KeyHandler_HandleCandidate.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = KeyHandler_HandleCandidate.swift; sourceTree = ""; tabWidth = 2; usesTabs = 0; }; - 5B78EE0C28A562B4009456C1 /* suiPrefPaneDangerZone.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = suiPrefPaneDangerZone.swift; sourceTree = ""; }; + 5B78EE0C28A562B4009456C1 /* suiPrefPaneDevZone.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = suiPrefPaneDevZone.swift; sourceTree = ""; }; 5B7BC4AF27AFFBE800F66C24 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/frmPrefWindow.xib; sourceTree = ""; }; 5B7BC4B227AFFC0B00F66C24 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/frmPrefWindow.strings; sourceTree = ""; }; 5B7F225C2808501000DDD3CB /* KeyHandler_HandleInput.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = KeyHandler_HandleInput.swift; sourceTree = ""; tabWidth = 2; usesTabs = 0; }; @@ -654,7 +654,7 @@ isa = PBXGroup; children = ( 5BA9FD0C27FEDB6B002DE248 /* ctlPrefUI.swift */, - 5B78EE0C28A562B4009456C1 /* suiPrefPaneDangerZone.swift */, + 5B78EE0C28A562B4009456C1 /* suiPrefPaneDevZone.swift */, 5BA9FD0E27FEDB6B002DE248 /* suiPrefPaneDictionary.swift */, 5BA9FD0D27FEDB6B002DE248 /* suiPrefPaneExperience.swift */, 5BA9FD0A27FEDB6B002DE248 /* suiPrefPaneGeneral.swift */, @@ -1187,7 +1187,7 @@ 5B3A87BC28597CDB0090E163 /* LMSymbolNode.swift in Sources */, 5BA9FD4327FEF3C8002DE248 /* Preferences.swift in Sources */, 5BA9FD4427FEF3C8002DE248 /* SegmentedControlStyleViewController.swift in Sources */, - 5B78EE0D28A562B4009456C1 /* suiPrefPaneDangerZone.swift in Sources */, + 5B78EE0D28A562B4009456C1 /* suiPrefPaneDevZone.swift in Sources */, D47F7DCE278BFB57002F9DD7 /* ctlPrefWindow.swift in Sources */, 5BD0113D2818543900609769 /* KeyHandler_Core.swift in Sources */, 5B2170E4289FACAD00BE7304 /* 2_Walker.swift in Sources */, From 0a2ab43f54b2125d9165d8655a9f71ec629d1702 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sat, 13 Aug 2022 15:09:23 +0800 Subject: [PATCH 17/20] i18n // Typo fix. --- Source/Resources/Base.lproj/Localizable.strings | 2 +- Source/Resources/en.lproj/Localizable.strings | 2 +- Source/Resources/ja.lproj/Localizable.strings | 2 +- Source/Resources/zh-Hans.lproj/Localizable.strings | 2 +- Source/Resources/zh-Hant.lproj/Localizable.strings | 2 +- Source/UI/PrefUI/suiPrefPaneDevZone.swift | 2 +- Source/WindowNIBs/Base.lproj/frmPrefWindow.xib | 3 ++- Source/WindowNIBs/en.lproj/frmPrefWindow.strings | 2 +- 8 files changed, 9 insertions(+), 8 deletions(-) diff --git a/Source/Resources/Base.lproj/Localizable.strings b/Source/Resources/Base.lproj/Localizable.strings index 2c932b7a..4db7d243 100644 --- a/Source/Resources/Base.lproj/Localizable.strings +++ b/Source/Resources/Base.lproj/Localizable.strings @@ -174,7 +174,7 @@ "Typing Style:" = "Typing Style:"; "UI Language:" = "UI Language:"; "Universal Pinyin with Numeral Intonation" = "Universal Pinyin with Numeral Intonation"; -"Use .langIdentifier to handle UI font in candidate window" = "Use .langIdentifier to handle UI font in candidate window"; +"Use .langIdentifier to handle UI fonts in candidate window" = "Use .langIdentifier to handle UI fonts in candidate window"; "Use ESC key to clear the entire input buffer" = "Use ESC key to clear the entire input buffer"; "Use IMK Candidate Window instead (will reboot the IME)" = "Use IMK Candidate Window instead (will reboot the IME)"; "Vertical" = "Vertical"; diff --git a/Source/Resources/en.lproj/Localizable.strings b/Source/Resources/en.lproj/Localizable.strings index 2c932b7a..4db7d243 100644 --- a/Source/Resources/en.lproj/Localizable.strings +++ b/Source/Resources/en.lproj/Localizable.strings @@ -174,7 +174,7 @@ "Typing Style:" = "Typing Style:"; "UI Language:" = "UI Language:"; "Universal Pinyin with Numeral Intonation" = "Universal Pinyin with Numeral Intonation"; -"Use .langIdentifier to handle UI font in candidate window" = "Use .langIdentifier to handle UI font in candidate window"; +"Use .langIdentifier to handle UI fonts in candidate window" = "Use .langIdentifier to handle UI fonts in candidate window"; "Use ESC key to clear the entire input buffer" = "Use ESC key to clear the entire input buffer"; "Use IMK Candidate Window instead (will reboot the IME)" = "Use IMK Candidate Window instead (will reboot the IME)"; "Vertical" = "Vertical"; diff --git a/Source/Resources/ja.lproj/Localizable.strings b/Source/Resources/ja.lproj/Localizable.strings index fa828be0..871535a8 100644 --- a/Source/Resources/ja.lproj/Localizable.strings +++ b/Source/Resources/ja.lproj/Localizable.strings @@ -174,7 +174,7 @@ "Typing Style:" = "入力習慣:"; "UI Language:" = "表示用言語:"; "Universal Pinyin with Numeral Intonation" = "汎用弁音 (ローマ字+数字音調)"; -"Use .langIdentifier to handle UI font in candidate window" = "「.langIdentifier」を使って候補陳列ウィンドウのフォントを取り扱う"; +"Use .langIdentifier to handle UI fonts in candidate window" = "「.langIdentifier」を使って候補陳列ウィンドウのフォントを取り扱う"; "Use ESC key to clear the entire input buffer" = "ESC キーで入力緩衝列を消す"; "Use IMK Candidate Window instead (will reboot the IME)" = "IMK 候補陳列ウィンドウを起用(入力アプリは自動的に再起動)"; "Vertical" = "縦型陳列"; diff --git a/Source/Resources/zh-Hans.lproj/Localizable.strings b/Source/Resources/zh-Hans.lproj/Localizable.strings index 89d3bbac..ffd244f2 100644 --- a/Source/Resources/zh-Hans.lproj/Localizable.strings +++ b/Source/Resources/zh-Hans.lproj/Localizable.strings @@ -176,7 +176,7 @@ "UI Language:" = "介面语言:"; "Universal Pinyin with Numeral Intonation" = "通用拼音+数字标调"; "Universal Pinyin with Numeral Intonation" = "通用拼音+数字标调"; -"Use .langIdentifier to handle UI font in candidate window" = "使用 .langIdentifier 来管理选字窗的预设介面字型"; +"Use .langIdentifier to handle UI fonts in candidate window" = "使用 .langIdentifier 来管理选字窗的预设介面字型"; "Use ESC key to clear the entire input buffer" = "敲 ESC 键以清空整个组字缓冲区"; "Use IMK Candidate Window instead (will reboot the IME)" = "启用 IMK 选字窗(会自动重启输入法)"; "Vertical" = "纵向布局"; diff --git a/Source/Resources/zh-Hant.lproj/Localizable.strings b/Source/Resources/zh-Hant.lproj/Localizable.strings index 929528f3..7b905d5f 100644 --- a/Source/Resources/zh-Hant.lproj/Localizable.strings +++ b/Source/Resources/zh-Hant.lproj/Localizable.strings @@ -174,7 +174,7 @@ "Typing Style:" = "輸入風格:"; "UI Language:" = "介面語言:"; "Universal Pinyin with Numeral Intonation" = "通用拼音+數字標調"; -"Use .langIdentifier to handle UI font in candidate window" = "使用 .langIdentifier 來管理選字窗的預設介面字型"; +"Use .langIdentifier to handle UI fonts in candidate window" = "使用 .langIdentifier 來管理選字窗的預設介面字型"; "Use ESC key to clear the entire input buffer" = "敲 ESC 鍵以清空整個組字緩衝區"; "Use IMK Candidate Window instead (will reboot the IME)" = "啟用 IMK 選字窗(會自動重啟輸入法)"; "Vertical" = "縱向佈局"; diff --git a/Source/UI/PrefUI/suiPrefPaneDevZone.swift b/Source/UI/PrefUI/suiPrefPaneDevZone.swift index e6c125a4..6d0b26f8 100644 --- a/Source/UI/PrefUI/suiPrefPaneDevZone.swift +++ b/Source/UI/PrefUI/suiPrefPaneDevZone.swift @@ -45,7 +45,7 @@ struct suiPrefPaneDevZone: View { Text(LocalizedStringKey("Candidate selection keys are not yet available in IMK candidate window.")) .preferenceDescription().fixedSize(horizontal: false, vertical: true) Toggle( - LocalizedStringKey("Use .langIdentifier to handle UI font in candidate window"), + LocalizedStringKey("Use .langIdentifier to handle UI fonts in candidate window"), isOn: $selHandleDefaultCandidateFontsByLangIdentifier.onChange { mgrPrefs.handleDefaultCandidateFontsByLangIdentifier = selHandleDefaultCandidateFontsByLangIdentifier } diff --git a/Source/WindowNIBs/Base.lproj/frmPrefWindow.xib b/Source/WindowNIBs/Base.lproj/frmPrefWindow.xib index ae6f1947..bc98a6d7 100644 --- a/Source/WindowNIBs/Base.lproj/frmPrefWindow.xib +++ b/Source/WindowNIBs/Base.lproj/frmPrefWindow.xib @@ -1,6 +1,7 @@ + @@ -1099,7 +1100,7 @@ Features listed here may not work as expected. - + diff --git a/Source/WindowNIBs/en.lproj/frmPrefWindow.strings b/Source/WindowNIBs/en.lproj/frmPrefWindow.strings index de36ffdf..c6cea943 100644 --- a/Source/WindowNIBs/en.lproj/frmPrefWindow.strings +++ b/Source/WindowNIBs/en.lproj/frmPrefWindow.strings @@ -81,7 +81,7 @@ "rVQ-Hx-cGi.title" = "Japanese"; "s7u-Fm-dVg.title" = "Cycling Pages"; "shc-Nu-UsM.title" = "Show page buttons in candidate list"; -"tglDevZoneCandidateFont.title" = "Use .langIdentifier to handle UI font in candidate window"; +"tglDevZoneCandidateFont.title" = "Use .langIdentifier to handle UI fonts in candidate window"; "tglDevZoneIMKCandidate.title" = "Use IMK Candidate Window instead (will reboot the IME)"; "TXr-FF-ehw.title" = "Traditional Chinese"; "ueU-Rz-a1C.title" = "Choose the behavior of (Shift+)Tab key in the candidate window."; From b60578c0642c53b6b490e1b0e6279c14f2b26f47 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sat, 13 Aug 2022 15:05:51 +0800 Subject: [PATCH 18/20] i18n // Update descriptions regarding IMK candidate window. --- Source/Resources/Base.lproj/Localizable.strings | 2 +- Source/Resources/en.lproj/Localizable.strings | 2 +- Source/Resources/ja.lproj/Localizable.strings | 2 +- Source/Resources/zh-Hans.lproj/Localizable.strings | 2 +- Source/Resources/zh-Hant.lproj/Localizable.strings | 2 +- Source/UI/PrefUI/suiPrefPaneDevZone.swift | 2 +- Source/WindowNIBs/Base.lproj/frmPrefWindow.xib | 8 ++++---- Source/WindowNIBs/en.lproj/frmPrefWindow.strings | 2 +- Source/WindowNIBs/ja.lproj/frmPrefWindow.strings | 2 +- Source/WindowNIBs/zh-Hans.lproj/frmPrefWindow.strings | 2 +- Source/WindowNIBs/zh-Hant.lproj/frmPrefWindow.strings | 2 +- 11 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Source/Resources/Base.lproj/Localizable.strings b/Source/Resources/Base.lproj/Localizable.strings index 4db7d243..e936fe79 100644 --- a/Source/Resources/Base.lproj/Localizable.strings +++ b/Source/Resources/Base.lproj/Localizable.strings @@ -106,7 +106,6 @@ "Automatically reload user data files if changes detected" = "Automatically reload user data files if changes detected"; "Basic Keyboard Layout:" = "Basic Keyboard Layout:"; "Candidate Layout:" = "Candidate Layout:"; -"Candidate selection keys are not yet available in IMK candidate window." = "Candidate selection keys are not yet available in IMK candidate window."; "Candidate Size:" = "Candidate Size:"; "Change user interface language (will reboot the IME)." = "Change user interface language (will reboot the IME)."; "Check for updates automatically" = "Check for updates automatically"; @@ -146,6 +145,7 @@ "Hsu" = "Hsu"; "Hualuo Pinyin with Numeral Intonation" = "Hualuo Pinyin with Numeral Intonation"; "IBM" = "IBM"; +"IMK candidate window is plagued with issues like failed selection keys." = "IMK candidate window is plagued with issues like failed selection keys."; "in front of the phrase (like macOS built-in Zhuyin IME)" = "in front of the phrase (like macOS built-in Zhuyin IME)"; "Japanese" = "Japanese"; "Keyboard Shortcuts:" = "Keyboard Shortcuts:"; diff --git a/Source/Resources/en.lproj/Localizable.strings b/Source/Resources/en.lproj/Localizable.strings index 4db7d243..e936fe79 100644 --- a/Source/Resources/en.lproj/Localizable.strings +++ b/Source/Resources/en.lproj/Localizable.strings @@ -106,7 +106,6 @@ "Automatically reload user data files if changes detected" = "Automatically reload user data files if changes detected"; "Basic Keyboard Layout:" = "Basic Keyboard Layout:"; "Candidate Layout:" = "Candidate Layout:"; -"Candidate selection keys are not yet available in IMK candidate window." = "Candidate selection keys are not yet available in IMK candidate window."; "Candidate Size:" = "Candidate Size:"; "Change user interface language (will reboot the IME)." = "Change user interface language (will reboot the IME)."; "Check for updates automatically" = "Check for updates automatically"; @@ -146,6 +145,7 @@ "Hsu" = "Hsu"; "Hualuo Pinyin with Numeral Intonation" = "Hualuo Pinyin with Numeral Intonation"; "IBM" = "IBM"; +"IMK candidate window is plagued with issues like failed selection keys." = "IMK candidate window is plagued with issues like failed selection keys."; "in front of the phrase (like macOS built-in Zhuyin IME)" = "in front of the phrase (like macOS built-in Zhuyin IME)"; "Japanese" = "Japanese"; "Keyboard Shortcuts:" = "Keyboard Shortcuts:"; diff --git a/Source/Resources/ja.lproj/Localizable.strings b/Source/Resources/ja.lproj/Localizable.strings index 871535a8..ee1e49ad 100644 --- a/Source/Resources/ja.lproj/Localizable.strings +++ b/Source/Resources/ja.lproj/Localizable.strings @@ -106,7 +106,6 @@ "Automatically reload user data files if changes detected" = "ユーザー辞書データの変更を自動検出し、自動的に再読込"; "Basic Keyboard Layout:" = "基礎キーボード:"; "Candidate Layout:" = "入力候補陳列の仕様"; -"Candidate selection keys are not yet available in IMK candidate window." = "IMK 候補陳列ウィンドウで言選り用キーは現時点で利用不可。"; "Candidate Size:" = "候補文字の字号:"; "Change user interface language (will reboot the IME)." = "アプリ表示用言語をご指定下さい、そして入力アプリは自動的に再起動。"; "Check for updates automatically" = "アプリの更新通知を受く"; @@ -146,6 +145,7 @@ "Hsu" = "許氏国音自然配列"; "Hualuo Pinyin with Numeral Intonation" = "中華ローマ弁音 (ローマ字+数字音調)"; "IBM" = "IBM 配列"; +"IMK candidate window is plagued with issues like failed selection keys." = "IMK 候補陳列ウィンドウで言選り用キーは現時点で利用不可、尚他故障あり。"; "in front of the phrase (like macOS built-in Zhuyin IME)" = "単語の前で // macOS 内蔵注音入力のやり方"; "Japanese" = "和語"; "Keyboard Shortcuts:" = "ショートカット:"; diff --git a/Source/Resources/zh-Hans.lproj/Localizable.strings b/Source/Resources/zh-Hans.lproj/Localizable.strings index ffd244f2..805d740f 100644 --- a/Source/Resources/zh-Hans.lproj/Localizable.strings +++ b/Source/Resources/zh-Hans.lproj/Localizable.strings @@ -106,7 +106,6 @@ "Automatically reload user data files if changes detected" = "自动检测并载入使用者语汇档案变更"; "Basic Keyboard Layout:" = "基础键盘布局:"; "Candidate Layout:" = "候选字窗布局:"; -"Candidate selection keys are not yet available in IMK candidate window." = "IMK 选字窗目前暂时无法正常使用选字键。"; "Candidate Size:" = "候选字窗字号:"; "Change user interface language (will reboot the IME)." = "变更输入法介面语言,会自动重启输入法。"; "Check for updates automatically" = "自动检查软体更新"; @@ -147,6 +146,7 @@ "Hualuo Pinyin with Numeral Intonation" = "华罗拼音+数字标调"; "Hualuo Pinyin with Numeral Intonation" = "華羅拼音+数字标调"; "IBM" = "IBM 排列"; +"IMK candidate window is plagued with issues like failed selection keys." = "IMK 选字窗目前暂时无法正常使用选字键,并具其它未知故障。"; "in front of the phrase (like macOS built-in Zhuyin IME)" = "将游标置于词语前方 // macOS 内建注音风格"; "Japanese" = "和语"; "Keyboard Shortcuts:" = "键盘快捷键:"; diff --git a/Source/Resources/zh-Hant.lproj/Localizable.strings b/Source/Resources/zh-Hant.lproj/Localizable.strings index 7b905d5f..12e66a70 100644 --- a/Source/Resources/zh-Hant.lproj/Localizable.strings +++ b/Source/Resources/zh-Hant.lproj/Localizable.strings @@ -106,7 +106,6 @@ "Automatically reload user data files if changes detected" = "自動檢測並載入使用者語彙檔案變更"; "Basic Keyboard Layout:" = "基礎鍵盤佈局:"; "Candidate Layout:" = "候選字窗佈局:"; -"Candidate selection keys are not yet available in IMK candidate window." = "IMK 選字窗目前暫時無法正常使用選字鍵。"; "Candidate Size:" = "候選字窗字號:"; "Change user interface language (will reboot the IME)." = "變更輸入法介面語言,會自動重啟輸入法。"; "Check for updates automatically" = "自動檢查軟體更新"; @@ -146,6 +145,7 @@ "Hsu" = "許氏國音自然排列"; "Hualuo Pinyin with Numeral Intonation" = "華羅拼音+數字標調"; "IBM" = "IBM 排列"; +"IMK candidate window is plagued with issues like failed selection keys." = "IMK 選字窗目前暫時無法正常使用選字鍵,併具其它未知故障。"; "in front of the phrase (like macOS built-in Zhuyin IME)" = "將游標置於詞語前方 // macOS 內建注音風格"; "Japanese" = "和語"; "Keyboard Shortcuts:" = "鍵盤快速鍵:"; diff --git a/Source/UI/PrefUI/suiPrefPaneDevZone.swift b/Source/UI/PrefUI/suiPrefPaneDevZone.swift index 6d0b26f8..2f18036e 100644 --- a/Source/UI/PrefUI/suiPrefPaneDevZone.swift +++ b/Source/UI/PrefUI/suiPrefPaneDevZone.swift @@ -42,7 +42,7 @@ struct suiPrefPaneDevZone: View { mgrPrefs.useIMKCandidateWindow = selUseIMKCandidateWindow } ) - Text(LocalizedStringKey("Candidate selection keys are not yet available in IMK candidate window.")) + Text(LocalizedStringKey("IMK candidate window is plagued with issues like failed selection keys.")) .preferenceDescription().fixedSize(horizontal: false, vertical: true) Toggle( LocalizedStringKey("Use .langIdentifier to handle UI fonts in candidate window"), diff --git a/Source/WindowNIBs/Base.lproj/frmPrefWindow.xib b/Source/WindowNIBs/Base.lproj/frmPrefWindow.xib index bc98a6d7..1f8b3a0b 100644 --- a/Source/WindowNIBs/Base.lproj/frmPrefWindow.xib +++ b/Source/WindowNIBs/Base.lproj/frmPrefWindow.xib @@ -1088,15 +1088,15 @@ Features listed here may not work as expected. - - + + - + diff --git a/Source/WindowNIBs/en.lproj/frmPrefWindow.strings b/Source/WindowNIBs/en.lproj/frmPrefWindow.strings index c6cea943..9be7c456 100644 --- a/Source/WindowNIBs/en.lproj/frmPrefWindow.strings +++ b/Source/WindowNIBs/en.lproj/frmPrefWindow.strings @@ -64,7 +64,7 @@ "jQC-12-UuK.ibShadowedObjectValues[1]" = "Item 2"; "jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3"; "lblDevZoneCandidateFont.title" = "This only works since macOS 12 with non-IMK candidate window as an alternative wordaround of Apple Bug Report #FB10978412. Apple should patch that for macOS 11 and later."; -"lblDevZoneIMKCandidate.title" = "Candidate selection keys are not yet available in IMK candidate window."; +"lblDevZoneIMKCandidate.title" = "IMK candidate window is plagued with issues like failed selection keys."; "lblDevZoneTitleDescription.title" = "Warning: This page is for testing future features. \nFeatures listed here may not work as expected."; "lblUpperCaseLetterKeyBehavior.title" = "Choose the behavior of Shift+Letter key with letter inputs."; "Parser11.title" = "Secondary Pinyin with Numeral Intonation"; diff --git a/Source/WindowNIBs/ja.lproj/frmPrefWindow.strings b/Source/WindowNIBs/ja.lproj/frmPrefWindow.strings index df2afb7e..160876a7 100644 --- a/Source/WindowNIBs/ja.lproj/frmPrefWindow.strings +++ b/Source/WindowNIBs/ja.lproj/frmPrefWindow.strings @@ -64,7 +64,7 @@ "jQC-12-UuK.ibShadowedObjectValues[1]" = "Item 2"; "jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3"; "lblDevZoneCandidateFont.title" = "これは Apple Bug Report #FB10978412 の臨時対策であり、macOS 12 からの macOS に効き、IMK 以外の候補陳列ウィンドウに作用する。Apple は macOS 11 からの macOS のために該当 Bug を修復すべきである。"; -"lblDevZoneIMKCandidate.title" = "IMK 候補陳列ウィンドウで言選り用キーは現時点で利用不可。"; +"lblDevZoneIMKCandidate.title" = "IMK 候補陳列ウィンドウで言選り用キーは現時点で利用不可、尚他故障あり。"; "lblDevZoneTitleDescription.title" = "警告:これからの新機能テストのために作ったページですから、\nここで陳列されている諸機能は予想通り動けるだと思わないでください。"; "lblUpperCaseLetterKeyBehavior.title" = "Shift+文字キーの行為をご指定ください。"; "Parser11.title" = "国音二式 (ローマ字+数字音調)"; diff --git a/Source/WindowNIBs/zh-Hans.lproj/frmPrefWindow.strings b/Source/WindowNIBs/zh-Hans.lproj/frmPrefWindow.strings index ac6836ef..8d0f1877 100644 --- a/Source/WindowNIBs/zh-Hans.lproj/frmPrefWindow.strings +++ b/Source/WindowNIBs/zh-Hans.lproj/frmPrefWindow.strings @@ -64,7 +64,7 @@ "jQC-12-UuK.ibShadowedObjectValues[1]" = "Item 2"; "jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3"; "lblDevZoneCandidateFont.title" = "该方法是 Apple Bug Report #FB10978412 的保守治疗方案,用来仅针对 macOS 12 开始的系统,且仅对非 IMK 选字窗起作用。Apple 应该对 macOS 11 开始的系统修复这个 Bug。"; -"lblDevZoneIMKCandidate.title" = "IMK 选字窗目前暂时无法正常使用选字键。"; +"lblDevZoneIMKCandidate.title" = "IMK 选字窗目前暂时无法正常使用选字键,并具其它未知故障。"; "lblDevZoneTitleDescription.title" = "警告:该页面仅作未来功能测试所用。\n在此列出的功能并非处于完全可用之状态。"; "lblUpperCaseLetterKeyBehavior.title" = "指定 Shift+字母键 的行为。"; "Parser11.title" = "国音二式+数字标调"; diff --git a/Source/WindowNIBs/zh-Hant.lproj/frmPrefWindow.strings b/Source/WindowNIBs/zh-Hant.lproj/frmPrefWindow.strings index d3e56850..50c4cc90 100644 --- a/Source/WindowNIBs/zh-Hant.lproj/frmPrefWindow.strings +++ b/Source/WindowNIBs/zh-Hant.lproj/frmPrefWindow.strings @@ -64,7 +64,7 @@ "jQC-12-UuK.ibShadowedObjectValues[1]" = "Item 2"; "jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3"; "lblDevZoneCandidateFont.title" = "該方法是 Apple Bug Report #FB10978412 的保守治療方案,用來僅針對 macOS 12 開始的系統,且僅對非 IMK 選字窗起作用。Apple 應該對 macOS 11 開始的系統修復這個 Bug。"; -"lblDevZoneIMKCandidate.title" = "IMK 選字窗目前暫時無法正常使用選字鍵。"; +"lblDevZoneIMKCandidate.title" = "IMK 選字窗目前暫時無法正常使用選字鍵,併具其它未知故障。"; "lblDevZoneTitleDescription.title" = "警告:該頁面僅作未來功能測試所用。\n在此列出的功能並非處於完全可用之狀態。"; "lblUpperCaseLetterKeyBehavior.title" = "指定 Shift+字母鍵 的行為。"; "Parser11.title" = "國音二式+數字標調"; From 56c4be5fd3176775e38faf71d035a25f06646bf0 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sat, 13 Aug 2022 15:35:44 +0800 Subject: [PATCH 19/20] Update Data - 20220813 --- Source/Data | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Data b/Source/Data index 1daf4d57..3cb476e7 160000 --- a/Source/Data +++ b/Source/Data @@ -1 +1 @@ -Subproject commit 1daf4d576a248373889889213bea4bd3cbb4b5d4 +Subproject commit 3cb476e7c884198fe91ce7d7ccc1ac0e082e007e From 5db087008b1f1dea803525cc162dfcb5b949d3a9 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sat, 13 Aug 2022 15:39:37 +0800 Subject: [PATCH 20/20] Bump version to 1.9.2 Build 1992 --- Update-Info.plist | 4 ++-- vChewing.pkgproj | 2 +- vChewing.xcodeproj/project.pbxproj | 32 +++++++++++++++--------------- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Update-Info.plist b/Update-Info.plist index ebb02c01..9463db6d 100644 --- a/Update-Info.plist +++ b/Update-Info.plist @@ -3,9 +3,9 @@ CFBundleShortVersionString - 1.9.1 + 1.9.2 CFBundleVersion - 1991 + 1992 UpdateInfoEndpoint https://gitee.com/vchewing/vChewing-macOS/raw/main/Update-Info.plist UpdateInfoSite diff --git a/vChewing.pkgproj b/vChewing.pkgproj index 5f4a2a23..789a5002 100644 --- a/vChewing.pkgproj +++ b/vChewing.pkgproj @@ -726,7 +726,7 @@ USE_HFS+_COMPRESSION VERSION - 1.9.1 + 1.9.2 TYPE 0 diff --git a/vChewing.xcodeproj/project.pbxproj b/vChewing.xcodeproj/project.pbxproj index 6cb45a0f..7c959c59 100644 --- a/vChewing.xcodeproj/project.pbxproj +++ b/vChewing.xcodeproj/project.pbxproj @@ -1417,7 +1417,7 @@ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1991; + CURRENT_PROJECT_VERSION = 1992; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_PREPROCESSOR_DEFINITIONS = ( @@ -1427,7 +1427,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.9.1; + MARKETING_VERSION = 1.9.2; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewingTests; @@ -1456,13 +1456,13 @@ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1991; + CURRENT_PROJECT_VERSION = 1992; ENABLE_NS_ASSERTIONS = NO; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.9.1; + MARKETING_VERSION = 1.9.2; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewingTests; @@ -1493,7 +1493,7 @@ CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1991; + CURRENT_PROJECT_VERSION = 1992; DEAD_CODE_STRIPPING = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; @@ -1514,7 +1514,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 1.9.1; + MARKETING_VERSION = 1.9.2; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewing.vChewingPhraseEditor; @@ -1543,7 +1543,7 @@ CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1991; + CURRENT_PROJECT_VERSION = 1992; DEAD_CODE_STRIPPING = YES; ENABLE_NS_ASSERTIONS = NO; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1560,7 +1560,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 1.9.1; + MARKETING_VERSION = 1.9.2; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewing.vChewingPhraseEditor; @@ -1674,7 +1674,7 @@ CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1991; + CURRENT_PROJECT_VERSION = 1992; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = ""; @@ -1702,7 +1702,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 1.9.1; + MARKETING_VERSION = 1.9.2; ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.inputmethod.vChewing; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1729,7 +1729,7 @@ CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1991; + CURRENT_PROJECT_VERSION = 1992; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = ""; @@ -1751,7 +1751,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 1.9.1; + MARKETING_VERSION = 1.9.2; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.inputmethod.vChewing; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1773,7 +1773,7 @@ CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1991; + CURRENT_PROJECT_VERSION = 1992; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -1793,7 +1793,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 1.9.1; + MARKETING_VERSION = 1.9.2; ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = "org.atelierInmu.vChewing.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1815,7 +1815,7 @@ CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1991; + CURRENT_PROJECT_VERSION = 1992; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -1829,7 +1829,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 1.9.1; + MARKETING_VERSION = 1.9.2; PRODUCT_BUNDLE_IDENTIFIER = "org.atelierInmu.vChewing.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = "";