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 @@