From d2686f0f99ac3a3bd27d8416f925851af5aba450 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sat, 29 Jan 2022 17:51:21 +0800 Subject: [PATCH 1/8] LMConsolidator // Regex Patch for proper match. - Previously it doesn't match non-break whitespace. --- Source/Engine/LanguageModel/LMConsolidator.mm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Source/Engine/LanguageModel/LMConsolidator.mm b/Source/Engine/LanguageModel/LMConsolidator.mm index bfba1f80..8e6593c1 100644 --- a/Source/Engine/LanguageModel/LMConsolidator.mm +++ b/Source/Engine/LanguageModel/LMConsolidator.mm @@ -49,11 +49,13 @@ bool LMConsolidator::ConsolidateContent(const char *path, bool shouldsort) { vecEntry.push_back(zfdBuffer); } // 第一遍 for 用來統整每行內的內容。 - regex sedCJKWhiteSpace(" "), sedWhiteSpace("\\s+"), sedLeadingSpace("^\\s"), sedTrailingSpace("\\s$"); // RegEx 先定義好。 + // regex sedCJKWhiteSpace("\\x{3000}"), sedNonBreakWhiteSpace("\\x{A0}"), sedWhiteSpace("\\s+"), sedLeadingSpace("^\\s"), sedTrailingSpace("\\s$"); // 這樣寫會導致輸入法敲不了任何字,推測 Xcode 13 支援的 cpp / objCpp 可能對某些 Regex 寫法有相容性問題。 + regex sedCJKWhiteSpace(" "), sedNonBreakWhiteSpace(" "), sedWhiteSpace("\\s+"), sedLeadingSpace("^\\s"), sedTrailingSpace("\\s$"); // RegEx 先定義好。 for(int i=0;i Date: Sat, 29 Jan 2022 15:04:21 +0800 Subject: [PATCH 2/8] Pref // Merging OOBE module into Pref module. --- Source/AppDelegate.swift | 2 +- Source/Engine/vChewing/clsOOBEDefaults.swift | 80 ---------- Source/InputMethodController.mm | 4 +- Source/PreferencesModule.swift | 159 +++++++++++++------ vChewing.xcodeproj/project.pbxproj | 4 - 5 files changed, 111 insertions(+), 138 deletions(-) delete mode 100644 Source/Engine/vChewing/clsOOBEDefaults.swift diff --git a/Source/AppDelegate.swift b/Source/AppDelegate.swift index c84206f8..0959b114 100644 --- a/Source/AppDelegate.swift +++ b/Source/AppDelegate.swift @@ -150,7 +150,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NonModalAlertWindowControlle LanguageModelManager.loadUserPhrases() LanguageModelManager.loadUserPhraseReplacement() - OOBE.setMissingDefaults() + Preferences.setMissingDefaults() // 只要使用者沒有勾選檢查更新、沒有主動做出要檢查更新的操作,就不要檢查更新。 if (UserDefaults.standard.object(forKey: kCheckUpdateAutomatically) != nil) == true { diff --git a/Source/Engine/vChewing/clsOOBEDefaults.swift b/Source/Engine/vChewing/clsOOBEDefaults.swift deleted file mode 100644 index 8e82b9c5..00000000 --- a/Source/Engine/vChewing/clsOOBEDefaults.swift +++ /dev/null @@ -1,80 +0,0 @@ -/* - * clsOOBEDefaults.swift - * - * Copyright 2021-2022 vChewing Project (3-Clause BSD License). - * Derived from 2011-2022 OpenVanilla Project (MIT License). - * Some rights reserved. See "LICENSE.TXT" for details. - */ - -import Cocoa - -private let kShouldNotFartInLieuOfBeep = "ShouldNotFartInLieuOfBeep" -private let kCheckUpdateAutomatically = "CheckUpdateAutomatically" -private let kCandidateListTextSize = "CandidateListTextSize" -private let kChooseCandidateUsingSpaceKey = "ChooseCandidateUsingSpaceKey" -private let kUseWinNT351BPMF = "UseWinNT351BPMF" -private let kSelectPhraseAfterCursorAsCandidate = "SelectPhraseAfterCursorAsCandidate" -private let kUseHorizontalCandidateList = "UseHorizontalCandidateList" -private let kCNS11643EnabledKey = "CNS11643Enabled" -private let kChineseConversionEnabledKey = "ChineseConversionEnabled" -private let kPhraseReplacementEnabledKey = "PhraseReplacementEnabled" - -@objc public class OOBE : NSObject { - - @objc public static func setMissingDefaults () { - // 既然 Preferences Module 的預設屬性不自動寫入 plist、而且還是 private,那這邊就先寫入了。 - - // 首次啟用輸入法時設定不要自動更新,免得在某些要隔絕外部網路連線的保密機構內觸犯資安規則。 - if UserDefaults.standard.object(forKey: kCheckUpdateAutomatically) == nil { - UserDefaults.standard.set(false, forKey: kCheckUpdateAutomatically) - UserDefaults.standard.synchronize() - } - - // 預設選字窗字詞文字尺寸,設成 18 剛剛好 - if UserDefaults.standard.object(forKey: kCandidateListTextSize) == nil { - UserDefaults.standard.set(Preferences.candidateListTextSize, forKey: kCandidateListTextSize) - } - - // 預設摁空格鍵來選字,所以設成 true - if UserDefaults.standard.object(forKey: kChooseCandidateUsingSpaceKey) == nil { - UserDefaults.standard.set(Preferences.chooseCandidateUsingSpace, forKey: kChooseCandidateUsingSpaceKey) - } - - // 預設禁用 WinNT351 風格的注音選字模式(就是每個字都要選的那種),所以設成 false - if UserDefaults.standard.object(forKey: kUseWinNT351BPMF) == nil { - UserDefaults.standard.set(Preferences.useWinNT351BPMF, forKey: kUseWinNT351BPMF) - } - - // 預設漢音風格選字,所以要設成 0 - if UserDefaults.standard.object(forKey: kSelectPhraseAfterCursorAsCandidate) == nil { - UserDefaults.standard.set(Preferences.selectPhraseAfterCursorAsCandidate, forKey: kSelectPhraseAfterCursorAsCandidate) - } - - // 預設橫向選字窗,不爽請自行改成縱向選字窗 - if UserDefaults.standard.object(forKey: kUseHorizontalCandidateList) == nil { - UserDefaults.standard.set(Preferences.useHorizontalCandidateList, forKey: kUseHorizontalCandidateList) - } - - // 預設停用全字庫支援 - if UserDefaults.standard.object(forKey: kCNS11643EnabledKey) == nil { - UserDefaults.standard.set(Preferences.cns11643Enabled, forKey: kCNS11643EnabledKey) - } - - // 預設停用繁體轉康熙模組 - if UserDefaults.standard.object(forKey: kChineseConversionEnabledKey) == nil { - UserDefaults.standard.set(Preferences.chineseConversionEnabled, forKey: kChineseConversionEnabledKey) - } - - // 預設停用自訂語彙置換 - if UserDefaults.standard.object(forKey: kPhraseReplacementEnabledKey) == nil { - UserDefaults.standard.set(Preferences.phraseReplacementEnabled, forKey: kPhraseReplacementEnabledKey) - } - - // 預設沒事不要在那裡放屁 - if UserDefaults.standard.object(forKey: kShouldNotFartInLieuOfBeep) == nil { - UserDefaults.standard.set(Preferences.shouldNotFartInLieuOfBeep, forKey: kShouldNotFartInLieuOfBeep) - } - - UserDefaults.standard.synchronize() - } -} diff --git a/Source/InputMethodController.mm b/Source/InputMethodController.mm index 6529b2f0..7f3303c5 100644 --- a/Source/InputMethodController.mm +++ b/Source/InputMethodController.mm @@ -182,7 +182,7 @@ static double FindHighestScore(const vector& nodes, double epsilon) - (void)activateServer:(id)client { // Write missing OOBE user plist entries. - [OOBE setMissingDefaults]; + [Preferences setMissingDefaults]; // Read user plist. [[NSUserDefaults standardUserDefaults] synchronize]; @@ -1493,7 +1493,7 @@ NS_INLINE size_t max(size_t a, size_t b) { return a > b ? a : b; } - (void)showPreferences:(id)sender { // Write missing OOBE user plist entries. - [OOBE setMissingDefaults]; + [Preferences setMissingDefaults]; // show the preferences panel, and also make the IME app itself the focus if ([IMKInputController instancesRespondToSelector:@selector(showPreferences:)]) { diff --git a/Source/PreferencesModule.swift b/Source/PreferencesModule.swift index cd6267df..593c2788 100644 --- a/Source/PreferencesModule.swift +++ b/Source/PreferencesModule.swift @@ -8,20 +8,21 @@ import Cocoa -private let kKeyboardLayoutPreferenceKey = "KeyboardLayout" -private let kBasisKeyboardLayoutPreferenceKey = "BasisKeyboardLayout" // alphanumeric ("ASCII") input basi -private let kFunctionKeyKeyboardLayoutPreferenceKey = "FunctionKeyKeyboardLayout" // alphanumeric ("ASCII") input basi -private let kFunctionKeyKeyboardLayoutOverrideIncludeShiftKey = "FunctionKeyKeyboardLayoutOverrideIncludeShift" // whether include shif -private let kCandidateListTextSizeKey = "CandidateListTextSize" -private let kAppleLanguagesPreferencesKey = "AppleLanguages" -private let kSelectPhraseAfterCursorAsCandidatePreferenceKey = "SelectPhraseAfterCursorAsCandidate" -private let kUseHorizontalCandidateListPreferenceKey = "UseHorizontalCandidateList" -private let kComposingBufferSizePreferenceKey = "ComposingBufferSize" -private let kChooseCandidateUsingSpaceKey = "ChooseCandidateUsingSpaceKey" -private let kCNS11643EnabledKey = "CNS11643Enabled" -private let kChineseConversionEnabledKey = "ChineseConversionEnabled" -private let kHalfWidthPunctuationEnabledKey = "HalfWidthPunctuationEnable" -private let kEscToCleanInputBufferKey = "EscToCleanInputBuffer" +private let kCheckUpdateAutomatically = "CheckUpdateAutomatically" +private let kKeyboardLayoutPreference = "KeyboardLayout" +private let kBasisKeyboardLayoutPreference = "BasisKeyboardLayout" +private let kFunctionKeyKeyboardLayoutPreference = "FunctionKeyKeyboardLayout" +private let kFunctionKeyKeyboardLayoutOverrideIncludeShift = "FunctionKeyKeyboardLayoutOverrideIncludeShift" +private let kCandidateListTextSize = "CandidateListTextSize" +private let kAppleLanguagesPreferences = "AppleLanguages" +private let kSelectPhraseAfterCursorAsCandidatePreference = "SelectPhraseAfterCursorAsCandidate" +private let kUseHorizontalCandidateListPreference = "UseHorizontalCandidateList" +private let kComposingBufferSizePreference = "ComposingBufferSize" +private let kChooseCandidateUsingSpace = "ChooseCandidateUsingSpaceKey" +private let kCNS11643Enabled = "CNS11643Enabled" +private let kChineseConversionEnabled = "ChineseConversionEnabled" +private let kHalfWidthPunctuationEnabled = "HalfWidthPunctuationEnable" +private let kEscToCleanInputBuffer = "EscToCleanInputBuffer" private let kUseWinNT351BPMF = "UseWinNT351BPMF" private let kMaxCandidateLength = "MaxCandidateLength" private let kShouldNotFartInLieuOfBeep = "ShouldNotFartInLieuOfBeep" @@ -29,8 +30,8 @@ private let kShouldNotFartInLieuOfBeep = "ShouldNotFartInLieuOfBeep" private let kCandidateTextFontName = "CandidateTextFontName" private let kCandidateKeyLabelFontName = "CandidateKeyLabelFontName" private let kCandidateKeys = "CandidateKeys" -private let kChineseConversionEngineKey = "ChineseConversionEngine" -private let kPhraseReplacementEnabledKey = "PhraseReplacementEnabled" +private let kChineseConversionEngine = "ChineseConversionEngine" +private let kPhraseReplacementEnabled = "PhraseReplacementEnabled" private let kDefaultCandidateListTextSize: CGFloat = 18 private let kMinKeyLabelSize: CGFloat = 10 @@ -168,62 +169,118 @@ struct ComposingBufferSize { @objc public class Preferences: NSObject { static func reset() { let defaults = UserDefaults.standard - defaults.removeObject(forKey: kKeyboardLayoutPreferenceKey) - defaults.removeObject(forKey: kBasisKeyboardLayoutPreferenceKey) - defaults.removeObject(forKey: kFunctionKeyKeyboardLayoutPreferenceKey) - defaults.removeObject(forKey: kFunctionKeyKeyboardLayoutOverrideIncludeShiftKey) - defaults.removeObject(forKey: kCandidateListTextSizeKey) - defaults.removeObject(forKey: kAppleLanguagesPreferencesKey) - defaults.removeObject(forKey: kSelectPhraseAfterCursorAsCandidatePreferenceKey) - defaults.removeObject(forKey: kUseHorizontalCandidateListPreferenceKey) - defaults.removeObject(forKey: kComposingBufferSizePreferenceKey) - defaults.removeObject(forKey: kChooseCandidateUsingSpaceKey) - defaults.removeObject(forKey: kCNS11643EnabledKey) - defaults.removeObject(forKey: kChineseConversionEnabledKey) - defaults.removeObject(forKey: kHalfWidthPunctuationEnabledKey) - defaults.removeObject(forKey: kEscToCleanInputBufferKey) + defaults.removeObject(forKey: kKeyboardLayoutPreference) + defaults.removeObject(forKey: kBasisKeyboardLayoutPreference) + defaults.removeObject(forKey: kFunctionKeyKeyboardLayoutPreference) + defaults.removeObject(forKey: kFunctionKeyKeyboardLayoutOverrideIncludeShift) + defaults.removeObject(forKey: kCandidateListTextSize) + defaults.removeObject(forKey: kAppleLanguagesPreferences) + defaults.removeObject(forKey: kSelectPhraseAfterCursorAsCandidatePreference) + defaults.removeObject(forKey: kUseHorizontalCandidateListPreference) + defaults.removeObject(forKey: kComposingBufferSizePreference) + defaults.removeObject(forKey: kChooseCandidateUsingSpace) + defaults.removeObject(forKey: kCNS11643Enabled) + defaults.removeObject(forKey: kChineseConversionEnabled) + defaults.removeObject(forKey: kHalfWidthPunctuationEnabled) + defaults.removeObject(forKey: kEscToCleanInputBuffer) defaults.removeObject(forKey: kCandidateTextFontName) defaults.removeObject(forKey: kCandidateKeyLabelFontName) defaults.removeObject(forKey: kCandidateKeys) - defaults.removeObject(forKey: kPhraseReplacementEnabledKey) - defaults.removeObject(forKey: kChineseConversionEngineKey) + defaults.removeObject(forKey: kPhraseReplacementEnabled) + defaults.removeObject(forKey: kChineseConversionEngine) defaults.removeObject(forKey: kUseWinNT351BPMF) defaults.removeObject(forKey: kMaxCandidateLength) defaults.removeObject(forKey: kShouldNotFartInLieuOfBeep) } - @UserDefault(key: kAppleLanguagesPreferencesKey, defaultValue: []) + @objc public static func setMissingDefaults () { + // 既然 Preferences Module 的預設屬性不自動寫入 plist、而且還是 private,那這邊就先寫入了。 + + // 首次啟用輸入法時設定不要自動更新,免得在某些要隔絕外部網路連線的保密機構內觸犯資安規則。 + if UserDefaults.standard.object(forKey: kCheckUpdateAutomatically) == nil { + UserDefaults.standard.set(false, forKey: kCheckUpdateAutomatically) + } + + // 預設選字窗字詞文字尺寸,設成 18 剛剛好 + if UserDefaults.standard.object(forKey: kCandidateListTextSize) == nil { + UserDefaults.standard.set(Preferences.candidateListTextSize, forKey: kCandidateListTextSize) + } + + // 預設摁空格鍵來選字,所以設成 true + if UserDefaults.standard.object(forKey: kChooseCandidateUsingSpace) == nil { + UserDefaults.standard.set(Preferences.chooseCandidateUsingSpace, forKey: kChooseCandidateUsingSpace) + } + + // 預設禁用 WinNT351 風格的注音選字模式(就是每個字都要選的那種),所以設成 false + if UserDefaults.standard.object(forKey: kUseWinNT351BPMF) == nil { + UserDefaults.standard.set(Preferences.useWinNT351BPMF, forKey: kUseWinNT351BPMF) + } + + // 預設漢音風格選字,所以要設成 0 + if UserDefaults.standard.object(forKey: kSelectPhraseAfterCursorAsCandidatePreference) == nil { + UserDefaults.standard.set(Preferences.selectPhraseAfterCursorAsCandidate, forKey: kSelectPhraseAfterCursorAsCandidatePreference) + } + + // 預設橫向選字窗,不爽請自行改成縱向選字窗 + if UserDefaults.standard.object(forKey: kUseHorizontalCandidateListPreference) == nil { + UserDefaults.standard.set(Preferences.useHorizontalCandidateList, forKey: kUseHorizontalCandidateListPreference) + } + + // 預設停用全字庫支援 + if UserDefaults.standard.object(forKey: kCNS11643Enabled) == nil { + UserDefaults.standard.set(Preferences.cns11643Enabled, forKey: kCNS11643Enabled) + } + + // 預設停用繁體轉康熙模組 + if UserDefaults.standard.object(forKey: kChineseConversionEnabled) == nil { + UserDefaults.standard.set(Preferences.chineseConversionEnabled, forKey: kChineseConversionEnabled) + } + + // 預設停用自訂語彙置換 + if UserDefaults.standard.object(forKey: kPhraseReplacementEnabled) == nil { + UserDefaults.standard.set(Preferences.phraseReplacementEnabled, forKey: kPhraseReplacementEnabled) + } + + // 預設沒事不要在那裡放屁 + if UserDefaults.standard.object(forKey: kShouldNotFartInLieuOfBeep) == nil { + UserDefaults.standard.set(Preferences.shouldNotFartInLieuOfBeep, forKey: kShouldNotFartInLieuOfBeep) + } + + UserDefaults.standard.synchronize() + } + + @UserDefault(key: kAppleLanguagesPreferences, defaultValue: []) @objc static var appleLanguages: Array - @UserDefault(key: kKeyboardLayoutPreferenceKey, defaultValue: 0) + @UserDefault(key: kKeyboardLayoutPreference, defaultValue: 0) @objc static var keyboardLayout: Int @objc static var keyboardLayoutName: String { (KeyboardLayout(rawValue: self.keyboardLayout) ?? KeyboardLayout.standard).name } - @UserDefault(key: kBasisKeyboardLayoutPreferenceKey, defaultValue: "com.apple.keylayout.US") + @UserDefault(key: kBasisKeyboardLayoutPreference, defaultValue: "com.apple.keylayout.US") @objc static var basisKeyboardLayout: String - @UserDefault(key: kFunctionKeyKeyboardLayoutPreferenceKey, defaultValue: "com.apple.keylayout.US") + @UserDefault(key: kFunctionKeyKeyboardLayoutPreference, defaultValue: "com.apple.keylayout.US") @objc static var functionKeyboardLayout: String - @UserDefault(key: kFunctionKeyKeyboardLayoutOverrideIncludeShiftKey, defaultValue: false) + @UserDefault(key: kFunctionKeyKeyboardLayoutOverrideIncludeShift, defaultValue: false) @objc static var functionKeyKeyboardLayoutOverrideIncludeShiftKey: Bool - @CandidateListTextSize(key: kCandidateListTextSizeKey) + @CandidateListTextSize(key: kCandidateListTextSize) @objc static var candidateListTextSize: CGFloat - @UserDefault(key: kSelectPhraseAfterCursorAsCandidatePreferenceKey, defaultValue: false) + @UserDefault(key: kSelectPhraseAfterCursorAsCandidatePreference, defaultValue: false) @objc static var selectPhraseAfterCursorAsCandidate: Bool - @UserDefault(key: kUseHorizontalCandidateListPreferenceKey, defaultValue: true) + @UserDefault(key: kUseHorizontalCandidateListPreference, defaultValue: true) @objc static var useHorizontalCandidateList: Bool - @ComposingBufferSize(key: kComposingBufferSizePreferenceKey) + @ComposingBufferSize(key: kComposingBufferSizePreference) @objc static var composingBufferSize: Int - @UserDefault(key: kChooseCandidateUsingSpaceKey, defaultValue: true) + @UserDefault(key: kChooseCandidateUsingSpace, defaultValue: true) @objc static var chooseCandidateUsingSpace: Bool @UserDefault(key: kUseWinNT351BPMF, defaultValue: false) @@ -247,25 +304,25 @@ struct ComposingBufferSize { return shouldNotFartInLieuOfBeep } - @UserDefault(key: kCNS11643EnabledKey, defaultValue: false) + @UserDefault(key: kCNS11643Enabled, defaultValue: false) @objc static var cns11643Enabled: Bool @objc static func toggleCNS11643Enabled() -> Bool { cns11643Enabled = !cns11643Enabled - UserDefaults.standard.set(cns11643Enabled, forKey: kCNS11643EnabledKey) + UserDefaults.standard.set(cns11643Enabled, forKey: kCNS11643Enabled) return cns11643Enabled } - @UserDefault(key: kChineseConversionEnabledKey, defaultValue: false) + @UserDefault(key: kChineseConversionEnabled, defaultValue: false) @objc static var chineseConversionEnabled: Bool @objc static func toggleChineseConversionEnabled() -> Bool { chineseConversionEnabled = !chineseConversionEnabled - UserDefaults.standard.set(chineseConversionEnabled, forKey: kChineseConversionEnabledKey) + UserDefaults.standard.set(chineseConversionEnabled, forKey: kChineseConversionEnabled) return chineseConversionEnabled } - @UserDefault(key: kHalfWidthPunctuationEnabledKey, defaultValue: false) + @UserDefault(key: kHalfWidthPunctuationEnabled, defaultValue: false) @objc static var halfWidthPunctuationEnabled: Bool @objc static func toggleHalfWidthPunctuationEnabled() -> Bool { @@ -273,7 +330,7 @@ struct ComposingBufferSize { return halfWidthPunctuationEnabled } - @UserDefault(key: kEscToCleanInputBufferKey, defaultValue: true) + @UserDefault(key: kEscToCleanInputBuffer, defaultValue: true) @objc static var escToCleanInputBuffer: Bool // MARK: Optional settings @@ -343,19 +400,19 @@ struct ComposingBufferSize { } - @UserDefault(key: kChineseConversionEngineKey, defaultValue: 0) + @UserDefault(key: kChineseConversionEngine, defaultValue: 0) @objc static var chineseConversionEngine: Int @objc static var chineseConversionEngineName: String? { return ChineseConversionEngine(rawValue: chineseConversionEngine)?.name } - @UserDefault(key: kPhraseReplacementEnabledKey, defaultValue: false) + @UserDefault(key: kPhraseReplacementEnabled, defaultValue: false) @objc static var phraseReplacementEnabled: Bool @objc static func togglePhraseReplacementEnabled() -> Bool { phraseReplacementEnabled = !phraseReplacementEnabled - UserDefaults.standard.set(phraseReplacementEnabled, forKey: kPhraseReplacementEnabledKey) + UserDefaults.standard.set(phraseReplacementEnabled, forKey: kPhraseReplacementEnabled) return phraseReplacementEnabled } } diff --git a/vChewing.xcodeproj/project.pbxproj b/vChewing.xcodeproj/project.pbxproj index d171ee00..79091b13 100644 --- a/vChewing.xcodeproj/project.pbxproj +++ b/vChewing.xcodeproj/project.pbxproj @@ -31,7 +31,6 @@ 5BD0D19427940E9D0008F48E /* Fart.aif in Resources */ = {isa = PBXBuildFile; fileRef = 5BD0D19327940E9D0008F48E /* Fart.aif */; }; 5BD0D19A27943D390008F48E /* clsSFX.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BD0D19927943D390008F48E /* clsSFX.swift */; }; 5BD0D19F279454F60008F48E /* Beep.aif in Resources */ = {isa = PBXBuildFile; fileRef = 5BD0D19E279454F60008F48E /* Beep.aif */; }; - 5BD0D1A4279463510008F48E /* clsOOBEDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BD0D1A3279463510008F48E /* clsOOBEDefaults.swift */; }; 5BD13F482794F0A6000E429F /* PhraseReplacementMap.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5B6797B42794822C004AC7CE /* PhraseReplacementMap.mm */; }; 5BDD25F2279D65CC00AA18F8 /* UNICHARS.zip in Resources */ = {isa = PBXBuildFile; fileRef = 5BDD25F1279D65CB00AA18F8 /* UNICHARS.zip */; }; 5BDD25F4279D678600AA18F8 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 5BDD25F3279D677F00AA18F8 /* libz.tbd */; }; @@ -146,7 +145,6 @@ 5BD0D19327940E9D0008F48E /* Fart.aif */ = {isa = PBXFileReference; lastKnownFileType = file; path = Fart.aif; sourceTree = ""; }; 5BD0D19927943D390008F48E /* clsSFX.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = clsSFX.swift; sourceTree = ""; }; 5BD0D19E279454F60008F48E /* Beep.aif */ = {isa = PBXFileReference; lastKnownFileType = file; path = Beep.aif; sourceTree = ""; }; - 5BD0D1A3279463510008F48E /* clsOOBEDefaults.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = clsOOBEDefaults.swift; sourceTree = ""; }; 5BDD25E2279D64FB00AA18F8 /* AWFileHash.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AWFileHash.h; sourceTree = ""; }; 5BDD25E3279D64FB00AA18F8 /* AWFileHash.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AWFileHash.m; sourceTree = ""; }; 5BDD25E6279D64FB00AA18F8 /* unzip.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = unzip.m; sourceTree = ""; }; @@ -275,7 +273,6 @@ children = ( 5BC2D2842793B434002C0BEC /* KeyValueBlobReader.h */, 5BC2D2862793B434002C0BEC /* KeyValueBlobReader.cpp */, - 5BD0D1A3279463510008F48E /* clsOOBEDefaults.swift */, ); path = vChewing; sourceTree = ""; @@ -729,7 +726,6 @@ 5BC3EE1B278FC48C00F5E44C /* VerticalCandidateController.swift in Sources */, 5B42B64027876FDC00BB9B9F /* UserOverrideModel.mm in Sources */, 5BDD25F7279D6D1200AA18F8 /* unzip.m in Sources */, - 5BD0D1A4279463510008F48E /* clsOOBEDefaults.swift in Sources */, D427A9C125ED28CC005D43E0 /* OpenCCBridge.swift in Sources */, 6A0D4F4515FC0EB100ABF4B3 /* Mandarin.mm in Sources */, 5B6797B52794822C004AC7CE /* PhraseReplacementMap.h in Sources */, From 5ef1aab92ed5581fe20a6f3013d38a5850eec058 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sat, 29 Jan 2022 17:01:26 +0800 Subject: [PATCH 3/8] Pref // WindowNIB changes (localized). --- Source/Base.lproj/preferences.xib | 55 +++++++++++++++++++++++- Source/en.lproj/preferences.strings | 13 +++++- Source/ja.lproj/preferences.strings | 13 +++++- Source/zh-Hans.lproj/preferences.strings | 13 +++++- Source/zh-Hant.lproj/preferences.strings | 13 +++++- 5 files changed, 97 insertions(+), 10 deletions(-) diff --git a/Source/Base.lproj/preferences.xib b/Source/Base.lproj/preferences.xib index 8d6483fd..38e9ef40 100644 --- a/Source/Base.lproj/preferences.xib +++ b/Source/Base.lproj/preferences.xib @@ -459,21 +459,72 @@ - + - + + + + + + + + + + + + + diff --git a/Source/en.lproj/preferences.strings b/Source/en.lproj/preferences.strings index 54ad44cf..40345575 100644 --- a/Source/en.lproj/preferences.strings +++ b/Source/en.lproj/preferences.strings @@ -125,6 +125,9 @@ /* Class = "NSTabViewItem"; label = "Dictionary"; ObjectID = "ISh-Da-hKv"; */ "ISh-Da-hKv.label" = "Dictionary"; +/* Class = "NSButtonCell"; title = "Sort entries when reloading user phrases and excluded phrases list"; ObjectID = "Li3-Yg-SOC"; */ +"Li3-Yg-SOC.title" = "Sort entries when reloading user phrases and excluded phrases list"; + /* Class = "NSTabViewItem"; label = "General"; ObjectID = "QUQ-oY-4Hc"; */ "QUQ-oY-4Hc.label" = "General"; @@ -155,11 +158,14 @@ /* Class = "NSButtonCell"; title = "Press ESC key clears entire input buffer"; ObjectID = "f2j-xD-4xK"; */ "f2j-xD-4xK.title" = "Press ESC key clears entire input buffer"; +/* Class = "NSButtonCell"; title = "Automatically reload user data files if changes detected"; ObjectID = "f8i-69-zxm"; */ +"f8i-69-zxm.title" = "Automatically reload user data files if changes detected"; + /* Class = "NSTextFieldCell"; title = "Change UI font size of candidate window for a better visual clarity."; ObjectID = "iRg-wx-Nx2"; */ "iRg-wx-Nx2.title" = "Change UI font size of candidate window for a better visual clarity."; -/* Class = "NSTextFieldCell"; title = "This dictionary page is under development."; ObjectID = "j48-5a-cEs"; */ -"j48-5a-cEs.title" = "This dictionary page is under development."; +/* Class = "NSTextFieldCell"; title = "Define your preferred action when user data files reload."; ObjectID = "j48-5a-cEs"; */ +"j48-5a-cEs.title" = "Define your preferred action when user data files reload."; /* Class = "NSComboBoxCell"; jQC-12-UuK.ibShadowedObjectValues[0] = "Item 1"; ObjectID = "jQC-12-UuK"; */ "jQC-12-UuK.ibShadowedObjectValues[0]" = "Item 1"; @@ -170,6 +176,9 @@ /* Class = "NSComboBoxCell"; jQC-12-UuK.ibShadowedObjectValues[2] = "Item 3"; ObjectID = "jQC-12-UuK"; */ "jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3"; +/* Class = "NSButtonCell"; title = "Sort entries when reloading the phrase replacement map"; ObjectID = "o60-vW-i1B"; */ +"o60-vW-i1B.title" = "Sort entries when reloading the phrase replacement map"; + /* Class = "NSMenuItem"; title = "Japanese"; ObjectID = "rVQ-Hx-cGi"; */ "rVQ-Hx-cGi.title" = "Japanese"; diff --git a/Source/ja.lproj/preferences.strings b/Source/ja.lproj/preferences.strings index ffedad7f..f34ebbb3 100644 --- a/Source/ja.lproj/preferences.strings +++ b/Source/ja.lproj/preferences.strings @@ -125,6 +125,9 @@ /* Class = "NSTabViewItem"; label = "Dictionary"; ObjectID = "ISh-Da-hKv"; */ "ISh-Da-hKv.label" = "辞書"; +/* Class = "NSButtonCell"; title = "Sort entries when reloading user phrases and excluded phrases list"; ObjectID = "Li3-Yg-SOC"; */ +"Li3-Yg-SOC.title" = "ユーザー辞書と条目排除表を読み込むときに、内容の順番を整う"; + /* Class = "NSTabViewItem"; label = "General"; ObjectID = "QUQ-oY-4Hc"; */ "QUQ-oY-4Hc.label" = "全般"; @@ -155,11 +158,14 @@ /* Class = "NSButtonCell"; title = "Press ESC key clears entire input buffer"; ObjectID = "f2j-xD-4xK"; */ "f2j-xD-4xK.title" = "ESC キーで入力緩衝列を消す"; +/* Class = "NSButtonCell"; title = "Automatically reload user data files if changes detected"; ObjectID = "f8i-69-zxm"; */ +"f8i-69-zxm.title" = "変更されたユーザー辞書データを自動的に再読込"; + /* Class = "NSTextFieldCell"; title = "Change UI font size of candidate window for a better visual clarity."; ObjectID = "iRg-wx-Nx2"; */ "iRg-wx-Nx2.title" = "入力候補陣列の候補文字の字号をご指定ください。"; -/* Class = "NSTextFieldCell"; title = "This dictionary page is under development."; ObjectID = "j48-5a-cEs"; */ -"j48-5a-cEs.title" = "このページの機能はまだまだ施工中ですが……"; +/* Class = "NSTextFieldCell"; title = "Define your preferred action when user data files reload."; ObjectID = "j48-5a-cEs"; */ +"j48-5a-cEs.title" = "ユーザー辞書データの読み込む時のやることをご指示ください。"; /* Class = "NSComboBoxCell"; jQC-12-UuK.ibShadowedObjectValues[0] = "Item 1"; ObjectID = "jQC-12-UuK"; */ "jQC-12-UuK.ibShadowedObjectValues[0]" = "Item 1"; @@ -170,6 +176,9 @@ /* Class = "NSComboBoxCell"; jQC-12-UuK.ibShadowedObjectValues[2] = "Item 3"; ObjectID = "jQC-12-UuK"; */ "jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3"; +/* Class = "NSButtonCell"; title = "Sort entries when reloading the phrase replacement map"; ObjectID = "o60-vW-i1B"; */ +"o60-vW-i1B.title" = "言葉置換表を読み込むときに、内容の順番を整う"; + /* Class = "NSMenuItem"; title = "Japanese"; ObjectID = "rVQ-Hx-cGi"; */ "rVQ-Hx-cGi.title" = "和語"; diff --git a/Source/zh-Hans.lproj/preferences.strings b/Source/zh-Hans.lproj/preferences.strings index 37951c0d..3ba951d5 100644 --- a/Source/zh-Hans.lproj/preferences.strings +++ b/Source/zh-Hans.lproj/preferences.strings @@ -125,6 +125,9 @@ /* Class = "NSTabViewItem"; label = "Dictionary"; ObjectID = "ISh-Da-hKv"; */ "ISh-Da-hKv.label" = "辞典"; +/* Class = "NSButtonCell"; title = "Sort entries when reloading user phrases and excluded phrases list"; ObjectID = "Li3-Yg-SOC"; */ +"Li3-Yg-SOC.title" = "在重新载入自订语汇与滤除语汇时,统整档案内容排序"; + /* Class = "NSTabViewItem"; label = "General"; ObjectID = "QUQ-oY-4Hc"; */ "QUQ-oY-4Hc.label" = "一般"; @@ -155,11 +158,14 @@ /* Class = "NSButtonCell"; title = "Press ESC key clears entire input buffer"; ObjectID = "f2j-xD-4xK"; */ "f2j-xD-4xK.title" = "敲 ESC 键以清空整个输入缓冲区"; +/* Class = "NSButtonCell"; title = "Automatically reload user data files if changes detected"; ObjectID = "f8i-69-zxm"; */ +"f8i-69-zxm.title" = "自动重新载入变更过的使用者数据内容"; + /* Class = "NSTextFieldCell"; title = "Change UI font size of candidate window for a better visual clarity."; ObjectID = "iRg-wx-Nx2"; */ "iRg-wx-Nx2.title" = "变更候选字窗的字型大小。"; -/* Class = "NSTextFieldCell"; title = "This dictionary page is under development."; ObjectID = "j48-5a-cEs"; */ -"j48-5a-cEs.title" = "该辞典页面相关功能正在施工。"; +/* Class = "NSTextFieldCell"; title = "Define your preferred action when user data files reload."; ObjectID = "j48-5a-cEs"; */ +"j48-5a-cEs.title" = "請指定在使用者數據重載時要啟用的功能。"; /* Class = "NSComboBoxCell"; jQC-12-UuK.ibShadowedObjectValues[0] = "Item 1"; ObjectID = "jQC-12-UuK"; */ "jQC-12-UuK.ibShadowedObjectValues[0]" = "Item 1"; @@ -170,6 +176,9 @@ /* Class = "NSComboBoxCell"; jQC-12-UuK.ibShadowedObjectValues[2] = "Item 3"; ObjectID = "jQC-12-UuK"; */ "jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3"; +/* Class = "NSButtonCell"; title = "Sort entries when reloading the phrase replacement map"; ObjectID = "o60-vW-i1B"; */ +"o60-vW-i1B.title" = "在重新载入语汇滤除表时,统整档案内容排序"; + /* Class = "NSMenuItem"; title = "Japanese"; ObjectID = "rVQ-Hx-cGi"; */ "rVQ-Hx-cGi.title" = "和语"; diff --git a/Source/zh-Hant.lproj/preferences.strings b/Source/zh-Hant.lproj/preferences.strings index a894f35b..35d926a9 100644 --- a/Source/zh-Hant.lproj/preferences.strings +++ b/Source/zh-Hant.lproj/preferences.strings @@ -125,6 +125,9 @@ /* Class = "NSTabViewItem"; label = "Dictionary"; ObjectID = "ISh-Da-hKv"; */ "ISh-Da-hKv.label" = "辭典"; +/* Class = "NSButtonCell"; title = "Sort entries when reloading user phrases and excluded phrases list"; ObjectID = "Li3-Yg-SOC"; */ +"Li3-Yg-SOC.title" = "在重新載入自訂語彙與濾除語彙時,統整檔案內容排序"; + /* Class = "NSTabViewItem"; label = "General"; ObjectID = "QUQ-oY-4Hc"; */ "QUQ-oY-4Hc.label" = "一般"; @@ -155,11 +158,14 @@ /* Class = "NSButtonCell"; title = "Press ESC key clears entire input buffer"; ObjectID = "f2j-xD-4xK"; */ "f2j-xD-4xK.title" = "敲 ESC 鍵以清空整個輸入緩衝區"; +/* Class = "NSButtonCell"; title = "Automatically reload user data files if changes detected"; ObjectID = "f8i-69-zxm"; */ +"f8i-69-zxm.title" = "自動重新載入變更過的使用者數據內容"; + /* Class = "NSTextFieldCell"; title = "Change UI font size of candidate window for a better visual clarity."; ObjectID = "iRg-wx-Nx2"; */ "iRg-wx-Nx2.title" = "變更候選字窗的字型大小。"; -/* Class = "NSTextFieldCell"; title = "This dictionary page is under development."; ObjectID = "j48-5a-cEs"; */ -"j48-5a-cEs.title" = "該辭典頁面相關功能正在施工。"; +/* Class = "NSTextFieldCell"; title = "Define your preferred action when user data files reload."; ObjectID = "j48-5a-cEs"; */ +"j48-5a-cEs.title" = "請指定在使用者數據重載時要啟用的功能。"; /* Class = "NSComboBoxCell"; jQC-12-UuK.ibShadowedObjectValues[0] = "Item 1"; ObjectID = "jQC-12-UuK"; */ "jQC-12-UuK.ibShadowedObjectValues[0]" = "Item 1"; @@ -170,6 +176,9 @@ /* Class = "NSComboBoxCell"; jQC-12-UuK.ibShadowedObjectValues[2] = "Item 3"; ObjectID = "jQC-12-UuK"; */ "jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3"; +/* Class = "NSButtonCell"; title = "Sort entries when reloading the phrase replacement map"; ObjectID = "o60-vW-i1B"; */ +"o60-vW-i1B.title" = "在重新載入語彙濾除表時,統整檔案內容排序"; + /* Class = "NSMenuItem"; title = "Japanese"; ObjectID = "rVQ-Hx-cGi"; */ "rVQ-Hx-cGi.title" = "和語"; From 4c9f6ad150c8e74b742f53887988ddba93c56d80 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sat, 29 Jan 2022 17:56:27 +0800 Subject: [PATCH 4/8] Pref // PrefModule Updates. --- Source/PreferencesModule.swift | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/Source/PreferencesModule.swift b/Source/PreferencesModule.swift index 593c2788..38959f45 100644 --- a/Source/PreferencesModule.swift +++ b/Source/PreferencesModule.swift @@ -15,6 +15,9 @@ private let kFunctionKeyKeyboardLayoutPreference = "FunctionKeyKeyboardLayout" private let kFunctionKeyKeyboardLayoutOverrideIncludeShift = "FunctionKeyKeyboardLayoutOverrideIncludeShift" private let kCandidateListTextSize = "CandidateListTextSize" private let kAppleLanguagesPreferences = "AppleLanguages" +private let kShouldAutoReloadUserDataFiles = "ShouldAutoReloadUserDataFiles" +private let kShouldAutoSortUserPhrasesAndExclListOnLoad = "ShouldAutoSortUserPhrasesAndExclListOnLoad" +private let kShouldAutoSortPhraseReplacementMapOnLoad = "ShouldAutoSortPhraseReplacementMapOnLoad" private let kSelectPhraseAfterCursorAsCandidatePreference = "SelectPhraseAfterCursorAsCandidate" private let kUseHorizontalCandidateListPreference = "UseHorizontalCandidateList" private let kComposingBufferSizePreference = "ComposingBufferSize" @@ -175,6 +178,9 @@ struct ComposingBufferSize { defaults.removeObject(forKey: kFunctionKeyKeyboardLayoutOverrideIncludeShift) defaults.removeObject(forKey: kCandidateListTextSize) defaults.removeObject(forKey: kAppleLanguagesPreferences) + defaults.removeObject(forKey: kShouldAutoReloadUserDataFiles) + defaults.removeObject(forKey: kShouldAutoSortUserPhrasesAndExclListOnLoad) + defaults.removeObject(forKey: kShouldAutoSortPhraseReplacementMapOnLoad) defaults.removeObject(forKey: kSelectPhraseAfterCursorAsCandidatePreference) defaults.removeObject(forKey: kUseHorizontalCandidateListPreference) defaults.removeObject(forKey: kComposingBufferSizePreference) @@ -211,6 +217,21 @@ struct ComposingBufferSize { UserDefaults.standard.set(Preferences.chooseCandidateUsingSpace, forKey: kChooseCandidateUsingSpace) } + // 在檔案載入時,預設不啟用使用者自訂語彙表與語彙排除表的內容排序。 + if UserDefaults.standard.object(forKey: kShouldAutoReloadUserDataFiles) == nil { + UserDefaults.standard.set(Preferences.shouldAutoReloadUserDataFiles, forKey: kShouldAutoReloadUserDataFiles) + } + + // 在檔案載入時,預設不啟用語彙置換表的內容排序。 + if UserDefaults.standard.object(forKey: kShouldAutoSortUserPhrasesAndExclListOnLoad) == nil { + UserDefaults.standard.set(Preferences.ShouldAutoSortUserPhrasesAndExclListOnLoad, forKey: kShouldAutoSortUserPhrasesAndExclListOnLoad) + } + + // 自動檢測使用者自訂語彙數據的變動並載入。 + if UserDefaults.standard.object(forKey: kShouldAutoSortPhraseReplacementMapOnLoad) == nil { + UserDefaults.standard.set(Preferences.shouldAutoSortPhraseReplacementMapOnLoad, forKey: kShouldAutoSortPhraseReplacementMapOnLoad) + } + // 預設禁用 WinNT351 風格的注音選字模式(就是每個字都要選的那種),所以設成 false if UserDefaults.standard.object(forKey: kUseWinNT351BPMF) == nil { UserDefaults.standard.set(Preferences.useWinNT351BPMF, forKey: kUseWinNT351BPMF) @@ -270,6 +291,15 @@ struct ComposingBufferSize { @CandidateListTextSize(key: kCandidateListTextSize) @objc static var candidateListTextSize: CGFloat + + @UserDefault(key: kShouldAutoReloadUserDataFiles, defaultValue: false) + @objc static var shouldAutoReloadUserDataFiles: Bool + + @UserDefault(key: kShouldAutoSortUserPhrasesAndExclListOnLoad, defaultValue: false) + @objc static var ShouldAutoSortUserPhrasesAndExclListOnLoad: Bool + + @UserDefault(key: kShouldAutoSortPhraseReplacementMapOnLoad, defaultValue: false) + @objc static var shouldAutoSortPhraseReplacementMapOnLoad: Bool @UserDefault(key: kSelectPhraseAfterCursorAsCandidatePreference, defaultValue: false) @objc static var selectPhraseAfterCursorAsCandidate: Bool From 4aafd793d96c291508f1d93f8510a4b57f160951 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sat, 29 Jan 2022 18:43:23 +0800 Subject: [PATCH 5/8] Pref // Bind Options to User Data LMs. --- Source/Engine/LanguageModel/PhraseReplacementMap.mm | 10 ++++++++-- Source/Engine/LanguageModel/UserPhrasesLM.mm | 8 +++++++- Source/InputMethodController.mm | 1 - 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/Source/Engine/LanguageModel/PhraseReplacementMap.mm b/Source/Engine/LanguageModel/PhraseReplacementMap.mm index e2ed00ab..433fcad5 100644 --- a/Source/Engine/LanguageModel/PhraseReplacementMap.mm +++ b/Source/Engine/LanguageModel/PhraseReplacementMap.mm @@ -15,6 +15,7 @@ #include "KeyValueBlobReader.h" #include "PhraseReplacementMap.h" #include "LMConsolidator.h" +#include "vChewing-Swift.h" namespace vChewing { @@ -39,9 +40,14 @@ bool PhraseReplacementMap::open(const char *path) if (data) { return false; } - + LMConsolidator::FixEOF(path); - LMConsolidator::ConsolidateContent(path, false); + + if (Preferences.shouldAutoSortPhraseReplacementMapOnLoad) { + LMConsolidator::ConsolidateContent(path, true); + } else { + LMConsolidator::ConsolidateContent(path, false); + } fd = ::open(path, O_RDONLY); if (fd == -1) { diff --git a/Source/Engine/LanguageModel/UserPhrasesLM.mm b/Source/Engine/LanguageModel/UserPhrasesLM.mm index fe94a305..f5901d40 100644 --- a/Source/Engine/LanguageModel/UserPhrasesLM.mm +++ b/Source/Engine/LanguageModel/UserPhrasesLM.mm @@ -15,6 +15,7 @@ #include #include "LMConsolidator.h" #include "KeyValueBlobReader.h" +#include "vChewing-Swift.h" namespace vChewing { @@ -39,7 +40,12 @@ bool UserPhrasesLM::open(const char *path) } LMConsolidator::FixEOF(path); - LMConsolidator::ConsolidateContent(path, false); + + if (Preferences.ShouldAutoSortUserPhrasesAndExclListOnLoad) { + LMConsolidator::ConsolidateContent(path, true); + } else { + LMConsolidator::ConsolidateContent(path, false); + } fd = ::open(path, O_RDONLY); if (fd == -1) { diff --git a/Source/InputMethodController.mm b/Source/InputMethodController.mm index 7f3303c5..2c711495 100644 --- a/Source/InputMethodController.mm +++ b/Source/InputMethodController.mm @@ -7,7 +7,6 @@ */ #import "InputMethodController.h" -#include #import #import #import From 8c0d7fa02bd9b148ffb1ace4bb499f973ac9a322 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sat, 29 Jan 2022 21:44:31 +0800 Subject: [PATCH 6/8] Pref // Bind Options to IMController. - At this moment we let the IME always automatically load the changes. Fingerprint-based conditioning will be implemented later. --- Source/InputMethodController.mm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Source/InputMethodController.mm b/Source/InputMethodController.mm index 2c711495..d9dbe91e 100644 --- a/Source/InputMethodController.mm +++ b/Source/InputMethodController.mm @@ -190,6 +190,11 @@ static double FindHighestScore(const vector& nodes, double epsilon) NSString *basisKeyboardLayoutID = Preferences.basisKeyboardLayout; [client overrideKeyboardWithKeyboardNamed:basisKeyboardLayoutID]; + // Load UserPhrases // 這裡今後需要改造成「驗證檔案指紋、根據驗證結果判定是否需要重新讀入」的形式。 + if (Preferences.shouldAutoReloadUserDataFiles) { + [self reloadUserPhrases:(id)nil]; + } + // reset the state _currentDeferredClient = nil; _currentCandidateClient = nil; From 9207994bfaf9061cc2390c445a781ea10698ec4b Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sat, 29 Jan 2022 22:25:36 +0800 Subject: [PATCH 7/8] Pref // Bind Options to Menu Option Visibility. - The "Reload User Phrases" menu command will not show unless either the Alt key gets pressed or the autoreload of user phrases data is checked Enabled in the Preferences window. --- Source/InputMethodController.mm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Source/InputMethodController.mm b/Source/InputMethodController.mm index d9dbe91e..429374ca 100644 --- a/Source/InputMethodController.mm +++ b/Source/InputMethodController.mm @@ -163,8 +163,10 @@ static double FindHighestScore(const vector& nodes, double epsilon) [menu addItemWithTitle:NSLocalizedString(@"Edit Phrase Replacement Table", @"") action:@selector(openPhraseReplacement:) keyEquivalent:@""]; } - [menu addItemWithTitle:NSLocalizedString(@"Reload User Phrases", @"") action:@selector(reloadUserPhrases:) keyEquivalent:@""]; - + if (optionKeyPressed || !Preferences.shouldAutoReloadUserDataFiles) { + [menu addItemWithTitle:NSLocalizedString(@"Reload User Phrases", @"") action:@selector(reloadUserPhrases:) keyEquivalent:@""]; + } + [menu addItem:[NSMenuItem separatorItem]]; // ------------------------------ [menu addItemWithTitle:NSLocalizedString(@"vChewing Preferences", @"") action:@selector(showPreferences:) keyEquivalent:@""]; From bd030dd987407b5f80571c2c9f0c8ec6c63b5c90 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sat, 29 Jan 2022 22:31:24 +0800 Subject: [PATCH 8/8] Pref // Other localization tweaks. --- Source/Base.lproj/preferences.xib | 4 ++-- Source/InputMethodController.mm | 2 +- Source/en.lproj/Localizable.strings | 6 +++--- Source/ja.lproj/Localizable.strings | 6 +++--- Source/zh-Hans.lproj/Localizable.strings | 6 +++--- Source/zh-Hant.lproj/Localizable.strings | 6 +++--- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Source/Base.lproj/preferences.xib b/Source/Base.lproj/preferences.xib index 38e9ef40..5693b12a 100644 --- a/Source/Base.lproj/preferences.xib +++ b/Source/Base.lproj/preferences.xib @@ -85,8 +85,8 @@ - - + + diff --git a/Source/InputMethodController.mm b/Source/InputMethodController.mm index 429374ca..8677f548 100644 --- a/Source/InputMethodController.mm +++ b/Source/InputMethodController.mm @@ -157,7 +157,7 @@ static double FindHighestScore(const vector& nodes, double epsilon) [menu addItem:[NSMenuItem separatorItem]]; // ------------------------------ - [menu addItemWithTitle:NSLocalizedString(@"Edit User Phrases", @"") action:@selector(openUserPhrases:) keyEquivalent:@""]; + [menu addItemWithTitle:NSLocalizedString(@"Edit User Phrases…", @"") action:@selector(openUserPhrases:) keyEquivalent:@""]; if (optionKeyPressed) { [menu addItemWithTitle:NSLocalizedString(@"Edit Excluded Phrases", @"") action:@selector(openExcludedPhrases:) keyEquivalent:@""]; [menu addItemWithTitle:NSLocalizedString(@"Edit Phrase Replacement Table", @"") action:@selector(openPhraseReplacement:) keyEquivalent:@""]; diff --git a/Source/en.lproj/Localizable.strings b/Source/en.lproj/Localizable.strings index 016d461c..0732f0da 100644 --- a/Source/en.lproj/Localizable.strings +++ b/Source/en.lproj/Localizable.strings @@ -16,16 +16,16 @@ "Force KangXi Writing" = "Force KangXi Writing"; "NotificationSwitchON" = "✔ ON"; "NotificationSwitchOFF" = "✘ OFF"; -"Edit User Phrases" = "Edit User Phrases"; +"Edit User Phrases…" = "Edit User Phrases…"; "Reload User Phrases" = "Reload User Phrases"; "Unable to create the user phrase file." = "Unable to create the user phrase file."; "Please check the permission of at \"%@\"." = "Please check the permission of at \"%@\"."; -"Edit Excluded Phrases" = "Edit Excluded Phrases"; +"Edit Excluded Phrases" = "Edit Excluded Phrases…"; "Use Half-Width Punctuations" = "Use Half-Width Punctuations"; "\"%@\" length must ≥ 2 for a user phrase." = "\"%@\" length must ≥ 2 for a user phrase."; "\"%@\" length too long for a user phrase." = "\"%@\" length too long for a user phrase."; "\"%@\" selected. ENTER to add user phrase." = "\"%@\" selected. ENTER to add user phrase."; -"Edit Phrase Replacement Table" = "Edit Phrase Replacement Table"; +"Edit Phrase Replacement Table" = "Edit Phrase Replacement Table…"; "Use Phrase Replacement" = "Use Phrase Replacement"; "Candidates keys cannot be empty." = "Candidates keys cannot be empty."; "Candidate keys can only contain ASCII characters like alphanumerals." = "Candidate keys can only contain ASCII characters like alphanumerals."; diff --git a/Source/ja.lproj/Localizable.strings b/Source/ja.lproj/Localizable.strings index 1c34d83c..a7a60c75 100644 --- a/Source/ja.lproj/Localizable.strings +++ b/Source/ja.lproj/Localizable.strings @@ -16,16 +16,16 @@ "Force KangXi Writing" = "康熙文字変換モード"; "NotificationSwitchON" = "✔ 機能起動"; "NotificationSwitchOFF" = "✘ 機能停止"; -"Edit User Phrases" = "ユーザー辞書を編集"; +"Edit User Phrases…" = "ユーザー辞書を編集…"; "Reload User Phrases" = "ユーザー辞書を再び読込む"; "Unable to create the user phrase file." = "ユーザー辞書ファイルの作成は失敗しました。"; "Please check the permission of at \"%@\"." = "「%@」に書き出す権限は不足らしい。"; -"Edit Excluded Phrases" = "辞書条目排除表を編集"; +"Edit Excluded Phrases" = "辞書条目排除表を編集…"; "Use Half-Width Punctuations" = "半角句読機能を起用"; "\"%@\" length must ≥ 2 for a user phrase." = "「%@」もう1つ文字のお選びを。"; "\"%@\" length too long for a user phrase." = "「%@」文字数過剰で登録不可。"; "\"%@\" selected. ENTER to add user phrase." = "「%@」を ENTER で辞書に登録。"; -"Edit Phrase Replacement Table" = "言葉置換表を編集"; +"Edit Phrase Replacement Table" = "言葉置換表を編集…"; "Use Phrase Replacement" = "言葉置換機能"; "Candidates keys cannot be empty." = "言選り用キー陣列に何かキーをご登録ください。"; "Candidate keys can only contain ASCII characters like alphanumerals." = "言選り用キー陣列にはASCII文字だけをご登録ください(英数など)。"; diff --git a/Source/zh-Hans.lproj/Localizable.strings b/Source/zh-Hans.lproj/Localizable.strings index a67e8e6d..e9926ac7 100644 --- a/Source/zh-Hans.lproj/Localizable.strings +++ b/Source/zh-Hans.lproj/Localizable.strings @@ -16,16 +16,16 @@ "Force KangXi Writing" = "康熙繁体字模式"; "NotificationSwitchON" = "✔ 已启用"; "NotificationSwitchOFF" = "✘ 已停用"; -"Edit User Phrases" = "编辑自订语汇"; +"Edit User Phrases…" = "编辑自订语汇…"; "Reload User Phrases" = "重载自订语汇"; "Unable to create the user phrase file." = "无法创建自订语汇档案。"; "Please check the permission of at \"%@\"." = "请检查此处的存取权限:\"%@\"."; -"Edit Excluded Phrases" = "编辑要滤除的语汇"; +"Edit Excluded Phrases" = "编辑要滤除的语汇…"; "Use Half-Width Punctuations" = "啟用半角標點輸出"; "\"%@\" length must ≥ 2 for a user phrase." = "「%@」字数不足以自订语汇。"; "\"%@\" length too long for a user phrase." = "「%@」字数太长、无法自订。"; "\"%@\" selected. ENTER to add user phrase." = "「%@」敲 Enter 添入自订语汇。"; -"Edit Phrase Replacement Table" = "编辑语汇置换表"; +"Edit Phrase Replacement Table" = "编辑语汇置换表…"; "Use Phrase Replacement" = "使用语汇置换"; "Candidates keys cannot be empty." = "您必须指定选字键。"; "Candidate keys can only contain ASCII characters like alphanumerals." = "选字键只能是英数等 ASCII 字符。"; diff --git a/Source/zh-Hant.lproj/Localizable.strings b/Source/zh-Hant.lproj/Localizable.strings index 79fa9be8..aac48d3f 100644 --- a/Source/zh-Hant.lproj/Localizable.strings +++ b/Source/zh-Hant.lproj/Localizable.strings @@ -16,16 +16,16 @@ "Force KangXi Writing" = "康熙繁體字模式"; "NotificationSwitchON" = "✔ 已啟用"; "NotificationSwitchOFF" = "✘ 已停用"; -"Edit User Phrases" = "編輯自訂語彙"; +"Edit User Phrases…" = "編輯自訂語彙…"; "Reload User Phrases" = "重載自訂語彙"; "Unable to create the user phrase file." = "無法創建自訂語彙檔案。"; "Please check the permission of at \"%@\"." = "請檢查此處的存取權限:\"%@\"."; -"Edit Excluded Phrases" = "編輯要濾除的語彙"; +"Edit Excluded Phrases" = "編輯要濾除的語彙…"; "Use Half-Width Punctuations" = "啟用半形標點輸出"; "\"%@\" length must ≥ 2 for a user phrase." = "「%@」字數不足以自訂語彙。"; "\"%@\" length too long for a user phrase." = "「%@」字數太長、無法自訂。"; "\"%@\" selected. ENTER to add user phrase." = "「%@」敲 Enter 添入自訂語彙。"; -"Edit Phrase Replacement Table" = "編輯語彙置換表"; +"Edit Phrase Replacement Table" = "編輯語彙置換表…"; "Use Phrase Replacement" = "使用語彙置換"; "Candidates keys cannot be empty." = "您必須指定選字鍵。"; "Candidate keys can only contain ASCII characters like alphanumerals." = "選字鍵只能是英數等 ASCII 字符。";