diff --git a/README-CHT.md b/README-CHT.md index e28c6ea3..eac8c9fa 100644 --- a/README-CHT.md +++ b/README-CHT.md @@ -1,5 +1,7 @@ 語言:[简体中文](./README.md) | *繁體中文* +僅以此 README 紀念祁建華 (CHIEN-HUA CHI, 1921-2001)。 + --- 因不可控原因,該倉庫只能保證在 Gitee 有最新的內容可用: diff --git a/README.md b/README.md index 89301d51..0df7851f 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ 语言:*简体中文* | [繁體中文](./README-CHT.md) +仅以此 README 纪念祁建华 (CHIEN-HUA CHI, 1921-2001)。 + --- 因不可控原因,该仓库只能保证在 Gitee 有最新的内容可用: diff --git a/Source/Data b/Source/Data index 2cbca5af..30a5bc77 160000 --- a/Source/Data +++ b/Source/Data @@ -1 +1 @@ -Subproject commit 2cbca5af7f281b7932878cda5e63f2dfed6b48b0 +Subproject commit 30a5bc773a21d67c3f117eef5346d3b35433bbaa diff --git a/Source/Modules/ControllerModules/KeyHandler_Core.swift b/Source/Modules/ControllerModules/KeyHandler_Core.swift index bc25f26d..ffe181e1 100644 --- a/Source/Modules/ControllerModules/KeyHandler_Core.swift +++ b/Source/Modules/ControllerModules/KeyHandler_Core.swift @@ -317,6 +317,10 @@ class KeyHandler { composer.ensureParser(arrange: .ofMiTAC) case MandarinParser.ofFakeSeigyou.rawValue: composer.ensureParser(arrange: .ofFakeSeigyou) + case MandarinParser.ofSeigyou.rawValue: + composer.ensureParser(arrange: .ofSeigyou) + case MandarinParser.ofStarlight.rawValue: + composer.ensureParser(arrange: .ofStarlight) case MandarinParser.ofHanyuPinyin.rawValue: composer.ensureParser(arrange: .ofHanyuPinyin) case MandarinParser.ofSecondaryPinyin.rawValue: diff --git a/Source/Modules/ControllerModules/SyllableComposer.swift b/Source/Modules/ControllerModules/SyllableComposer.swift index b34d0982..5c76dca9 100644 --- a/Source/Modules/ControllerModules/SyllableComposer.swift +++ b/Source/Modules/ControllerModules/SyllableComposer.swift @@ -48,6 +48,7 @@ public struct Tekkon { case ofMiTAC = 6 case ofSeigyou = 7 case ofFakeSeigyou = 8 + case ofStarlight = 9 case ofHanyuPinyin = 100 case ofSecondaryPinyin = 101 case ofYalePinyin = 102 @@ -74,6 +75,8 @@ public struct Tekkon { return "FakeSeigyou" case .ofSeigyou: return "Seigyou" + case .ofStarlight: + return "Starlight" case .ofHanyuPinyin: return "HanyuPinyin" case .ofSecondaryPinyin: @@ -334,6 +337,8 @@ public struct Tekkon { return Tekkon.mapSeigyou[input] != nil case .ofFakeSeigyou: return Tekkon.mapFakeSeigyou[input] != nil + case .ofStarlight: + return Tekkon.mapStarlightStaticKeys[input] != nil case .ofHanyuPinyin, .ofSecondaryPinyin, .ofYalePinyin, .ofHualuoPinyin, .ofUniversalPinyin: return Tekkon.mapArayuruPinyin.contains(input) } @@ -390,7 +395,10 @@ public struct Tekkon { case "ㄧ", "ㄩ": if vowel.value == "ㄜ" { vowel = "ㄝ" } case "ㄜ": + if "ㄨ".contains(semivowel.value) { semivowel = "ㄩ" } if "ㄧㄩ".contains(semivowel.value) { thePhone = "ㄝ" } + case "ㄝ": + if "ㄨ".contains(semivowel.value) { semivowel = "ㄩ" } case "ㄛ", "ㄥ": if "ㄅㄆㄇㄈ".contains(consonant.value), semivowel.value == "ㄨ" { semivowel.clear() } case "ㄟ": @@ -398,6 +406,8 @@ public struct Tekkon { case "ㄨ": if "ㄅㄆㄇㄈ".contains(consonant.value), "ㄛㄥ".contains(vowel.value) { vowel.clear() } if "ㄋㄌ".contains(consonant.value), "ㄟ".contains(vowel.value) { vowel.clear() } + if "ㄜ".contains(vowel.value) { vowel = "ㄝ" } + if "ㄝ".contains(vowel.value) { thePhone = "ㄩ" } case "ㄅ", "ㄆ", "ㄇ", "ㄈ": if ["ㄨㄛ", "ㄨㄥ"].contains(semivowel.value + vowel.value) { semivowel.clear() } default: break @@ -537,12 +547,61 @@ public struct Tekkon { return Tekkon.mapSeigyou[key] ?? "" case .ofFakeSeigyou: return Tekkon.mapFakeSeigyou[key] ?? "" + case .ofStarlight: + return handleStarlight(key: key) case .ofHanyuPinyin, .ofSecondaryPinyin, .ofYalePinyin, .ofHualuoPinyin, .ofUniversalPinyin: break // 漢語拼音單獨用另外的函式處理 } return "" } + /// 所有動態注音鍵盤佈局都會用到的共用糾錯處理步驟。 + /// - Parameter incomingPhonabet: 傳入的注音 Phonabet。 + mutating func commonFixWhenHandlingDynamicArrangeInputs(target incomingPhonabet: Phonabet) { + // 處理特殊情形。 + switch incomingPhonabet.type { + case .semivowel: + switch consonant { + case "ㄍ": + switch incomingPhonabet { + case "ㄧ": consonant = "ㄑ" // ㄑㄧ + case "ㄨ": consonant = "ㄍ" // ㄍㄨ + case "ㄩ": consonant = "ㄑ" // ㄑㄩ + default: break + } + case "ㄓ": + switch incomingPhonabet { + case "ㄧ": consonant = "ㄐ" // ㄐㄧ + case "ㄨ": consonant = "ㄓ" // ㄓㄨ + case "ㄩ": consonant = "ㄐ" // ㄐㄩ + default: break + } + case "ㄔ": + switch incomingPhonabet { + case "ㄧ": consonant = "ㄑ" // ㄐㄧ + case "ㄨ": consonant = "ㄔ" // ㄓㄨ + case "ㄩ": consonant = "ㄑ" // ㄐㄩ + default: break + } + case "ㄕ": + switch incomingPhonabet { + case "ㄧ": consonant = "ㄒ" // ㄒㄧ + case "ㄨ": consonant = "ㄕ" // ㄕㄨ + case "ㄩ": consonant = "ㄒ" // ㄒㄩ + default: break + } + default: break + } + case .vowel: + if semivowel.isEmpty { + consonant.selfReplace("ㄐ", "ㄓ") + consonant.selfReplace("ㄑ", "ㄔ") + consonant.selfReplace("ㄒ", "ㄕ") + } + default: break + } + } + /// 倚天忘形注音排列比較麻煩,需要單獨處理。 /// /// 回傳結果是空字串的話,不要緊,因為該函式內部已經處理過分配過程了。 @@ -577,33 +636,8 @@ public struct Tekkon { default: break } - // 處理「一個按鍵對應兩個聲母」的情形。 - if !consonant.isEmpty, incomingPhonabet.type == .semivowel { - switch consonant { - case "ㄍ": - switch incomingPhonabet { - case "ㄧ": consonant = "ㄑ" // ㄑㄧ - case "ㄨ": consonant = "ㄍ" // ㄍㄨ - case "ㄩ": consonant = "ㄑ" // ㄑㄩ - default: break - } - case "ㄓ": - switch incomingPhonabet { - case "ㄧ": consonant = "ㄐ" // ㄐㄧ - case "ㄨ": consonant = "ㄓ" // ㄓㄨ - case "ㄩ": consonant = "ㄐ" // ㄐㄩ - default: break - } - case "ㄕ": - switch incomingPhonabet { - case "ㄧ": consonant = "ㄒ" // ㄒㄧ - case "ㄨ": consonant = "ㄕ" // ㄕㄨ - case "ㄩ": consonant = "ㄒ" // ㄒㄩ - default: break - } - default: break - } - } + // 處理特殊情形。 + commonFixWhenHandlingDynamicArrangeInputs(target: incomingPhonabet) if "dfjk ".contains(key), !consonant.isEmpty, semivowel.isEmpty, vowel.isEmpty @@ -666,51 +700,7 @@ public struct Tekkon { } // 處理特殊情形。 - switch incomingPhonabet.type { - case .semivowel: - switch consonant { - case "ㄍ": // 許氏鍵盤應該也需要這個自動糾正 - switch incomingPhonabet { - case "ㄧ": consonant = "ㄑ" // ㄑㄧ - case "ㄨ": consonant = "ㄍ" // ㄍㄨ - case "ㄩ": consonant = "ㄑ" // ㄑㄩ - default: break - } - case "ㄓ": - if intonation.isEmpty { - switch incomingPhonabet { - case "ㄧ": consonant = "ㄐ" // ㄐㄧ - case "ㄨ": consonant = "ㄓ" // ㄓㄨ - case "ㄩ": consonant = "ㄐ" // ㄐㄩ - default: break - } - } - case "ㄔ": - if intonation.isEmpty { - switch incomingPhonabet { - case "ㄧ": consonant = "ㄑ" // ㄐㄧ - case "ㄨ": consonant = "ㄔ" // ㄓㄨ - case "ㄩ": consonant = "ㄑ" // ㄐㄩ - default: break - } - } - case "ㄕ": - switch incomingPhonabet { - case "ㄧ": consonant = "ㄒ" // ㄒㄧ - case "ㄨ": consonant = "ㄕ" // ㄕㄨ - case "ㄩ": consonant = "ㄒ" // ㄒㄩ - default: break - } - default: break - } - case .vowel: - if semivowel.isEmpty { - consonant.selfReplace("ㄐ", "ㄓ") - consonant.selfReplace("ㄑ", "ㄔ") - consonant.selfReplace("ㄒ", "ㄕ") - } - default: break - } + commonFixWhenHandlingDynamicArrangeInputs(target: incomingPhonabet) if "dfjs ".contains(key) { if !consonant.isEmpty, semivowel.isEmpty, vowel.isEmpty { @@ -749,6 +739,48 @@ public struct Tekkon { return strReturn } + /// 星光排列一樣同樣也比較麻煩,需要單獨處理。 + /// + /// 回傳結果是空的話,不要緊,因為該函式內部已經處理過分配過程了。 + /// - Parameters: + /// - key: 傳入的 String 訊號。 + mutating func handleStarlight(key: String) -> String { + var strReturn = Tekkon.mapStarlightStaticKeys[key] ?? "" + let incomingPhonabet = Phonabet(strReturn) + switch key { + case "e": return "ㄧㄩ".contains(semivowel.value) ? "ㄝ" : "ㄜ" + case "f": return vowel == "ㄠ" || !isPronouncable ? "ㄈ" : "ㄠ" + case "g": return vowel == "ㄥ" || !isPronouncable ? "ㄍ" : "ㄥ" + case "k": return vowel == "ㄤ" || !isPronouncable ? "ㄎ" : "ㄤ" + case "l": return vowel == "ㄦ" || !isPronouncable ? "ㄌ" : "ㄦ" + case "m": return vowel == "ㄢ" || !isPronouncable ? "ㄇ" : "ㄢ" + case "n": return vowel == "ㄣ" || !isPronouncable ? "ㄋ" : "ㄣ" + case "t": return vowel == "ㄟ" || !isPronouncable ? "ㄊ" : "ㄟ" + default: break + } + + // 處理特殊情形。 + commonFixWhenHandlingDynamicArrangeInputs(target: incomingPhonabet) + + if "67890 ".contains(key) { + if !consonant.isEmpty, semivowel.isEmpty, vowel.isEmpty { + consonant.selfReplace("ㄈ", "ㄠ") + consonant.selfReplace("ㄍ", "ㄥ") + consonant.selfReplace("ㄎ", "ㄤ") + consonant.selfReplace("ㄌ", "ㄦ") + consonant.selfReplace("ㄇ", "ㄢ") + consonant.selfReplace("ㄋ", "ㄣ") + consonant.selfReplace("ㄊ", "ㄟ") + } + } + + // 這些按鍵在上文處理過了,就不要再回傳了。 + if "efgklmn".contains(key) { strReturn = "" } + + // 回傳結果是空的話,不要緊,因為上文已經代處理過分配過程了。 + return strReturn + } + /// 大千忘形一樣同樣也比較麻煩,需要單獨處理。 /// /// 回傳結果是空的話,不要緊,因為該函式內部已經處理過分配過程了。 @@ -765,7 +797,13 @@ public struct Tekkon { case "b": if !consonant.isEmpty || !semivowel.isEmpty { vowel = "ㄝ" } else { consonant = "ㄖ" } case "i": if vowel.isEmpty || vowel == "ㄞ" { vowel = "ㄛ" } else { vowel = "ㄞ" } case "l": if vowel.isEmpty || vowel == "ㄤ" { vowel = "ㄠ" } else { vowel = "ㄤ" } - case "n": if !consonant.isEmpty || !semivowel.isEmpty { vowel = "ㄥ" } else { consonant = "ㄙ" } + case "n": + if !consonant.isEmpty || !semivowel.isEmpty { + if consonant == "ㄙ", semivowel.isEmpty, vowel.isEmpty { consonant.clear() } + vowel = "ㄥ" + } else { + consonant = "ㄙ" + } case "o": if vowel.isEmpty || vowel == "ㄢ" { vowel = "ㄟ" } else { vowel = "ㄢ" } case "p": if vowel.isEmpty || vowel == "ㄦ" { vowel = "ㄣ" } else { vowel = "ㄦ" } case "q": if consonant.isEmpty || consonant == "ㄅ" { consonant = "ㄆ" } else { consonant = "ㄅ" } @@ -781,7 +819,7 @@ public struct Tekkon { } else if !semivowel.isEmpty { vowel = "ㄡ" } else { - semivowel = "ㄩ" + receiveKey(fromPhonabet: "ㄐㄑㄒ".contains(consonant.value) ? "ㄩ" : "ㄡ") } case "u": if semivowel == "ㄧ", vowel != "ㄚ" { @@ -895,9 +933,11 @@ public struct Tekkon { } /// 該函式用來將漢語拼音轉為注音。 - /// - Parameter target: 要轉換的漢語拼音內容,要求必須帶有 12345 數字標調。 + /// - Parameters: + /// - target: 要轉換的漢語拼音內容,要求必須帶有 12345 數字標調。 + /// - newToneOne: 對陰平指定新的標記。預設情況下該標記為空字串。 /// - Returns: 轉換結果。 - static func cnvHanyuPinyinToPhona(target: String) -> String { + static func cnvHanyuPinyinToPhona(target: String, newToneOne: String = "") -> String { if target.contains("_") { return target } var result = target for key in Tekkon.mapHanyuPinyin.keys.sorted(by: { $0.count > $1.count }) { @@ -906,7 +946,7 @@ public struct Tekkon { } for key in Tekkon.mapArayuruPinyinIntonation.keys.sorted(by: { $0.count > $1.count }) { guard let value = Tekkon.mapArayuruPinyinIntonation[key] else { continue } - result = result.replacingOccurrences(of: key, with: (key == "1") ? "" : value) + result = result.replacingOccurrences(of: key, with: (key == "1") ? newToneOne : value) } return result } @@ -1371,6 +1411,17 @@ public struct Tekkon { "w": "ㄘ", "x": "ㄨ", "y": "ㄔ", "z": "ㄠ", " ": " ", ] + /// 星光排列預處理專用陣列,但未包含全部的映射內容。 + /// + /// 在這裡將二十六個字母寫全,也只是為了方便做 validity check。 + /// 這裡提前對複音按鍵做處理,然後再用程式判斷介母類型、據此判斷是否需要做複音切換。 + static let mapStarlightStaticKeys: [String: String] = [ + "a": "ㄚ", "b": "ㄅ", "c": "ㄘ", "d": "ㄉ", "e": "ㄜ", "f": "ㄈ", "g": "ㄍ", "h": "ㄏ", "i": "ㄧ", "j": "ㄓ", "k": "ㄎ", + "l": "ㄌ", "m": "ㄇ", "n": "ㄋ", "o": "ㄛ", "p": "ㄆ", "q": "ㄔ", "r": "ㄖ", "s": "ㄙ", "t": "ㄊ", "u": "ㄨ", "v": "ㄩ", + "w": "ㄡ", "x": "ㄕ", "y": "ㄞ", "z": "ㄗ", " ": " ", "1": " ", "2": "ˊ", "3": "ˇ", "4": "ˋ", "5": "˙", "6": " ", + "7": "ˊ", "8": "ˇ", "9": "ˋ", "0": "˙", + ] + /// 倚天傳統排列專用處理陣列。 static let mapQwertyETenTraditional: [String: String] = [ "'": "ㄘ", ",": "ㄓ", "-": "ㄥ", ".": "ㄔ", "/": "ㄕ", "0": "ㄤ", "1": "˙", "2": "ˊ", "3": "ˇ", "4": "ˋ", "7": "ㄑ", diff --git a/Source/Modules/IMEModules/mgrPrefs.swift b/Source/Modules/IMEModules/mgrPrefs.swift index bbf0a40b..a48c4e61 100644 --- a/Source/Modules/IMEModules/mgrPrefs.swift +++ b/Source/Modules/IMEModules/mgrPrefs.swift @@ -189,6 +189,8 @@ enum MandarinParser: Int { case ofMiTAC = 5 case ofFakeSeigyou = 6 case ofDachen26 = 7 + case ofSeigyou = 8 + case ofStarlight = 9 case ofHanyuPinyin = 10 case ofSecondaryPinyin = 11 case ofYalePinyin = 12 @@ -213,6 +215,10 @@ enum MandarinParser: Int { return "FakeSeigyou" case .ofDachen26: return "Dachen26" + case .ofSeigyou: + return "Seigyou" + case .ofStarlight: + return "Starlight" case .ofHanyuPinyin: return "HanyuPinyin" case .ofSecondaryPinyin: diff --git a/Source/Resources/Base.lproj/Localizable.strings b/Source/Resources/Base.lproj/Localizable.strings index 5a350c35..a1ccc9f1 100644 --- a/Source/Resources/Base.lproj/Localizable.strings +++ b/Source/Resources/Base.lproj/Localizable.strings @@ -127,7 +127,7 @@ "Eten 26" = "Eten 26"; "Eten Traditional" = "Eten Traditional"; "Experience" = "Experience"; -"Fake Seigyou" = "Fake Seigyou"; +"Fake Seigyou" = "Fake Seigyou (Similar to JinYei)"; "Follow OS settings" = "Follow OS settings"; "for cycling candidates" = "for cycling candidates"; "for cycling pages" = "for cycling pages"; @@ -149,6 +149,7 @@ "Phonetic Parser:" = "Phonetic Parser:"; "Push the cursor in front of the phrase after selection" = "Push the cursor in front of the phrase after selection"; "Secondary Pinyin with Numeral Intonation" = "Secondary Pinyin with Numeral Intonation"; +"Seigyou" = "Seigyou (JinYei)"; "Selection Keys:" = "Selection Keys:"; "Show Hanyu-Pinyin in the inline composition buffer & tooltip" = "Show Hanyu-Pinyin in the inline composition buffer & tooltip"; "Show page buttons in candidate window" = "Show page buttons in candidate window"; @@ -157,6 +158,7 @@ "Space to +cycle candidates, Shift+Space to +cycle pages" = "Space to +cycle candidates, Shift+Space to +cycle pages"; "Space to +cycle pages, Shift+Space to +cycle candidates" = "Space to +cycle pages, Shift+Space to +cycle candidates"; "Specify the maximum characters allowed in the composition buffer." = "Specify the maximum characters allowed in the composition buffer."; +"Starlight" = "Starlight"; "Stop farting (when typed phonetic combination is invalid, etc.)" = "Stop farting (when typed phonetic combination is invalid, etc.)"; "Traditional Chinese" = "Traditional Chinese"; "Typing Style:" = "Typing Style:"; diff --git a/Source/Resources/en.lproj/Localizable.strings b/Source/Resources/en.lproj/Localizable.strings index 5a350c35..a1ccc9f1 100644 --- a/Source/Resources/en.lproj/Localizable.strings +++ b/Source/Resources/en.lproj/Localizable.strings @@ -127,7 +127,7 @@ "Eten 26" = "Eten 26"; "Eten Traditional" = "Eten Traditional"; "Experience" = "Experience"; -"Fake Seigyou" = "Fake Seigyou"; +"Fake Seigyou" = "Fake Seigyou (Similar to JinYei)"; "Follow OS settings" = "Follow OS settings"; "for cycling candidates" = "for cycling candidates"; "for cycling pages" = "for cycling pages"; @@ -149,6 +149,7 @@ "Phonetic Parser:" = "Phonetic Parser:"; "Push the cursor in front of the phrase after selection" = "Push the cursor in front of the phrase after selection"; "Secondary Pinyin with Numeral Intonation" = "Secondary Pinyin with Numeral Intonation"; +"Seigyou" = "Seigyou (JinYei)"; "Selection Keys:" = "Selection Keys:"; "Show Hanyu-Pinyin in the inline composition buffer & tooltip" = "Show Hanyu-Pinyin in the inline composition buffer & tooltip"; "Show page buttons in candidate window" = "Show page buttons in candidate window"; @@ -157,6 +158,7 @@ "Space to +cycle candidates, Shift+Space to +cycle pages" = "Space to +cycle candidates, Shift+Space to +cycle pages"; "Space to +cycle pages, Shift+Space to +cycle candidates" = "Space to +cycle pages, Shift+Space to +cycle candidates"; "Specify the maximum characters allowed in the composition buffer." = "Specify the maximum characters allowed in the composition buffer."; +"Starlight" = "Starlight"; "Stop farting (when typed phonetic combination is invalid, etc.)" = "Stop farting (when typed phonetic combination is invalid, etc.)"; "Traditional Chinese" = "Traditional Chinese"; "Typing Style:" = "Typing Style:"; diff --git a/Source/Resources/ja.lproj/Localizable.strings b/Source/Resources/ja.lproj/Localizable.strings index cf68e40d..38e6b238 100644 --- a/Source/Resources/ja.lproj/Localizable.strings +++ b/Source/Resources/ja.lproj/Localizable.strings @@ -149,6 +149,7 @@ "Phonetic Parser:" = "注音配列:"; "Push the cursor in front of the phrase after selection" = "候補選択の直後、すぐカーソルを単語の向こうに推し進める"; "Secondary Pinyin with Numeral Intonation" = "国音二式 (ローマ字+数字音調)"; +"Seigyou" = "精業配列"; "Selection Keys:" = "言選り用キー:"; "Show Hanyu-Pinyin in the inline composition buffer & tooltip" = "弁音合併入力(入力緩衝列とヒントで音読みを漢語弁音に)"; "Show page buttons in candidate window" = "入力候補陳列の側にページボタンを表示"; @@ -157,6 +158,7 @@ "Space to +cycle candidates, Shift+Space to +cycle pages" = "Shift+Space で次のページ、Space で次の候補文字を"; "Space to +cycle pages, Shift+Space to +cycle candidates" = "Space で次のページ、Shift+Space で次の候補文字を"; "Specify the maximum characters allowed in the composition buffer." = "緩衝列に入れる文字の数の上限をご指定ください。"; +"Starlight" = "星光配列"; "Stop farting (when typed phonetic combination is invalid, etc.)" = "マナーモード // 外すと入力間違った時に変な声が出る"; "Traditional Chinese" = "繁体中国語"; "Typing Style:" = "入力習慣:"; diff --git a/Source/Resources/zh-Hans.lproj/Localizable.strings b/Source/Resources/zh-Hans.lproj/Localizable.strings index 05f23bf9..5f2d23fe 100644 --- a/Source/Resources/zh-Hans.lproj/Localizable.strings +++ b/Source/Resources/zh-Hans.lproj/Localizable.strings @@ -150,6 +150,7 @@ "Phonetic Parser:" = "注音排列:"; "Push the cursor in front of the phrase after selection" = "在选字后将游标置于该字词的前方"; "Secondary Pinyin with Numeral Intonation" = "国音二式+数字标调"; +"Seigyou" = "精业排列"; "Selection Keys:" = "选字键:"; "Show Hanyu-Pinyin in the inline composition buffer & tooltip" = "拼音并击(组字区与工具提示内显示汉语拼音)"; "Show page buttons in candidate window" = "在选字窗内显示翻页按钮"; @@ -158,6 +159,7 @@ "Space to +cycle candidates, Shift+Space to +cycle pages" = "Shift+空格键 换下一页,空格键 换选下一个后选字"; "Space to +cycle pages, Shift+Space to +cycle candidates" = "空格键 换下一页,Shift+空格键 换选下一个后选字"; "Specify the maximum characters allowed in the composition buffer." = "请指定组字缓冲区内的文字数的上限。"; +"Starlight" = "星光排列"; "Stop farting (when typed phonetic combination is invalid, etc.)" = "廉耻模式 // 取消勾选的话,敲错字时会有异音"; "Traditional Chinese" = "繁体中文"; "Typing Style:" = "输入风格:"; diff --git a/Source/Resources/zh-Hant.lproj/Localizable.strings b/Source/Resources/zh-Hant.lproj/Localizable.strings index 64ec4aff..a2f0fe9c 100644 --- a/Source/Resources/zh-Hant.lproj/Localizable.strings +++ b/Source/Resources/zh-Hant.lproj/Localizable.strings @@ -149,6 +149,7 @@ "Phonetic Parser:" = "注音排列:"; "Push the cursor in front of the phrase after selection" = "在選字後將游標置於該字詞的前方"; "Secondary Pinyin with Numeral Intonation" = "國音二式+數字標調"; +"Seigyou" = "精業排列"; "Selection Keys:" = "選字鍵:"; "Show Hanyu-Pinyin in the inline composition buffer & tooltip" = "拼音並擊(組字區與工具提示內顯示漢語拼音)"; "Show page buttons in candidate window" = "在選字窗內顯示翻頁按鈕"; @@ -157,6 +158,7 @@ "Space to +cycle candidates, Shift+Space to +cycle pages" = "Shift+空格鍵 換下一頁,空格鍵 換選下一個後選字"; "Space to +cycle pages, Shift+Space to +cycle candidates" = "空格鍵 換下一頁,Shift+空格鍵 換選下一個後選字"; "Specify the maximum characters allowed in the composition buffer." = "請指定組字緩衝區內的文字數的上限。"; +"Starlight" = "星光排列"; "Stop farting (when typed phonetic combination is invalid, etc.)" = "廉恥模式 // 取消勾選的話,敲錯字時會有異音"; "Traditional Chinese" = "繁體中文"; "Typing Style:" = "輸入風格:"; diff --git a/Source/UI/PrefUI/suiPrefPaneKeyboard.swift b/Source/UI/PrefUI/suiPrefPaneKeyboard.swift index 734eb4db..e5048412 100644 --- a/Source/UI/PrefUI/suiPrefPaneKeyboard.swift +++ b/Source/UI/PrefUI/suiPrefPaneKeyboard.swift @@ -60,15 +60,20 @@ struct suiPrefPaneKeyboard: View { Picker("", selection: $selMandarinParser) { Group { Text(LocalizedStringKey("Dachen (Microsoft Standard / Wang / 01, etc.)")).tag(0) - Text(LocalizedStringKey("Dachen 26 (libChewing)")).tag(7) Text(LocalizedStringKey("Eten Traditional")).tag(1) - Text(LocalizedStringKey("Eten 26")).tag(3) Text(LocalizedStringKey("IBM")).tag(4) - Text(LocalizedStringKey("Hsu")).tag(2) Text(LocalizedStringKey("MiTAC")).tag(5) + Text(LocalizedStringKey("Seigyou")).tag(8) Text(LocalizedStringKey("Fake Seigyou")).tag(6) } Divider() + Group { + Text(LocalizedStringKey("Dachen 26 (libChewing)")).tag(7) + Text(LocalizedStringKey("Eten 26")).tag(3) + Text(LocalizedStringKey("Hsu")).tag(2) + Text(LocalizedStringKey("Starlight")).tag(9) + } + Divider() Group { Text(LocalizedStringKey("Hanyu Pinyin with Numeral Intonation")).tag(10) Text(LocalizedStringKey("Secondary Pinyin with Numeral Intonation")).tag(11) diff --git a/Source/WindowNIBs/Base.lproj/frmPrefWindow.xib b/Source/WindowNIBs/Base.lproj/frmPrefWindow.xib index 51e6b55d..1d171f73 100644 --- a/Source/WindowNIBs/Base.lproj/frmPrefWindow.xib +++ b/Source/WindowNIBs/Base.lproj/frmPrefWindow.xib @@ -27,13 +27,13 @@ - + - + - + @@ -862,13 +862,16 @@ - - - + + + + + + diff --git a/Source/WindowNIBs/en.lproj/frmPrefWindow.strings b/Source/WindowNIBs/en.lproj/frmPrefWindow.strings index faa4b4db..4dcc457d 100644 --- a/Source/WindowNIBs/en.lproj/frmPrefWindow.strings +++ b/Source/WindowNIBs/en.lproj/frmPrefWindow.strings @@ -44,6 +44,7 @@ "chkAutoCorrectReadingCombination.title" = "Automatically correct reading combinations when typing"; "chkFetchSuggestionsFromUserOverrideModel.title" = "Applying typing suggestions from half-life user override model"; "chkUseFixecCandidateOrderOnSelection.title" = "Always use fixed listing order in candidate window"; +"DbW-eq-ZdB.title" = "Starlight"; "dIN-TZ-67g.title" = "Space to +cycle candidates, Shift+Space to +cycle pages"; "E1l-m8-xgb.title" = "Advanced Settings"; "eia-1F-Do0.title" = "Auto-convert traditional Chinese glyphs to JIS Shinjitai characters"; @@ -73,6 +74,7 @@ "sZx-18-8dO.title" = "Debug Mode"; "TXr-FF-ehw.title" = "Traditional Chinese"; "ueU-Rz-a1C.title" = "Choose the behavior of (Shift+)Tab key in the candidate window."; +"vpd-zx-GIk.title" = "Seigyou (JinYei)"; "W24-T4-cg0.title" = "Enable CNS11643 Support (2022-07-20)"; "wFR-zX-M8H.title" = "Show Hanyu-Pinyin in the inline composition buffer & tooltip"; "wN3-k3-b2a.title" = "Choose your desired user data folder path. Will be omitted if invalid."; diff --git a/Source/WindowNIBs/ja.lproj/frmPrefWindow.strings b/Source/WindowNIBs/ja.lproj/frmPrefWindow.strings index 21797c87..169638b0 100644 --- a/Source/WindowNIBs/ja.lproj/frmPrefWindow.strings +++ b/Source/WindowNIBs/ja.lproj/frmPrefWindow.strings @@ -44,6 +44,7 @@ "chkAutoCorrectReadingCombination.title" = "入力中で打ち間違った発音組み合わせを自動的に訂正する"; "chkFetchSuggestionsFromUserOverrideModel.title" = "入力中で臨時記憶モジュールからお薦めの候補を自動的に選ぶ"; "chkUseFixecCandidateOrderOnSelection.title" = "候補文字を固定順番で陳列する"; +"DbW-eq-ZdB.title" = "星光"; "dIN-TZ-67g.title" = "Shift+Space で次のページ、Space で次の候補文字を"; "E1l-m8-xgb.title" = "詳細設定"; "eia-1F-Do0.title" = "入力した繁体字を日文 JIS 新字体と自動変換"; @@ -73,6 +74,7 @@ "sZx-18-8dO.title" = "欠陥辿着モード"; "TXr-FF-ehw.title" = "繁体中国語"; "ueU-Rz-a1C.title" = "入力候補陳列での (Shift+)Tab キーの輪番切替対象をご指定ください。"; +"vpd-zx-GIk.title" = "精業配列"; "W24-T4-cg0.title" = "全字庫モード // 入力可能の漢字数倍増 (2022-07-20)"; "wFR-zX-M8H.title" = "弁音合併入力(入力緩衝列とヒントで音読みを漢語弁音に)"; "wN3-k3-b2a.title" = "欲しがるユーザー辞書保存先をご指定ください。無効の保存先設定は効かぬ。"; diff --git a/Source/WindowNIBs/zh-Hans.lproj/frmPrefWindow.strings b/Source/WindowNIBs/zh-Hans.lproj/frmPrefWindow.strings index 0699b46e..03e1337a 100644 --- a/Source/WindowNIBs/zh-Hans.lproj/frmPrefWindow.strings +++ b/Source/WindowNIBs/zh-Hans.lproj/frmPrefWindow.strings @@ -44,6 +44,7 @@ "chkAutoCorrectReadingCombination.title" = "敲字时自动纠正读音组合"; "chkFetchSuggestionsFromUserOverrideModel.title" = "在敲字时自动套用来自半衰记忆模组的建议"; "chkUseFixecCandidateOrderOnSelection.title" = "以固定顺序来陈列选字窗内的候选字"; +"DbW-eq-ZdB.title" = "星光"; "dIN-TZ-67g.title" = "Shift+Space 换下一页,Space 换选下一个候选字。"; "E1l-m8-xgb.title" = "进阶设定"; "eia-1F-Do0.title" = "自动将繁体中文字转换为日本简化字(JIS 新字体)"; @@ -73,6 +74,7 @@ "sZx-18-8dO.title" = "侦错模式"; "TXr-FF-ehw.title" = "繁体中文"; "ueU-Rz-a1C.title" = "指定 (Shift+)Tab 热键在选字窗内的轮替操作对象。"; +"vpd-zx-GIk.title" = "精业"; "W24-T4-cg0.title" = "启用 CNS11643 全字库支援 (2022-07-20)"; "wFR-zX-M8H.title" = "拼音并击(组字区与工具提示内显示汉语拼音)"; "wN3-k3-b2a.title" = "请在此指定您想指定的使用者语汇档案目录。无效值会被忽略。"; diff --git a/Source/WindowNIBs/zh-Hant.lproj/frmPrefWindow.strings b/Source/WindowNIBs/zh-Hant.lproj/frmPrefWindow.strings index 75944562..b0019775 100644 --- a/Source/WindowNIBs/zh-Hant.lproj/frmPrefWindow.strings +++ b/Source/WindowNIBs/zh-Hant.lproj/frmPrefWindow.strings @@ -44,6 +44,7 @@ "chkAutoCorrectReadingCombination.title" = "敲字時自動糾正讀音組合"; "chkFetchSuggestionsFromUserOverrideModel.title" = "在敲字時自動套用來自半衰記憶模組的建議"; "chkUseFixecCandidateOrderOnSelection.title" = "以固定順序來陳列選字窗內的候選字"; +"DbW-eq-ZdB.title" = "星光"; "dIN-TZ-67g.title" = "Shift+Space 換下一頁,Space 換選下一個候選字"; "E1l-m8-xgb.title" = "進階設定"; "eia-1F-Do0.title" = "自動將繁體中文字轉換為日本簡化字(JIS 新字體)"; @@ -73,6 +74,7 @@ "sZx-18-8dO.title" = "偵錯模式"; "TXr-FF-ehw.title" = "繁體中文"; "ueU-Rz-a1C.title" = "指定 (Shift+)Tab 熱鍵在選字窗內的輪替操作對象。"; +"vpd-zx-GIk.title" = "精業"; "W24-T4-cg0.title" = "啟用 CNS11643 全字庫支援 (2022-07-20)"; "wFR-zX-M8H.title" = "拼音並擊(組字區與工具提示內顯示漢語拼音)"; "wN3-k3-b2a.title" = "請在此指定您想指定的使用者語彙檔案目錄。無效值會被忽略。"; diff --git a/Update-Info.plist b/Update-Info.plist index 4baff48b..f58fbea1 100644 --- a/Update-Info.plist +++ b/Update-Info.plist @@ -3,9 +3,9 @@ CFBundleShortVersionString - 1.8.5 + 1.8.6 CFBundleVersion - 1985 + 1986 UpdateInfoEndpoint https://gitee.com/vchewing/vChewing-macOS/raw/main/Update-Info.plist UpdateInfoSite diff --git a/vChewing.pkgproj b/vChewing.pkgproj index ff5330b3..706f8b1b 100644 --- a/vChewing.pkgproj +++ b/vChewing.pkgproj @@ -726,7 +726,7 @@ USE_HFS+_COMPRESSION VERSION - 1.8.5 + 1.8.6 TYPE 0 diff --git a/vChewing.xcodeproj/project.pbxproj b/vChewing.xcodeproj/project.pbxproj index aea9c244..8ce2f6ce 100644 --- a/vChewing.xcodeproj/project.pbxproj +++ b/vChewing.xcodeproj/project.pbxproj @@ -1393,7 +1393,7 @@ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1985; + CURRENT_PROJECT_VERSION = 1986; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_PREPROCESSOR_DEFINITIONS = ( @@ -1403,7 +1403,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.8.5; + MARKETING_VERSION = 1.8.6; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewingTests; @@ -1432,13 +1432,13 @@ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1985; + CURRENT_PROJECT_VERSION = 1986; 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.8.5; + MARKETING_VERSION = 1.8.6; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewingTests; @@ -1469,7 +1469,7 @@ CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1985; + CURRENT_PROJECT_VERSION = 1986; DEAD_CODE_STRIPPING = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; @@ -1490,7 +1490,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 1.8.5; + MARKETING_VERSION = 1.8.6; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewing.vChewingPhraseEditor; @@ -1519,7 +1519,7 @@ CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1985; + CURRENT_PROJECT_VERSION = 1986; DEAD_CODE_STRIPPING = YES; ENABLE_NS_ASSERTIONS = NO; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1536,7 +1536,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 1.8.5; + MARKETING_VERSION = 1.8.6; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewing.vChewingPhraseEditor; @@ -1650,7 +1650,7 @@ CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1985; + CURRENT_PROJECT_VERSION = 1986; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = ""; @@ -1678,7 +1678,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 1.8.5; + MARKETING_VERSION = 1.8.6; ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.inputmethod.vChewing; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1705,7 +1705,7 @@ CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1985; + CURRENT_PROJECT_VERSION = 1986; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = ""; @@ -1727,7 +1727,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 1.8.5; + MARKETING_VERSION = 1.8.6; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.inputmethod.vChewing; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1749,7 +1749,7 @@ CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1985; + CURRENT_PROJECT_VERSION = 1986; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -1769,7 +1769,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 1.8.5; + MARKETING_VERSION = 1.8.6; ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = "org.atelierInmu.vChewing.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1791,7 +1791,7 @@ CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1985; + CURRENT_PROJECT_VERSION = 1986; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -1805,7 +1805,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 1.8.5; + MARKETING_VERSION = 1.8.6; PRODUCT_BUNDLE_IDENTIFIER = "org.atelierInmu.vChewing.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = "";