Pre Merge pull request !36 from ShikiSuen/upd/1.6.1

This commit is contained in:
ShikiSuen 2022-05-23 08:57:37 +00:00 committed by Gitee
commit 3766177cc9
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
28 changed files with 704 additions and 317 deletions

View File

@ -43,6 +43,20 @@ extension String {
} }
} }
// MARK: - StringView Ranges Extension (by Isaac Xen)
extension String {
fileprivate func ranges(splitBy separator: Element) -> [Range<String.Index>] {
var startIndex = startIndex
return split(separator: separator).reduce(into: []) { ranges, substring in
_ = range(of: substring, range: startIndex..<endIndex).map { range in
ranges.append(range)
startIndex = range.upperBound
}
}
}
}
// MARK: - // MARK: -
// Ref: https://stackoverflow.com/a/32581409/4162914 // Ref: https://stackoverflow.com/a/32581409/4162914
@ -53,7 +67,7 @@ extension Float {
} }
} }
// MARK: - // MARK: -
// Ref: https://stackoverflow.com/a/41581695/4162914 // Ref: https://stackoverflow.com/a/41581695/4162914
precedencegroup ExponentiationPrecedence { precedencegroup ExponentiationPrecedence {
@ -80,6 +94,24 @@ struct Entry {
var valCount: Int = 0 var valCount: Int = 0
} }
// MARK: - plist
func cnvPhonabetToASCII(_ incoming: String) -> String {
let dicPhonabet2ASCII = [
"": "b", "": "p", "": "m", "": "f", "": "d", "": "t", "": "n", "": "l", "": "g", "": "k", "": "h",
"": "j", "": "q", "": "x", "": "Z", "": "C", "": "S", "": "r", "": "z", "": "c", "": "s", "": "i",
"": "u", "": "v", "": "a", "": "o", "": "e", "": "E", "": "B", "": "P", "": "M", "": "F", "": "D",
"": "T", "": "N", "": "L", "": "R", "ˊ": "2", "ˇ": "3", "ˋ": "4", "˙": "5",
]
var strOutput = incoming
if !strOutput.contains("_") {
for entry in dicPhonabet2ASCII {
strOutput = strOutput.replacingOccurrences(of: entry.key, with: entry.value)
}
}
return strOutput
}
// MARK: - // MARK: -
private let urlCurrentFolder = URL(fileURLWithPath: FileManager.default.currentDirectoryPath) private let urlCurrentFolder = URL(fileURLWithPath: FileManager.default.currentDirectoryPath)
@ -95,12 +127,22 @@ private let urlCHTforMOE: String = "./components/cht/phrases-moe-cht.txt"
private let urlCHTforVCHEW: String = "./components/cht/phrases-vchewing-cht.txt" private let urlCHTforVCHEW: String = "./components/cht/phrases-vchewing-cht.txt"
private let urlKanjiCore: String = "./components/common/char-kanji-core.txt" private let urlKanjiCore: String = "./components/common/char-kanji-core.txt"
private let urlPunctuation: String = "./components/common/data-punctuations.txt"
private let urlMiscBPMF: String = "./components/common/char-misc-bpmf.txt" private let urlMiscBPMF: String = "./components/common/char-misc-bpmf.txt"
private let urlMiscNonKanji: String = "./components/common/char-misc-nonkanji.txt" private let urlMiscNonKanji: String = "./components/common/char-misc-nonkanji.txt"
private let urlPunctuation: String = "./components/common/data-punctuations.txt"
private let urlSymbols: String = "./components/common/data-symbols.txt"
private let urlZhuyinwen: String = "./components/common/data-zhuyinwen.txt"
private let urlCNS: String = "./components/common/char-kanji-cns.txt"
private let urlPlistSymbols: String = "./data-symbols.plist"
private let urlPlistZhuyinwen: String = "./data-zhuyinwen.plist"
private let urlPlistCNS: String = "./data-cns.plist"
private let urlOutputCHS: String = "./data-chs.txt" private let urlOutputCHS: String = "./data-chs.txt"
private let urlPlistCHS: String = "./data-chs.plist"
private let urlOutputCHT: String = "./data-cht.txt" private let urlOutputCHT: String = "./data-cht.txt"
private let urlPlistCHT: String = "./data-cht.plist"
// MARK: - // MARK: -
@ -382,41 +424,130 @@ func weightAndSort(_ arrStructUncalculated: [Entry], isCHS: Bool) -> [Entry] {
func fileOutput(isCHS: Bool) { func fileOutput(isCHS: Bool) {
let i18n: String = isCHS ? "簡體中文" : "繁體中文" let i18n: String = isCHS ? "簡體中文" : "繁體中文"
var strPunctuation = ""
var rangeMap: [String: [Data]] = [:]
let pathOutput = urlCurrentFolder.appendingPathComponent( let pathOutput = urlCurrentFolder.appendingPathComponent(
isCHS ? urlOutputCHS : urlOutputCHT) isCHS ? urlOutputCHS : urlOutputCHT)
let plistURL = urlCurrentFolder.appendingPathComponent(
isCHS ? urlPlistCHS : urlPlistCHT)
var strPrintLine = "" var strPrintLine = ""
// //
do { do {
strPrintLine += try String(contentsOfFile: urlPunctuation, encoding: .utf8) strPunctuation = try String(contentsOfFile: urlPunctuation, encoding: .utf8).replacingOccurrences(
of: "\t", with: " ")
strPrintLine += try String(contentsOfFile: urlPunctuation, encoding: .utf8).replacingOccurrences(
of: "\t", with: " ")
} catch { } catch {
NSLog(" - \(i18n): Exception happened when reading raw punctuation data.") NSLog(" - \(i18n): Exception happened when reading raw punctuation data.")
} }
NSLog(" - \(i18n): 成功插入標點符號與西文字母數據") NSLog(" - \(i18n): 成功插入標點符號與西文字母數據txt")
// //
strPunctuation.ranges(splitBy: "\n").forEach {
let neta = strPunctuation[$0].split(separator: " ")
let line = String(strPunctuation[$0])
if neta.count >= 2 {
let theKey = String(neta[0])
let theValue = String(neta[1])
if !neta[0].isEmpty, !neta[1].isEmpty, line.first != "#" {
rangeMap[cnvPhonabetToASCII(theKey), default: []].append(theValue.data(using: .utf8)!)
}
}
}
var arrStructUnified: [Entry] = [] var arrStructUnified: [Entry] = []
arrStructUnified += rawDictForKanjis(isCHS: isCHS) arrStructUnified += rawDictForKanjis(isCHS: isCHS)
arrStructUnified += rawDictForNonKanjis(isCHS: isCHS) arrStructUnified += rawDictForNonKanjis(isCHS: isCHS)
arrStructUnified += rawDictForPhrases(isCHS: isCHS) arrStructUnified += rawDictForPhrases(isCHS: isCHS)
// //
arrStructUnified = weightAndSort(arrStructUnified, isCHS: isCHS) arrStructUnified = weightAndSort(arrStructUnified, isCHS: isCHS)
for entry in arrStructUnified { for entry in arrStructUnified {
let theKey = entry.valPhone
let theValue = (String(entry.valWeight) + " " + entry.valPhrase)
rangeMap[cnvPhonabetToASCII(theKey), default: []].append(theValue.data(using: .utf8)!)
strPrintLine += strPrintLine +=
entry.valPhone + " " + entry.valPhrase + " " + String(entry.valWeight) entry.valPhone + " " + entry.valPhrase + " " + String(entry.valWeight)
+ "\n" + "\n"
} }
NSLog(" - \(i18n): 要寫入檔案的內容編譯完畢。") NSLog(" - \(i18n): 要寫入檔案的 txt 內容編譯完畢。")
do { do {
try strPrintLine.write(to: pathOutput, atomically: false, encoding: .utf8) try strPrintLine.write(to: pathOutput, atomically: false, encoding: .utf8)
let plistData = try PropertyListSerialization.data(fromPropertyList: rangeMap, format: .binary, options: 0)
try plistData.write(to: plistURL)
} catch { } catch {
NSLog(" - \(i18n): Error on writing strings to file: \(error)") NSLog(" - \(i18n): Error on writing strings to file: \(error)")
} }
NSLog(" - \(i18n): 寫入完成。") NSLog(" - \(i18n): 寫入完成。")
} }
// MARK: - func commonFileOutput() {
let i18n = "語言中性"
var strSymbols = ""
var strZhuyinwen = ""
var strCNS = ""
var mapSymbols: [String: [Data]] = [:]
var mapZhuyinwen: [String: [Data]] = [:]
var mapCNS: [String: [Data]] = [:]
//
do {
strSymbols = try String(contentsOfFile: urlSymbols, encoding: .utf8).replacingOccurrences(of: "\t", with: " ")
strZhuyinwen = try String(contentsOfFile: urlZhuyinwen, encoding: .utf8).replacingOccurrences(of: "\t", with: " ")
strCNS = try String(contentsOfFile: urlCNS, encoding: .utf8).replacingOccurrences(of: "\t", with: " ")
} catch {
NSLog(" - \(i18n): Exception happened when reading raw punctuation data.")
}
NSLog(" - \(i18n): 成功取得標點符號與西文字母原始資料plist")
//
strSymbols.ranges(splitBy: "\n").forEach {
let neta = strSymbols[$0].split(separator: " ")
let line = String(strSymbols[$0])
if neta.count >= 2 {
let theKey = String(neta[1])
let theValue = String(neta[0])
if !neta[0].isEmpty, !neta[1].isEmpty, line.first != "#" {
mapSymbols[cnvPhonabetToASCII(theKey), default: []].append(theValue.data(using: .utf8)!)
}
}
}
strZhuyinwen.ranges(splitBy: "\n").forEach {
let neta = strZhuyinwen[$0].split(separator: " ")
let line = String(strZhuyinwen[$0])
if neta.count >= 2 {
let theKey = String(neta[1])
let theValue = String(neta[0])
if !neta[0].isEmpty, !neta[1].isEmpty, line.first != "#" {
mapZhuyinwen[cnvPhonabetToASCII(theKey), default: []].append(theValue.data(using: .utf8)!)
}
}
}
strCNS.ranges(splitBy: "\n").forEach {
let neta = strCNS[$0].split(separator: " ")
let line = String(strCNS[$0])
if neta.count >= 2 {
let theKey = String(neta[1])
let theValue = String(neta[0])
if !neta[0].isEmpty, !neta[1].isEmpty, line.first != "#" {
mapCNS[cnvPhonabetToASCII(theKey), default: []].append(theValue.data(using: .utf8)!)
}
}
}
NSLog(" - \(i18n): 要寫入檔案的內容編譯完畢。")
do {
try PropertyListSerialization.data(fromPropertyList: mapSymbols, format: .binary, options: 0).write(
to: URL(fileURLWithPath: urlPlistSymbols))
try PropertyListSerialization.data(fromPropertyList: mapZhuyinwen, format: .binary, options: 0).write(
to: URL(fileURLWithPath: urlPlistZhuyinwen))
try PropertyListSerialization.data(fromPropertyList: mapCNS, format: .binary, options: 0).write(
to: URL(fileURLWithPath: urlPlistCNS))
} catch {
NSLog(" - \(i18n): Error on writing strings to file: \(error)")
}
NSLog(" - \(i18n): 寫入完成。")
}
// MARK: -
func main() { func main() {
NSLog("// 準備編譯符號表情ㄅ文語料檔案。")
commonFileOutput()
NSLog("// 準備編譯繁體中文核心語料檔案。") NSLog("// 準備編譯繁體中文核心語料檔案。")
fileOutput(isCHS: false) fileOutput(isCHS: false)
NSLog("// 準備編譯簡體中文核心語料檔案。") NSLog("// 準備編譯簡體中文核心語料檔案。")

View File

@ -24,27 +24,31 @@
## 系統需求 ## 系統需求
建置用系統需求:至少 macOS 10.15 Catalina & Xcode 12。// 原因Swift 封包管理支所需。 建置用系統需求:至少 macOS 10.15 Catalina & Xcode 12。// 原因Swift 封包管理支所需。
編譯出的成品對應系統需求: 編譯出的成品對應系統需求:
- 至少 macOS El Capitan 10.11.5,否則無法處理 Unicode 8.0 的漢字。即便如此,仍需手動升級蘋方至至少 macOS 10.12 開始隨贈的版本、以支持 Unicode 8.0 的通用規範漢字表用字(全字型檔沒有「𫫇」字)。 - 至少 macOS El Capitan 10.11.5,否則無法處理 Unicode 8.0 的漢字。即便如此,仍需手動升級蘋方至至少 macOS 10.12 開始隨贈的版本、以支援 Unicode 8.0 的通用規範漢字表用字(全字庫沒有「𫫇」字)。
- 保留該系統支援的原因:非 Unibody 體型的 MacBook Pro 支援的最後一版 macOS 就是 El Capitan。 - 保留該系統支援的原因:非 Unibody 體型的 MacBook Pro 支援的最後一版 macOS 就是 El Capitan。
- **推薦最低系統版本**macOS 10.12 Sierra對 Unicode 8.0 開始的《通用規範漢字表》漢字有原生的蘋方支持。 - **推薦最低系統版本**macOS 10.12 Sierra對 Unicode 8.0 開始的《通用規範漢字表》漢字有原生的蘋方支援。
- 同時建議**系統記憶體應至少 4GB**。威注音輸入法佔用記憶體約 115MB 左右簡繁雙模式、75MB左右單模式供參考。
- 請務必使用 SSD 硬碟,否則可能會影響每次開機之後輸入法首次載入的速度。從 10.10 Yosemite 開始macOS 就已經是針對機械硬碟負優化的作業系統了。
- 注:能裝 macOS 10.13 High Sierra 就不要去碰 macOS 10.12 Sierra 這個半成品。 - 注:能裝 macOS 10.13 High Sierra 就不要去碰 macOS 10.12 Sierra 這個半成品。
- 關於全字型檔支持,因下述事實而在理論上很難做到最完美: - 關於全字庫支援,因下述事實而在理論上很難做到最完美:
- 很可惜 GB18030-2005 並沒有官方提供的逐字讀音對照表,所以目前才用了全字型檔。然而全字型檔並不等於完美。 - 很可惜 GB18030-2005 並沒有官方提供的逐字讀音對照表,所以目前才用了全字庫。然而全字庫並不等於完美。
- 有條件者可以安裝全字型檔字型與花園明朝,否則全字型檔等高萬國碼碼位漢字恐無法在輸入法的選字窗內完整顯示。 - 有條件者可以安裝全字庫字型與花園明朝,否則全字庫等高萬國碼碼位漢字恐無法在輸入法的選字窗內完整顯示。
- 全字型檔漢字顯示支持會受到具體系統版本對萬國碼版本的支持的限制。 - 全字庫漢字顯示支援會受到具體系統版本對萬國碼版本的支援的限制。
- 有些全字型檔漢字一開始會依賴萬國碼的私人造字區,且在之後被新版本萬國碼所支持 - 有些全字庫漢字一開始會依賴萬國碼的私人造字區,且在之後被新版本萬國碼所支援
## 建置流程 ## 建置流程
@ -106,6 +110,6 @@
其實我滿懷念上游專案還沒被 Lukhnos Liu 接管收入 OpenVanilla 的那個年代。MJHsieh 主導開發小麥注音的時候且不討論他立場怎樣但基礎的技術交流是完全沒問題的。LibChewing 那邊也是,正常交流完全沒問題。 其實我滿懷念上游專案還沒被 Lukhnos Liu 接管收入 OpenVanilla 的那個年代。MJHsieh 主導開發小麥注音的時候且不討論他立場怎樣但基礎的技術交流是完全沒問題的。LibChewing 那邊也是,正常交流完全沒問題。
有些事情,繼續爭論下去也沒用。本來我想著重寫 ctlInputMethod 撤掉 zonble 的狀態管理引擎的,畢竟有大陸同鄉寫的火山五筆輸入法的框架套上我的鐵恨注音並擊引擎可以直接用。但這樣賭氣對誰都沒好處。眼下,威注音 macOS 版還需要一些小維護。之後我就得開始考慮用 Rust 重寫鐵恨注音並擊引擎與天權星語彙引擎、方便接下來威注音的 Windows 版本的研發。能將 Lukhnos 的 C++ 內容全部換掉、徹底砸碎套在威注音身上的名為 C++ 的枷鎖、讓威注音有一個自由的未來,我已經知足了。讓更多的人用上好用的輸入法,才是最重要的。**這個重要性,不是 zonble 用「私人需求」這種帽子扣過來、就可以泯滅了的**。 有些事情,繼續爭論下去也沒用。本來我想著重寫 ctlInputMethod 撤掉 zonble 的狀態管理引擎的,畢竟有大陸同鄉寫的火山五筆輸入法的框架套上我的鐵恨注音並擊引擎可以直接用。但這樣賭氣對誰都沒好處。眼下,威注音 macOS 版還需要一些小維護。之後我就得開始考慮用 Windows 平台可用的除了 C++ 以外的語言重寫鐵恨注音並擊引擎與天權星語彙引擎、方便接下來威注音的 Windows 版本的研發。能將 Lukhnos 的 C++ 內容全部換掉、徹底砸碎套在威注音身上的名為 C++ 的枷鎖、讓威注音有一個自由的未來,我已經知足了。讓更多的人用上好用的輸入法,才是最重要的。**這個重要性,不是 zonble 用「私人需求」這種帽子扣過來、就可以泯滅了的**。
$ EOF. $ EOF.

@ -1 +1 @@
Subproject commit 6c4d659d148ef5be3255427bfd4429fa8690631d Subproject commit b92e458ddda22f43e2a0e9b0b7a2b2aa6455fab2

View File

@ -112,7 +112,9 @@ class KeyHandler {
// of the best possible Mandarin characters given the input syllables, // of the best possible Mandarin characters given the input syllables,
// using the Viterbi algorithm implemented in the Megrez library. // using the Viterbi algorithm implemented in the Megrez library.
// The walk() traces the grid to the end, hence no need to use .reversed() here. // The walk() traces the grid to the end, hence no need to use .reversed() here.
_walkedNodes = _builder.walk(at: _builder.grid.width, nodesLimit: 10, balanced: true) _walkedNodes = _builder.walk(
at: _builder.grid.width, nodesLimit: 10, balanced: mgrPrefs.useScoreBalancing
)
} }
var popOverflowComposingTextAndWalk: String { var popOverflowComposingTextAndWalk: String {

View File

@ -869,7 +869,7 @@ public struct Tekkon {
["ㄕㄨㄢ", "shuan"], ["ㄕㄨㄣ", "shun"], ["ㄕㄨㄤ", "shuang"], ["ㄖㄨㄛ", "ruo"], ["ㄖㄨㄟ", "rui"], ["ㄖㄨㄢ", "ruan"], ["ㄕㄨㄢ", "shuan"], ["ㄕㄨㄣ", "shun"], ["ㄕㄨㄤ", "shuang"], ["ㄖㄨㄛ", "ruo"], ["ㄖㄨㄟ", "rui"], ["ㄖㄨㄢ", "ruan"],
["ㄖㄨㄣ", "run"], ["ㄖㄨㄥ", "rong"], ["ㄗㄨㄛ", "zuo"], ["ㄗㄨㄟ", "zui"], ["ㄗㄨㄢ", "zuan"], ["ㄗㄨㄣ", "zun"], ["ㄗㄨㄥ", "zong"], ["ㄖㄨㄣ", "run"], ["ㄖㄨㄥ", "rong"], ["ㄗㄨㄛ", "zuo"], ["ㄗㄨㄟ", "zui"], ["ㄗㄨㄢ", "zuan"], ["ㄗㄨㄣ", "zun"], ["ㄗㄨㄥ", "zong"],
["ㄘㄨㄛ", "cuo"], ["ㄘㄨㄟ", "cui"], ["ㄘㄨㄢ", "cuan"], ["ㄘㄨㄣ", "cun"], ["ㄘㄨㄥ", "cong"], ["ㄙㄨㄛ", "suo"], ["ㄙㄨㄟ", "sui"], ["ㄘㄨㄛ", "cuo"], ["ㄘㄨㄟ", "cui"], ["ㄘㄨㄢ", "cuan"], ["ㄘㄨㄣ", "cun"], ["ㄘㄨㄥ", "cong"], ["ㄙㄨㄛ", "suo"], ["ㄙㄨㄟ", "sui"],
["ㄙㄨㄢ", "suan"], ["ㄙㄨㄣ", "sun"], ["ㄙㄨㄥ", "song"], ["ㄙㄨㄢ", "suan"], ["ㄙㄨㄣ", "sun"], ["ㄙㄨㄥ", "song"], ["ㄅㄧㄤ", "biang"], ["ㄉㄨㄤ", "duang"],
["ㄅㄚ", "ba"], ["ㄅㄛ", "bo"], ["ㄅㄞ", "bai"], ["ㄅㄟ", "bei"], ["ㄅㄠ", "bao"], ["ㄅㄢ", "ban"], ["ㄅㄣ", "ben"], ["ㄅㄚ", "ba"], ["ㄅㄛ", "bo"], ["ㄅㄞ", "bai"], ["ㄅㄟ", "bei"], ["ㄅㄠ", "bao"], ["ㄅㄢ", "ban"], ["ㄅㄣ", "ben"],
["ㄅㄤ", "bang"], ["ㄅㄥ", "beng"], ["ㄅㄧ", "bi"], ["ㄅㄨ", "bu"], ["ㄆㄚ", "pa"], ["ㄆㄛ", "po"], ["ㄆㄞ", "pai"], ["ㄅㄤ", "bang"], ["ㄅㄥ", "beng"], ["ㄅㄧ", "bi"], ["ㄅㄨ", "bu"], ["ㄆㄚ", "pa"], ["ㄆㄛ", "po"], ["ㄆㄞ", "pai"],
@ -956,15 +956,16 @@ public struct Tekkon {
] ]
/// ///
static let mapHanyuPinyin: [String: String] = [ static let mapHanyuPinyin: [String: String] = [
"chuang": "ㄔㄨㄤ", "shuang": "ㄕㄨㄤ", "zhuang": "ㄓㄨㄤ", "chang": "ㄔㄤ", "cheng": "ㄔㄥ", "chong": "ㄔㄨㄥ", "chuai": "ㄔㄨㄞ", "chuang": "ㄔㄨㄤ", "shuang": "ㄕㄨㄤ", "zhuang": "ㄓㄨㄤ",
"chuan": "ㄔㄨㄢ", "guang": "ㄍㄨㄤ", "huang": "ㄏㄨㄤ", "jiang": "ㄐㄧㄤ", "jiong": "ㄐㄩㄥ", "kiang": "ㄎㄧㄤ", "kuang": "ㄎㄨㄤ", "chang": "ㄔㄤ", "cheng": "ㄔㄥ", "chong": "ㄔㄨㄥ", "chuai": "ㄔㄨㄞ", "chuan": "ㄔㄨㄢ", "guang": "ㄍㄨㄤ", "huang": "ㄏㄨㄤ",
"liang": "ㄌㄧㄤ", "niang": "ㄋㄧㄤ", "qiang": "ㄑㄧㄤ", "qiong": "ㄑㄩㄥ", "shang": "ㄕㄤ", "sheng": "ㄕㄥ", "shuai": "ㄕㄨㄞ", "jiang": "ㄐㄧㄤ", "jiong": "ㄐㄩㄥ", "kiang": "ㄎㄧㄤ", "kuang": "ㄎㄨㄤ", "biang": "ㄅㄧㄤ", "duang": "ㄉㄨㄤ", "liang": "ㄌㄧㄤ",
"shuan": "ㄕㄨㄢ", "xiang": "ㄒㄧㄤ", "xiong": "ㄒㄩㄥ", "zhang": "ㄓㄤ", "zheng": "ㄓㄥ", "zhong": "ㄓㄨㄥ", "zhuai": "ㄓㄨㄞ", "niang": "ㄋㄧㄤ", "qiang": "ㄑㄧㄤ", "qiong": "ㄑㄩㄥ", "shang": "ㄕㄤ", "sheng": "ㄕㄥ", "shuai": "ㄕㄨㄞ", "shuan": "ㄕㄨㄢ",
"zhuan": "ㄓㄨㄢ", "bang": "ㄅㄤ", "beng": "ㄅㄥ", "bian": "ㄅㄧㄢ", "biao": "ㄅㄧㄠ", "bing": "ㄅㄧㄥ", "cang": "ㄘㄤ", "ceng": "ㄘㄥ", "xiang": "ㄒㄧㄤ", "xiong": "ㄒㄩㄥ", "zhang": "ㄓㄤ", "zheng": "ㄓㄥ", "zhong": "ㄓㄨㄥ", "zhuai": "ㄓㄨㄞ", "zhuan": "ㄓㄨㄢ",
"chai": "ㄔㄞ", "chan": "ㄔㄢ", "chao": "ㄔㄠ", "chen": "ㄔㄣ", "chou": "ㄔㄡ", "chua": "ㄔㄨㄚ", "chui": "ㄔㄨㄟ", "chun": "ㄔㄨㄣ", "bang": "ㄅㄤ", "beng": "ㄅㄥ", "bian": "ㄅㄧㄢ", "biao": "ㄅㄧㄠ", "bing": "ㄅㄧㄥ", "cang": "ㄘㄤ", "ceng": "ㄘㄥ", "chai": "ㄔㄞ",
"chuo": "ㄔㄨㄛ", "cong": "ㄘㄨㄥ", "cuan": "ㄘㄨㄢ", "dang": "ㄉㄤ", "deng": "ㄉㄥ", "dian": "ㄉㄧㄢ", "diao": "ㄉㄧㄠ", "chan": "ㄔㄢ", "chao": "ㄔㄠ", "chen": "ㄔㄣ", "chou": "ㄔㄡ", "chua": "ㄔㄨㄚ", "chui": "ㄔㄨㄟ", "chun": "ㄔㄨㄣ", "chuo": "ㄔㄨㄛ",
"ding": "ㄉㄧㄥ", "dong": "ㄉㄨㄥ", "duan": "ㄉㄨㄢ", "fang": "ㄈㄤ", "feng": "ㄈㄥ", "fiao": "ㄈㄧㄠ", "fong": "ㄈㄨㄥ", "gang": "ㄍㄤ", "cong": "ㄘㄨㄥ", "cuan": "ㄘㄨㄢ", "dang": "ㄉㄤ", "deng": "ㄉㄥ", "dian": "ㄉㄧㄢ", "diao": "ㄉㄧㄠ", "ding": "ㄉㄧㄥ",
"geng": "ㄍㄥ", "giao": "ㄍㄧㄠ", "gong": "ㄍㄨㄥ", "guai": "ㄍㄨㄞ", "guan": "ㄍㄨㄢ", "hang": "ㄏㄤ", "heng": "ㄏㄥ", "hong": "ㄏㄨㄥ", "dong": "ㄉㄨㄥ", "duan": "ㄉㄨㄢ", "fang": "ㄈㄤ", "feng": "ㄈㄥ", "fiao": "ㄈㄧㄠ", "fong": "ㄈㄨㄥ", "gang": "ㄍㄤ", "geng": "ㄍㄥ",
"giao": "ㄍㄧㄠ", "gong": "ㄍㄨㄥ", "guai": "ㄍㄨㄞ", "guan": "ㄍㄨㄢ", "hang": "ㄏㄤ", "heng": "ㄏㄥ", "hong": "ㄏㄨㄥ",
"huai": "ㄏㄨㄞ", "huan": "ㄏㄨㄢ", "jian": "ㄐㄧㄢ", "jiao": "ㄐㄧㄠ", "jing": "ㄐㄧㄥ", "juan": "ㄐㄩㄢ", "kang": "ㄎㄤ", "huai": "ㄏㄨㄞ", "huan": "ㄏㄨㄢ", "jian": "ㄐㄧㄢ", "jiao": "ㄐㄧㄠ", "jing": "ㄐㄧㄥ", "juan": "ㄐㄩㄢ", "kang": "ㄎㄤ",
"keng": "ㄎㄥ", "kong": "ㄎㄨㄥ", "kuai": "ㄎㄨㄞ", "kuan": "ㄎㄨㄢ", "lang": "ㄌㄤ", "leng": "ㄌㄥ", "lian": "ㄌㄧㄢ", "liao": "ㄌㄧㄠ", "keng": "ㄎㄥ", "kong": "ㄎㄨㄥ", "kuai": "ㄎㄨㄞ", "kuan": "ㄎㄨㄢ", "lang": "ㄌㄤ", "leng": "ㄌㄥ", "lian": "ㄌㄧㄢ", "liao": "ㄌㄧㄠ",
"ling": "ㄌㄧㄥ", "long": "ㄌㄨㄥ", "luan": "ㄌㄨㄢ", "lvan": "ㄌㄩㄢ", "mang": "ㄇㄤ", "meng": "ㄇㄥ", "mian": "ㄇㄧㄢ", "ling": "ㄌㄧㄥ", "long": "ㄌㄨㄥ", "luan": "ㄌㄨㄢ", "lvan": "ㄌㄩㄢ", "mang": "ㄇㄤ", "meng": "ㄇㄥ", "mian": "ㄇㄧㄢ",
@ -999,33 +1000,36 @@ public struct Tekkon {
"wan": "ㄨㄢ", "wei": "ㄨㄟ", "wen": "ㄨㄣ", "xia": "ㄒㄧㄚ", "xie": "ㄒㄧㄝ", "xin": "ㄒㄧㄣ", "xiu": "ㄒㄧㄡ", "xue": "ㄒㄩㄝ", "wan": "ㄨㄢ", "wei": "ㄨㄟ", "wen": "ㄨㄣ", "xia": "ㄒㄧㄚ", "xie": "ㄒㄧㄝ", "xin": "ㄒㄧㄣ", "xiu": "ㄒㄧㄡ", "xue": "ㄒㄩㄝ",
"xun": "ㄒㄩㄣ", "yai": "ㄧㄞ", "yan": "ㄧㄢ", "yao": "ㄧㄠ", "yin": "ㄧㄣ", "you": "ㄧㄡ", "yue": "ㄩㄝ", "yun": "ㄩㄣ", "xun": "ㄒㄩㄣ", "yai": "ㄧㄞ", "yan": "ㄧㄢ", "yao": "ㄧㄠ", "yin": "ㄧㄣ", "you": "ㄧㄡ", "yue": "ㄩㄝ", "yun": "ㄩㄣ",
"zai": "ㄗㄞ", "zan": "ㄗㄢ", "zao": "ㄗㄠ", "zei": "ㄗㄟ", "zen": "ㄗㄣ", "zha": "ㄓㄚ", "zhe": "ㄓㄜ", "zhi": "", "zhu": "ㄓㄨ", "zai": "ㄗㄞ", "zan": "ㄗㄢ", "zao": "ㄗㄠ", "zei": "ㄗㄟ", "zen": "ㄗㄣ", "zha": "ㄓㄚ", "zhe": "ㄓㄜ", "zhi": "", "zhu": "ㄓㄨ",
"zou": "ㄗㄡ", "zui": "ㄗㄨㄟ", "zun": "ㄗㄨㄣ", "zuo": "ㄗㄨㄛ", "ai": "", "an": "", "ao": "", "ba": "ㄅㄚ", "bi": "ㄅㄧ", "zou": "ㄗㄡ", "zui": "ㄗㄨㄟ", "zun": "ㄗㄨㄣ", "zuo": "ㄗㄨㄛ",
"bo": "ㄅㄛ", "bu": "ㄅㄨ", "ca": "ㄘㄚ", "ce": "ㄘㄜ", "ci": "", "cu": "ㄘㄨ", "da": "ㄉㄚ", "de": "ㄉㄜ", "di": "ㄉㄧ", "ai": "", "an": "", "ao": "", "ba": "ㄅㄚ", "bi": "ㄅㄧ", "bo": "ㄅㄛ", "bu": "ㄅㄨ", "ca": "ㄘㄚ", "ce": "ㄘㄜ", "ci": "",
"du": "ㄉㄨ", "eh": "", "ei": "", "en": "", "er": "", "fa": "ㄈㄚ", "fo": "ㄈㄛ", "fu": "ㄈㄨ", "ga": "ㄍㄚ", "ge": "ㄍㄜ", "cu": "ㄘㄨ", "da": "ㄉㄚ", "de": "ㄉㄜ", "di": "ㄉㄧ", "du": "ㄉㄨ", "eh": "", "ei": "", "en": "", "er": "", "fa": "ㄈㄚ",
"gi": "ㄍㄧ", "gu": "ㄍㄨ", "ha": "ㄏㄚ", "he": "ㄏㄜ", "hu": "ㄏㄨ", "ji": "ㄐㄧ", "ju": "ㄐㄩ", "ka": "ㄎㄚ", "ke": "ㄎㄜ", "fo": "ㄈㄛ", "fu": "ㄈㄨ", "ga": "ㄍㄚ", "ge": "ㄍㄜ", "gi": "ㄍㄧ", "gu": "ㄍㄨ", "ha": "ㄏㄚ", "he": "ㄏㄜ", "hu": "ㄏㄨ",
"ku": "ㄎㄨ", "la": "ㄌㄚ", "le": "ㄌㄜ", "li": "ㄌㄧ", "lo": "ㄌㄛ", "lu": "ㄌㄨ", "lv": "ㄌㄩ", "ma": "ㄇㄚ", "me": "ㄇㄜ", "ji": "ㄐㄧ", "ju": "ㄐㄩ", "ka": "ㄎㄚ", "ke": "ㄎㄜ", "ku": "ㄎㄨ", "la": "ㄌㄚ", "le": "ㄌㄜ", "li": "ㄌㄧ", "lo": "ㄌㄛ",
"mi": "ㄇㄧ", "mo": "ㄇㄛ", "mu": "ㄇㄨ", "na": "ㄋㄚ", "ne": "ㄋㄜ", "ni": "ㄋㄧ", "nu": "ㄋㄨ", "nv": "ㄋㄩ", "ou": "", "lu": "ㄌㄨ", "lv": "ㄌㄩ", "ma": "ㄇㄚ", "me": "ㄇㄜ", "mi": "ㄇㄧ", "mo": "ㄇㄛ", "mu": "ㄇㄨ", "na": "ㄋㄚ", "ne": "ㄋㄜ",
"pa": "ㄆㄚ", "pi": "ㄆㄧ", "po": "ㄆㄛ", "pu": "ㄆㄨ", "qi": "ㄑㄧ", "qu": "ㄑㄩ", "re": "ㄖㄜ", "ri": "", "ru": "ㄖㄨ", "ni": "ㄋㄧ", "nu": "ㄋㄨ", "nv": "ㄋㄩ", "ou": "", "pa": "ㄆㄚ", "pi": "ㄆㄧ", "po": "ㄆㄛ", "pu": "ㄆㄨ", "qi": "ㄑㄧ",
"sa": "ㄙㄚ", "se": "ㄙㄜ", "si": "", "su": "ㄙㄨ", "ta": "ㄊㄚ", "te": "ㄊㄜ", "ti": "ㄊㄧ", "tu": "ㄊㄨ", "wa": "ㄨㄚ", "qu": "ㄑㄩ", "re": "ㄖㄜ", "ri": "", "ru": "ㄖㄨ", "sa": "ㄙㄚ", "se": "ㄙㄜ", "si": "", "su": "ㄙㄨ", "ta": "ㄊㄚ",
"wo": "ㄨㄛ", "wu": "", "xi": "ㄒㄧ", "xu": "ㄒㄩ", "ya": "ㄧㄚ", "ye": "ㄧㄝ", "yi": "", "yo": "ㄧㄛ", "yu": "", "za": "ㄗㄚ", "te": "ㄊㄜ", "ti": "ㄊㄧ", "tu": "ㄊㄨ", "wa": "ㄨㄚ", "wo": "ㄨㄛ", "wu": "", "xi": "ㄒㄧ", "xu": "ㄒㄩ", "ya": "ㄧㄚ",
"ze": "ㄗㄜ", "zi": "", "zu": "ㄗㄨ", "a": "", "e": "", "o": "", "q": "", "ye": "ㄧㄝ", "yi": "", "yo": "ㄧㄛ", "yu": "", "za": "ㄗㄚ", "ze": "ㄗㄜ", "zi": "", "zu": "ㄗㄨ",
"a": "", "e": "", "o": "", "q": "",
] ]
/// ///
static let mapSecondaryPinyin: [String: String] = [ static let mapSecondaryPinyin: [String: String] = [
"chuang": "ㄔㄨㄤ", "shuang": "ㄕㄨㄤ", "chiang": "ㄑㄧㄤ", "chiung": "ㄑㄩㄥ", "chiuan": "ㄑㄩㄢ", "shiang": "ㄒㄧㄤ", "chuang": "ㄔㄨㄤ", "shuang": "ㄕㄨㄤ", "chiang": "ㄑㄧㄤ", "chiung": "ㄑㄩㄥ", "chiuan": "ㄑㄩㄢ", "shiang": "ㄒㄧㄤ",
"shiung": "ㄒㄩㄥ", "shiuan": "ㄒㄩㄢ", "juang": "ㄓㄨㄤ", "jiang": "ㄐㄧㄤ", "jiung": "ㄐㄩㄥ", "niang": "ㄋㄧㄤ", "liang": "ㄌㄧㄤ", "shiung": "ㄒㄩㄥ", "shiuan": "ㄒㄩㄢ",
"biang": "ㄅㄧㄤ", "duang": "ㄉㄨㄤ", "juang": "ㄓㄨㄤ", "jiang": "ㄐㄧㄤ", "jiung": "ㄐㄩㄥ", "niang": "ㄋㄧㄤ", "liang": "ㄌㄧㄤ",
"guang": "ㄍㄨㄤ", "kuang": "ㄎㄨㄤ", "huang": "ㄏㄨㄤ", "chang": "ㄔㄤ", "cheng": "ㄔㄥ", "chuai": "ㄔㄨㄞ", "chuan": "ㄔㄨㄢ", "guang": "ㄍㄨㄤ", "kuang": "ㄎㄨㄤ", "huang": "ㄏㄨㄤ", "chang": "ㄔㄤ", "cheng": "ㄔㄥ", "chuai": "ㄔㄨㄞ", "chuan": "ㄔㄨㄢ",
"chung": "ㄔㄨㄥ", "shang": "ㄕㄤ", "sheng": "ㄕㄥ", "shuai": "ㄕㄨㄞ", "shuan": "ㄕㄨㄢ", "jiuan": "ㄐㄩㄢ", "chiau": "ㄑㄧㄠ", "chung": "ㄔㄨㄥ", "shang": "ㄕㄤ", "sheng": "ㄕㄥ", "shuai": "ㄕㄨㄞ", "shuan": "ㄕㄨㄢ", "jiuan": "ㄐㄩㄢ", "chiau": "ㄑㄧㄠ",
"chian": "ㄑㄧㄢ", "ching": "ㄑㄧㄥ", "shing": "ㄒㄧㄥ", "tzang": "ㄗㄤ", "tzeng": "ㄗㄥ", "tzuan": "ㄗㄨㄢ", "tzung": "ㄗㄨㄥ", "chian": "ㄑㄧㄢ", "ching": "ㄑㄧㄥ", "shing": "ㄒㄧㄥ", "tzang": "ㄗㄤ", "tzeng": "ㄗㄥ", "tzuan": "ㄗㄨㄢ", "tzung": "ㄗㄨㄥ",
"tsang": "ㄘㄤ", "tseng": "ㄘㄥ", "tsuan": "ㄘㄨㄢ", "tsung": "ㄘㄨㄥ", "chiue": "ㄑㄩㄝ", "liuan": "ㄌㄩㄢ", "chuei": "ㄔㄨㄟ", "tsang": "ㄘㄤ", "tseng": "ㄘㄥ", "tsuan": "ㄘㄨㄢ", "tsung": "ㄘㄨㄥ", "chiue": "ㄑㄩㄝ", "liuan": "ㄌㄩㄢ", "chuei": "ㄔㄨㄟ",
"chuen": "ㄔㄨㄣ", "shuei": "ㄕㄨㄟ", "shuen": "ㄕㄨㄣ", "chiou": "ㄑㄧㄡ", "chiun": "ㄑㄩㄣ", "tzuei": "ㄗㄨㄟ", "tzuen": "ㄗㄨㄣ", "chuen": "ㄔㄨㄣ", "shuei": "ㄕㄨㄟ", "shuen": "ㄕㄨㄣ", "chiou": "ㄑㄧㄡ", "chiun": "ㄑㄩㄣ", "tzuei": "ㄗㄨㄟ", "tzuen": "ㄗㄨㄣ",
"tsuei": "ㄘㄨㄟ", "tsuen": "ㄘㄨㄣ", "kiang": "ㄎㄧㄤ", "shiau": "ㄒㄧㄠ", "shian": "ㄒㄧㄢ", "shiue": "ㄒㄩㄝ", "shiou": "ㄒㄧㄡ", "tsuei": "ㄘㄨㄟ", "tsuen": "ㄘㄨㄣ", "kiang": "ㄎㄧㄤ", "shiau": "ㄒㄧㄠ", "shian": "ㄒㄧㄢ", "shiue": "ㄒㄩㄝ", "shiou": "ㄒㄧㄡ",
"shiun": "ㄒㄩㄣ", "jang": "ㄓㄤ", "jeng": "ㄓㄥ", "juai": "ㄓㄨㄞ", "juan": "ㄓㄨㄢ", "jung": "ㄓㄨㄥ", "jiau": "ㄐㄧㄠ", "shiun": "ㄒㄩㄣ",
"jian": "ㄐㄧㄢ", "jing": "ㄐㄧㄥ", "jiue": "ㄐㄩㄝ", "chie": "ㄑㄧㄝ", "bang": "ㄅㄤ", "beng": "ㄅㄥ", "biau": "ㄅㄧㄠ", "jang": "ㄓㄤ", "jeng": "ㄓㄥ", "juai": "ㄓㄨㄞ", "juan": "ㄓㄨㄢ", "jung": "ㄓㄨㄥ", "jiau": "ㄐㄧㄠ", "jian": "ㄐㄧㄢ",
"bian": "ㄅㄧㄢ", "bing": "ㄅㄧㄥ", "pang": "ㄆㄤ", "peng": "ㄆㄥ", "piau": "ㄆㄧㄠ", "pian": "ㄆㄧㄢ", "ping": "ㄆㄧㄥ", "mang": "ㄇㄤ", "jing": "ㄐㄧㄥ", "jiue": "ㄐㄩㄝ", "chie": "ㄑㄧㄝ", "bang": "ㄅㄤ", "beng": "ㄅㄥ", "biau": "ㄅㄧㄠ", "bian": "ㄅㄧㄢ",
"meng": "ㄇㄥ", "miau": "ㄇㄧㄠ", "mian": "ㄇㄧㄢ", "ming": "ㄇㄧㄥ", "fang": "ㄈㄤ", "feng": "ㄈㄥ", "fiau": "ㄈㄧㄠ", "dang": "ㄉㄤ", "bing": "ㄅㄧㄥ", "pang": "ㄆㄤ", "peng": "ㄆㄥ", "piau": "ㄆㄧㄠ", "pian": "ㄆㄧㄢ", "ping": "ㄆㄧㄥ", "mang": "ㄇㄤ", "meng": "ㄇㄥ",
"deng": "ㄉㄥ", "diau": "ㄉㄧㄠ", "dian": "ㄉㄧㄢ", "ding": "ㄉㄧㄥ", "duan": "ㄉㄨㄢ", "dung": "ㄉㄨㄥ", "tang": "ㄊㄤ", "teng": "ㄊㄥ", "miau": "ㄇㄧㄠ", "mian": "ㄇㄧㄢ", "ming": "ㄇㄧㄥ", "fang": "ㄈㄤ", "feng": "ㄈㄥ", "fiau": "ㄈㄧㄠ", "dang": "ㄉㄤ", "deng": "ㄉㄥ",
"diau": "ㄉㄧㄠ", "dian": "ㄉㄧㄢ", "ding": "ㄉㄧㄥ", "duan": "ㄉㄨㄢ", "dung": "ㄉㄨㄥ", "tang": "ㄊㄤ", "teng": "ㄊㄥ",
"tiau": "ㄊㄧㄠ", "tian": "ㄊㄧㄢ", "ting": "ㄊㄧㄥ", "tuan": "ㄊㄨㄢ", "tung": "ㄊㄨㄥ", "nang": "ㄋㄤ", "neng": "ㄋㄥ", "tiau": "ㄊㄧㄠ", "tian": "ㄊㄧㄢ", "ting": "ㄊㄧㄥ", "tuan": "ㄊㄨㄢ", "tung": "ㄊㄨㄥ", "nang": "ㄋㄤ", "neng": "ㄋㄥ",
"niau": "ㄋㄧㄠ", "nian": "ㄋㄧㄢ", "ning": "ㄋㄧㄥ", "nuan": "ㄋㄨㄢ", "nung": "ㄋㄨㄥ", "lang": "ㄌㄤ", "leng": "ㄌㄥ", "niau": "ㄋㄧㄠ", "nian": "ㄋㄧㄢ", "ning": "ㄋㄧㄥ", "nuan": "ㄋㄨㄢ", "nung": "ㄋㄨㄥ", "lang": "ㄌㄤ", "leng": "ㄌㄥ",
"liau": "ㄌㄧㄠ", "lian": "ㄌㄧㄢ", "ling": "ㄌㄧㄥ", "luan": "ㄌㄨㄢ", "lung": "ㄌㄨㄥ", "gang": "ㄍㄤ", "geng": "ㄍㄥ", "liau": "ㄌㄧㄠ", "lian": "ㄌㄧㄢ", "ling": "ㄌㄧㄥ", "luan": "ㄌㄨㄢ", "lung": "ㄌㄨㄥ", "gang": "ㄍㄤ", "geng": "ㄍㄥ",
@ -1041,203 +1045,215 @@ public struct Tekkon {
"tuei": "ㄊㄨㄟ", "tuen": "ㄊㄨㄣ", "niou": "ㄋㄧㄡ", "nuei": "ㄋㄨㄟ", "nuen": "ㄋㄨㄣ", "liou": "ㄌㄧㄡ", "luen": "ㄌㄨㄣ", "tuei": "ㄊㄨㄟ", "tuen": "ㄊㄨㄣ", "niou": "ㄋㄧㄡ", "nuei": "ㄋㄨㄟ", "nuen": "ㄋㄨㄣ", "liou": "ㄌㄧㄡ", "luen": "ㄌㄨㄣ",
"guen": "ㄍㄨㄣ", "kuen": "ㄎㄨㄣ", "huei": "ㄏㄨㄟ", "huen": "ㄏㄨㄣ", "ruei": "ㄖㄨㄟ", "ruen": "ㄖㄨㄣ", "tzuo": "ㄗㄨㄛ", "guen": "ㄍㄨㄣ", "kuen": "ㄎㄨㄣ", "huei": "ㄏㄨㄟ", "huen": "ㄏㄨㄣ", "ruei": "ㄖㄨㄟ", "ruen": "ㄖㄨㄣ", "tzuo": "ㄗㄨㄛ",
"tsuo": "ㄘㄨㄛ", "suei": "ㄙㄨㄟ", "suen": "ㄙㄨㄣ", "chiu": "ㄑㄩ", "giau": "ㄍㄧㄠ", "shie": "ㄒㄧㄝ", "shia": "ㄒㄧㄚ", "tsuo": "ㄘㄨㄛ", "suei": "ㄙㄨㄟ", "suen": "ㄙㄨㄣ", "chiu": "ㄑㄩ", "giau": "ㄍㄧㄠ", "shie": "ㄒㄧㄝ", "shia": "ㄒㄧㄚ",
"shiu": "ㄒㄩ", "jie": "ㄐㄧㄝ", "jai": "ㄓㄞ", "jei": "ㄓㄟ", "jau": "ㄓㄠ", "jou": "ㄓㄡ", "jan": "ㄓㄢ", "jen": "ㄓㄣ", "shiu": "ㄒㄩ",
"jua": "ㄓㄨㄚ", "bie": "ㄅㄧㄝ", "pie": "ㄆㄧㄝ", "mie": "ㄇㄧㄝ", "die": "ㄉㄧㄝ", "tie": "ㄊㄧㄝ", "nie": "ㄋㄧㄝ", "lie": "ㄌㄧㄝ", "jie": "ㄐㄧㄝ", "jai": "ㄓㄞ", "jei": "ㄓㄟ", "jau": "ㄓㄠ", "jou": "ㄓㄡ", "jan": "ㄓㄢ", "jen": "ㄓㄣ", "jua": "ㄓㄨㄚ",
"jia": "ㄐㄧㄚ", "jin": "ㄐㄧㄣ", "chr": "", "shr": "", "yue": "ㄩㄝ", "juo": "ㄓㄨㄛ", "bai": "ㄅㄞ", "bei": "ㄅㄟ", "bie": "ㄅㄧㄝ", "pie": "ㄆㄧㄝ", "mie": "ㄇㄧㄝ", "die": "ㄉㄧㄝ", "tie": "ㄊㄧㄝ", "nie": "ㄋㄧㄝ", "lie": "ㄌㄧㄝ", "jia": "ㄐㄧㄚ",
"bau": "ㄅㄠ", "ban": "ㄅㄢ", "ben": "ㄅㄣ", "bin": "ㄅㄧㄣ", "pai": "ㄆㄞ", "pei": "ㄆㄟ", "pau": "ㄆㄠ", "pou": "ㄆㄡ", "jin": "ㄐㄧㄣ", "chr": "", "shr": "", "yue": "ㄩㄝ", "juo": "ㄓㄨㄛ", "bai": "ㄅㄞ", "bei": "ㄅㄟ", "bau": "ㄅㄠ", "ban": "ㄅㄢ",
"pan": "ㄆㄢ", "pen": "ㄆㄣ", "pia": "ㄆㄧㄚ", "pin": "ㄆㄧㄣ", "mai": "ㄇㄞ", "mei": "ㄇㄟ", "mau": "ㄇㄠ", "mou": "ㄇㄡ", "ben": "ㄅㄣ", "bin": "ㄅㄧㄣ", "pai": "ㄆㄞ", "pei": "ㄆㄟ", "pau": "ㄆㄠ", "pou": "ㄆㄡ", "pan": "ㄆㄢ", "pen": "ㄆㄣ",
"man": "ㄇㄢ", "men": "ㄇㄣ", "min": "ㄇㄧㄣ", "fei": "ㄈㄟ", "fou": "ㄈㄡ", "fan": "ㄈㄢ", "fen": "ㄈㄣ", "dai": "ㄉㄞ", "pia": "ㄆㄧㄚ", "pin": "ㄆㄧㄣ", "mai": "ㄇㄞ", "mei": "ㄇㄟ", "mau": "ㄇㄠ", "mou": "ㄇㄡ", "man": "ㄇㄢ", "men": "ㄇㄣ",
"dei": "ㄉㄟ", "dau": "ㄉㄠ", "dou": "ㄉㄡ", "dan": "ㄉㄢ", "den": "ㄉㄣ", "dia": "ㄉㄧㄚ", "tai": "ㄊㄞ", "tau": "ㄊㄠ", "min": "ㄇㄧㄣ", "fei": "ㄈㄟ", "fou": "ㄈㄡ", "fan": "ㄈㄢ", "fen": "ㄈㄣ", "dai": "ㄉㄞ", "dei": "ㄉㄟ", "dau": "ㄉㄠ",
"tou": "ㄊㄡ", "tan": "ㄊㄢ", "nai": "ㄋㄞ", "nei": "ㄋㄟ", "nau": "ㄋㄠ", "nou": "ㄋㄡ", "nan": "ㄋㄢ", "nen": "ㄋㄣ", "dou": "ㄉㄡ", "dan": "ㄉㄢ", "den": "ㄉㄣ", "dia": "ㄉㄧㄚ", "tai": "ㄊㄞ", "tau": "ㄊㄠ", "tou": "ㄊㄡ", "tan": "ㄊㄢ",
"nin": "ㄋㄧㄣ", "lai": "ㄌㄞ", "lei": "ㄌㄟ", "lau": "ㄌㄠ", "lou": "ㄌㄡ", "lan": "ㄌㄢ", "lia": "ㄌㄧㄚ", "lin": "ㄌㄧㄣ", "nai": "ㄋㄞ", "nei": "ㄋㄟ", "nau": "ㄋㄠ", "nou": "ㄋㄡ", "nan": "ㄋㄢ", "nen": "ㄋㄣ", "nin": "ㄋㄧㄣ", "lai": "ㄌㄞ",
"gai": "ㄍㄞ", "gei": "ㄍㄟ", "gau": "ㄍㄠ", "gou": "ㄍㄡ", "gan": "ㄍㄢ", "gen": "ㄍㄣ", "gua": "ㄍㄨㄚ", "guo": "ㄍㄨㄛ", "lei": "ㄌㄟ", "lau": "ㄌㄠ", "lou": "ㄌㄡ", "lan": "ㄌㄢ", "lia": "ㄌㄧㄚ", "lin": "ㄌㄧㄣ", "gai": "ㄍㄞ", "gei": "ㄍㄟ",
"gue": "ㄍㄨㄜ", "kai": "ㄎㄞ", "kau": "ㄎㄠ", "kou": "ㄎㄡ", "kan": "ㄎㄢ", "ken": "ㄎㄣ", "kua": "ㄎㄨㄚ", "kuo": "ㄎㄨㄛ", "gau": "ㄍㄠ", "gou": "ㄍㄡ", "gan": "ㄍㄢ", "gen": "ㄍㄣ", "gua": "ㄍㄨㄚ", "guo": "ㄍㄨㄛ", "gue": "ㄍㄨㄜ", "kai": "ㄎㄞ",
"hai": "ㄏㄞ", "hei": "ㄏㄟ", "hau": "ㄏㄠ", "hou": "ㄏㄡ", "han": "ㄏㄢ", "hen": "ㄏㄣ", "hua": "ㄏㄨㄚ", "huo": "ㄏㄨㄛ", "kau": "ㄎㄠ", "kou": "ㄎㄡ", "kan": "ㄎㄢ", "ken": "ㄎㄣ", "kua": "ㄎㄨㄚ", "kuo": "ㄎㄨㄛ", "hai": "ㄏㄞ", "hei": "ㄏㄟ",
"cha": "ㄔㄚ", "che": "ㄔㄜ", "chu": "ㄔㄨ", "sha": "ㄕㄚ", "she": "ㄕㄜ", "shu": "ㄕㄨ", "rau": "ㄖㄠ", "rou": "ㄖㄡ", "ran": "ㄖㄢ", "hau": "ㄏㄠ", "hou": "ㄏㄡ", "han": "ㄏㄢ", "hen": "ㄏㄣ", "hua": "ㄏㄨㄚ", "huo": "ㄏㄨㄛ", "cha": "ㄔㄚ", "che": "ㄔㄜ",
"ren": "ㄖㄣ", "sai": "ㄙㄞ", "sei": "ㄙㄟ", "sau": "ㄙㄠ", "sou": "ㄙㄡ", "san": "ㄙㄢ", "sen": "ㄙㄣ", "ang": "", "eng": "", "chu": "ㄔㄨ", "sha": "ㄕㄚ", "she": "ㄕㄜ", "shu": "ㄕㄨ", "rau": "ㄖㄠ", "rou": "ㄖㄡ", "ran": "ㄖㄢ", "ren": "ㄖㄣ", "sai": "ㄙㄞ",
"yai": "ㄧㄞ", "yau": "ㄧㄠ", "yan": "ㄧㄢ", "yin": "ㄧㄣ", "wai": "ㄨㄞ", "wei": "ㄨㄟ", "wan": "ㄨㄢ", "wen": "ㄨㄣ", "yun": "ㄩㄣ", "sei": "ㄙㄟ", "sau": "ㄙㄠ", "sou": "ㄙㄡ", "san": "ㄙㄢ", "sen": "ㄙㄣ", "ang": "", "eng": "", "yai": "ㄧㄞ", "yau": "ㄧㄠ",
"jiu": "ㄐㄩ", "chi": "ㄑㄧ", "shi": "ㄒㄧ", "tza": "ㄗㄚ", "tze": "ㄗㄜ", "tzu": "ㄗㄨ", "tsz": "", "tsa": "ㄘㄚ", "tse": "ㄘㄜ", "yan": "ㄧㄢ", "yin": "ㄧㄣ", "wai": "ㄨㄞ", "wei": "ㄨㄟ", "wan": "ㄨㄢ", "wen": "ㄨㄣ", "yun": "ㄩㄣ", "jiu": "ㄐㄩ", "chi": "ㄑㄧ",
"tsu": "ㄘㄨ", "duo": "ㄉㄨㄛ", "tuo": "ㄊㄨㄛ", "nuo": "ㄋㄨㄛ", "luo": "ㄌㄨㄛ", "ruo": "ㄖㄨㄛ", "suo": "ㄙㄨㄛ", "you": "ㄧㄡ", "shi": "ㄒㄧ", "tza": "ㄗㄚ", "tze": "ㄗㄜ", "tzu": "ㄗㄨ", "tsz": "", "tsa": "ㄘㄚ", "tse": "ㄘㄜ", "tsu": "ㄘㄨ", "duo": "ㄉㄨㄛ",
"niu": "ㄋㄩ", "liu": "ㄌㄩ", "gin": "ㄍㄧㄣ", "bo": "ㄅㄛ", "po": "ㄆㄛ", "mo": "ㄇㄛ", "fo": "ㄈㄛ", "jr": "", "ja": "ㄓㄚ", "tuo": "ㄊㄨㄛ", "nuo": "ㄋㄨㄛ", "luo": "ㄌㄨㄛ", "ruo": "ㄖㄨㄛ", "suo": "ㄙㄨㄛ", "you": "ㄧㄡ", "niu": "ㄋㄩ", "liu": "ㄌㄩ",
"je": "ㄓㄜ", "ju": "ㄓㄨ", "ji": "ㄐㄧ", "tz": "", "sz": "", "er": "", "ye": "ㄧㄝ", "ba": "ㄅㄚ", "bi": "ㄅㄧ", "bu": "ㄅㄨ", "gin": "ㄍㄧㄣ",
"pa": "ㄆㄚ", "pi": "ㄆㄧ", "pu": "ㄆㄨ", "ma": "ㄇㄚ", "me": "ㄇㄜ", "mi": "ㄇㄧ", "mu": "ㄇㄨ", "fa": "ㄈㄚ", "fu": "ㄈㄨ", "bo": "ㄅㄛ", "po": "ㄆㄛ", "mo": "ㄇㄛ", "fo": "ㄈㄛ", "jr": "", "ja": "ㄓㄚ", "je": "ㄓㄜ", "ju": "ㄓㄨ", "ji": "ㄐㄧ",
"da": "ㄉㄚ", "de": "ㄉㄜ", "di": "ㄉㄧ", "du": "ㄉㄨ", "ta": "ㄊㄚ", "te": "ㄊㄜ", "ti": "ㄊㄧ", "tu": "ㄊㄨ", "na": "ㄋㄚ", "tz": "", "sz": "", "er": "", "ye": "ㄧㄝ", "ba": "ㄅㄚ", "bi": "ㄅㄧ", "bu": "ㄅㄨ", "pa": "ㄆㄚ", "pi": "ㄆㄧ", "pu": "ㄆㄨ",
"ne": "ㄋㄜ", "ni": "ㄋㄧ", "nu": "ㄋㄨ", "la": "ㄌㄚ", "lo": "ㄌㄛ", "le": "ㄌㄜ", "li": "ㄌㄧ", "lu": "ㄌㄨ", "ga": "ㄍㄚ",
"ge": "ㄍㄜ", "gu": "ㄍㄨ", "ka": "ㄎㄚ", "ke": "ㄎㄜ", "ku": "ㄎㄨ", "ha": "ㄏㄚ", "he": "ㄏㄜ", "hu": "ㄏㄨ", "re": "ㄖㄜ",
"ru": "ㄖㄨ", "sa": "ㄙㄚ", "se": "ㄙㄜ", "su": "ㄙㄨ", "eh": "", "ai": "", "ei": "", "au": "", "ou": "", "an": "",
"en": "", "ya": "ㄧㄚ", "yo": "ㄧㄛ", "wu": "", "wa": "ㄨㄚ", "wo": "ㄨㄛ", "yu": "", "ch": "", "yi": "", "r": "",
"a": "", "o": "", "e": "",
]
///
static let mapYalePinyin: [String: String] = [
"chwang": "ㄔㄨㄤ", "shwang": "ㄕㄨㄤ", "chyang": "ㄑㄧㄤ", "chyung": "ㄑㄩㄥ", "chywan": "ㄑㄩㄢ", "jwang": "ㄓㄨㄤ", "syang": "ㄒㄧㄤ",
"syung": "ㄒㄩㄥ", "jyang": "ㄐㄧㄤ", "jyung": "ㄐㄩㄥ", "nyang": "ㄋㄧㄤ", "lyang": "ㄌㄧㄤ", "gwang": "ㄍㄨㄤ", "kwang": "ㄎㄨㄤ",
"hwang": "ㄏㄨㄤ", "chang": "ㄔㄤ", "cheng": "ㄔㄥ", "chwai": "ㄔㄨㄞ", "chwan": "ㄔㄨㄢ", "chung": "ㄔㄨㄥ", "shang": "ㄕㄤ",
"sheng": "ㄕㄥ", "shwai": "ㄕㄨㄞ", "shwan": "ㄕㄨㄢ", "sywan": "ㄒㄩㄢ", "jywan": "ㄐㄩㄢ", "chyau": "ㄑㄧㄠ", "chyan": "ㄑㄧㄢ",
"ching": "ㄑㄧㄥ", "sying": "ㄒㄧㄥ", "dzang": "ㄗㄤ", "dzeng": "ㄗㄥ", "dzwan": "ㄗㄨㄢ", "dzung": "ㄗㄨㄥ", "tsang": "ㄘㄤ",
"tseng": "ㄘㄥ", "tswan": "ㄘㄨㄢ", "tsung": "ㄘㄨㄥ", "chywe": "ㄑㄩㄝ", "lywan": "ㄌㄩㄢ", "chwei": "ㄔㄨㄟ", "chwun": "ㄔㄨㄣ",
"shwei": "ㄕㄨㄟ", "shwun": "ㄕㄨㄣ", "chyou": "ㄑㄧㄡ", "chyun": "ㄑㄩㄣ", "dzwei": "ㄗㄨㄟ", "dzwun": "ㄗㄨㄣ", "tswei": "ㄘㄨㄟ",
"tswun": "ㄘㄨㄣ", "kyang": "ㄎㄧㄤ", "jang": "ㄓㄤ", "jeng": "ㄓㄥ", "jwai": "ㄓㄨㄞ", "jwan": "ㄓㄨㄢ", "jung": "ㄓㄨㄥ",
"syau": "ㄒㄧㄠ", "syan": "ㄒㄧㄢ", "jyau": "ㄐㄧㄠ", "jyan": "ㄐㄧㄢ", "jing": "ㄐㄧㄥ", "sywe": "ㄒㄩㄝ", "jywe": "ㄐㄩㄝ",
"chye": "ㄑㄧㄝ", "bang": "ㄅㄤ", "beng": "ㄅㄥ", "byau": "ㄅㄧㄠ", "byan": "ㄅㄧㄢ", "bing": "ㄅㄧㄥ", "pang": "ㄆㄤ", "peng": "ㄆㄥ",
"pyau": "ㄆㄧㄠ", "pyan": "ㄆㄧㄢ", "ping": "ㄆㄧㄥ", "mang": "ㄇㄤ", "meng": "ㄇㄥ", "myau": "ㄇㄧㄠ", "myan": "ㄇㄧㄢ",
"ming": "ㄇㄧㄥ", "fang": "ㄈㄤ", "feng": "ㄈㄥ", "fyau": "ㄈㄧㄠ", "dang": "ㄉㄤ", "deng": "ㄉㄥ", "dyau": "ㄉㄧㄠ", "dyan": "ㄉㄧㄢ",
"ding": "ㄉㄧㄥ", "dwan": "ㄉㄨㄢ", "dung": "ㄉㄨㄥ", "tang": "ㄊㄤ", "teng": "ㄊㄥ", "tyau": "ㄊㄧㄠ", "tyan": "ㄊㄧㄢ",
"ting": "ㄊㄧㄥ", "twan": "ㄊㄨㄢ", "tung": "ㄊㄨㄥ", "nang": "ㄋㄤ", "neng": "ㄋㄥ", "nyau": "ㄋㄧㄠ", "nyan": "ㄋㄧㄢ",
"ning": "ㄋㄧㄥ", "nwan": "ㄋㄨㄢ", "nung": "ㄋㄨㄥ", "lang": "ㄌㄤ", "leng": "ㄌㄥ", "lyau": "ㄌㄧㄠ", "lyan": "ㄌㄧㄢ",
"ling": "ㄌㄧㄥ", "lwan": "ㄌㄨㄢ", "lung": "ㄌㄨㄥ", "gang": "ㄍㄤ", "geng": "ㄍㄥ", "gwai": "ㄍㄨㄞ", "gwan": "ㄍㄨㄢ",
"gung": "ㄍㄨㄥ", "kang": "ㄎㄤ", "keng": "ㄎㄥ", "kwai": "ㄎㄨㄞ", "kwan": "ㄎㄨㄢ", "kung": "ㄎㄨㄥ", "hang": "ㄏㄤ", "heng": "ㄏㄥ",
"hwai": "ㄏㄨㄞ", "hwan": "ㄏㄨㄢ", "hung": "ㄏㄨㄥ", "jwei": "ㄓㄨㄟ", "jwun": "ㄓㄨㄣ", "chai": "ㄔㄞ", "chau": "ㄔㄠ", "chou": "ㄔㄡ",
"chan": "ㄔㄢ", "chen": "ㄔㄣ", "chwa": "ㄔㄨㄚ", "shai": "ㄕㄞ", "shei": "ㄕㄟ", "shau": "ㄕㄠ", "shou": "ㄕㄡ", "shan": "ㄕㄢ",
"shen": "ㄕㄣ", "shwa": "ㄕㄨㄚ", "shwo": "ㄕㄨㄛ", "rang": "ㄖㄤ", "reng": "ㄖㄥ", "rwan": "ㄖㄨㄢ", "rung": "ㄖㄨㄥ", "sang": "ㄙㄤ",
"seng": "ㄙㄥ", "swan": "ㄙㄨㄢ", "sung": "ㄙㄨㄥ", "yang": "ㄧㄤ", "ying": "ㄧㄥ", "wang": "ㄨㄤ", "weng": "ㄨㄥ", "ywan": "ㄩㄢ",
"yung": "ㄩㄥ", "syou": "ㄒㄧㄡ", "syun": "ㄒㄩㄣ", "nywe": "ㄋㄩㄝ", "lywe": "ㄌㄩㄝ", "gwei": "ㄍㄨㄟ", "kwei": "ㄎㄨㄟ",
"jyou": "ㄐㄧㄡ", "jyun": "ㄐㄩㄣ", "chya": "ㄑㄧㄚ", "chin": "ㄑㄧㄣ", "syin": "ㄒㄧㄣ", "dzai": "ㄗㄞ", "dzei": "ㄗㄟ", "dzau": "ㄗㄠ",
"dzou": "ㄗㄡ", "dzan": "ㄗㄢ", "dzen": "ㄗㄣ", "tsai": "ㄘㄞ", "tsau": "ㄘㄠ", "tsou": "ㄘㄡ", "tsan": "ㄘㄢ", "tsen": "ㄘㄣ",
"chwo": "ㄔㄨㄛ", "myou": "ㄇㄧㄡ", "dyou": "ㄉㄧㄡ", "dwei": "ㄉㄨㄟ", "dwun": "ㄉㄨㄣ", "twei": "ㄊㄨㄟ", "twun": "ㄊㄨㄣ",
"nyou": "ㄋㄧㄡ", "nwei": "ㄋㄨㄟ", "nwun": "ㄋㄨㄣ", "lyou": "ㄌㄧㄡ", "lwun": "ㄌㄨㄣ", "gwun": "ㄍㄨㄣ", "kwun": "ㄎㄨㄣ",
"hwei": "ㄏㄨㄟ", "hwun": "ㄏㄨㄣ", "rwei": "ㄖㄨㄟ", "rwun": "ㄖㄨㄣ", "dzwo": "ㄗㄨㄛ", "tswo": "ㄘㄨㄛ", "swei": "ㄙㄨㄟ",
"swun": "ㄙㄨㄣ", "chyu": "ㄑㄩ", "giau": "ㄍㄧㄠ", "sye": "ㄒㄧㄝ", "jye": "ㄐㄧㄝ", "jai": "ㄓㄞ", "jei": "ㄓㄟ", "jau": "ㄓㄠ",
"jou": "ㄓㄡ", "jan": "ㄓㄢ", "jen": "ㄓㄣ", "jwa": "ㄓㄨㄚ", "sya": "ㄒㄧㄚ", "bye": "ㄅㄧㄝ", "pye": "ㄆㄧㄝ", "mye": "ㄇㄧㄝ",
"dye": "ㄉㄧㄝ", "tye": "ㄊㄧㄝ", "nye": "ㄋㄧㄝ", "lye": "ㄌㄧㄝ", "jya": "ㄐㄧㄚ", "jin": "ㄐㄧㄣ", "chr": "", "shr": "",
"ywe": "ㄩㄝ", "jwo": "ㄓㄨㄛ", "bai": "ㄅㄞ", "bei": "ㄅㄟ", "bau": "ㄅㄠ", "ban": "ㄅㄢ", "ben": "ㄅㄣ", "bin": "ㄅㄧㄣ",
"pai": "ㄆㄞ", "pei": "ㄆㄟ", "pau": "ㄆㄠ", "pou": "ㄆㄡ", "pan": "ㄆㄢ", "pen": "ㄆㄣ", "pya": "ㄆㄧㄚ", "pin": "ㄆㄧㄣ",
"mai": "ㄇㄞ", "mei": "ㄇㄟ", "mau": "ㄇㄠ", "mou": "ㄇㄡ", "man": "ㄇㄢ", "men": "ㄇㄣ", "min": "ㄇㄧㄣ", "fei": "ㄈㄟ",
"fou": "ㄈㄡ", "fan": "ㄈㄢ", "fen": "ㄈㄣ", "dai": "ㄉㄞ", "dei": "ㄉㄟ", "dau": "ㄉㄠ", "dou": "ㄉㄡ", "dan": "ㄉㄢ", "den": "ㄉㄣ",
"dya": "ㄉㄧㄚ", "tai": "ㄊㄞ", "tau": "ㄊㄠ", "tou": "ㄊㄡ", "tan": "ㄊㄢ", "nai": "ㄋㄞ", "nei": "ㄋㄟ", "nau": "ㄋㄠ",
"nou": "ㄋㄡ", "nan": "ㄋㄢ", "nen": "ㄋㄣ", "nin": "ㄋㄧㄣ", "lai": "ㄌㄞ", "lei": "ㄌㄟ", "lau": "ㄌㄠ", "lou": "ㄌㄡ",
"lan": "ㄌㄢ", "lya": "ㄌㄧㄚ", "lin": "ㄌㄧㄣ", "gai": "ㄍㄞ", "gei": "ㄍㄟ", "gau": "ㄍㄠ", "gou": "ㄍㄡ", "gan": "ㄍㄢ",
"gen": "ㄍㄣ", "gwa": "ㄍㄨㄚ", "gwo": "ㄍㄨㄛ", "gue": "ㄍㄨㄜ", "kai": "ㄎㄞ", "kau": "ㄎㄠ", "kou": "ㄎㄡ", "kan": "ㄎㄢ",
"ken": "ㄎㄣ", "kwa": "ㄎㄨㄚ", "kwo": "ㄎㄨㄛ", "hai": "ㄏㄞ", "hei": "ㄏㄟ", "hau": "ㄏㄠ", "hou": "ㄏㄡ", "han": "ㄏㄢ",
"hen": "ㄏㄣ", "hwa": "ㄏㄨㄚ", "hwo": "ㄏㄨㄛ", "cha": "ㄔㄚ", "che": "ㄔㄜ", "chu": "ㄔㄨ", "sha": "ㄕㄚ", "she": "ㄕㄜ",
"shu": "ㄕㄨ", "rau": "ㄖㄠ", "rou": "ㄖㄡ", "ran": "ㄖㄢ", "ren": "ㄖㄣ", "sai": "ㄙㄞ", "sei": "ㄙㄟ", "sau": "ㄙㄠ", "sou": "ㄙㄡ",
"san": "ㄙㄢ", "sen": "ㄙㄣ", "ang": "", "eng": "", "yai": "ㄧㄞ", "yau": "ㄧㄠ", "yan": "ㄧㄢ", "yin": "ㄧㄣ", "wai": "ㄨㄞ",
"wei": "ㄨㄟ", "wan": "ㄨㄢ", "wen": "ㄨㄣ", "yun": "ㄩㄣ", "syu": "ㄒㄩ", "jyu": "ㄐㄩ", "chi": "ㄑㄧ", "syi": "ㄒㄧ", "dza": "ㄗㄚ",
"dze": "ㄗㄜ", "dzu": "ㄗㄨ", "tsz": "", "tsa": "ㄘㄚ", "tse": "ㄘㄜ", "tsu": "ㄘㄨ", "dwo": "ㄉㄨㄛ", "two": "ㄊㄨㄛ",
"nwo": "ㄋㄨㄛ", "lwo": "ㄌㄨㄛ", "rwo": "ㄖㄨㄛ", "swo": "ㄙㄨㄛ", "you": "ㄧㄡ", "nyu": "ㄋㄩ", "lyu": "ㄌㄩ", "bwo": "ㄅㄛ",
"pwo": "ㄆㄛ", "mwo": "ㄇㄛ", "fwo": "ㄈㄛ", "gin": "ㄍㄧㄣ", "jr": "", "ja": "ㄓㄚ", "je": "ㄓㄜ", "ju": "ㄓㄨ", "ji": "ㄐㄧ",
"dz": "", "sz": "", "er": "", "ye": "ㄧㄝ", "ba": "ㄅㄚ", "bi": "ㄅㄧ", "bu": "ㄅㄨ", "pa": "ㄆㄚ", "pi": "ㄆㄧ", "pu": "ㄆㄨ",
"ma": "ㄇㄚ", "me": "ㄇㄜ", "mi": "ㄇㄧ", "mu": "ㄇㄨ", "fa": "ㄈㄚ", "fu": "ㄈㄨ", "da": "ㄉㄚ", "de": "ㄉㄜ", "di": "ㄉㄧ", "ma": "ㄇㄚ", "me": "ㄇㄜ", "mi": "ㄇㄧ", "mu": "ㄇㄨ", "fa": "ㄈㄚ", "fu": "ㄈㄨ", "da": "ㄉㄚ", "de": "ㄉㄜ", "di": "ㄉㄧ",
"du": "ㄉㄨ", "ta": "ㄊㄚ", "te": "ㄊㄜ", "ti": "ㄊㄧ", "tu": "ㄊㄨ", "na": "ㄋㄚ", "ne": "ㄋㄜ", "ni": "ㄋㄧ", "nu": "ㄋㄨ", "du": "ㄉㄨ", "ta": "ㄊㄚ", "te": "ㄊㄜ", "ti": "ㄊㄧ", "tu": "ㄊㄨ", "na": "ㄋㄚ", "ne": "ㄋㄜ", "ni": "ㄋㄧ", "nu": "ㄋㄨ",
"la": "ㄌㄚ", "lo": "ㄌㄛ", "le": "ㄌㄜ", "li": "ㄌㄧ", "lu": "ㄌㄨ", "ga": "ㄍㄚ", "ge": "ㄍㄜ", "gu": "ㄍㄨ", "ka": "ㄎㄚ", "la": "ㄌㄚ", "lo": "ㄌㄛ", "le": "ㄌㄜ", "li": "ㄌㄧ", "lu": "ㄌㄨ", "ga": "ㄍㄚ", "ge": "ㄍㄜ", "gu": "ㄍㄨ", "ka": "ㄎㄚ",
"ke": "ㄎㄜ", "ku": "ㄎㄨ", "ha": "ㄏㄚ", "he": "ㄏㄜ", "hu": "ㄏㄨ", "re": "ㄖㄜ", "ru": "ㄖㄨ", "sa": "ㄙㄚ", "se": "ㄙㄜ", "ke": "ㄎㄜ", "ku": "ㄎㄨ", "ha": "ㄏㄚ", "he": "ㄏㄜ", "hu": "ㄏㄨ", "re": "ㄖㄜ", "ru": "ㄖㄨ", "sa": "ㄙㄚ", "se": "ㄙㄜ",
"su": "ㄙㄨ", "eh": "", "ai": "", "ei": "", "au": "", "ou": "", "an": "", "en": "", "ya": "ㄧㄚ", "yo": "ㄧㄛ", "su": "ㄙㄨ", "eh": "", "ai": "", "ei": "", "au": "", "ou": "", "an": "", "en": "", "ya": "ㄧㄚ", "yo": "ㄧㄛ",
"wu": "", "wa": "ㄨㄚ", "wo": "ㄨㄛ", "yu": "", "ch": "", "yi": "", "r": "", "a": "", "o": "", "e": "", "wu": "", "wa": "ㄨㄚ", "wo": "ㄨㄛ", "yu": "", "ch": "", "yi": "",
"r": "", "a": "", "o": "", "e": "",
]
///
static let mapYalePinyin: [String: String] = [
"chwang": "ㄔㄨㄤ", "shwang": "ㄕㄨㄤ", "chyang": "ㄑㄧㄤ", "chyung": "ㄑㄩㄥ", "chywan": "ㄑㄩㄢ",
"byang": "ㄅㄧㄤ", "dwang": "ㄉㄨㄤ", "jwang": "ㄓㄨㄤ", "syang": "ㄒㄧㄤ", "syung": "ㄒㄩㄥ", "jyang": "ㄐㄧㄤ", "jyung": "ㄐㄩㄥ",
"nyang": "ㄋㄧㄤ", "lyang": "ㄌㄧㄤ", "gwang": "ㄍㄨㄤ", "kwang": "ㄎㄨㄤ", "hwang": "ㄏㄨㄤ", "chang": "ㄔㄤ", "cheng": "ㄔㄥ",
"chwai": "ㄔㄨㄞ", "chwan": "ㄔㄨㄢ", "chung": "ㄔㄨㄥ", "shang": "ㄕㄤ", "sheng": "ㄕㄥ", "shwai": "ㄕㄨㄞ", "shwan": "ㄕㄨㄢ",
"sywan": "ㄒㄩㄢ", "jywan": "ㄐㄩㄢ", "chyau": "ㄑㄧㄠ", "chyan": "ㄑㄧㄢ", "ching": "ㄑㄧㄥ", "sying": "ㄒㄧㄥ", "dzang": "ㄗㄤ",
"dzeng": "ㄗㄥ", "dzwan": "ㄗㄨㄢ", "dzung": "ㄗㄨㄥ", "tsang": "ㄘㄤ", "tseng": "ㄘㄥ", "tswan": "ㄘㄨㄢ", "tsung": "ㄘㄨㄥ",
"chywe": "ㄑㄩㄝ", "lywan": "ㄌㄩㄢ", "chwei": "ㄔㄨㄟ", "chwun": "ㄔㄨㄣ", "shwei": "ㄕㄨㄟ", "shwun": "ㄕㄨㄣ", "chyou": "ㄑㄧㄡ",
"chyun": "ㄑㄩㄣ", "dzwei": "ㄗㄨㄟ", "dzwun": "ㄗㄨㄣ", "tswei": "ㄘㄨㄟ", "tswun": "ㄘㄨㄣ", "kyang": "ㄎㄧㄤ",
"jang": "ㄓㄤ", "jeng": "ㄓㄥ", "jwai": "ㄓㄨㄞ", "jwan": "ㄓㄨㄢ", "jung": "ㄓㄨㄥ", "syau": "ㄒㄧㄠ", "syan": "ㄒㄧㄢ",
"jyau": "ㄐㄧㄠ", "jyan": "ㄐㄧㄢ", "jing": "ㄐㄧㄥ", "sywe": "ㄒㄩㄝ", "jywe": "ㄐㄩㄝ", "chye": "ㄑㄧㄝ", "bang": "ㄅㄤ",
"beng": "ㄅㄥ", "byau": "ㄅㄧㄠ", "byan": "ㄅㄧㄢ", "bing": "ㄅㄧㄥ", "pang": "ㄆㄤ", "peng": "ㄆㄥ", "pyau": "ㄆㄧㄠ", "pyan": "ㄆㄧㄢ",
"ping": "ㄆㄧㄥ", "mang": "ㄇㄤ", "meng": "ㄇㄥ", "myau": "ㄇㄧㄠ", "myan": "ㄇㄧㄢ", "ming": "ㄇㄧㄥ", "fang": "ㄈㄤ", "feng": "ㄈㄥ",
"fyau": "ㄈㄧㄠ", "dang": "ㄉㄤ", "deng": "ㄉㄥ", "dyau": "ㄉㄧㄠ", "dyan": "ㄉㄧㄢ", "ding": "ㄉㄧㄥ", "dwan": "ㄉㄨㄢ",
"dung": "ㄉㄨㄥ", "tang": "ㄊㄤ", "teng": "ㄊㄥ", "tyau": "ㄊㄧㄠ", "tyan": "ㄊㄧㄢ", "ting": "ㄊㄧㄥ", "twan": "ㄊㄨㄢ",
"tung": "ㄊㄨㄥ", "nang": "ㄋㄤ", "neng": "ㄋㄥ", "nyau": "ㄋㄧㄠ", "nyan": "ㄋㄧㄢ", "ning": "ㄋㄧㄥ", "nwan": "ㄋㄨㄢ",
"nung": "ㄋㄨㄥ", "lang": "ㄌㄤ", "leng": "ㄌㄥ", "lyau": "ㄌㄧㄠ", "lyan": "ㄌㄧㄢ", "ling": "ㄌㄧㄥ", "lwan": "ㄌㄨㄢ",
"lung": "ㄌㄨㄥ", "gang": "ㄍㄤ", "geng": "ㄍㄥ", "gwai": "ㄍㄨㄞ", "gwan": "ㄍㄨㄢ", "gung": "ㄍㄨㄥ", "kang": "ㄎㄤ", "keng": "ㄎㄥ",
"kwai": "ㄎㄨㄞ", "kwan": "ㄎㄨㄢ", "kung": "ㄎㄨㄥ", "hang": "ㄏㄤ", "heng": "ㄏㄥ", "hwai": "ㄏㄨㄞ", "hwan": "ㄏㄨㄢ",
"hung": "ㄏㄨㄥ", "jwei": "ㄓㄨㄟ", "jwun": "ㄓㄨㄣ", "chai": "ㄔㄞ", "chau": "ㄔㄠ", "chou": "ㄔㄡ", "chan": "ㄔㄢ", "chen": "ㄔㄣ",
"chwa": "ㄔㄨㄚ", "shai": "ㄕㄞ", "shei": "ㄕㄟ", "shau": "ㄕㄠ", "shou": "ㄕㄡ", "shan": "ㄕㄢ", "shen": "ㄕㄣ", "shwa": "ㄕㄨㄚ",
"shwo": "ㄕㄨㄛ", "rang": "ㄖㄤ", "reng": "ㄖㄥ", "rwan": "ㄖㄨㄢ", "rung": "ㄖㄨㄥ", "sang": "ㄙㄤ", "seng": "ㄙㄥ", "swan": "ㄙㄨㄢ",
"sung": "ㄙㄨㄥ", "yang": "ㄧㄤ", "ying": "ㄧㄥ", "wang": "ㄨㄤ", "weng": "ㄨㄥ", "ywan": "ㄩㄢ", "yung": "ㄩㄥ", "syou": "ㄒㄧㄡ",
"syun": "ㄒㄩㄣ", "nywe": "ㄋㄩㄝ", "lywe": "ㄌㄩㄝ", "gwei": "ㄍㄨㄟ", "kwei": "ㄎㄨㄟ", "jyou": "ㄐㄧㄡ", "jyun": "ㄐㄩㄣ",
"chya": "ㄑㄧㄚ", "chin": "ㄑㄧㄣ", "syin": "ㄒㄧㄣ", "dzai": "ㄗㄞ", "dzei": "ㄗㄟ", "dzau": "ㄗㄠ", "dzou": "ㄗㄡ", "dzan": "ㄗㄢ",
"dzen": "ㄗㄣ", "tsai": "ㄘㄞ", "tsau": "ㄘㄠ", "tsou": "ㄘㄡ", "tsan": "ㄘㄢ", "tsen": "ㄘㄣ", "chwo": "ㄔㄨㄛ", "myou": "ㄇㄧㄡ",
"dyou": "ㄉㄧㄡ", "dwei": "ㄉㄨㄟ", "dwun": "ㄉㄨㄣ", "twei": "ㄊㄨㄟ", "twun": "ㄊㄨㄣ", "nyou": "ㄋㄧㄡ", "nwei": "ㄋㄨㄟ",
"nwun": "ㄋㄨㄣ", "lyou": "ㄌㄧㄡ", "lwun": "ㄌㄨㄣ", "gwun": "ㄍㄨㄣ", "kwun": "ㄎㄨㄣ", "hwei": "ㄏㄨㄟ", "hwun": "ㄏㄨㄣ",
"rwei": "ㄖㄨㄟ", "rwun": "ㄖㄨㄣ", "dzwo": "ㄗㄨㄛ", "tswo": "ㄘㄨㄛ", "swei": "ㄙㄨㄟ", "swun": "ㄙㄨㄣ", "chyu": "ㄑㄩ",
"giau": "ㄍㄧㄠ",
"sye": "ㄒㄧㄝ", "jye": "ㄐㄧㄝ", "jai": "ㄓㄞ", "jei": "ㄓㄟ", "jau": "ㄓㄠ", "jou": "ㄓㄡ", "jan": "ㄓㄢ", "jen": "ㄓㄣ",
"jwa": "ㄓㄨㄚ", "sya": "ㄒㄧㄚ", "bye": "ㄅㄧㄝ", "pye": "ㄆㄧㄝ", "mye": "ㄇㄧㄝ", "dye": "ㄉㄧㄝ", "tye": "ㄊㄧㄝ", "nye": "ㄋㄧㄝ",
"lye": "ㄌㄧㄝ", "jya": "ㄐㄧㄚ", "jin": "ㄐㄧㄣ", "chr": "", "shr": "", "ywe": "ㄩㄝ", "jwo": "ㄓㄨㄛ", "bai": "ㄅㄞ",
"bei": "ㄅㄟ", "bau": "ㄅㄠ", "ban": "ㄅㄢ", "ben": "ㄅㄣ", "bin": "ㄅㄧㄣ", "pai": "ㄆㄞ", "pei": "ㄆㄟ", "pau": "ㄆㄠ",
"pou": "ㄆㄡ", "pan": "ㄆㄢ", "pen": "ㄆㄣ", "pya": "ㄆㄧㄚ", "pin": "ㄆㄧㄣ", "mai": "ㄇㄞ", "mei": "ㄇㄟ", "mau": "ㄇㄠ",
"mou": "ㄇㄡ", "man": "ㄇㄢ", "men": "ㄇㄣ", "min": "ㄇㄧㄣ", "fei": "ㄈㄟ", "fou": "ㄈㄡ", "fan": "ㄈㄢ", "fen": "ㄈㄣ",
"dai": "ㄉㄞ", "dei": "ㄉㄟ", "dau": "ㄉㄠ", "dou": "ㄉㄡ", "dan": "ㄉㄢ", "den": "ㄉㄣ", "dya": "ㄉㄧㄚ", "tai": "ㄊㄞ",
"tau": "ㄊㄠ", "tou": "ㄊㄡ", "tan": "ㄊㄢ", "nai": "ㄋㄞ", "nei": "ㄋㄟ", "nau": "ㄋㄠ", "nou": "ㄋㄡ", "nan": "ㄋㄢ", "nen": "ㄋㄣ",
"nin": "ㄋㄧㄣ", "lai": "ㄌㄞ", "lei": "ㄌㄟ", "lau": "ㄌㄠ", "lou": "ㄌㄡ", "lan": "ㄌㄢ", "lya": "ㄌㄧㄚ", "lin": "ㄌㄧㄣ",
"gai": "ㄍㄞ", "gei": "ㄍㄟ", "gau": "ㄍㄠ", "gou": "ㄍㄡ", "gan": "ㄍㄢ", "gen": "ㄍㄣ", "gwa": "ㄍㄨㄚ", "gwo": "ㄍㄨㄛ",
"gue": "ㄍㄨㄜ", "kai": "ㄎㄞ", "kau": "ㄎㄠ", "kou": "ㄎㄡ", "kan": "ㄎㄢ", "ken": "ㄎㄣ", "kwa": "ㄎㄨㄚ", "kwo": "ㄎㄨㄛ",
"hai": "ㄏㄞ", "hei": "ㄏㄟ", "hau": "ㄏㄠ", "hou": "ㄏㄡ", "han": "ㄏㄢ", "hen": "ㄏㄣ", "hwa": "ㄏㄨㄚ", "hwo": "ㄏㄨㄛ",
"cha": "ㄔㄚ", "che": "ㄔㄜ", "chu": "ㄔㄨ", "sha": "ㄕㄚ", "she": "ㄕㄜ", "shu": "ㄕㄨ", "rau": "ㄖㄠ", "rou": "ㄖㄡ", "ran": "ㄖㄢ",
"ren": "ㄖㄣ", "sai": "ㄙㄞ", "sei": "ㄙㄟ", "sau": "ㄙㄠ", "sou": "ㄙㄡ", "san": "ㄙㄢ", "sen": "ㄙㄣ", "ang": "", "eng": "",
"yai": "ㄧㄞ", "yau": "ㄧㄠ", "yan": "ㄧㄢ", "yin": "ㄧㄣ", "wai": "ㄨㄞ", "wei": "ㄨㄟ", "wan": "ㄨㄢ", "wen": "ㄨㄣ", "yun": "ㄩㄣ",
"syu": "ㄒㄩ", "jyu": "ㄐㄩ", "chi": "ㄑㄧ", "syi": "ㄒㄧ", "dza": "ㄗㄚ", "dze": "ㄗㄜ", "dzu": "ㄗㄨ", "tsz": "", "tsa": "ㄘㄚ",
"tse": "ㄘㄜ", "tsu": "ㄘㄨ", "dwo": "ㄉㄨㄛ", "two": "ㄊㄨㄛ", "nwo": "ㄋㄨㄛ", "lwo": "ㄌㄨㄛ", "rwo": "ㄖㄨㄛ", "swo": "ㄙㄨㄛ",
"you": "ㄧㄡ", "nyu": "ㄋㄩ", "lyu": "ㄌㄩ", "bwo": "ㄅㄛ", "pwo": "ㄆㄛ", "mwo": "ㄇㄛ", "fwo": "ㄈㄛ", "gin": "ㄍㄧㄣ",
"jr": "", "ja": "ㄓㄚ", "je": "ㄓㄜ", "ju": "ㄓㄨ", "ji": "ㄐㄧ", "dz": "", "sz": "", "er": "", "ye": "ㄧㄝ", "ba": "ㄅㄚ",
"bi": "ㄅㄧ", "bu": "ㄅㄨ", "pa": "ㄆㄚ", "pi": "ㄆㄧ", "pu": "ㄆㄨ", "ma": "ㄇㄚ", "me": "ㄇㄜ", "mi": "ㄇㄧ", "mu": "ㄇㄨ",
"fa": "ㄈㄚ", "fu": "ㄈㄨ", "da": "ㄉㄚ", "de": "ㄉㄜ", "di": "ㄉㄧ", "du": "ㄉㄨ", "ta": "ㄊㄚ", "te": "ㄊㄜ", "ti": "ㄊㄧ",
"tu": "ㄊㄨ", "na": "ㄋㄚ", "ne": "ㄋㄜ", "ni": "ㄋㄧ", "nu": "ㄋㄨ", "la": "ㄌㄚ", "lo": "ㄌㄛ", "le": "ㄌㄜ", "li": "ㄌㄧ",
"lu": "ㄌㄨ", "ga": "ㄍㄚ", "ge": "ㄍㄜ", "gu": "ㄍㄨ", "ka": "ㄎㄚ", "ke": "ㄎㄜ", "ku": "ㄎㄨ", "ha": "ㄏㄚ", "he": "ㄏㄜ",
"hu": "ㄏㄨ", "re": "ㄖㄜ", "ru": "ㄖㄨ", "sa": "ㄙㄚ", "se": "ㄙㄜ", "su": "ㄙㄨ", "eh": "", "ai": "", "ei": "", "au": "",
"ou": "", "an": "", "en": "", "ya": "ㄧㄚ", "yo": "ㄧㄛ", "wu": "", "wa": "ㄨㄚ", "wo": "ㄨㄛ", "yu": "", "ch": "",
"yi": "",
"r": "", "a": "", "o": "", "e": "",
] ]
/// ///
static let mapHualuoPinyin: [String: String] = [ static let mapHualuoPinyin: [String: String] = [
"shuang": "ㄕㄨㄤ", "jhuang": "ㄓㄨㄤ", "chyueh": "ㄑㄩㄝ", "chyuan": "ㄑㄩㄢ", "chyong": "ㄑㄩㄥ", "chiang": "ㄑㄧㄤ", "shuang": "ㄕㄨㄤ", "jhuang": "ㄓㄨㄤ", "chyueh": "ㄑㄩㄝ", "chyuan": "ㄑㄩㄢ", "chyong": "ㄑㄩㄥ", "chiang": "ㄑㄧㄤ",
"chuang": "ㄔㄨㄤ", "kyang": "ㄎㄧㄤ", "syueh": "ㄒㄩㄝ", "syuan": "ㄒㄩㄢ", "syong": "ㄒㄩㄥ", "sihei": "ㄙㄟ", "siang": "ㄒㄧㄤ", "chuang": "ㄔㄨㄤ",
"shuei": "ㄕㄨㄟ", "shuan": "ㄕㄨㄢ", "shuai": "ㄕㄨㄞ", "sheng": "ㄕㄥ", "shang": "ㄕㄤ", "nyueh": "ㄋㄩㄝ", "niang": "ㄋㄧㄤ", "biang": "ㄅㄧㄤ", "duang": "ㄉㄨㄤ", "kyang": "ㄎㄧㄤ", "syueh": "ㄒㄩㄝ", "syuan": "ㄒㄩㄢ", "syong": "ㄒㄩㄥ", "sihei": "ㄙㄟ",
"lyueh": "ㄌㄩㄝ", "lyuan": "ㄌㄩㄢ", "liang": "ㄌㄧㄤ", "kuang": "ㄎㄨㄤ", "jyueh": "ㄐㄩㄝ", "jyuan": "ㄐㄩㄢ", "jyong": "ㄐㄩㄥ", "siang": "ㄒㄧㄤ", "shuei": "ㄕㄨㄟ", "shuan": "ㄕㄨㄢ", "shuai": "ㄕㄨㄞ", "sheng": "ㄕㄥ", "shang": "ㄕㄤ", "nyueh": "ㄋㄩㄝ",
"niang": "ㄋㄧㄤ", "lyueh": "ㄌㄩㄝ", "lyuan": "ㄌㄩㄢ", "liang": "ㄌㄧㄤ", "kuang": "ㄎㄨㄤ", "jyueh": "ㄐㄩㄝ", "jyuan": "ㄐㄩㄢ",
"jyong": "ㄐㄩㄥ", "jiang": "ㄐㄧㄤ", "jhuei": "ㄓㄨㄟ", "jhuan": "ㄓㄨㄢ", "jhuai": "ㄓㄨㄞ", "jhong": "ㄓㄨㄥ", "jheng": "ㄓㄥ",
"jhang": "ㄓㄤ", "huang": "ㄏㄨㄤ", "guang": "ㄍㄨㄤ", "chyun": "ㄑㄩㄣ", "tsuei": "ㄘㄨㄟ", "tsuan": "ㄘㄨㄢ", "tsong": "ㄘㄨㄥ",
"chiou": "ㄑㄧㄡ", "ching": "ㄑㄧㄥ", "chieh": "ㄑㄧㄝ", "chiao": "ㄑㄧㄠ", "chian": "ㄑㄧㄢ", "chuei": "ㄔㄨㄟ", "chuan": "ㄔㄨㄢ",
"chuai": "ㄔㄨㄞ", "chong": "ㄔㄨㄥ", "cheng": "ㄔㄥ", "chang": "ㄔㄤ", "tseng": "ㄘㄥ", "tsang": "ㄘㄤ",
"gyao": "ㄍㄧㄠ", "fiao": "ㄈㄧㄠ", "zuei": "ㄗㄨㄟ", "zuan": "ㄗㄨㄢ", "zong": "ㄗㄨㄥ", "zeng": "ㄗㄥ", "zang": "ㄗㄤ", "yueh": "ㄩㄝ",
"yuan": "ㄩㄢ", "yong": "ㄩㄥ", "ying": "ㄧㄥ", "yang": "ㄧㄤ", "wong": "ㄨㄥ", "wang": "ㄨㄤ", "tuei": "ㄊㄨㄟ", "tuan": "ㄊㄨㄢ",
"tong": "ㄊㄨㄥ", "ting": "ㄊㄧㄥ", "tieh": "ㄊㄧㄝ", "tiao": "ㄊㄧㄠ", "tian": "ㄊㄧㄢ", "teng": "ㄊㄥ", "tang": "ㄊㄤ",
"syun": "ㄒㄩㄣ", "suei": "ㄙㄨㄟ", "suan": "ㄙㄨㄢ", "song": "ㄙㄨㄥ", "siou": "ㄒㄧㄡ", "sing": "ㄒㄧㄥ", "sieh": "ㄒㄧㄝ",
"siao": "ㄒㄧㄠ", "sian": "ㄒㄧㄢ", "shuo": "ㄕㄨㄛ", "shun": "ㄕㄨㄣ", "shua": "ㄕㄨㄚ", "shou": "ㄕㄡ", "shih": "", "shen": "ㄕㄣ",
"shei": "ㄕㄟ", "shao": "ㄕㄠ", "shan": "ㄕㄢ", "shai": "ㄕㄞ", "seng": "ㄙㄥ", "sang": "ㄙㄤ", "ruei": "ㄖㄨㄟ", "ruan": "ㄖㄨㄢ",
"rong": "ㄖㄨㄥ", "reng": "ㄖㄥ", "rang": "ㄖㄤ", "ping": "ㄆㄧㄥ", "pieh": "ㄆㄧㄝ", "piao": "ㄆㄧㄠ", "pian": "ㄆㄧㄢ", "peng": "ㄆㄥ",
"pang": "ㄆㄤ", "nuei": "ㄋㄨㄟ", "nuan": "ㄋㄨㄢ", "nong": "ㄋㄨㄥ", "niou": "ㄋㄧㄡ", "ning": "ㄋㄧㄥ", "nieh": "ㄋㄧㄝ",
"niao": "ㄋㄧㄠ", "nian": "ㄋㄧㄢ", "neng": "ㄋㄥ", "nang": "ㄋㄤ", "miou": "ㄇㄧㄡ", "ming": "ㄇㄧㄥ", "mieh": "ㄇㄧㄝ",
"miao": "ㄇㄧㄠ", "mian": "ㄇㄧㄢ", "meng": "ㄇㄥ", "mang": "ㄇㄤ", "luan": "ㄌㄨㄢ", "long": "ㄌㄨㄥ", "liou": "ㄌㄧㄡ",
"ling": "ㄌㄧㄥ", "lieh": "ㄌㄧㄝ", "liao": "ㄌㄧㄠ", "lian": "ㄌㄧㄢ", "leng": "ㄌㄥ", "lang": "ㄌㄤ", "kuei": "ㄎㄨㄟ",
"kuan": "ㄎㄨㄢ", "kuai": "ㄎㄨㄞ", "kong": "ㄎㄨㄥ", "keng": "ㄎㄥ", "kang": "ㄎㄤ", "jyun": "ㄐㄩㄣ", "jiou": "ㄐㄧㄡ",
"jing": "ㄐㄧㄥ", "jieh": "ㄐㄧㄝ", "jiao": "ㄐㄧㄠ", "jian": "ㄐㄧㄢ", "jhuo": "ㄓㄨㄛ", "jhun": "ㄓㄨㄣ", "jhua": "ㄓㄨㄚ",
"jhou": "ㄓㄡ", "jhih": "", "jhen": "ㄓㄣ", "jhei": "ㄓㄟ", "jhao": "ㄓㄠ", "jhan": "ㄓㄢ", "jhai": "ㄓㄞ", "huei": "ㄏㄨㄟ",
"huan": "ㄏㄨㄢ", "huai": "ㄏㄨㄞ", "hong": "ㄏㄨㄥ", "heng": "ㄏㄥ", "hang": "ㄏㄤ", "guei": "ㄍㄨㄟ", "guan": "ㄍㄨㄢ",
"guai": "ㄍㄨㄞ", "gong": "ㄍㄨㄥ", "geng": "ㄍㄥ", "gang": "ㄍㄤ", "feng": "ㄈㄥ", "fang": "ㄈㄤ", "duei": "ㄉㄨㄟ", "duan": "ㄉㄨㄢ",
"dong": "ㄉㄨㄥ", "diou": "ㄉㄧㄡ", "ding": "ㄉㄧㄥ", "dieh": "ㄉㄧㄝ", "diao": "ㄉㄧㄠ", "dian": "ㄉㄧㄢ", "deng": "ㄉㄥ",
"dang": "ㄉㄤ", "chyu": "ㄑㄩ", "tsuo": "ㄘㄨㄛ", "tsun": "ㄘㄨㄣ", "tsou": "ㄘㄡ", "chin": "ㄑㄧㄣ", "tsih": "", "chia": "ㄑㄧㄚ",
"chuo": "ㄔㄨㄛ", "chun": "ㄔㄨㄣ", "chua": "ㄔㄨㄚ", "chou": "ㄔㄡ", "chih": "", "chen": "ㄔㄣ", "chao": "ㄔㄠ", "chan": "ㄔㄢ",
"chai": "ㄔㄞ", "tsen": "ㄘㄣ", "tsao": "ㄘㄠ", "tsan": "ㄘㄢ", "tsai": "ㄘㄞ", "bing": "ㄅㄧㄥ", "bieh": "ㄅㄧㄝ", "biao": "ㄅㄧㄠ",
"bian": "ㄅㄧㄢ", "beng": "ㄅㄥ", "bang": "ㄅㄤ",
"gin": "ㄍㄧㄣ", "den": "ㄉㄣ", "zuo": "ㄗㄨㄛ", "zun": "ㄗㄨㄣ", "zou": "ㄗㄡ", "zih": "", "zen": "ㄗㄣ", "zei": "ㄗㄟ",
"zao": "ㄗㄠ", "zan": "ㄗㄢ", "zai": "ㄗㄞ", "yun": "ㄩㄣ", "you": "ㄧㄡ", "yin": "ㄧㄣ", "yeh": "ㄧㄝ", "yao": "ㄧㄠ", "yan": "ㄧㄢ",
"yai": "ㄧㄞ", "wun": "ㄨㄣ", "wei": "ㄨㄟ", "wan": "ㄨㄢ", "wai": "ㄨㄞ", "tuo": "ㄊㄨㄛ", "tun": "ㄊㄨㄣ", "tou": "ㄊㄡ",
"tao": "ㄊㄠ", "tan": "ㄊㄢ", "tai": "ㄊㄞ", "syu": "ㄒㄩ", "suo": "ㄙㄨㄛ", "sun": "ㄙㄨㄣ", "sou": "ㄙㄡ", "sin": "ㄒㄧㄣ",
"sih": "", "sia": "ㄒㄧㄚ", "shu": "ㄕㄨ", "she": "ㄕㄜ", "sha": "ㄕㄚ", "sen": "ㄙㄣ", "sao": "ㄙㄠ", "san": "ㄙㄢ", "sai": "ㄙㄞ",
"ruo": "ㄖㄨㄛ", "run": "ㄖㄨㄣ", "rou": "ㄖㄡ", "rih": "", "ren": "ㄖㄣ", "rao": "ㄖㄠ", "ran": "ㄖㄢ", "pou": "ㄆㄡ",
"pin": "ㄆㄧㄣ", "pia": "ㄆㄧㄚ", "pen": "ㄆㄣ", "pei": "ㄆㄟ", "pao": "ㄆㄠ", "pan": "ㄆㄢ", "pai": "ㄆㄞ", "nyu": "ㄋㄩ",
"nuo": "ㄋㄨㄛ", "nun": "ㄋㄨㄣ", "nou": "ㄋㄡ", "nin": "ㄋㄧㄣ", "nen": "ㄋㄣ", "nei": "ㄋㄟ", "nao": "ㄋㄠ", "nan": "ㄋㄢ",
"nai": "ㄋㄞ", "mou": "ㄇㄡ", "min": "ㄇㄧㄣ", "men": "ㄇㄣ", "mei": "ㄇㄟ", "mao": "ㄇㄠ", "man": "ㄇㄢ", "mai": "ㄇㄞ",
"lyu": "ㄌㄩ", "luo": "ㄌㄨㄛ", "lun": "ㄌㄨㄣ", "lou": "ㄌㄡ", "lin": "ㄌㄧㄣ", "lia": "ㄌㄧㄚ", "lei": "ㄌㄟ", "lao": "ㄌㄠ",
"lan": "ㄌㄢ", "lai": "ㄌㄞ", "kuo": "ㄎㄨㄛ", "kun": "ㄎㄨㄣ", "kua": "ㄎㄨㄚ", "kou": "ㄎㄡ", "ken": "ㄎㄣ", "kao": "ㄎㄠ",
"kan": "ㄎㄢ", "kai": "ㄎㄞ", "jyu": "ㄐㄩ", "jin": "ㄐㄧㄣ", "jia": "ㄐㄧㄚ", "jhu": "ㄓㄨ", "jhe": "ㄓㄜ", "jha": "ㄓㄚ",
"huo": "ㄏㄨㄛ", "hun": "ㄏㄨㄣ", "hua": "ㄏㄨㄚ", "hou": "ㄏㄡ", "hen": "ㄏㄣ", "hei": "ㄏㄟ", "hao": "ㄏㄠ", "han": "ㄏㄢ",
"hai": "ㄏㄞ", "guo": "ㄍㄨㄛ", "gun": "ㄍㄨㄣ", "gue": "ㄍㄨㄜ", "gua": "ㄍㄨㄚ", "gou": "ㄍㄡ", "gen": "ㄍㄣ", "gei": "ㄍㄟ",
"gao": "ㄍㄠ", "gan": "ㄍㄢ", "gai": "ㄍㄞ", "fou": "ㄈㄡ", "fen": "ㄈㄣ", "fei": "ㄈㄟ", "fan": "ㄈㄢ", "eng": "", "duo": "ㄉㄨㄛ",
"dun": "ㄉㄨㄣ", "dou": "ㄉㄡ", "dia": "ㄉㄧㄚ", "dei": "ㄉㄟ", "dao": "ㄉㄠ", "dan": "ㄉㄢ", "dai": "ㄉㄞ", "tsu": "ㄘㄨ",
"chi": "ㄑㄧ", "chu": "ㄔㄨ", "che": "ㄔㄜ", "cha": "ㄔㄚ", "tse": "ㄘㄜ", "tsa": "ㄘㄚ", "bin": "ㄅㄧㄣ", "ben": "ㄅㄣ",
"bei": "ㄅㄟ", "bao": "ㄅㄠ", "ban": "ㄅㄢ", "bai": "ㄅㄞ", "ang": "",
"ch": "", "zu": "ㄗㄨ", "ze": "ㄗㄜ", "za": "ㄗㄚ", "yu": "", "yo": "ㄧㄛ", "ya": "ㄧㄚ", "yi": "", "wu": "", "wo": "ㄨㄛ",
"wa": "ㄨㄚ", "tu": "ㄊㄨ", "ti": "ㄊㄧ", "te": "ㄊㄜ", "ta": "ㄊㄚ", "su": "ㄙㄨ", "si": "ㄒㄧ", "se": "ㄙㄜ", "sa": "ㄙㄚ",
"ru": "ㄖㄨ", "re": "ㄖㄜ", "pu": "ㄆㄨ", "po": "ㄆㄛ", "pi": "ㄆㄧ", "pa": "ㄆㄚ", "ou": "", "nu": "ㄋㄨ", "ni": "ㄋㄧ",
"ne": "ㄋㄜ", "na": "ㄋㄚ", "mu": "ㄇㄨ", "mo": "ㄇㄛ", "mi": "ㄇㄧ", "me": "ㄇㄜ", "ma": "ㄇㄚ", "lu": "ㄌㄨ", "lo": "ㄌㄛ",
"li": "ㄌㄧ", "le": "ㄌㄜ", "la": "ㄌㄚ", "ku": "ㄎㄨ", "ke": "ㄎㄜ", "ka": "ㄎㄚ", "ji": "ㄐㄧ", "hu": "ㄏㄨ", "he": "ㄏㄜ",
"ha": "ㄏㄚ", "gu": "ㄍㄨ", "ge": "ㄍㄜ", "ga": "ㄍㄚ", "fu": "ㄈㄨ", "fo": "ㄈㄛ", "fa": "ㄈㄚ", "er": "", "en": "", "ei": "",
"eh": "", "du": "ㄉㄨ", "di": "ㄉㄧ", "de": "ㄉㄜ", "da": "ㄉㄚ", "bu": "ㄅㄨ", "bo": "ㄅㄛ", "bi": "ㄅㄧ", "ba": "ㄅㄚ",
"ao": "", "an": "", "ai": "",
"o": "", "e": "", "a": "",
]
///
static let mapUniversalPinyin: [String: String] = [
"shuang": "ㄕㄨㄤ", "jhuang": "ㄓㄨㄤ", "chuang": "ㄔㄨㄤ",
"biang": "ㄅㄧㄤ", "duang": "ㄉㄨㄤ", "cyuan": "ㄑㄩㄢ", "cyong": "ㄑㄩㄥ", "ciang": "ㄑㄧㄤ", "kyang": "ㄎㄧㄤ", "syuan": "ㄒㄩㄢ",
"syong": "ㄒㄩㄥ", "sihei": "ㄙㄟ", "siang": "ㄒㄧㄤ", "shuei": "ㄕㄨㄟ", "shuan": "ㄕㄨㄢ", "shuai": "ㄕㄨㄞ", "sheng": "ㄕㄥ",
"shang": "ㄕㄤ", "niang": "ㄋㄧㄤ", "lyuan": "ㄌㄩㄢ", "liang": "ㄌㄧㄤ", "kuang": "ㄎㄨㄤ", "jyuan": "ㄐㄩㄢ", "jyong": "ㄐㄩㄥ",
"jiang": "ㄐㄧㄤ", "jhuei": "ㄓㄨㄟ", "jhuan": "ㄓㄨㄢ", "jhuai": "ㄓㄨㄞ", "jhong": "ㄓㄨㄥ", "jheng": "ㄓㄥ", "jhang": "ㄓㄤ", "jiang": "ㄐㄧㄤ", "jhuei": "ㄓㄨㄟ", "jhuan": "ㄓㄨㄢ", "jhuai": "ㄓㄨㄞ", "jhong": "ㄓㄨㄥ", "jheng": "ㄓㄥ", "jhang": "ㄓㄤ",
"huang": "ㄏㄨㄤ", "guang": "ㄍㄨㄤ", "chyun": "ㄑㄩㄣ", "tsuei": "ㄘㄨㄟ", "tsuan": "ㄘㄨㄢ", "tsong": "ㄘㄨㄥ", "chiou": "ㄑㄧㄡ", "huang": "ㄏㄨㄤ", "guang": "ㄍㄨㄤ", "chuei": "ㄔㄨㄟ", "chuan": "ㄔㄨㄢ", "chuai": "ㄔㄨㄞ", "chong": "ㄔㄨㄥ", "cheng": "ㄔㄥ",
"ching": "ㄑㄧㄥ", "chieh": "ㄑㄧㄝ", "chiao": "ㄑㄧㄠ", "chian": "ㄑㄧㄢ", "chuei": "ㄔㄨㄟ", "chuan": "ㄔㄨㄢ", "chuai": "ㄔㄨㄞ", "chang": "ㄔㄤ",
"chong": "ㄔㄨㄥ", "cheng": "ㄔㄥ", "chang": "ㄔㄤ", "tseng": "ㄘㄥ", "tsang": "ㄘㄤ", "gyao": "ㄍㄧㄠ", "fiao": "ㄈㄧㄠ", "cyue": "ㄑㄩㄝ", "syue": "ㄒㄩㄝ", "nyue": "ㄋㄩㄝ", "lyue": "ㄌㄩㄝ", "jyue": "ㄐㄩㄝ", "cyun": "ㄑㄩㄣ", "cuei": "ㄘㄨㄟ",
"zuei": "ㄗㄨㄟ", "zuan": "ㄗㄨㄢ", "zong": "ㄗㄨㄥ", "zeng": "ㄗㄥ", "zang": "ㄗㄤ", "yueh": "ㄩㄝ", "yuan": "ㄩㄢ", "yong": "ㄩㄥ", "cuan": "ㄘㄨㄢ", "cong": "ㄘㄨㄥ", "ciou": "ㄑㄧㄡ", "cing": "ㄑㄧㄥ", "ciao": "ㄑㄧㄠ", "cian": "ㄑㄧㄢ", "ceng": "ㄘㄥ",
"ying": "ㄧㄥ", "yang": "ㄧㄤ", "wong": "ㄨㄥ", "wang": "ㄨㄤ", "tuei": "ㄊㄨㄟ", "tuan": "ㄊㄨㄢ", "tong": "ㄊㄨㄥ", "ting": "ㄊㄧㄥ", "cang": "ㄘㄤ", "gyao": "ㄍㄧㄠ", "fiao": "ㄈㄧㄠ", "zuei": "ㄗㄨㄟ", "zuan": "ㄗㄨㄢ", "zong": "ㄗㄨㄥ", "zeng": "ㄗㄥ", "zang": "ㄗㄤ",
"tieh": "ㄊㄧㄝ", "tiao": "ㄊㄧㄠ", "tian": "ㄊㄧㄢ", "teng": "ㄊㄥ", "tang": "ㄊㄤ", "syun": "ㄒㄩㄣ", "suei": "ㄙㄨㄟ", "yuan": "ㄩㄢ", "yong": "ㄩㄥ", "ying": "ㄧㄥ", "yang": "ㄧㄤ", "wong": "ㄨㄥ", "wang": "ㄨㄤ", "tuei": "ㄊㄨㄟ", "tuan": "ㄊㄨㄢ",
"suan": "ㄙㄨㄢ", "song": "ㄙㄨㄥ", "siou": "ㄒㄧㄡ", "sing": "ㄒㄧㄥ", "sieh": "ㄒㄧㄝ", "siao": "ㄒㄧㄠ", "sian": "ㄒㄧㄢ", "tong": "ㄊㄨㄥ", "ting": "ㄊㄧㄥ", "tiao": "ㄊㄧㄠ", "tian": "ㄊㄧㄢ", "teng": "ㄊㄥ", "tang": "ㄊㄤ", "syun": "ㄒㄩㄣ",
"suei": "ㄙㄨㄟ", "suan": "ㄙㄨㄢ", "song": "ㄙㄨㄥ", "siou": "ㄒㄧㄡ", "sing": "ㄒㄧㄥ", "siao": "ㄒㄧㄠ", "sian": "ㄒㄧㄢ",
"shuo": "ㄕㄨㄛ", "shun": "ㄕㄨㄣ", "shua": "ㄕㄨㄚ", "shou": "ㄕㄡ", "shih": "", "shen": "ㄕㄣ", "shei": "ㄕㄟ", "shao": "ㄕㄠ", "shuo": "ㄕㄨㄛ", "shun": "ㄕㄨㄣ", "shua": "ㄕㄨㄚ", "shou": "ㄕㄡ", "shih": "", "shen": "ㄕㄣ", "shei": "ㄕㄟ", "shao": "ㄕㄠ",
"shan": "ㄕㄢ", "shai": "ㄕㄞ", "seng": "ㄙㄥ", "sang": "ㄙㄤ", "ruei": "ㄖㄨㄟ", "ruan": "ㄖㄨㄢ", "rong": "ㄖㄨㄥ", "reng": "ㄖㄥ", "shan": "ㄕㄢ", "shai": "ㄕㄞ", "seng": "ㄙㄥ", "sang": "ㄙㄤ", "ruei": "ㄖㄨㄟ", "ruan": "ㄖㄨㄢ", "rong": "ㄖㄨㄥ", "reng": "ㄖㄥ",
"rang": "ㄖㄤ", "ping": "ㄆㄧㄥ", "pieh": "ㄆㄧㄝ", "piao": "ㄆㄧㄠ", "pian": "ㄆㄧㄢ", "peng": "ㄆㄥ", "pang": "ㄆㄤ", "nuei": "ㄋㄨㄟ", "rang": "ㄖㄤ", "ping": "ㄆㄧㄥ", "piao": "ㄆㄧㄠ", "pian": "ㄆㄧㄢ", "peng": "ㄆㄥ", "pang": "ㄆㄤ", "nuei": "ㄋㄨㄟ", "nuan": "ㄋㄨㄢ",
"nuan": "ㄋㄨㄢ", "nong": "ㄋㄨㄥ", "niou": "ㄋㄧㄡ", "ning": "ㄋㄧㄥ", "nieh": "ㄋㄧㄝ", "niao": "ㄋㄧㄠ", "nian": "ㄋㄧㄢ", "nong": "ㄋㄨㄥ", "niou": "ㄋㄧㄡ", "ning": "ㄋㄧㄥ", "niao": "ㄋㄧㄠ", "nian": "ㄋㄧㄢ", "neng": "ㄋㄥ", "nang": "ㄋㄤ",
"neng": "ㄋㄥ", "nang": "ㄋㄤ", "miou": "ㄇㄧㄡ", "ming": "ㄇㄧㄥ", "mieh": "ㄇㄧㄝ", "miao": "ㄇㄧㄠ", "mian": "ㄇㄧㄢ", "meng": "ㄇㄥ", "miou": "ㄇㄧㄡ", "ming": "ㄇㄧㄥ", "miao": "ㄇㄧㄠ", "mian": "ㄇㄧㄢ", "meng": "ㄇㄥ", "mang": "ㄇㄤ", "luan": "ㄌㄨㄢ",
"mang": "ㄇㄤ", "luan": "ㄌㄨㄢ", "long": "ㄌㄨㄥ", "liou": "ㄌㄧㄡ", "ling": "ㄌㄧㄥ", "lieh": "ㄌㄧㄝ", "liao": "ㄌㄧㄠ", "long": "ㄌㄨㄥ", "liou": "ㄌㄧㄡ", "ling": "ㄌㄧㄥ", "liao": "ㄌㄧㄠ", "lian": "ㄌㄧㄢ", "leng": "ㄌㄥ", "lang": "ㄌㄤ",
"lian": "ㄌㄧㄢ", "leng": "ㄌㄥ", "lang": "ㄌㄤ", "kuei": "ㄎㄨㄟ", "kuan": "ㄎㄨㄢ", "kuai": "ㄎㄨㄞ", "kong": "ㄎㄨㄥ", "keng": "ㄎㄥ", "kuei": "ㄎㄨㄟ", "kuan": "ㄎㄨㄢ", "kuai": "ㄎㄨㄞ", "kong": "ㄎㄨㄥ", "keng": "ㄎㄥ", "kang": "ㄎㄤ", "jyun": "ㄐㄩㄣ",
"kang": "ㄎㄤ", "jyun": "ㄐㄩㄣ", "jiou": "ㄐㄧㄡ", "jing": "ㄐㄧㄥ", "jieh": "ㄐㄧㄝ", "jiao": "ㄐㄧㄠ", "jian": "ㄐㄧㄢ", "jiou": "ㄐㄧㄡ", "jing": "ㄐㄧㄥ", "jiao": "ㄐㄧㄠ", "jian": "ㄐㄧㄢ", "jhuo": "ㄓㄨㄛ", "jhun": "ㄓㄨㄣ", "jhua": "ㄓㄨㄚ",
"jhuo": "ㄓㄨㄛ", "jhun": "ㄓㄨㄣ", "jhua": "ㄓㄨㄚ", "jhou": "ㄓㄡ", "jhih": "", "jhen": "ㄓㄣ", "jhei": "ㄓㄟ", "jhao": "ㄓㄠ", "jhou": "ㄓㄡ", "jhih": "", "jhen": "ㄓㄣ", "jhei": "ㄓㄟ", "jhao": "ㄓㄠ", "jhan": "ㄓㄢ", "jhai": "ㄓㄞ", "huei": "ㄏㄨㄟ",
"jhan": "ㄓㄢ", "jhai": "ㄓㄞ", "huei": "ㄏㄨㄟ", "huan": "ㄏㄨㄢ", "huai": "ㄏㄨㄞ", "hong": "ㄏㄨㄥ", "heng": "ㄏㄥ", "hang": "ㄏㄤ", "huan": "ㄏㄨㄢ", "huai": "ㄏㄨㄞ", "hong": "ㄏㄨㄥ", "heng": "ㄏㄥ", "hang": "ㄏㄤ", "guei": "ㄍㄨㄟ", "guan": "ㄍㄨㄢ",
"guei": "ㄍㄨㄟ", "guan": "ㄍㄨㄢ", "guai": "ㄍㄨㄞ", "gong": "ㄍㄨㄥ", "geng": "ㄍㄥ", "gang": "ㄍㄤ", "feng": "ㄈㄥ", "fang": "ㄈㄤ", "guai": "ㄍㄨㄞ", "gong": "ㄍㄨㄥ", "geng": "ㄍㄥ", "gang": "ㄍㄤ", "fong": "ㄈㄥ", "fang": "ㄈㄤ", "duei": "ㄉㄨㄟ", "duan": "ㄉㄨㄢ",
"duei": "ㄉㄨㄟ", "duan": "ㄉㄨㄢ", "dong": "ㄉㄨㄥ", "diou": "ㄉㄧㄡ", "ding": "ㄉㄧㄥ", "dieh": "ㄉㄧㄝ", "diao": "ㄉㄧㄠ", "dong": "ㄉㄨㄥ", "diou": "ㄉㄧㄡ", "ding": "ㄉㄧㄥ", "diao": "ㄉㄧㄠ", "dian": "ㄉㄧㄢ", "deng": "ㄉㄥ", "dang": "ㄉㄤ",
"dian": "ㄉㄧㄢ", "deng": "ㄉㄥ", "dang": "ㄉㄤ", "chyu": "ㄑㄩ", "tsuo": "ㄘㄨㄛ", "tsun": "ㄘㄨㄣ", "tsou": "ㄘㄡ", "chin": "ㄑㄧㄣ", "chuo": "ㄔㄨㄛ", "chun": "ㄔㄨㄣ", "chua": "ㄔㄨㄚ", "chou": "ㄔㄡ", "chih": "", "chen": "ㄔㄣ", "chao": "ㄔㄠ", "chan": "ㄔㄢ",
"tsih": "", "chia": "ㄑㄧㄚ", "chuo": "ㄔㄨㄛ", "chun": "ㄔㄨㄣ", "chua": "ㄔㄨㄚ", "chou": "ㄔㄡ", "chih": "", "chen": "ㄔㄣ", "chai": "ㄔㄞ", "bing": "ㄅㄧㄥ", "biao": "ㄅㄧㄠ", "bian": "ㄅㄧㄢ", "beng": "ㄅㄥ", "bang": "ㄅㄤ",
"chao": "ㄔㄠ", "chan": "ㄔㄢ", "chai": "ㄔㄞ", "tsen": "ㄘㄣ", "tsao": "ㄘㄠ", "tsan": "ㄘㄢ", "tsai": "ㄘㄞ", "bing": "ㄅㄧㄥ", "cie": "ㄑㄧㄝ", "yue": "ㄩㄝ", "tie": "ㄊㄧㄝ", "sie": "ㄒㄧㄝ", "pie": "ㄆㄧㄝ", "nie": "ㄋㄧㄝ", "mie": "ㄇㄧㄝ", "lie": "ㄌㄧㄝ",
"bieh": "ㄅㄧㄝ", "biao": "ㄅㄧㄠ", "bian": "ㄅㄧㄢ", "beng": "ㄅㄥ", "bang": "ㄅㄤ", "gin": "ㄍㄧㄣ", "den": "ㄉㄣ", "zuo": "ㄗㄨㄛ", "jie": "ㄐㄧㄝ", "die": "ㄉㄧㄝ", "cyu": "ㄑㄩ", "cuo": "ㄘㄨㄛ", "cun": "ㄘㄨㄣ", "cou": "ㄘㄡ", "cin": "ㄑㄧㄣ", "cih": "",
"zun": "ㄗㄨㄣ", "zou": "ㄗㄡ", "zih": "", "zen": "ㄗㄣ", "zei": "ㄗㄟ", "zao": "ㄗㄠ", "zan": "ㄗㄢ", "zai": "ㄗㄞ", "yun": "ㄩㄣ", "cia": "ㄑㄧㄚ", "cen": "ㄘㄣ", "cao": "ㄘㄠ", "can": "ㄘㄢ", "cai": "ㄘㄞ", "bie": "ㄅㄧㄝ", "gin": "ㄍㄧㄣ", "den": "ㄉㄣ",
"you": "ㄧㄡ", "yin": "ㄧㄣ", "yeh": "ㄧㄝ", "yao": "ㄧㄠ", "yan": "ㄧㄢ", "yai": "ㄧㄞ", "wun": "ㄨㄣ", "wei": "ㄨㄟ", "wan": "ㄨㄢ", "zuo": "ㄗㄨㄛ", "zun": "ㄗㄨㄣ", "zou": "ㄗㄡ", "zih": "", "zen": "ㄗㄣ", "zei": "ㄗㄟ", "zao": "ㄗㄠ", "zan": "ㄗㄢ",
"wai": "ㄨㄞ", "tuo": "ㄊㄨㄛ", "tun": "ㄊㄨㄣ", "tou": "ㄊㄡ", "tao": "ㄊㄠ", "tan": "ㄊㄢ", "tai": "ㄊㄞ", "syu": "ㄒㄩ", "zai": "ㄗㄞ", "yun": "ㄩㄣ", "you": "ㄧㄡ", "yin": "ㄧㄣ", "yao": "ㄧㄠ", "yan": "ㄧㄢ", "yai": "ㄧㄞ", "wun": "ㄨㄣ", "wei": "ㄨㄟ",
"suo": "ㄙㄨㄛ", "sun": "ㄙㄨㄣ", "sou": "ㄙㄡ", "sin": "ㄒㄧㄣ", "sih": "", "sia": "ㄒㄧㄚ", "shu": "ㄕㄨ", "she": "ㄕㄜ", "wan": "ㄨㄢ", "wai": "ㄨㄞ", "tuo": "ㄊㄨㄛ", "tun": "ㄊㄨㄣ", "tou": "ㄊㄡ", "tao": "ㄊㄠ", "tan": "ㄊㄢ", "tai": "ㄊㄞ",
"sha": "ㄕㄚ", "sen": "ㄙㄣ", "sao": "ㄙㄠ", "san": "ㄙㄢ", "sai": "ㄙㄞ", "ruo": "ㄖㄨㄛ", "run": "ㄖㄨㄣ", "rou": "ㄖㄡ", "syu": "ㄒㄩ", "suo": "ㄙㄨㄛ", "sun": "ㄙㄨㄣ", "sou": "ㄙㄡ", "sin": "ㄒㄧㄣ", "sih": "", "sia": "ㄒㄧㄚ", "shu": "ㄕㄨ",
"rih": "", "ren": "ㄖㄣ", "rao": "ㄖㄠ", "ran": "ㄖㄢ", "pou": "ㄆㄡ", "pin": "ㄆㄧㄣ", "pia": "ㄆㄧㄚ", "pen": "ㄆㄣ", "she": "ㄕㄜ", "sha": "ㄕㄚ", "sen": "ㄙㄣ", "sao": "ㄙㄠ", "san": "ㄙㄢ", "sai": "ㄙㄞ", "ruo": "ㄖㄨㄛ", "run": "ㄖㄨㄣ",
"pei": "ㄆㄟ", "pao": "ㄆㄠ", "pan": "ㄆㄢ", "pai": "ㄆㄞ", "nyu": "ㄋㄩ", "nuo": "ㄋㄨㄛ", "nun": "ㄋㄨㄣ", "nou": "ㄋㄡ", "rou": "ㄖㄡ", "rih": "", "ren": "ㄖㄣ", "rao": "ㄖㄠ", "ran": "ㄖㄢ", "pou": "ㄆㄡ", "pin": "ㄆㄧㄣ", "pia": "ㄆㄧㄚ",
"nin": "ㄋㄧㄣ", "nen": "ㄋㄣ", "nei": "ㄋㄟ", "nao": "ㄋㄠ", "nan": "ㄋㄢ", "nai": "ㄋㄞ", "mou": "ㄇㄡ", "min": "ㄇㄧㄣ", "pen": "ㄆㄣ", "pei": "ㄆㄟ", "pao": "ㄆㄠ", "pan": "ㄆㄢ", "pai": "ㄆㄞ", "nyu": "ㄋㄩ", "nuo": "ㄋㄨㄛ", "nun": "ㄋㄨㄣ",
"men": "ㄇㄣ", "mei": "ㄇㄟ", "mao": "ㄇㄠ", "man": "ㄇㄢ", "mai": "ㄇㄞ", "lyu": "ㄌㄩ", "luo": "ㄌㄨㄛ", "lun": "ㄌㄨㄣ", "nou": "ㄋㄡ", "nin": "ㄋㄧㄣ", "nen": "ㄋㄣ", "nei": "ㄋㄟ", "nao": "ㄋㄠ", "nan": "ㄋㄢ", "nai": "ㄋㄞ", "mou": "ㄇㄡ",
"lou": "ㄌㄡ", "lin": "ㄌㄧㄣ", "lia": "ㄌㄧㄚ", "lei": "ㄌㄟ", "lao": "ㄌㄠ", "lan": "ㄌㄢ", "lai": "ㄌㄞ", "kuo": "ㄎㄨㄛ", "min": "ㄇㄧㄣ", "men": "ㄇㄣ", "mei": "ㄇㄟ", "mao": "ㄇㄠ", "man": "ㄇㄢ", "mai": "ㄇㄞ", "lyu": "ㄌㄩ", "luo": "ㄌㄨㄛ",
"kun": "ㄎㄨㄣ", "kua": "ㄎㄨㄚ", "kou": "ㄎㄡ", "ken": "ㄎㄣ", "kao": "ㄎㄠ", "kan": "ㄎㄢ", "kai": "ㄎㄞ", "jyu": "ㄐㄩ", "lun": "ㄌㄨㄣ", "lou": "ㄌㄡ", "lin": "ㄌㄧㄣ", "lia": "ㄌㄧㄚ", "lei": "ㄌㄟ", "lao": "ㄌㄠ", "lan": "ㄌㄢ", "lai": "ㄌㄞ",
"jin": "ㄐㄧㄣ", "jia": "ㄐㄧㄚ", "jhu": "ㄓㄨ", "jhe": "ㄓㄜ", "jha": "ㄓㄚ", "huo": "ㄏㄨㄛ", "hun": "ㄏㄨㄣ", "hua": "ㄏㄨㄚ", "kuo": "ㄎㄨㄛ", "kun": "ㄎㄨㄣ", "kua": "ㄎㄨㄚ", "kou": "ㄎㄡ", "ken": "ㄎㄣ", "kao": "ㄎㄠ", "kan": "ㄎㄢ", "kai": "ㄎㄞ",
"hou": "ㄏㄡ", "hen": "ㄏㄣ", "hei": "ㄏㄟ", "hao": "ㄏㄠ", "han": "ㄏㄢ", "hai": "ㄏㄞ", "guo": "ㄍㄨㄛ", "gun": "ㄍㄨㄣ", "jyu": "ㄐㄩ", "jin": "ㄐㄧㄣ", "jia": "ㄐㄧㄚ", "jhu": "ㄓㄨ", "jhe": "ㄓㄜ", "jha": "ㄓㄚ", "huo": "ㄏㄨㄛ", "hun": "ㄏㄨㄣ",
"gue": "ㄍㄨㄜ", "gua": "ㄍㄨㄚ", "gou": "ㄍㄡ", "gen": "ㄍㄣ", "gei": "ㄍㄟ", "gao": "ㄍㄠ", "gan": "ㄍㄢ", "gai": "ㄍㄞ", "hua": "ㄏㄨㄚ", "hou": "ㄏㄡ", "hen": "ㄏㄣ", "hei": "ㄏㄟ", "hao": "ㄏㄠ", "han": "ㄏㄢ", "hai": "ㄏㄞ", "guo": "ㄍㄨㄛ",
"fou": "ㄈㄡ", "fen": "ㄈㄣ", "fei": "ㄈㄟ", "fan": "ㄈㄢ", "eng": "", "duo": "ㄉㄨㄛ", "dun": "ㄉㄨㄣ", "dou": "ㄉㄡ", "gun": "ㄍㄨㄣ", "gue": "ㄍㄨㄜ", "gua": "ㄍㄨㄚ", "gou": "ㄍㄡ", "gen": "ㄍㄣ", "gei": "ㄍㄟ", "gao": "ㄍㄠ", "gan": "ㄍㄢ",
"dia": "ㄉㄧㄚ", "dei": "ㄉㄟ", "dao": "ㄉㄠ", "dan": "ㄉㄢ", "dai": "ㄉㄞ", "tsu": "ㄘㄨ", "chi": "ㄑㄧ", "chu": "ㄔㄨ", "gai": "ㄍㄞ", "fou": "ㄈㄡ", "fen": "ㄈㄣ", "fei": "ㄈㄟ", "fan": "ㄈㄢ", "eng": "", "duo": "ㄉㄨㄛ", "dun": "ㄉㄨㄣ",
"che": "ㄔㄜ", "cha": "ㄔㄚ", "tse": "ㄘㄜ", "tsa": "ㄘㄚ", "bin": "ㄅㄧㄣ", "ben": "ㄅㄣ", "bei": "ㄅㄟ", "bao": "ㄅㄠ", "dou": "ㄉㄡ", "dia": "ㄉㄧㄚ", "dei": "ㄉㄟ", "dao": "ㄉㄠ", "dan": "ㄉㄢ", "dai": "ㄉㄞ", "chu": "ㄔㄨ", "che": "ㄔㄜ",
"ban": "ㄅㄢ", "bai": "ㄅㄞ", "ang": "", "ch": "", "zu": "ㄗㄨ", "ze": "ㄗㄜ", "za": "ㄗㄚ", "yu": "", "yo": "ㄧㄛ", "cha": "ㄔㄚ", "bin": "ㄅㄧㄣ", "ben": "ㄅㄣ", "bei": "ㄅㄟ", "bao": "ㄅㄠ", "ban": "ㄅㄢ", "bai": "ㄅㄞ", "ang": "", "yia": "ㄧㄚ",
"ya": "ㄧㄚ", "yi": "", "wu": "", "wo": "ㄨㄛ", "wa": "ㄨㄚ", "tu": "ㄊㄨ", "ti": "ㄊㄧ", "te": "ㄊㄜ", "ta": "ㄊㄚ", "ye": "ㄧㄝ", "cu": "ㄘㄨ", "ci": "ㄑㄧ", "ce": "ㄘㄜ", "ca": "ㄘㄚ", "zu": "ㄗㄨ", "ze": "ㄗㄜ", "za": "ㄗㄚ", "yu": "",
"yo": "ㄧㄛ", "yi": "", "wu": "", "wo": "ㄨㄛ", "wa": "ㄨㄚ", "tu": "ㄊㄨ", "ti": "ㄊㄧ", "te": "ㄊㄜ", "ta": "ㄊㄚ",
"su": "ㄙㄨ", "si": "ㄒㄧ", "se": "ㄙㄜ", "sa": "ㄙㄚ", "ru": "ㄖㄨ", "re": "ㄖㄜ", "pu": "ㄆㄨ", "po": "ㄆㄛ", "pi": "ㄆㄧ", "su": "ㄙㄨ", "si": "ㄒㄧ", "se": "ㄙㄜ", "sa": "ㄙㄚ", "ru": "ㄖㄨ", "re": "ㄖㄜ", "pu": "ㄆㄨ", "po": "ㄆㄛ", "pi": "ㄆㄧ",
"pa": "ㄆㄚ", "ou": "", "nu": "ㄋㄨ", "ni": "ㄋㄧ", "ne": "ㄋㄜ", "na": "ㄋㄚ", "mu": "ㄇㄨ", "mo": "ㄇㄛ", "mi": "ㄇㄧ", "pa": "ㄆㄚ", "ou": "", "nu": "ㄋㄨ", "ni": "ㄋㄧ", "ne": "ㄋㄜ", "na": "ㄋㄚ", "mu": "ㄇㄨ", "mo": "ㄇㄛ", "mi": "ㄇㄧ",
"me": "ㄇㄜ", "ma": "ㄇㄚ", "lu": "ㄌㄨ", "lo": "ㄌㄛ", "li": "ㄌㄧ", "le": "ㄌㄜ", "la": "ㄌㄚ", "ku": "ㄎㄨ", "ke": "ㄎㄜ", "me": "ㄇㄜ", "ma": "ㄇㄚ", "lu": "ㄌㄨ", "lo": "ㄌㄛ", "li": "ㄌㄧ", "le": "ㄌㄜ", "la": "ㄌㄚ", "ku": "ㄎㄨ", "ke": "ㄎㄜ",
"ka": "ㄎㄚ", "ji": "ㄐㄧ", "hu": "ㄏㄨ", "he": "ㄏㄜ", "ha": "ㄏㄚ", "gu": "ㄍㄨ", "ge": "ㄍㄜ", "ga": "ㄍㄚ", "fu": "ㄈㄨ", "ka": "ㄎㄚ", "ji": "ㄐㄧ", "hu": "ㄏㄨ", "he": "ㄏㄜ", "ha": "ㄏㄚ", "gu": "ㄍㄨ", "ge": "ㄍㄜ", "ga": "ㄍㄚ", "fu": "ㄈㄨ",
"fo": "ㄈㄛ", "fa": "ㄈㄚ", "er": "", "en": "", "ei": "", "eh": "", "du": "ㄉㄨ", "di": "ㄉㄧ", "de": "ㄉㄜ", "da": "ㄉㄚ", "fo": "ㄈㄛ", "fa": "ㄈㄚ", "er": "", "en": "", "ei": "", "eh": "", "du": "ㄉㄨ", "di": "ㄉㄧ", "de": "ㄉㄜ", "da": "ㄉㄚ",
"bu": "ㄅㄨ", "bo": "ㄅㄛ", "bi": "ㄅㄧ", "ba": "ㄅㄚ", "ao": "", "an": "", "ai": "", "o": "", "e": "", "a": "", "bu": "ㄅㄨ", "bo": "ㄅㄛ", "bi": "ㄅㄧ", "ba": "ㄅㄚ", "ao": "", "an": "", "ai": "",
] "c": "", "o": "", "e": "", "a": "",
///
static let mapUniversalPinyin: [String: String] = [
"shuang": "ㄕㄨㄤ", "jhuang": "ㄓㄨㄤ", "chuang": "ㄔㄨㄤ", "cyuan": "ㄑㄩㄢ", "cyong": "ㄑㄩㄥ", "ciang": "ㄑㄧㄤ", "kyang": "ㄎㄧㄤ",
"syuan": "ㄒㄩㄢ", "syong": "ㄒㄩㄥ", "sihei": "ㄙㄟ", "siang": "ㄒㄧㄤ", "shuei": "ㄕㄨㄟ", "shuan": "ㄕㄨㄢ", "shuai": "ㄕㄨㄞ",
"sheng": "ㄕㄥ", "shang": "ㄕㄤ", "niang": "ㄋㄧㄤ", "lyuan": "ㄌㄩㄢ", "liang": "ㄌㄧㄤ", "kuang": "ㄎㄨㄤ", "jyuan": "ㄐㄩㄢ",
"jyong": "ㄐㄩㄥ", "jiang": "ㄐㄧㄤ", "jhuei": "ㄓㄨㄟ", "jhuan": "ㄓㄨㄢ", "jhuai": "ㄓㄨㄞ", "jhong": "ㄓㄨㄥ", "jheng": "ㄓㄥ",
"jhang": "ㄓㄤ", "huang": "ㄏㄨㄤ", "guang": "ㄍㄨㄤ", "chuei": "ㄔㄨㄟ", "chuan": "ㄔㄨㄢ", "chuai": "ㄔㄨㄞ", "chong": "ㄔㄨㄥ",
"cheng": "ㄔㄥ", "chang": "ㄔㄤ", "cyue": "ㄑㄩㄝ", "syue": "ㄒㄩㄝ", "nyue": "ㄋㄩㄝ", "lyue": "ㄌㄩㄝ", "jyue": "ㄐㄩㄝ",
"cyun": "ㄑㄩㄣ", "cuei": "ㄘㄨㄟ", "cuan": "ㄘㄨㄢ", "cong": "ㄘㄨㄥ", "ciou": "ㄑㄧㄡ", "cing": "ㄑㄧㄥ", "ciao": "ㄑㄧㄠ",
"cian": "ㄑㄧㄢ", "ceng": "ㄘㄥ", "cang": "ㄘㄤ", "gyao": "ㄍㄧㄠ", "fiao": "ㄈㄧㄠ", "zuei": "ㄗㄨㄟ", "zuan": "ㄗㄨㄢ",
"zong": "ㄗㄨㄥ", "zeng": "ㄗㄥ", "zang": "ㄗㄤ", "yuan": "ㄩㄢ", "yong": "ㄩㄥ", "ying": "ㄧㄥ", "yang": "ㄧㄤ", "wong": "ㄨㄥ",
"wang": "ㄨㄤ", "tuei": "ㄊㄨㄟ", "tuan": "ㄊㄨㄢ", "tong": "ㄊㄨㄥ", "ting": "ㄊㄧㄥ", "tiao": "ㄊㄧㄠ", "tian": "ㄊㄧㄢ",
"teng": "ㄊㄥ", "tang": "ㄊㄤ", "syun": "ㄒㄩㄣ", "suei": "ㄙㄨㄟ", "suan": "ㄙㄨㄢ", "song": "ㄙㄨㄥ", "siou": "ㄒㄧㄡ",
"sing": "ㄒㄧㄥ", "siao": "ㄒㄧㄠ", "sian": "ㄒㄧㄢ", "shuo": "ㄕㄨㄛ", "shun": "ㄕㄨㄣ", "shua": "ㄕㄨㄚ", "shou": "ㄕㄡ", "shih": "",
"shen": "ㄕㄣ", "shei": "ㄕㄟ", "shao": "ㄕㄠ", "shan": "ㄕㄢ", "shai": "ㄕㄞ", "seng": "ㄙㄥ", "sang": "ㄙㄤ", "ruei": "ㄖㄨㄟ",
"ruan": "ㄖㄨㄢ", "rong": "ㄖㄨㄥ", "reng": "ㄖㄥ", "rang": "ㄖㄤ", "ping": "ㄆㄧㄥ", "piao": "ㄆㄧㄠ", "pian": "ㄆㄧㄢ", "peng": "ㄆㄥ",
"pang": "ㄆㄤ", "nuei": "ㄋㄨㄟ", "nuan": "ㄋㄨㄢ", "nong": "ㄋㄨㄥ", "niou": "ㄋㄧㄡ", "ning": "ㄋㄧㄥ", "niao": "ㄋㄧㄠ",
"nian": "ㄋㄧㄢ", "neng": "ㄋㄥ", "nang": "ㄋㄤ", "miou": "ㄇㄧㄡ", "ming": "ㄇㄧㄥ", "miao": "ㄇㄧㄠ", "mian": "ㄇㄧㄢ", "meng": "ㄇㄥ",
"mang": "ㄇㄤ", "luan": "ㄌㄨㄢ", "long": "ㄌㄨㄥ", "liou": "ㄌㄧㄡ", "ling": "ㄌㄧㄥ", "liao": "ㄌㄧㄠ", "lian": "ㄌㄧㄢ",
"leng": "ㄌㄥ", "lang": "ㄌㄤ", "kuei": "ㄎㄨㄟ", "kuan": "ㄎㄨㄢ", "kuai": "ㄎㄨㄞ", "kong": "ㄎㄨㄥ", "keng": "ㄎㄥ", "kang": "ㄎㄤ",
"jyun": "ㄐㄩㄣ", "jiou": "ㄐㄧㄡ", "jing": "ㄐㄧㄥ", "jiao": "ㄐㄧㄠ", "jian": "ㄐㄧㄢ", "jhuo": "ㄓㄨㄛ", "jhun": "ㄓㄨㄣ",
"jhua": "ㄓㄨㄚ", "jhou": "ㄓㄡ", "jhih": "", "jhen": "ㄓㄣ", "jhei": "ㄓㄟ", "jhao": "ㄓㄠ", "jhan": "ㄓㄢ", "jhai": "ㄓㄞ",
"huei": "ㄏㄨㄟ", "huan": "ㄏㄨㄢ", "huai": "ㄏㄨㄞ", "hong": "ㄏㄨㄥ", "heng": "ㄏㄥ", "hang": "ㄏㄤ", "guei": "ㄍㄨㄟ",
"guan": "ㄍㄨㄢ", "guai": "ㄍㄨㄞ", "gong": "ㄍㄨㄥ", "geng": "ㄍㄥ", "gang": "ㄍㄤ", "fong": "ㄈㄥ", "fang": "ㄈㄤ", "duei": "ㄉㄨㄟ",
"duan": "ㄉㄨㄢ", "dong": "ㄉㄨㄥ", "diou": "ㄉㄧㄡ", "ding": "ㄉㄧㄥ", "diao": "ㄉㄧㄠ", "dian": "ㄉㄧㄢ", "deng": "ㄉㄥ",
"dang": "ㄉㄤ", "chuo": "ㄔㄨㄛ", "chun": "ㄔㄨㄣ", "chua": "ㄔㄨㄚ", "chou": "ㄔㄡ", "chih": "", "chen": "ㄔㄣ", "chao": "ㄔㄠ",
"chan": "ㄔㄢ", "chai": "ㄔㄞ", "bing": "ㄅㄧㄥ", "biao": "ㄅㄧㄠ", "bian": "ㄅㄧㄢ", "beng": "ㄅㄥ", "bang": "ㄅㄤ", "cie": "ㄑㄧㄝ",
"yue": "ㄩㄝ", "tie": "ㄊㄧㄝ", "sie": "ㄒㄧㄝ", "pie": "ㄆㄧㄝ", "nie": "ㄋㄧㄝ", "mie": "ㄇㄧㄝ", "lie": "ㄌㄧㄝ", "jie": "ㄐㄧㄝ",
"die": "ㄉㄧㄝ", "cyu": "ㄑㄩ", "cuo": "ㄘㄨㄛ", "cun": "ㄘㄨㄣ", "cou": "ㄘㄡ", "cin": "ㄑㄧㄣ", "cih": "", "cia": "ㄑㄧㄚ",
"cen": "ㄘㄣ", "cao": "ㄘㄠ", "can": "ㄘㄢ", "cai": "ㄘㄞ", "bie": "ㄅㄧㄝ", "gin": "ㄍㄧㄣ", "den": "ㄉㄣ", "zuo": "ㄗㄨㄛ",
"zun": "ㄗㄨㄣ", "zou": "ㄗㄡ", "zih": "", "zen": "ㄗㄣ", "zei": "ㄗㄟ", "zao": "ㄗㄠ", "zan": "ㄗㄢ", "zai": "ㄗㄞ", "yun": "ㄩㄣ",
"you": "ㄧㄡ", "yin": "ㄧㄣ", "yao": "ㄧㄠ", "yan": "ㄧㄢ", "yai": "ㄧㄞ", "wun": "ㄨㄣ", "wei": "ㄨㄟ", "wan": "ㄨㄢ", "wai": "ㄨㄞ",
"tuo": "ㄊㄨㄛ", "tun": "ㄊㄨㄣ", "tou": "ㄊㄡ", "tao": "ㄊㄠ", "tan": "ㄊㄢ", "tai": "ㄊㄞ", "syu": "ㄒㄩ", "suo": "ㄙㄨㄛ",
"sun": "ㄙㄨㄣ", "sou": "ㄙㄡ", "sin": "ㄒㄧㄣ", "sih": "", "sia": "ㄒㄧㄚ", "shu": "ㄕㄨ", "she": "ㄕㄜ", "sha": "ㄕㄚ",
"sen": "ㄙㄣ", "sao": "ㄙㄠ", "san": "ㄙㄢ", "sai": "ㄙㄞ", "ruo": "ㄖㄨㄛ", "run": "ㄖㄨㄣ", "rou": "ㄖㄡ", "rih": "",
"ren": "ㄖㄣ", "rao": "ㄖㄠ", "ran": "ㄖㄢ", "pou": "ㄆㄡ", "pin": "ㄆㄧㄣ", "pia": "ㄆㄧㄚ", "pen": "ㄆㄣ", "pei": "ㄆㄟ",
"pao": "ㄆㄠ", "pan": "ㄆㄢ", "pai": "ㄆㄞ", "nyu": "ㄋㄩ", "nuo": "ㄋㄨㄛ", "nun": "ㄋㄨㄣ", "nou": "ㄋㄡ", "nin": "ㄋㄧㄣ",
"nen": "ㄋㄣ", "nei": "ㄋㄟ", "nao": "ㄋㄠ", "nan": "ㄋㄢ", "nai": "ㄋㄞ", "mou": "ㄇㄡ", "min": "ㄇㄧㄣ", "men": "ㄇㄣ",
"mei": "ㄇㄟ", "mao": "ㄇㄠ", "man": "ㄇㄢ", "mai": "ㄇㄞ", "lyu": "ㄌㄩ", "luo": "ㄌㄨㄛ", "lun": "ㄌㄨㄣ", "lou": "ㄌㄡ",
"lin": "ㄌㄧㄣ", "lia": "ㄌㄧㄚ", "lei": "ㄌㄟ", "lao": "ㄌㄠ", "lan": "ㄌㄢ", "lai": "ㄌㄞ", "kuo": "ㄎㄨㄛ", "kun": "ㄎㄨㄣ",
"kua": "ㄎㄨㄚ", "kou": "ㄎㄡ", "ken": "ㄎㄣ", "kao": "ㄎㄠ", "kan": "ㄎㄢ", "kai": "ㄎㄞ", "jyu": "ㄐㄩ", "jin": "ㄐㄧㄣ",
"jia": "ㄐㄧㄚ", "jhu": "ㄓㄨ", "jhe": "ㄓㄜ", "jha": "ㄓㄚ", "huo": "ㄏㄨㄛ", "hun": "ㄏㄨㄣ", "hua": "ㄏㄨㄚ", "hou": "ㄏㄡ",
"hen": "ㄏㄣ", "hei": "ㄏㄟ", "hao": "ㄏㄠ", "han": "ㄏㄢ", "hai": "ㄏㄞ", "guo": "ㄍㄨㄛ", "gun": "ㄍㄨㄣ", "gue": "ㄍㄨㄜ",
"gua": "ㄍㄨㄚ", "gou": "ㄍㄡ", "gen": "ㄍㄣ", "gei": "ㄍㄟ", "gao": "ㄍㄠ", "gan": "ㄍㄢ", "gai": "ㄍㄞ", "fou": "ㄈㄡ",
"fen": "ㄈㄣ", "fei": "ㄈㄟ", "fan": "ㄈㄢ", "eng": "", "duo": "ㄉㄨㄛ", "dun": "ㄉㄨㄣ", "dou": "ㄉㄡ", "dia": "ㄉㄧㄚ",
"dei": "ㄉㄟ", "dao": "ㄉㄠ", "dan": "ㄉㄢ", "dai": "ㄉㄞ", "chu": "ㄔㄨ", "che": "ㄔㄜ", "cha": "ㄔㄚ", "bin": "ㄅㄧㄣ",
"ben": "ㄅㄣ", "bei": "ㄅㄟ", "bao": "ㄅㄠ", "ban": "ㄅㄢ", "bai": "ㄅㄞ", "ang": "", "yia": "ㄧㄚ", "ye": "ㄧㄝ", "cu": "ㄘㄨ",
"ci": "ㄑㄧ", "ce": "ㄘㄜ", "ca": "ㄘㄚ", "zu": "ㄗㄨ", "ze": "ㄗㄜ", "za": "ㄗㄚ", "yu": "", "yo": "ㄧㄛ", "yi": "", "wu": "",
"wo": "ㄨㄛ", "wa": "ㄨㄚ", "tu": "ㄊㄨ", "ti": "ㄊㄧ", "te": "ㄊㄜ", "ta": "ㄊㄚ", "su": "ㄙㄨ", "si": "ㄒㄧ", "se": "ㄙㄜ",
"sa": "ㄙㄚ", "ru": "ㄖㄨ", "re": "ㄖㄜ", "pu": "ㄆㄨ", "po": "ㄆㄛ", "pi": "ㄆㄧ", "pa": "ㄆㄚ", "ou": "", "nu": "ㄋㄨ",
"ni": "ㄋㄧ", "ne": "ㄋㄜ", "na": "ㄋㄚ", "mu": "ㄇㄨ", "mo": "ㄇㄛ", "mi": "ㄇㄧ", "me": "ㄇㄜ", "ma": "ㄇㄚ", "lu": "ㄌㄨ",
"lo": "ㄌㄛ", "li": "ㄌㄧ", "le": "ㄌㄜ", "la": "ㄌㄚ", "ku": "ㄎㄨ", "ke": "ㄎㄜ", "ka": "ㄎㄚ", "ji": "ㄐㄧ", "hu": "ㄏㄨ",
"he": "ㄏㄜ", "ha": "ㄏㄚ", "gu": "ㄍㄨ", "ge": "ㄍㄜ", "ga": "ㄍㄚ", "fu": "ㄈㄨ", "fo": "ㄈㄛ", "fa": "ㄈㄚ", "er": "",
"en": "", "ei": "", "eh": "", "du": "ㄉㄨ", "di": "ㄉㄧ", "de": "ㄉㄜ", "da": "ㄉㄚ", "bu": "ㄅㄨ", "bo": "ㄅㄛ", "bi": "ㄅㄧ",
"ba": "ㄅㄚ", "ao": "", "an": "", "ai": "", "c": "", "o": "", "e": "", "a": "",
] ]
// MARK: - Maps for Keyboard-to-Phonabet parsers // MARK: - Maps for Keyboard-to-Phonabet parsers

View File

@ -28,6 +28,7 @@ import Cocoa
struct UserDef { struct UserDef {
static let kIsDebugModeEnabled = "_DebugMode" static let kIsDebugModeEnabled = "_DebugMode"
static let kUseScoreBalancing = "UseScoreBalancing"
static let kMostRecentInputMode = "MostRecentInputMode" static let kMostRecentInputMode = "MostRecentInputMode"
static let kUserDataFolderSpecified = "UserDataFolderSpecified" static let kUserDataFolderSpecified = "UserDataFolderSpecified"
static let kCheckUpdateAutomatically = "CheckUpdateAutomatically" static let kCheckUpdateAutomatically = "CheckUpdateAutomatically"
@ -219,6 +220,7 @@ public enum mgrPrefs {
static var allKeys: [String] { static var allKeys: [String] {
[ [
UserDef.kIsDebugModeEnabled, UserDef.kIsDebugModeEnabled,
UserDef.kUseScoreBalancing,
UserDef.kMostRecentInputMode, UserDef.kMostRecentInputMode,
UserDef.kUserDataFolderSpecified, UserDef.kUserDataFolderSpecified,
UserDef.kMandarinParser, UserDef.kMandarinParser,
@ -257,6 +259,7 @@ public enum mgrPrefs {
public static func setMissingDefaults() { public static func setMissingDefaults() {
UserDefaults.standard.setDefault(mgrPrefs.isDebugModeEnabled, forKey: UserDef.kIsDebugModeEnabled) UserDefaults.standard.setDefault(mgrPrefs.isDebugModeEnabled, forKey: UserDef.kIsDebugModeEnabled)
UserDefaults.standard.setDefault(mgrPrefs.useScoreBalancing, forKey: UserDef.kUseScoreBalancing)
UserDefaults.standard.setDefault(mgrPrefs.mostRecentInputMode, forKey: UserDef.kMostRecentInputMode) UserDefaults.standard.setDefault(mgrPrefs.mostRecentInputMode, forKey: UserDef.kMostRecentInputMode)
UserDefaults.standard.setDefault(mgrPrefs.checkUpdateAutomatically, forKey: UserDef.kCheckUpdateAutomatically) UserDefaults.standard.setDefault(mgrPrefs.checkUpdateAutomatically, forKey: UserDef.kCheckUpdateAutomatically)
UserDefaults.standard.setDefault( UserDefaults.standard.setDefault(
@ -305,6 +308,9 @@ public enum mgrPrefs {
@UserDefault(key: UserDef.kIsDebugModeEnabled, defaultValue: false) @UserDefault(key: UserDef.kIsDebugModeEnabled, defaultValue: false)
static var isDebugModeEnabled: Bool static var isDebugModeEnabled: Bool
@UserDefault(key: UserDef.kUseScoreBalancing, defaultValue: false)
static var useScoreBalancing: Bool
@UserDefault(key: UserDef.kMostRecentInputMode, defaultValue: "") @UserDefault(key: UserDef.kMostRecentInputMode, defaultValue: "")
static var mostRecentInputMode: String static var mostRecentInputMode: String

View File

@ -31,10 +31,10 @@ import Foundation
// //
// LMInstantiator 100MB // LMInstantiator 100MB
private var lmCNS = vChewing.LMCoreEX( private var lmCNS = vChewing.LMCoreNS(
reverse: true, consolidate: false, defaultScore: -11.0, forceDefaultScore: false reverse: true, consolidate: false, defaultScore: -11.0, forceDefaultScore: false
) )
private var lmSymbols = vChewing.LMCoreEX( private var lmSymbols = vChewing.LMCoreNS(
reverse: true, consolidate: false, defaultScore: -13.0, forceDefaultScore: false reverse: true, consolidate: false, defaultScore: -13.0, forceDefaultScore: false
) )
@ -73,14 +73,16 @@ extension vChewing {
/// LMCoreEX Unigram /// LMCoreEX Unigram
/// LMCoreEX 滿 /// LMCoreEX 滿
/// LMReplacements LMAssociates 使 /// LMReplacements LMAssociates 使
/// LMCoreEX 2010-2013 mac
/// LMCoreNS plist
// //
/// Reverse /// Reverse
/// Reverse /// Reverse
var lmCore = LMCoreEX( var lmCore = LMCoreNS(
reverse: false, consolidate: false, defaultScore: -9.9, forceDefaultScore: false reverse: false, consolidate: false, defaultScore: -9.9, forceDefaultScore: false
) )
var lmMisc = LMCoreEX( var lmMisc = LMCoreNS(
reverse: true, consolidate: false, defaultScore: -1.0, forceDefaultScore: false reverse: true, consolidate: false, defaultScore: -1.0, forceDefaultScore: false
) )
@ -103,7 +105,7 @@ extension vChewing {
// 調 // 調
public func isLanguageModelLoaded() -> Bool { lmCore.isLoaded() } public var isLanguageModelLoaded: Bool { lmCore.isLoaded() }
public func loadLanguageModel(path: String) { public func loadLanguageModel(path: String) {
if FileManager.default.isReadableFile(atPath: path) { if FileManager.default.isReadableFile(atPath: path) {
lmCore.open(path) lmCore.open(path)
@ -113,7 +115,7 @@ extension vChewing {
} }
} }
public func isCNSDataLoaded() -> Bool { lmCNS.isLoaded() } public var isCNSDataLoaded: Bool { lmCNS.isLoaded() }
public func loadCNSData(path: String) { public func loadCNSData(path: String) {
if FileManager.default.isReadableFile(atPath: path) { if FileManager.default.isReadableFile(atPath: path) {
lmCNS.open(path) lmCNS.open(path)
@ -123,7 +125,7 @@ extension vChewing {
} }
} }
public func isMiscDataLoaded() -> Bool { lmMisc.isLoaded() } public var isMiscDataLoaded: Bool { lmMisc.isLoaded() }
public func loadMiscData(path: String) { public func loadMiscData(path: String) {
if FileManager.default.isReadableFile(atPath: path) { if FileManager.default.isReadableFile(atPath: path) {
lmMisc.open(path) lmMisc.open(path)
@ -133,7 +135,7 @@ extension vChewing {
} }
} }
public func isSymbolDataLoaded() -> Bool { lmSymbols.isLoaded() } public var isSymbolDataLoaded: Bool { lmSymbols.isLoaded() }
public func loadSymbolData(path: String) { public func loadSymbolData(path: String) {
if FileManager.default.isReadableFile(atPath: path) { if FileManager.default.isReadableFile(atPath: path) {
lmSymbols.open(path) lmSymbols.open(path)

View File

@ -0,0 +1,171 @@
// Copyright (c) 2021 and onwards The vChewing Project (MIT-NTL License).
/*
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
1. The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
2. No trademark license is granted to use the trade names, trademarks, service
marks, or product names of Contributor, except as required to fulfill notice
requirements above.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
/// LMCore LMCoreNS plist
/// mac
import Foundation
extension vChewing {
@frozen public struct LMCoreNS {
var rangeMap: [String: [Data]] = [:]
var strData: String = ""
var shouldReverse: Bool = false
var allowConsolidation: Bool = false
var defaultScore: Double = 0
var shouldForceDefaultScore: Bool = false
public var count: Int {
rangeMap.count
}
public init(
reverse: Bool = false, consolidate: Bool = false, defaultScore scoreDefault: Double = 0,
forceDefaultScore: Bool = false
) {
rangeMap = [:]
allowConsolidation = consolidate
shouldReverse = reverse
defaultScore = scoreDefault
shouldForceDefaultScore = forceDefaultScore
}
public func isLoaded() -> Bool {
!rangeMap.isEmpty
}
@discardableResult public mutating func open(_ path: String) -> Bool {
if isLoaded() {
return false
}
if allowConsolidation {
LMConsolidator.fixEOF(path: path)
LMConsolidator.consolidate(path: path, pragma: true)
}
do {
let rawData = try Data(contentsOf: URL(fileURLWithPath: path))
let rawPlist = try PropertyListSerialization.propertyList(from: rawData, format: nil) as! [String: [Data]]
rangeMap = rawPlist
} catch {
IME.prtDebugIntel("↑ Exception happened when reading plist file at: \(path).")
return false
}
return true
}
public mutating func close() {
if isLoaded() {
rangeMap.removeAll()
}
}
// MARK: - Advanced features
public func dump() {
var strDump = ""
for entry in rangeMap {
let netaSets: [Data] = entry.value
let theKey = entry.key
for netaSet in netaSets {
let strNetaSet = String(decoding: netaSet, as: UTF8.self)
let neta = Array(strNetaSet.components(separatedBy: " ").reversed())
let theValue = neta[0]
var theScore = defaultScore
if neta.count >= 2, !shouldForceDefaultScore {
theScore = .init(String(neta[1])) ?? defaultScore
}
strDump += "\(cnvPhonabetToASCII(theKey)) \(theValue) \(theScore)\n"
}
}
IME.prtDebugIntel(strDump)
}
public func bigramsForKeys(precedingKey: String, key: String) -> [Megrez.Bigram] {
// Swift
// [Megrez.Bigram]()
precedingKey == key ? [Megrez.Bigram]() : [Megrez.Bigram]()
}
public func unigramsFor(key: String) -> [Megrez.Unigram] {
var grams: [Megrez.Unigram] = []
if let arrRangeRecords: [Data] = rangeMap[cnvPhonabetToASCII(key)] {
for netaSet in arrRangeRecords {
let strNetaSet = String(decoding: netaSet, as: UTF8.self)
let neta = Array(strNetaSet.split(separator: " ").reversed())
let theValue: String = String(neta[0])
let kvPair = Megrez.KeyValuePair(key: key, value: theValue)
var theScore = defaultScore
if neta.count >= 2, !shouldForceDefaultScore {
theScore = .init(String(neta[1])) ?? defaultScore
}
if theScore > 0 {
theScore *= -1 //
}
grams.append(Megrez.Unigram(keyValue: kvPair, score: theScore))
}
}
return grams
}
public func hasUnigramsFor(key: String) -> Bool {
rangeMap[cnvPhonabetToASCII(key)] != nil
}
func cnvPhonabetToASCII(_ incoming: String) -> String {
let dicPhonabet2ASCII = [
"": "b", "": "p", "": "m", "": "f", "": "d", "": "t", "": "n", "": "l", "": "g", "": "k", "": "h",
"": "j", "": "q", "": "x", "": "Z", "": "C", "": "S", "": "r", "": "z", "": "c", "": "s", "": "i",
"": "u", "": "v", "": "a", "": "o", "": "e", "": "E", "": "B", "": "P", "": "M", "": "F", "": "D",
"": "T", "": "N", "": "L", "": "R", "ˊ": "2", "ˇ": "3", "ˋ": "4", "˙": "5",
]
var strOutput = incoming
if !strOutput.contains("_") {
for entry in dicPhonabet2ASCII {
strOutput = strOutput.replacingOccurrences(of: entry.key, with: entry.value)
}
}
return strOutput
}
func restorePhonabetFromASCII(_ incoming: String) -> String {
let dicPhonabet4ASCII = [
"b": "", "p": "", "m": "", "f": "", "d": "", "t": "", "n": "", "l": "", "g": "", "k": "", "h": "",
"j": "", "q": "", "x": "", "Z": "", "C": "", "S": "", "r": "", "z": "", "c": "", "s": "", "i": "",
"u": "", "v": "", "a": "", "o": "", "e": "", "E": "", "B": "", "P": "", "M": "", "F": "", "D": "",
"T": "", "N": "", "L": "", "R": "", "2": "ˊ", "3": "ˇ", "4": "ˋ", "5": "˙",
]
var strOutput = incoming
if !strOutput.contains("_") {
for entry in dicPhonabet4ASCII {
strOutput = strOutput.replacingOccurrences(of: entry.key, with: entry.value)
}
}
return strOutput
}
}
}

View File

@ -51,25 +51,25 @@ enum mgrLangModel {
} }
public static func loadDataModels() { public static func loadDataModels() {
if !gLangModelCHT.isCNSDataLoaded() { if !gLangModelCHT.isCNSDataLoaded {
gLangModelCHT.loadCNSData(path: getBundleDataPath("char-kanji-cns")) gLangModelCHT.loadCNSData(path: getBundleDataPath("data-cns"))
} }
if !gLangModelCHT.isMiscDataLoaded() { if !gLangModelCHT.isMiscDataLoaded {
gLangModelCHT.loadMiscData(path: getBundleDataPath("data-zhuyinwen")) gLangModelCHT.loadMiscData(path: getBundleDataPath("data-zhuyinwen"))
} }
if !gLangModelCHT.isSymbolDataLoaded() { if !gLangModelCHT.isSymbolDataLoaded {
gLangModelCHT.loadSymbolData(path: getBundleDataPath("data-symbols")) gLangModelCHT.loadSymbolData(path: getBundleDataPath("data-symbols"))
} }
if !gLangModelCHS.isCNSDataLoaded() { if !gLangModelCHS.isCNSDataLoaded {
gLangModelCHS.loadCNSData(path: getBundleDataPath("char-kanji-cns")) gLangModelCHS.loadCNSData(path: getBundleDataPath("data-cns"))
} }
if !gLangModelCHS.isMiscDataLoaded() { if !gLangModelCHS.isMiscDataLoaded {
gLangModelCHS.loadMiscData(path: getBundleDataPath("data-zhuyinwen")) gLangModelCHS.loadMiscData(path: getBundleDataPath("data-zhuyinwen"))
} }
if !gLangModelCHS.isSymbolDataLoaded() { if !gLangModelCHS.isSymbolDataLoaded {
gLangModelCHS.loadSymbolData(path: getBundleDataPath("data-symbols")) gLangModelCHS.loadSymbolData(path: getBundleDataPath("data-symbols"))
} }
if !gLangModelCHT.isLanguageModelLoaded() { if !gLangModelCHT.isLanguageModelLoaded {
NotifierController.notify( NotifierController.notify(
message: String( message: String(
format: "%@", NSLocalizedString("Loading CHT Core Dict...", comment: "") format: "%@", NSLocalizedString("Loading CHT Core Dict...", comment: "")
@ -82,7 +82,7 @@ enum mgrLangModel {
) )
) )
} }
if !gLangModelCHS.isLanguageModelLoaded() { if !gLangModelCHS.isLanguageModelLoaded {
NotifierController.notify( NotifierController.notify(
message: String( message: String(
format: "%@", NSLocalizedString("Loading CHS Core Dict...", comment: "") format: "%@", NSLocalizedString("Loading CHS Core Dict...", comment: "")
@ -99,16 +99,16 @@ enum mgrLangModel {
public static func loadDataModel(_ mode: InputMode) { public static func loadDataModel(_ mode: InputMode) {
if mode == InputMode.imeModeCHS { if mode == InputMode.imeModeCHS {
if !gLangModelCHS.isMiscDataLoaded() { if !gLangModelCHS.isMiscDataLoaded {
gLangModelCHS.loadMiscData(path: getBundleDataPath("data-zhuyinwen")) gLangModelCHS.loadMiscData(path: getBundleDataPath("data-zhuyinwen"))
} }
if !gLangModelCHS.isSymbolDataLoaded() { if !gLangModelCHS.isSymbolDataLoaded {
gLangModelCHS.loadSymbolData(path: getBundleDataPath("data-symbols")) gLangModelCHS.loadSymbolData(path: getBundleDataPath("data-symbols"))
} }
if !gLangModelCHS.isCNSDataLoaded() { if !gLangModelCHS.isCNSDataLoaded {
gLangModelCHS.loadCNSData(path: getBundleDataPath("char-kanji-cns")) gLangModelCHS.loadCNSData(path: getBundleDataPath("data-cns"))
} }
if !gLangModelCHS.isLanguageModelLoaded() { if !gLangModelCHS.isLanguageModelLoaded {
NotifierController.notify( NotifierController.notify(
message: String( message: String(
format: "%@", NSLocalizedString("Loading CHS Core Dict...", comment: "") format: "%@", NSLocalizedString("Loading CHS Core Dict...", comment: "")
@ -122,16 +122,16 @@ enum mgrLangModel {
) )
} }
} else if mode == InputMode.imeModeCHT { } else if mode == InputMode.imeModeCHT {
if !gLangModelCHT.isMiscDataLoaded() { if !gLangModelCHT.isMiscDataLoaded {
gLangModelCHT.loadMiscData(path: getBundleDataPath("data-zhuyinwen")) gLangModelCHT.loadMiscData(path: getBundleDataPath("data-zhuyinwen"))
} }
if !gLangModelCHT.isSymbolDataLoaded() { if !gLangModelCHT.isSymbolDataLoaded {
gLangModelCHT.loadSymbolData(path: getBundleDataPath("data-symbols")) gLangModelCHT.loadSymbolData(path: getBundleDataPath("data-symbols"))
} }
if !gLangModelCHT.isCNSDataLoaded() { if !gLangModelCHT.isCNSDataLoaded {
gLangModelCHT.loadCNSData(path: getBundleDataPath("char-kanji-cns")) gLangModelCHT.loadCNSData(path: getBundleDataPath("data-cns"))
} }
if !gLangModelCHT.isLanguageModelLoaded() { if !gLangModelCHT.isLanguageModelLoaded {
NotifierController.notify( NotifierController.notify(
message: String( message: String(
format: "%@", NSLocalizedString("Loading CHT Core Dict...", comment: "") format: "%@", NSLocalizedString("Loading CHT Core Dict...", comment: "")
@ -212,7 +212,7 @@ enum mgrLangModel {
// MARK: - // MARK: -
static func getBundleDataPath(_ filenameSansExt: String) -> String { static func getBundleDataPath(_ filenameSansExt: String) -> String {
Bundle.main.path(forResource: filenameSansExt, ofType: "txt")! Bundle.main.path(forResource: filenameSansExt, ofType: "plist")!
} }
// MARK: - 使 // MARK: - 使

View File

@ -193,8 +193,7 @@ extension Megrez {
// //
// //
if balanced { if balanced {
let weightedScore: Double = (Double(n.spanningLength) - 1) * 2 n.accumulatedScore += n.additionalWeights
n.accumulatedScore += weightedScore
} }
var path: [NodeAnchor] = reverseWalk( var path: [NodeAnchor] = reverseWalk(

View File

@ -204,33 +204,33 @@ extension Megrez {
extension Megrez.Grid { extension Megrez.Grid {
public var dumpDOT: String { public var dumpDOT: String {
var sst = "digraph {\ngraph [ rankdir=LR ];\nBOS;\n" var strOutput = "digraph {\ngraph [ rankdir=LR ];\nBOS;\n"
for (p, span) in mutSpans.enumerated() { for (p, span) in mutSpans.enumerated() {
for ni in 0...(span.maximumLength) { for ni in 0...(span.maximumLength) {
guard let np: Megrez.Node = span.node(length: ni) else { guard let np: Megrez.Node = span.node(length: ni) else {
continue continue
} }
if p == 0 { if p == 0 {
sst += "BOS -> \(np.currentKeyValue.value);\n" strOutput += "BOS -> \(np.currentKeyValue.value);\n"
} }
sst += "\(np.currentKeyValue.value);\n" strOutput += "\(np.currentKeyValue.value);\n"
if (p + ni) < mutSpans.count { if (p + ni) < mutSpans.count {
let dstSpan = mutSpans[p + ni] let destinatedSpan = mutSpans[p + ni]
for q in 0...(dstSpan.maximumLength) { for q in 0...(destinatedSpan.maximumLength) {
if let dn = dstSpan.node(length: q) { if let dn = destinatedSpan.node(length: q) {
sst += np.currentKeyValue.value + " -> " + dn.currentKeyValue.value + ";\n" strOutput += np.currentKeyValue.value + " -> " + dn.currentKeyValue.value + ";\n"
} }
} }
} }
if (p + ni) == mutSpans.count { if (p + ni) == mutSpans.count {
sst += np.currentKeyValue.value + " -> EOS;\n" strOutput += np.currentKeyValue.value + " -> EOS;\n"
} }
} }
} }
sst += "EOS;\n}\n" strOutput += "EOS;\n}\n"
return sst return strOutput
} }
} }

View File

@ -52,11 +52,19 @@ extension Megrez {
return stream return stream
} }
///
public var additionalWeights: Double {
(Double(spanningLength) - 1) * 0.75
}
/// ///
public var balancedScore: Double { public var balancedScore: Double {
let weightedScore: Double = (Double(spanningLength) - 1) * 2 (node?.score ?? 0) + additionalWeights
let nodeScore: Double = node?.score ?? 0 }
return weightedScore + nodeScore
///
public var balancedAccumulatedScore: Double {
accumulatedScore + additionalWeights
} }
} }
} }

View File

@ -89,6 +89,7 @@
"Auto-convert traditional Chinese glyphs to JIS Shinjitai characters" = "Auto-convert traditional Chinese glyphs to JIS Shinjitai characters"; "Auto-convert traditional Chinese glyphs to JIS Shinjitai characters" = "Auto-convert traditional Chinese glyphs to JIS Shinjitai characters";
"Auto-convert traditional Chinese glyphs to KangXi characters" = "Auto-convert traditional Chinese glyphs to KangXi characters"; "Auto-convert traditional Chinese glyphs to KangXi characters" = "Auto-convert traditional Chinese glyphs to KangXi characters";
"Automatically reload user data files if changes detected" = "Automatically reload user data files if changes detected"; "Automatically reload user data files if changes detected" = "Automatically reload user data files if changes detected";
"Balance the score according to candidate length" = "Balance the score according to candidate length";
"Basic Keyboard Layout:" = "Basic Keyboard Layout:"; "Basic Keyboard Layout:" = "Basic Keyboard Layout:";
"Candidate Layout:" = "Candidate Layout:"; "Candidate Layout:" = "Candidate Layout:";
"Candidate Size:" = "Candidate Size:"; "Candidate Size:" = "Candidate Size:";

Binary file not shown.

Binary file not shown.

View File

@ -89,6 +89,7 @@
"Auto-convert traditional Chinese glyphs to JIS Shinjitai characters" = "Auto-convert traditional Chinese glyphs to JIS Shinjitai characters"; "Auto-convert traditional Chinese glyphs to JIS Shinjitai characters" = "Auto-convert traditional Chinese glyphs to JIS Shinjitai characters";
"Auto-convert traditional Chinese glyphs to KangXi characters" = "Auto-convert traditional Chinese glyphs to KangXi characters"; "Auto-convert traditional Chinese glyphs to KangXi characters" = "Auto-convert traditional Chinese glyphs to KangXi characters";
"Automatically reload user data files if changes detected" = "Automatically reload user data files if changes detected"; "Automatically reload user data files if changes detected" = "Automatically reload user data files if changes detected";
"Balance the score according to candidate length" = "Balance the score according to candidate length";
"Basic Keyboard Layout:" = "Basic Keyboard Layout:"; "Basic Keyboard Layout:" = "Basic Keyboard Layout:";
"Candidate Layout:" = "Candidate Layout:"; "Candidate Layout:" = "Candidate Layout:";
"Candidate Size:" = "Candidate Size:"; "Candidate Size:" = "Candidate Size:";

View File

@ -89,6 +89,7 @@
"Auto-convert traditional Chinese glyphs to JIS Shinjitai characters" = "入力した繁体字を日文 JIS 新字体と自動変換"; "Auto-convert traditional Chinese glyphs to JIS Shinjitai characters" = "入力した繁体字を日文 JIS 新字体と自動変換";
"Auto-convert traditional Chinese glyphs to KangXi characters" = "入力した繁体字を康熙字体と自動変換"; "Auto-convert traditional Chinese glyphs to KangXi characters" = "入力した繁体字を康熙字体と自動変換";
"Automatically reload user data files if changes detected" = "ユーザー辞書データの変更を自動検出し、自動的に再読込"; "Automatically reload user data files if changes detected" = "ユーザー辞書データの変更を自動検出し、自動的に再読込";
"Balance the score according to candidate length" = "候補文字の長さによる重みの調整";
"Basic Keyboard Layout:" = "基礎キーボード:"; "Basic Keyboard Layout:" = "基礎キーボード:";
"Candidate Layout:" = "入力候補陳列の仕様"; "Candidate Layout:" = "入力候補陳列の仕様";
"Candidate Size:" = "候補文字の字号:"; "Candidate Size:" = "候補文字の字号:";

View File

@ -89,6 +89,7 @@
"Auto-convert traditional Chinese glyphs to JIS Shinjitai characters" = "自动将繁体中文字转为日文 JIS 新字体"; "Auto-convert traditional Chinese glyphs to JIS Shinjitai characters" = "自动将繁体中文字转为日文 JIS 新字体";
"Auto-convert traditional Chinese glyphs to KangXi characters" = "自动将繁体中文字转为康熙正体字"; "Auto-convert traditional Chinese glyphs to KangXi characters" = "自动将繁体中文字转为康熙正体字";
"Automatically reload user data files if changes detected" = "自动检测并载入使用者语汇档案变更"; "Automatically reload user data files if changes detected" = "自动检测并载入使用者语汇档案变更";
"Balance the score according to candidate length" = "按候选字词的长度调整权重";
"Basic Keyboard Layout:" = "基础键盘布局:"; "Basic Keyboard Layout:" = "基础键盘布局:";
"Candidate Layout:" = "候选字窗布局:"; "Candidate Layout:" = "候选字窗布局:";
"Candidate Size:" = "候选字窗字号:"; "Candidate Size:" = "候选字窗字号:";

View File

@ -89,6 +89,7 @@
"Auto-convert traditional Chinese glyphs to JIS Shinjitai characters" = "自動將繁體中文字轉為日文 JIS 新字體"; "Auto-convert traditional Chinese glyphs to JIS Shinjitai characters" = "自動將繁體中文字轉為日文 JIS 新字體";
"Auto-convert traditional Chinese glyphs to KangXi characters" = "自動將繁體中文字轉為康熙正體字"; "Auto-convert traditional Chinese glyphs to KangXi characters" = "自動將繁體中文字轉為康熙正體字";
"Automatically reload user data files if changes detected" = "自動檢測並載入使用者語彙檔案變更"; "Automatically reload user data files if changes detected" = "自動檢測並載入使用者語彙檔案變更";
"Balance the score according to candidate length" = "按候選字詞的長度調整權重";
"Basic Keyboard Layout:" = "基礎鍵盤佈局:"; "Basic Keyboard Layout:" = "基礎鍵盤佈局:";
"Candidate Layout:" = "候選字窗佈局:"; "Candidate Layout:" = "候選字窗佈局:";
"Candidate Size:" = "候選字窗字號:"; "Candidate Size:" = "候選字窗字號:";

View File

@ -35,6 +35,8 @@ struct suiPrefPaneDictionary: View {
@State private var selEnableCNS11643: Bool = UserDefaults.standard.bool(forKey: UserDef.kCNS11643Enabled) @State private var selEnableCNS11643: Bool = UserDefaults.standard.bool(forKey: UserDef.kCNS11643Enabled)
@State private var selEnableSymbolInputSupport: Bool = UserDefaults.standard.bool( @State private var selEnableSymbolInputSupport: Bool = UserDefaults.standard.bool(
forKey: UserDef.kSymbolInputEnabled) forKey: UserDef.kSymbolInputEnabled)
@State private var selUseScoreBalancing: Bool = UserDefaults.standard.bool(
forKey: UserDef.kUseScoreBalancing)
private let contentWidth: Double = { private let contentWidth: Double = {
switch mgrPrefs.appleLanguages[0] { switch mgrPrefs.appleLanguages[0] {
case "ja": case "ja":
@ -126,6 +128,13 @@ struct suiPrefPaneDictionary: View {
mgrPrefs.symbolInputEnabled = value mgrPrefs.symbolInputEnabled = value
mgrLangModel.setSymbolEnabled(value) mgrLangModel.setSymbolEnabled(value)
} }
Toggle(
LocalizedStringKey("Balance the score according to candidate length"),
isOn: $selUseScoreBalancing
)
.onChange(of: selUseScoreBalancing) { value in
mgrPrefs.useScoreBalancing = value
}
} }
} }
} }

View File

@ -623,9 +623,9 @@
</connections> </connections>
</textField> </textField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="p7V-IN-OTr"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="p7V-IN-OTr">
<rect key="frame" x="19" y="294.5" width="406" height="17"/> <rect key="frame" x="19" y="295.5" width="406" height="17"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="16" id="4e2-n5-KWF"/> <constraint firstAttribute="height" constant="16" id="KGx-QR-wgI"/>
</constraints> </constraints>
<buttonCell key="cell" type="check" title="Automatically reload user data files if changes detected" bezelStyle="regularSquare" imagePosition="left" controlSize="small" state="on" inset="2" id="f8i-69-zxm"> <buttonCell key="cell" type="check" title="Automatically reload user data files if changes detected" bezelStyle="regularSquare" imagePosition="left" controlSize="small" state="on" inset="2" id="f8i-69-zxm">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
@ -636,9 +636,9 @@
</connections> </connections>
</button> </button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="O4B-Z2-XYi"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="O4B-Z2-XYi">
<rect key="frame" x="19" y="271.5" width="406" height="17"/> <rect key="frame" x="19" y="273.5" width="406" height="17"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="16" id="45X-6Q-Dm8"/> <constraint firstAttribute="height" constant="16" id="60g-xI-n1n"/>
</constraints> </constraints>
<buttonCell key="cell" type="check" title="Enable symbol input support (incl. certain emoji symbols)" bezelStyle="regularSquare" imagePosition="left" controlSize="small" state="on" inset="2" id="hSv-LJ-Cq3" userLabel="chkSymbolEnabled"> <buttonCell key="cell" type="check" title="Enable symbol input support (incl. certain emoji symbols)" bezelStyle="regularSquare" imagePosition="left" controlSize="small" state="on" inset="2" id="hSv-LJ-Cq3" userLabel="chkSymbolEnabled">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
@ -678,9 +678,9 @@
</connections> </connections>
</button> </button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Yaj-QY-7xV" userLabel="chkCNSSupport"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Yaj-QY-7xV" userLabel="chkCNSSupport">
<rect key="frame" x="19" y="249.5" width="406" height="17"/> <rect key="frame" x="19" y="251.5" width="406" height="17"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="16" id="KdE-Vd-Y50"/> <constraint firstAttribute="height" constant="16" id="XP3-SR-9Ha"/>
</constraints> </constraints>
<buttonCell key="cell" type="check" title="Enable CNS11643 Support (2022-04-27)" bezelStyle="regularSquare" imagePosition="left" controlSize="small" inset="2" id="W24-T4-cg0"> <buttonCell key="cell" type="check" title="Enable CNS11643 Support (2022-04-27)" bezelStyle="regularSquare" imagePosition="left" controlSize="small" inset="2" id="W24-T4-cg0">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
@ -691,28 +691,45 @@
<binding destination="32" name="value" keyPath="values.CNS11643Enabled" id="Pbx-Gt-upm"/> <binding destination="32" name="value" keyPath="values.CNS11643Enabled" id="Pbx-Gt-upm"/>
</connections> </connections>
</button> </button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="O2c-HS-d9s" userLabel="chkCNSSupport">
<rect key="frame" x="19" y="229.5" width="406" height="17"/>
<constraints>
<constraint firstAttribute="height" constant="16" id="g8o-4X-IR5"/>
</constraints>
<buttonCell key="cell" type="check" title="Balance the score according to candidate length" bezelStyle="regularSquare" imagePosition="left" controlSize="small" inset="2" id="Wh1-iz-pwM">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="cellTitle"/>
</buttonCell>
<connections>
<action selector="toggleCNSSupport:" target="-2" id="S0T-uD-fde"/>
<binding destination="32" name="value" keyPath="values.UseScoreBalancing" id="mnq-pX-2PH"/>
</connections>
</button>
</subviews> </subviews>
<constraints> <constraints>
<constraint firstItem="s7t-Kk-EPu" firstAttribute="bottom" secondItem="MPN-np-SbT" secondAttribute="bottom" id="0Fo-ya-hQ9"/> <constraint firstItem="s7t-Kk-EPu" firstAttribute="bottom" secondItem="MPN-np-SbT" secondAttribute="bottom" id="0Fo-ya-hQ9"/>
<constraint firstItem="Yaj-QY-7xV" firstAttribute="top" secondItem="O4B-Z2-XYi" secondAttribute="bottom" constant="6" symbolic="YES" id="2RJ-v9-tO3"/> <constraint firstItem="O4B-Z2-XYi" firstAttribute="trailing" secondItem="Yaj-QY-7xV" secondAttribute="trailing" id="2VU-kM-5xJ"/>
<constraint firstItem="Yaj-QY-7xV" firstAttribute="trailing" secondItem="O2c-HS-d9s" secondAttribute="trailing" id="4Ma-Ni-LJP"/>
<constraint firstAttribute="trailing" secondItem="FUV-qx-xkC" secondAttribute="trailing" constant="20" symbolic="YES" id="6QR-tj-5cH"/> <constraint firstAttribute="trailing" secondItem="FUV-qx-xkC" secondAttribute="trailing" constant="20" symbolic="YES" id="6QR-tj-5cH"/>
<constraint firstItem="MPN-np-SbT" firstAttribute="leading" secondItem="p7V-IN-OTr" secondAttribute="leading" constant="346" id="7xl-xX-CEQ"/> <constraint firstItem="O4B-Z2-XYi" firstAttribute="top" secondItem="p7V-IN-OTr" secondAttribute="bottom" constant="6" id="6tf-H0-CKc"/>
<constraint firstItem="s7t-Kk-EPu" firstAttribute="leading" secondItem="MPN-np-SbT" secondAttribute="trailing" constant="-376" id="9at-E8-Bt1"/> <constraint firstItem="s7t-Kk-EPu" firstAttribute="leading" secondItem="MPN-np-SbT" secondAttribute="trailing" constant="-376" id="9at-E8-Bt1"/>
<constraint firstItem="FUV-qx-xkC" firstAttribute="top" secondItem="cy4-aV-hhk" secondAttribute="top" constant="15" id="BZE-dD-V2R"/> <constraint firstItem="FUV-qx-xkC" firstAttribute="top" secondItem="cy4-aV-hhk" secondAttribute="top" constant="15" id="BZE-dD-V2R"/>
<constraint firstItem="MPN-np-SbT" firstAttribute="top" secondItem="FUV-qx-xkC" secondAttribute="bottom" constant="14" id="Bp9-2u-f9E"/> <constraint firstItem="MPN-np-SbT" firstAttribute="top" secondItem="FUV-qx-xkC" secondAttribute="bottom" constant="14" id="Bp9-2u-f9E"/>
<constraint firstItem="FUV-qx-xkC" firstAttribute="leading" secondItem="cy4-aV-hhk" secondAttribute="leading" constant="20" symbolic="YES" id="Hy2-ZC-cvb"/> <constraint firstItem="FUV-qx-xkC" firstAttribute="leading" secondItem="cy4-aV-hhk" secondAttribute="leading" constant="20" symbolic="YES" id="Hy2-ZC-cvb"/>
<constraint firstItem="s7t-Kk-EPu" firstAttribute="firstBaseline" secondItem="MPN-np-SbT" secondAttribute="baseline" id="OYH-gA-WcA"/> <constraint firstItem="s7t-Kk-EPu" firstAttribute="firstBaseline" secondItem="MPN-np-SbT" secondAttribute="baseline" id="OYH-gA-WcA"/>
<constraint firstItem="p7V-IN-OTr" firstAttribute="top" secondItem="s7t-Kk-EPu" secondAttribute="bottom" constant="16" id="PBC-ZC-ahn"/> <constraint firstItem="p7V-IN-OTr" firstAttribute="trailing" secondItem="O4B-Z2-XYi" secondAttribute="trailing" id="Phu-Qi-Xup"/>
<constraint firstItem="p7V-IN-OTr" firstAttribute="top" secondItem="s7t-Kk-EPu" secondAttribute="bottom" constant="15" id="PyP-N9-MWb"/>
<constraint firstItem="p7V-IN-OTr" firstAttribute="leading" secondItem="s7t-Kk-EPu" secondAttribute="leading" id="QMQ-hR-c5W"/>
<constraint firstItem="FUV-qx-xkC" firstAttribute="leading" secondItem="MPN-np-SbT" secondAttribute="leading" constant="-346" id="Zet-wH-kmC"/> <constraint firstItem="FUV-qx-xkC" firstAttribute="leading" secondItem="MPN-np-SbT" secondAttribute="leading" constant="-346" id="Zet-wH-kmC"/>
<constraint firstItem="O4B-Z2-XYi" firstAttribute="top" secondItem="p7V-IN-OTr" secondAttribute="bottom" constant="7" id="ZsG-Rv-Xjo"/> <constraint firstItem="O2c-HS-d9s" firstAttribute="top" secondItem="Yaj-QY-7xV" secondAttribute="bottom" constant="6" symbolic="YES" id="cBe-nI-2F7"/>
<constraint firstItem="p7V-IN-OTr" firstAttribute="trailing" secondItem="O4B-Z2-XYi" secondAttribute="trailing" id="auY-l9-U7h"/>
<constraint firstItem="jXe-xz-9Sd" firstAttribute="leading" secondItem="MPN-np-SbT" secondAttribute="trailing" constant="-1" id="cYQ-Rx-tuG"/> <constraint firstItem="jXe-xz-9Sd" firstAttribute="leading" secondItem="MPN-np-SbT" secondAttribute="trailing" constant="-1" id="cYQ-Rx-tuG"/>
<constraint firstItem="s7t-Kk-EPu" firstAttribute="trailing" secondItem="p7V-IN-OTr" secondAttribute="trailing" constant="-60" id="eIn-kD-FGz"/> <constraint firstItem="p7V-IN-OTr" firstAttribute="leading" secondItem="O4B-Z2-XYi" secondAttribute="leading" id="dm5-TK-PRw"/>
<constraint firstItem="Yaj-QY-7xV" firstAttribute="leading" secondItem="O4B-Z2-XYi" secondAttribute="leading" id="kPh-vq-asr"/> <constraint firstItem="O4B-Z2-XYi" firstAttribute="leading" secondItem="Yaj-QY-7xV" secondAttribute="leading" id="qHY-fz-P9H"/>
<constraint firstItem="p7V-IN-OTr" firstAttribute="leading" secondItem="O4B-Z2-XYi" secondAttribute="leading" id="mmu-SS-jac"/> <constraint firstItem="Yaj-QY-7xV" firstAttribute="leading" secondItem="O2c-HS-d9s" secondAttribute="leading" id="tap-dN-5Nu"/>
<constraint firstItem="Yaj-QY-7xV" firstAttribute="trailing" secondItem="O4B-Z2-XYi" secondAttribute="trailing" id="r6q-3h-41a"/> <constraint firstItem="p7V-IN-OTr" firstAttribute="trailing" secondItem="jXe-xz-9Sd" secondAttribute="trailing" id="uuG-Bg-2Vi"/>
<constraint firstItem="s7t-Kk-EPu" firstAttribute="trailing" secondItem="FUV-qx-xkC" secondAttribute="trailing" constant="-60" id="vIO-x1-7Q2"/> <constraint firstItem="s7t-Kk-EPu" firstAttribute="trailing" secondItem="FUV-qx-xkC" secondAttribute="trailing" constant="-60" id="vIO-x1-7Q2"/>
<constraint firstItem="jXe-xz-9Sd" firstAttribute="baseline" secondItem="MPN-np-SbT" secondAttribute="baseline" id="wys-ML-2Q2"/> <constraint firstItem="jXe-xz-9Sd" firstAttribute="baseline" secondItem="MPN-np-SbT" secondAttribute="baseline" id="wys-ML-2Q2"/>
<constraint firstItem="Yaj-QY-7xV" firstAttribute="top" secondItem="O4B-Z2-XYi" secondAttribute="bottom" constant="6" symbolic="YES" id="zZg-M3-hSk"/>
</constraints> </constraints>
</view> </view>
</box> </box>
@ -789,6 +806,7 @@
<menuItem title="Hsu" tag="2" id="8"/> <menuItem title="Hsu" tag="2" id="8"/>
<menuItem title="MiTAC" tag="5" id="7fV-x8-WHQ"/> <menuItem title="MiTAC" tag="5" id="7fV-x8-WHQ"/>
<menuItem title="Fake Seigyou" tag="6" id="27F-8T-FkQ"/> <menuItem title="Fake Seigyou" tag="6" id="27F-8T-FkQ"/>
<menuItem isSeparatorItem="YES" id="DuR-GO-lab"/>
<menuItem title="Hanyu Pinyin" tag="10" id="10"/> <menuItem title="Hanyu Pinyin" tag="10" id="10"/>
<menuItem title="Secondary Pinyin" tag="11" id="Parser11"/> <menuItem title="Secondary Pinyin" tag="11" id="Parser11"/>
<menuItem title="Yale Pinyin" tag="12" id="Parser12"/> <menuItem title="Yale Pinyin" tag="12" id="Parser12"/>

View File

@ -247,3 +247,6 @@
/* Class = "NSMenuItem"; title = "Universal Pinyin with Numeral Intonation"; ObjectID = "Parser14"; */ /* Class = "NSMenuItem"; title = "Universal Pinyin with Numeral Intonation"; ObjectID = "Parser14"; */
"Parser14.title" = "Universal Pinyin with Numeral Intonation"; "Parser14.title" = "Universal Pinyin with Numeral Intonation";
/* Class = "NSButtonCell"; title = "Balance the score according to candidate length"; ObjectID = "Wh1-iz-pwM"; */
"Wh1-iz-pwM.title" = "Balance the score according to candidate length";

View File

@ -247,3 +247,6 @@
/* Class = "NSMenuItem"; title = "Universal Pinyin with Numeral Intonation"; ObjectID = "Parser14"; */ /* Class = "NSMenuItem"; title = "Universal Pinyin with Numeral Intonation"; ObjectID = "Parser14"; */
"Parser14.title" = "汎用弁音 (ローマ字+数字音調)"; "Parser14.title" = "汎用弁音 (ローマ字+数字音調)";
/* Class = "NSButtonCell"; title = "Balance the score according to candidate length"; ObjectID = "Wh1-iz-pwM"; */
"Wh1-iz-pwM.title" = "候補文字の長さによる重みの調整";

View File

@ -247,3 +247,6 @@
/* Class = "NSMenuItem"; title = "Universal Pinyin with Numeral Intonation"; ObjectID = "Parser14"; */ /* Class = "NSMenuItem"; title = "Universal Pinyin with Numeral Intonation"; ObjectID = "Parser14"; */
"Parser14.title" = "通用拼音+数字标调"; "Parser14.title" = "通用拼音+数字标调";
/* Class = "NSButtonCell"; title = "Balance the score according to candidate length"; ObjectID = "Wh1-iz-pwM"; */
"Wh1-iz-pwM.title" = "按候选字词的长度调整权重";

View File

@ -247,3 +247,6 @@
/* Class = "NSMenuItem"; title = "Universal Pinyin with Numeral Intonation"; ObjectID = "Parser14"; */ /* Class = "NSMenuItem"; title = "Universal Pinyin with Numeral Intonation"; ObjectID = "Parser14"; */
"Parser14.title" = "通用拼音+數字標調"; "Parser14.title" = "通用拼音+數字標調";
/* Class = "NSButtonCell"; title = "Balance the score according to candidate length"; ObjectID = "Wh1-iz-pwM"; */
"Wh1-iz-pwM.title" = "按候選字詞的長度調整權重";

View File

@ -3,9 +3,9 @@
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>1.6.0</string> <string>1.6.1</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>1960</string> <string>1961</string>
<key>UpdateInfoEndpoint</key> <key>UpdateInfoEndpoint</key>
<string>https://gitee.com/vchewing/vChewing-macOS/raw/main/Update-Info.plist</string> <string>https://gitee.com/vchewing/vChewing-macOS/raw/main/Update-Info.plist</string>
<key>UpdateInfoSite</key> <key>UpdateInfoSite</key>

View File

@ -726,7 +726,7 @@
<key>USE_HFS+_COMPRESSION</key> <key>USE_HFS+_COMPRESSION</key>
<false/> <false/>
<key>VERSION</key> <key>VERSION</key>
<string>1.6.0</string> <string>1.6.1</string>
</dict> </dict>
<key>TYPE</key> <key>TYPE</key>
<integer>0</integer> <integer>0</integer>

View File

@ -9,10 +9,6 @@
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
5B0AF8B527B2C8290096FE54 /* StringExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B0AF8B427B2C8290096FE54 /* StringExtension.swift */; }; 5B0AF8B527B2C8290096FE54 /* StringExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B0AF8B427B2C8290096FE54 /* StringExtension.swift */; };
5B11328927B94CFB00E58451 /* AppleKeyboardConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B11328827B94CFB00E58451 /* AppleKeyboardConverter.swift */; }; 5B11328927B94CFB00E58451 /* AppleKeyboardConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B11328827B94CFB00E58451 /* AppleKeyboardConverter.swift */; };
5B27AD6A27CB1F9B000ED75B /* data-symbols.txt in Resources */ = {isa = PBXBuildFile; fileRef = 5B27AD6827CB1F9B000ED75B /* data-symbols.txt */; };
5B27AD6B27CB1F9B000ED75B /* data-zhuyinwen.txt in Resources */ = {isa = PBXBuildFile; fileRef = 5B27AD6927CB1F9B000ED75B /* data-zhuyinwen.txt */; };
5B2DB16F27AF6891006D874E /* data-chs.txt in Resources */ = {isa = PBXBuildFile; fileRef = 5B2DB16D27AF6891006D874E /* data-chs.txt */; };
5B2DB17027AF6891006D874E /* data-cht.txt in Resources */ = {isa = PBXBuildFile; fileRef = 5B2DB16E27AF6891006D874E /* data-cht.txt */; };
5B3133BF280B229700A4A505 /* KeyHandler_States.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B3133BE280B229700A4A505 /* KeyHandler_States.swift */; }; 5B3133BF280B229700A4A505 /* KeyHandler_States.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B3133BE280B229700A4A505 /* KeyHandler_States.swift */; };
5B38F59A281E2E49007D5F5D /* 6_Unigram.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A0D4F1D15FC0EB100ABF4B3 /* 6_Unigram.swift */; }; 5B38F59A281E2E49007D5F5D /* 6_Unigram.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A0D4F1D15FC0EB100ABF4B3 /* 6_Unigram.swift */; };
5B38F59B281E2E49007D5F5D /* 7_KeyValuePair.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A0D4F1815FC0EB100ABF4B3 /* 7_KeyValuePair.swift */; }; 5B38F59B281E2E49007D5F5D /* 7_KeyValuePair.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A0D4F1815FC0EB100ABF4B3 /* 7_KeyValuePair.swift */; };
@ -26,6 +22,7 @@
5B38F5A4281E2E49007D5F5D /* 5_LanguageModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A0D4F1915FC0EB100ABF4B3 /* 5_LanguageModel.swift */; }; 5B38F5A4281E2E49007D5F5D /* 5_LanguageModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A0D4F1915FC0EB100ABF4B3 /* 5_LanguageModel.swift */; };
5B40730C281672610023DFFF /* lmAssociates.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B407309281672610023DFFF /* lmAssociates.swift */; }; 5B40730C281672610023DFFF /* lmAssociates.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B407309281672610023DFFF /* lmAssociates.swift */; };
5B40730D281672610023DFFF /* lmReplacements.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B40730A281672610023DFFF /* lmReplacements.swift */; }; 5B40730D281672610023DFFF /* lmReplacements.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B40730A281672610023DFFF /* lmReplacements.swift */; };
5B54E743283A7D89001ECBDC /* lmCoreNS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B54E742283A7D89001ECBDC /* lmCoreNS.swift */; };
5B5E535227EF261400C6AA1E /* IME.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B5E535127EF261400C6AA1E /* IME.swift */; }; 5B5E535227EF261400C6AA1E /* IME.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B5E535127EF261400C6AA1E /* IME.swift */; };
5B61B0CA280BEFD4002E3CFA /* KeyHandler_Misc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B61B0C9280BEFD4002E3CFA /* KeyHandler_Misc.swift */; }; 5B61B0CA280BEFD4002E3CFA /* KeyHandler_Misc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B61B0C9280BEFD4002E3CFA /* KeyHandler_Misc.swift */; };
5B62A32927AE77D100A19448 /* FSEventStreamHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B62A32827AE77D100A19448 /* FSEventStreamHelper.swift */; }; 5B62A32927AE77D100A19448 /* FSEventStreamHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B62A32827AE77D100A19448 /* FSEventStreamHelper.swift */; };
@ -84,7 +81,6 @@
5BC2652227E04B7E00700291 /* uninstall.sh in Resources */ = {isa = PBXBuildFile; fileRef = 5BC2652127E04B7B00700291 /* uninstall.sh */; }; 5BC2652227E04B7E00700291 /* uninstall.sh in Resources */ = {isa = PBXBuildFile; fileRef = 5BC2652127E04B7B00700291 /* uninstall.sh */; };
5BD0113B28180D6100609769 /* LMInstantiator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BD0113A28180D6100609769 /* LMInstantiator.swift */; }; 5BD0113B28180D6100609769 /* LMInstantiator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BD0113A28180D6100609769 /* LMInstantiator.swift */; };
5BD0113D2818543900609769 /* KeyHandler_Core.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BD0113C2818543900609769 /* KeyHandler_Core.swift */; }; 5BD0113D2818543900609769 /* KeyHandler_Core.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BD0113C2818543900609769 /* KeyHandler_Core.swift */; };
5BD05B8127B22F3C004C4F1D /* char-kanji-cns.txt in Resources */ = {isa = PBXBuildFile; fileRef = 5BD05B8027B22F3C004C4F1D /* char-kanji-cns.txt */; };
5BD05BCA27B2A43D004C4F1D /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6A2E40F5253A69DA00D1AE1D /* Images.xcassets */; }; 5BD05BCA27B2A43D004C4F1D /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6A2E40F5253A69DA00D1AE1D /* Images.xcassets */; };
5BD05C5D27B2BBA9004C4F1D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5BD05C5B27B2BBA9004C4F1D /* Main.storyboard */; }; 5BD05C5D27B2BBA9004C4F1D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5BD05C5B27B2BBA9004C4F1D /* Main.storyboard */; };
5BD05C6627B2BBEF004C4F1D /* Document.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BD05C6127B2BBEF004C4F1D /* Document.swift */; }; 5BD05C6627B2BBEF004C4F1D /* Document.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BD05C6127B2BBEF004C4F1D /* Document.swift */; };
@ -96,6 +92,11 @@
5BDCBB2E27B4E67A00D0CC59 /* vChewingPhraseEditor.app in Resources */ = {isa = PBXBuildFile; fileRef = 5BD05BB827B2A429004C4F1D /* vChewingPhraseEditor.app */; }; 5BDCBB2E27B4E67A00D0CC59 /* vChewingPhraseEditor.app in Resources */ = {isa = PBXBuildFile; fileRef = 5BD05BB827B2A429004C4F1D /* vChewingPhraseEditor.app */; };
5BE78BD927B3775B005EA1BE /* ctlAboutWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BE78BD827B37750005EA1BE /* ctlAboutWindow.swift */; }; 5BE78BD927B3775B005EA1BE /* ctlAboutWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BE78BD827B37750005EA1BE /* ctlAboutWindow.swift */; };
5BE78BDD27B3776D005EA1BE /* frmAboutWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BE78BDA27B37764005EA1BE /* frmAboutWindow.xib */; }; 5BE78BDD27B3776D005EA1BE /* frmAboutWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BE78BDA27B37764005EA1BE /* frmAboutWindow.xib */; };
5BEDB721283B4C250078EB25 /* data-cns.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71D283B4AEA0078EB25 /* data-cns.plist */; };
5BEDB722283B4C250078EB25 /* data-zhuyinwen.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71F283B4AEA0078EB25 /* data-zhuyinwen.plist */; };
5BEDB723283B4C250078EB25 /* data-cht.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB720283B4AEA0078EB25 /* data-cht.plist */; };
5BEDB724283B4C250078EB25 /* data-symbols.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71E283B4AEA0078EB25 /* data-symbols.plist */; };
5BEDB725283B4C250078EB25 /* data-chs.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71C283B4AEA0078EB25 /* data-chs.plist */; };
5BF8423127BAA942008E7E4C /* vChewingKanjiConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BF8423027BAA942008E7E4C /* vChewingKanjiConverter.swift */; }; 5BF8423127BAA942008E7E4C /* vChewingKanjiConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BF8423027BAA942008E7E4C /* vChewingKanjiConverter.swift */; };
6A187E2616004C5900466B2E /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6A187E2816004C5900466B2E /* MainMenu.xib */; }; 6A187E2616004C5900466B2E /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6A187E2816004C5900466B2E /* MainMenu.xib */; };
6A225A1F23679F2600F685C6 /* NotarizedArchives in Resources */ = {isa = PBXBuildFile; fileRef = 6A225A1E23679F2600F685C6 /* NotarizedArchives */; }; 6A225A1F23679F2600F685C6 /* NotarizedArchives in Resources */ = {isa = PBXBuildFile; fileRef = 6A225A1E23679F2600F685C6 /* NotarizedArchives */; };
@ -190,15 +191,12 @@
5B18BA7227C7BD8B0056EB19 /* LICENSE.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE.txt; sourceTree = "<group>"; }; 5B18BA7227C7BD8B0056EB19 /* LICENSE.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE.txt; sourceTree = "<group>"; };
5B18BA7327C7BD8C0056EB19 /* LICENSE-JPN.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = "LICENSE-JPN.txt"; sourceTree = "<group>"; }; 5B18BA7327C7BD8C0056EB19 /* LICENSE-JPN.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = "LICENSE-JPN.txt"; sourceTree = "<group>"; };
5B18BA7427C7BD8C0056EB19 /* LICENSE-CHT.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = "LICENSE-CHT.txt"; sourceTree = "<group>"; }; 5B18BA7427C7BD8C0056EB19 /* LICENSE-CHT.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = "LICENSE-CHT.txt"; sourceTree = "<group>"; };
5B27AD6827CB1F9B000ED75B /* data-symbols.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "data-symbols.txt"; path = "Data/components/common/data-symbols.txt"; sourceTree = "<group>"; };
5B27AD6927CB1F9B000ED75B /* data-zhuyinwen.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "data-zhuyinwen.txt"; path = "Data/components/common/data-zhuyinwen.txt"; sourceTree = "<group>"; };
5B2DB16D27AF6891006D874E /* data-chs.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "data-chs.txt"; path = "Data/data-chs.txt"; sourceTree = "<group>"; };
5B2DB16E27AF6891006D874E /* data-cht.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "data-cht.txt"; path = "Data/data-cht.txt"; sourceTree = "<group>"; };
5B2DB17127AF8771006D874E /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; name = Makefile; path = Data/Makefile; sourceTree = "<group>"; }; 5B2DB17127AF8771006D874E /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; name = Makefile; path = Data/Makefile; sourceTree = "<group>"; };
5B30F11227BA568800484E24 /* vChewingKeyLayout.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = vChewingKeyLayout.bundle; sourceTree = "<group>"; }; 5B30F11227BA568800484E24 /* vChewingKeyLayout.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = vChewingKeyLayout.bundle; sourceTree = "<group>"; };
5B3133BE280B229700A4A505 /* KeyHandler_States.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = KeyHandler_States.swift; sourceTree = "<group>"; tabWidth = 2; usesTabs = 0; }; 5B3133BE280B229700A4A505 /* KeyHandler_States.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = KeyHandler_States.swift; sourceTree = "<group>"; tabWidth = 2; usesTabs = 0; };
5B407309281672610023DFFF /* lmAssociates.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; lineEnding = 0; path = lmAssociates.swift; sourceTree = "<group>"; usesTabs = 0; }; 5B407309281672610023DFFF /* lmAssociates.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; lineEnding = 0; path = lmAssociates.swift; sourceTree = "<group>"; usesTabs = 0; };
5B40730A281672610023DFFF /* lmReplacements.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; lineEnding = 0; path = lmReplacements.swift; sourceTree = "<group>"; usesTabs = 0; }; 5B40730A281672610023DFFF /* lmReplacements.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; lineEnding = 0; path = lmReplacements.swift; sourceTree = "<group>"; usesTabs = 0; };
5B54E742283A7D89001ECBDC /* lmCoreNS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = lmCoreNS.swift; sourceTree = "<group>"; };
5B5E535127EF261400C6AA1E /* IME.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = IME.swift; sourceTree = "<group>"; tabWidth = 2; usesTabs = 0; }; 5B5E535127EF261400C6AA1E /* IME.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = IME.swift; sourceTree = "<group>"; tabWidth = 2; usesTabs = 0; };
5B61B0C9280BEFD4002E3CFA /* KeyHandler_Misc.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = KeyHandler_Misc.swift; sourceTree = "<group>"; tabWidth = 2; usesTabs = 0; }; 5B61B0C9280BEFD4002E3CFA /* KeyHandler_Misc.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = KeyHandler_Misc.swift; sourceTree = "<group>"; tabWidth = 2; usesTabs = 0; };
5B62A32827AE77D100A19448 /* FSEventStreamHelper.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = FSEventStreamHelper.swift; sourceTree = "<group>"; tabWidth = 2; usesTabs = 0; }; 5B62A32827AE77D100A19448 /* FSEventStreamHelper.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = FSEventStreamHelper.swift; sourceTree = "<group>"; tabWidth = 2; usesTabs = 0; };
@ -261,7 +259,6 @@
5BC2652127E04B7B00700291 /* uninstall.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; lineEnding = 0; path = uninstall.sh; sourceTree = "<group>"; }; 5BC2652127E04B7B00700291 /* uninstall.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; lineEnding = 0; path = uninstall.sh; sourceTree = "<group>"; };
5BD0113A28180D6100609769 /* LMInstantiator.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; lineEnding = 0; path = LMInstantiator.swift; sourceTree = "<group>"; usesTabs = 0; }; 5BD0113A28180D6100609769 /* LMInstantiator.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; lineEnding = 0; path = LMInstantiator.swift; sourceTree = "<group>"; usesTabs = 0; };
5BD0113C2818543900609769 /* KeyHandler_Core.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; lineEnding = 0; path = KeyHandler_Core.swift; sourceTree = "<group>"; usesTabs = 0; }; 5BD0113C2818543900609769 /* KeyHandler_Core.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; lineEnding = 0; path = KeyHandler_Core.swift; sourceTree = "<group>"; usesTabs = 0; };
5BD05B8027B22F3C004C4F1D /* char-kanji-cns.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "char-kanji-cns.txt"; path = "Data/components/common/char-kanji-cns.txt"; sourceTree = "<group>"; };
5BD05BB827B2A429004C4F1D /* vChewingPhraseEditor.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = vChewingPhraseEditor.app; sourceTree = BUILT_PRODUCTS_DIR; }; 5BD05BB827B2A429004C4F1D /* vChewingPhraseEditor.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = vChewingPhraseEditor.app; sourceTree = BUILT_PRODUCTS_DIR; };
5BD05BC627B2A42A004C4F1D /* vChewingPhraseEditor.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = vChewingPhraseEditor.entitlements; sourceTree = "<group>"; }; 5BD05BC627B2A42A004C4F1D /* vChewingPhraseEditor.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = vChewingPhraseEditor.entitlements; sourceTree = "<group>"; };
5BD05C5C27B2BBA9004C4F1D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; }; 5BD05C5C27B2BBA9004C4F1D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
@ -284,6 +281,11 @@
5BE78BDB27B37764005EA1BE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/frmAboutWindow.xib; sourceTree = "<group>"; }; 5BE78BDB27B37764005EA1BE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/frmAboutWindow.xib; sourceTree = "<group>"; };
5BE78BDF27B37968005EA1BE /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/frmAboutWindow.strings; sourceTree = "<group>"; }; 5BE78BDF27B37968005EA1BE /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/frmAboutWindow.strings; sourceTree = "<group>"; };
5BE8A8C4281EE65300197741 /* CONTRIBUTING.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = CONTRIBUTING.md; sourceTree = "<group>"; }; 5BE8A8C4281EE65300197741 /* CONTRIBUTING.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = CONTRIBUTING.md; sourceTree = "<group>"; };
5BEDB71C283B4AEA0078EB25 /* data-chs.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; name = "data-chs.plist"; path = "Data/data-chs.plist"; sourceTree = "<group>"; };
5BEDB71D283B4AEA0078EB25 /* data-cns.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; name = "data-cns.plist"; path = "Data/data-cns.plist"; sourceTree = "<group>"; };
5BEDB71E283B4AEA0078EB25 /* data-symbols.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; name = "data-symbols.plist"; path = "Data/data-symbols.plist"; sourceTree = "<group>"; };
5BEDB71F283B4AEA0078EB25 /* data-zhuyinwen.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; name = "data-zhuyinwen.plist"; path = "Data/data-zhuyinwen.plist"; sourceTree = "<group>"; };
5BEDB720283B4AEA0078EB25 /* data-cht.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; name = "data-cht.plist"; path = "Data/data-cht.plist"; sourceTree = "<group>"; };
5BF8423027BAA942008E7E4C /* vChewingKanjiConverter.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = vChewingKanjiConverter.swift; sourceTree = "<group>"; tabWidth = 2; usesTabs = 0; }; 5BF8423027BAA942008E7E4C /* vChewingKanjiConverter.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = vChewingKanjiConverter.swift; sourceTree = "<group>"; tabWidth = 2; usesTabs = 0; };
5BFDF48C27B51867009523B6 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/Main.strings"; sourceTree = "<group>"; }; 5BFDF48C27B51867009523B6 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/Main.strings"; sourceTree = "<group>"; };
6A0D4EA215FC0D2D00ABF4B3 /* vChewing.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = vChewing.app; sourceTree = BUILT_PRODUCTS_DIR; }; 6A0D4EA215FC0D2D00ABF4B3 /* vChewing.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = vChewing.app; sourceTree = BUILT_PRODUCTS_DIR; };
@ -380,6 +382,7 @@
children = ( children = (
5B407309281672610023DFFF /* lmAssociates.swift */, 5B407309281672610023DFFF /* lmAssociates.swift */,
5B887F2F2826AEA400B6651E /* lmCoreEX.swift */, 5B887F2F2826AEA400B6651E /* lmCoreEX.swift */,
5B54E742283A7D89001ECBDC /* lmCoreNS.swift */,
5B40730A281672610023DFFF /* lmReplacements.swift */, 5B40730A281672610023DFFF /* lmReplacements.swift */,
5BA0DF2E2817857D009E73BB /* lmUserOverride.swift */, 5BA0DF2E2817857D009E73BB /* lmUserOverride.swift */,
); );
@ -548,11 +551,11 @@
5B62A35027AE7F6600A19448 /* Data */ = { 5B62A35027AE7F6600A19448 /* Data */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
5BD05B8027B22F3C004C4F1D /* char-kanji-cns.txt */, 5BEDB71C283B4AEA0078EB25 /* data-chs.plist */,
5B2DB16D27AF6891006D874E /* data-chs.txt */, 5BEDB720283B4AEA0078EB25 /* data-cht.plist */,
5B2DB16E27AF6891006D874E /* data-cht.txt */, 5BEDB71D283B4AEA0078EB25 /* data-cns.plist */,
5B27AD6827CB1F9B000ED75B /* data-symbols.txt */, 5BEDB71E283B4AEA0078EB25 /* data-symbols.plist */,
5B27AD6927CB1F9B000ED75B /* data-zhuyinwen.txt */, 5BEDB71F283B4AEA0078EB25 /* data-zhuyinwen.plist */,
5B2DB17127AF8771006D874E /* Makefile */, 5B2DB17127AF8771006D874E /* Makefile */,
); );
name = Data; name = Data;
@ -956,23 +959,23 @@
D4E33D8A27A838CF006DB1CF /* Localizable.strings in Resources */, D4E33D8A27A838CF006DB1CF /* Localizable.strings in Resources */,
5BDCBB2E27B4E67A00D0CC59 /* vChewingPhraseEditor.app in Resources */, 5BDCBB2E27B4E67A00D0CC59 /* vChewingPhraseEditor.app in Resources */,
5BBBB76027AED54C0023B93A /* Fart.m4a in Resources */, 5BBBB76027AED54C0023B93A /* Fart.m4a in Resources */,
5B27AD6A27CB1F9B000ED75B /* data-symbols.txt in Resources */,
6A2E40F6253A69DA00D1AE1D /* Images.xcassets in Resources */, 6A2E40F6253A69DA00D1AE1D /* Images.xcassets in Resources */,
D4E33D8F27A838F0006DB1CF /* InfoPlist.strings in Resources */, D4E33D8F27A838F0006DB1CF /* InfoPlist.strings in Resources */,
5BBBB76B27AED5DB0023B93A /* frmNonModalAlertWindow.xib in Resources */, 5BBBB76B27AED5DB0023B93A /* frmNonModalAlertWindow.xib in Resources */,
5BEDB723283B4C250078EB25 /* data-cht.plist in Resources */,
5BEDB721283B4C250078EB25 /* data-cns.plist in Resources */,
5BEDB725283B4C250078EB25 /* data-chs.plist in Resources */,
5BBBB76D27AED5DB0023B93A /* frmAboutWindow.xib in Resources */, 5BBBB76D27AED5DB0023B93A /* frmAboutWindow.xib in Resources */,
5BBBB77527AED70B0023B93A /* MenuIcon-SCVIM.png in Resources */, 5BBBB77527AED70B0023B93A /* MenuIcon-SCVIM.png in Resources */,
5BEDB722283B4C250078EB25 /* data-zhuyinwen.plist in Resources */,
5BEDB724283B4C250078EB25 /* data-symbols.plist in Resources */,
5B7BC4B027AFFBE800F66C24 /* frmPrefWindow.xib in Resources */, 5B7BC4B027AFFBE800F66C24 /* frmPrefWindow.xib in Resources */,
5BD05B8127B22F3C004C4F1D /* char-kanji-cns.txt in Resources */,
5B27AD6B27CB1F9B000ED75B /* data-zhuyinwen.txt in Resources */,
5B2DB17027AF6891006D874E /* data-cht.txt in Resources */,
5BBBB77327AED70B0023B93A /* MenuIcon-TCVIM@2x.png in Resources */, 5BBBB77327AED70B0023B93A /* MenuIcon-TCVIM@2x.png in Resources */,
5BBBB77627AED70B0023B93A /* MenuIcon-TCVIM.png in Resources */, 5BBBB77627AED70B0023B93A /* MenuIcon-TCVIM.png in Resources */,
6A187E2616004C5900466B2E /* MainMenu.xib in Resources */, 6A187E2616004C5900466B2E /* MainMenu.xib in Resources */,
5BBBB75F27AED54C0023B93A /* Beep.m4a in Resources */, 5BBBB75F27AED54C0023B93A /* Beep.m4a in Resources */,
5BC2652227E04B7E00700291 /* uninstall.sh in Resources */, 5BC2652227E04B7E00700291 /* uninstall.sh in Resources */,
5BAD0CD527D701F6003D127F /* vChewingKeyLayout.bundle in Resources */, 5BAD0CD527D701F6003D127F /* vChewingKeyLayout.bundle in Resources */,
5B2DB16F27AF6891006D874E /* data-chs.txt in Resources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@ -1064,6 +1067,7 @@
5BA9FD4A27FEF3C9002DE248 /* PreferencesTabViewController.swift in Sources */, 5BA9FD4A27FEF3C9002DE248 /* PreferencesTabViewController.swift in Sources */,
5B62A34A27AE7CD900A19448 /* NotifierController.swift in Sources */, 5B62A34A27AE7CD900A19448 /* NotifierController.swift in Sources */,
5B11328927B94CFB00E58451 /* AppleKeyboardConverter.swift in Sources */, 5B11328927B94CFB00E58451 /* AppleKeyboardConverter.swift in Sources */,
5B54E743283A7D89001ECBDC /* lmCoreNS.swift in Sources */,
5B62A32927AE77D100A19448 /* FSEventStreamHelper.swift in Sources */, 5B62A32927AE77D100A19448 /* FSEventStreamHelper.swift in Sources */,
5B38F59B281E2E49007D5F5D /* 7_KeyValuePair.swift in Sources */, 5B38F59B281E2E49007D5F5D /* 7_KeyValuePair.swift in Sources */,
5B62A33627AE795800A19448 /* mgrPrefs.swift in Sources */, 5B62A33627AE795800A19448 /* mgrPrefs.swift in Sources */,
@ -1292,7 +1296,7 @@
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = NO; COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1960; CURRENT_PROJECT_VERSION = 1961;
DEBUG_INFORMATION_FORMAT = dwarf; DEBUG_INFORMATION_FORMAT = dwarf;
GCC_C_LANGUAGE_STANDARD = gnu11; GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO; GCC_DYNAMIC_NO_PIC = NO;
@ -1315,7 +1319,7 @@
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
MACOSX_DEPLOYMENT_TARGET = 10.11.5; MACOSX_DEPLOYMENT_TARGET = 10.11.5;
MARKETING_VERSION = 1.6.0; MARKETING_VERSION = 1.6.1;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewing.vChewingPhraseEditor; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewing.vChewingPhraseEditor;
@ -1348,7 +1352,7 @@
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = NO; COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1960; CURRENT_PROJECT_VERSION = 1961;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO; ENABLE_NS_ASSERTIONS = NO;
GCC_C_LANGUAGE_STANDARD = gnu11; GCC_C_LANGUAGE_STANDARD = gnu11;
@ -1367,7 +1371,7 @@
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
MACOSX_DEPLOYMENT_TARGET = 10.11.5; MACOSX_DEPLOYMENT_TARGET = 10.11.5;
MARKETING_VERSION = 1.6.0; MARKETING_VERSION = 1.6.1;
MTL_ENABLE_DEBUG_INFO = NO; MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewing.vChewingPhraseEditor; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewing.vChewingPhraseEditor;
@ -1482,7 +1486,7 @@
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = NO; COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1960; CURRENT_PROJECT_VERSION = 1961;
DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_ASSET_PATHS = "";
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = "";
GCC_C_LANGUAGE_STANDARD = gnu99; GCC_C_LANGUAGE_STANDARD = gnu99;
@ -1517,7 +1521,7 @@
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
MACOSX_DEPLOYMENT_TARGET = 10.11.5; MACOSX_DEPLOYMENT_TARGET = 10.11.5;
MARKETING_VERSION = 1.6.0; MARKETING_VERSION = 1.6.1;
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.inputmethod.vChewing; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.inputmethod.vChewing;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
@ -1549,7 +1553,7 @@
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = NO; COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1960; CURRENT_PROJECT_VERSION = 1961;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_ASSET_PATHS = "";
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = "";
@ -1579,7 +1583,7 @@
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
MACOSX_DEPLOYMENT_TARGET = 10.11.5; MACOSX_DEPLOYMENT_TARGET = 10.11.5;
MARKETING_VERSION = 1.6.0; MARKETING_VERSION = 1.6.1;
PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.inputmethod.vChewing; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.inputmethod.vChewing;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
@ -1662,7 +1666,7 @@
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = NO; COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1960; CURRENT_PROJECT_VERSION = 1961;
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = "";
GCC_C_LANGUAGE_STANDARD = gnu99; GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO; GCC_DYNAMIC_NO_PIC = NO;
@ -1687,7 +1691,7 @@
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
MACOSX_DEPLOYMENT_TARGET = 10.11.5; MACOSX_DEPLOYMENT_TARGET = 10.11.5;
MARKETING_VERSION = 1.6.0; MARKETING_VERSION = 1.6.1;
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
PRODUCT_BUNDLE_IDENTIFIER = "org.atelierInmu.vChewing.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_BUNDLE_IDENTIFIER = "org.atelierInmu.vChewing.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
@ -1714,7 +1718,7 @@
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = NO; COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1960; CURRENT_PROJECT_VERSION = 1961;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = "";
GCC_C_LANGUAGE_STANDARD = gnu99; GCC_C_LANGUAGE_STANDARD = gnu99;
@ -1734,7 +1738,7 @@
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
MACOSX_DEPLOYMENT_TARGET = 10.11.5; MACOSX_DEPLOYMENT_TARGET = 10.11.5;
MARKETING_VERSION = 1.6.0; MARKETING_VERSION = 1.6.1;
PRODUCT_BUNDLE_IDENTIFIER = "org.atelierInmu.vChewing.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_BUNDLE_IDENTIFIER = "org.atelierInmu.vChewing.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";