2.2.0 RTM(SP1) // Maintenance. Merge PR!96 from upd/2.2.0rtm

This commit is contained in:
ShikiSuen 2022-08-29 02:30:38 +00:00 committed by Gitee
commit 7901e42067
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
31 changed files with 1331 additions and 848 deletions

View File

@ -35,9 +35,6 @@ assignees: ""
**螢幕截圖或螢幕錄製** **螢幕截圖或螢幕錄製**
如果您能夠提供像螢幕截圖或螢幕錄製供大家參考,我們可以從畫面中,看出更多只從文字內容無法了解的線索。 如果您能夠提供像螢幕截圖或螢幕錄製供大家參考,我們可以從畫面中,看出更多只從文字內容無法了解的線索。
**小麥注音是否也有該問題**
威注音一開始是小麥注音的下游。雖經大量修改與重構,但也難免會受到之前繼承過來的可能存在的上游 Bug 或設計缺陷的影響。
所以呢,這個問題也請答覆。但如果是威注音特有功能出現故障的話,那這個問題可以不用答覆。 所以呢,這個問題也請答覆。但如果是威注音特有功能出現故障的話,那這個問題可以不用答覆。
**電腦環境** **電腦環境**

View File

@ -11,6 +11,37 @@ import Foundation
public enum ChineseConverter { public enum ChineseConverter {
public static let shared = HotenkaChineseConverter(plistDir: mgrLangModel.getBundleDataPath("convdict")) public static let shared = HotenkaChineseConverter(plistDir: mgrLangModel.getBundleDataPath("convdict"))
private static var punctuationConversionTable: [(String, String)] = [
("", ""), ("", ""), ("", ""), ("", ""), ("", ""), ("", ""), ("", ""), ("", ""),
("", "︿"), ("", ""), ("", ""), ("", ""), ("", ""), ("", ""), ("", ""), ("", ""),
("", ""), ("", ""), ("", ""), ("", ""),
]
///
/// 使使
/// - Parameters:
/// - target:
/// - convert:
public static func hardenVerticalPunctuations(target: inout String, convert: Bool = false) {
guard convert else { return }
for neta in ChineseConverter.punctuationConversionTable {
target = target.replacingOccurrences(of: neta.0, with: neta.1)
}
}
// JIS
private static func processKanjiRepeatSymbol(target: inout String) {
guard !target.isEmpty else { return }
var arr = target.charComponents
for (i, char) in arr.enumerated() {
if i == 0 { continue }
if char == target.charComponents[i - 1] {
arr[i] = ""
}
}
target = arr.joined()
}
/// ///
private static let currencyNumeralDictTable: [String: (String, String, String, String)] = [ private static let currencyNumeralDictTable: [String: (String, String, String, String)] = [
"": ("", "", "", ""), "": ("", "", "", ""), "": ("", "", "", ""), "": ("", "", "", ""), "": ("", "", "", ""), "": ("", "", "", ""),
@ -75,6 +106,8 @@ public enum ChineseConverter {
public static func cnvTradToJIS(_ strObj: String) -> String { public static func cnvTradToJIS(_ strObj: String) -> String {
// //
let strObj = cnvTradToKangXi(strObj) let strObj = cnvTradToKangXi(strObj)
return shared.convert(strObj, to: .zhHansJP) var result = shared.convert(strObj, to: .zhHansJP)
processKanjiRepeatSymbol(target: &result)
return result
} }
} }

@ -1 +1 @@
Subproject commit a0a2565cbede65e189951bc8cd44197b3e3d7cda Subproject commit 975d8b02cc1c87e83ac71adf9f937dd1cafaa1bb

View File

@ -471,7 +471,7 @@ public enum InputState {
super.init(composingBuffer: composingBuffer, cursorIndex: cursorIndex, nodeValuesArray: nodeValuesArray) super.init(composingBuffer: composingBuffer, cursorIndex: cursorIndex, nodeValuesArray: nodeValuesArray)
} }
// 使 chosenCandidateString // 使 chosenCandidateString
// macOS // macOS
// ctlInputMethod.candidateSelectionChanged() // ctlInputMethod.candidateSelectionChanged()
// //

View File

@ -19,6 +19,7 @@ import Foundation
/// KeyHandler /// KeyHandler
protocol KeyHandlerDelegate { protocol KeyHandlerDelegate {
var clientBundleIdentifier: String { get } var clientBundleIdentifier: String { get }
var isVerticalTyping: Bool { get }
func ctlCandidate() -> ctlCandidateProtocol func ctlCandidate() -> ctlCandidateProtocol
func keyHandler( func keyHandler(
_: KeyHandler, didSelectCandidateAt index: Int, _: KeyHandler, didSelectCandidateAt index: Int,
@ -142,38 +143,37 @@ public class KeyHandler {
/// ///
/// v1.9.3 SP2 Bug v1.9.4 /// v1.9.3 SP2 Bug v1.9.4
/// v2.0.2 /// v2.0.2
/// - Parameters: /// - Parameter theCandidate:
/// - theCandidate: func consolidateCursorContext(with theCandidate: Megrez.Compositor.Candidate) {
/// - cursorSpecified: actualCandidateCursor var grid = compositor
func consolidateCursorContext(with theCandidate: Megrez.Compositor.Candidate = .init(), cursorSpecified: Int? = nil) { var frontBoundaryEX = actualCandidateCursor + 1
var cursorSpecified = cursorSpecified ?? actualCandidateCursor var rearBoundaryEX = actualCandidateCursor
if cursorSpecified != actualCandidateCursor { var debugIntelToPrint = ""
cursorSpecified = max(0, min(cursorSpecified, compositor.width - 1)) // if grid.overrideCandidate(theCandidate, at: actualCandidateCursor) {
} grid.walk()
let grid = compositor let range = grid.walkedNodes.contextRange(ofGivenCursor: actualCandidateCursor)
var frontBoundaryEX = compositor.width - 1 rearBoundaryEX = range.lowerBound
var rearBoundaryEX = 0 frontBoundaryEX = range.upperBound
if grid.overrideCandidate(theCandidate, at: cursorSpecified) { debugIntelToPrint.append("EX: \(rearBoundaryEX)..<\(frontBoundaryEX), ")
guard let node = compositor.walkedNodes.findNode(at: cursorSpecified, target: &frontBoundaryEX) else {
return
}
rearBoundaryEX = max(0, frontBoundaryEX - node.keyArray.count)
} }
var frontBoundary = 0 let range = compositor.walkedNodes.contextRange(ofGivenCursor: actualCandidateCursor)
guard let node = compositor.walkedNodes.findNode(at: cursorSpecified, target: &frontBoundary) else { return } var rearBoundary = min(range.lowerBound, rearBoundaryEX)
var frontBoundary = max(range.upperBound, frontBoundaryEX)
var rearBoundary = min(max(0, frontBoundary - node.keyArray.count), rearBoundaryEX) // debugIntelToPrint.append("INI: \(rearBoundary)..<\(frontBoundary), ")
frontBoundary = max(min(frontBoundary, compositor.width), frontBoundaryEX) //
let cursorBackup = compositor.cursor let cursorBackup = compositor.cursor
while compositor.cursor > rearBoundary { compositor.jumpCursorBySpan(to: .rear) } while compositor.cursor > rearBoundary { compositor.jumpCursorBySpan(to: .rear) }
rearBoundary = min(compositor.cursor, rearBoundary) rearBoundary = min(compositor.cursor, rearBoundary)
compositor.cursor = cursorBackup // compositor.cursor = cursorBackup //
while compositor.cursor < frontBoundary { compositor.jumpCursorBySpan(to: .front) } while compositor.cursor < frontBoundary { compositor.jumpCursorBySpan(to: .front) }
frontBoundary = max(compositor.cursor, frontBoundary) frontBoundary = min(max(compositor.cursor, frontBoundary), compositor.width)
compositor.cursor = cursorBackup // compositor.cursor = cursorBackup //
debugIntelToPrint.append("FIN: \(rearBoundary)..<\(frontBoundary)")
IME.prtDebugIntel(debugIntelToPrint)
// //
var nodeIndices = [Int]() // var nodeIndices = [Int]() //

View File

@ -22,7 +22,13 @@ extension KeyHandler {
/// (Update the composing buffer) /// (Update the composing buffer)
/// NSAttributeString /// NSAttributeString
var tooltipParameterRef: [String] = ["", ""] var tooltipParameterRef: [String] = ["", ""]
let nodeValuesArray: [String] = compositor.walkedNodes.values let nodeValuesArray: [String] = compositor.walkedNodes.values.map {
guard let delegate = delegate, delegate.isVerticalTyping else { return $0 }
guard mgrPrefs.hardenVerticalPunctuations else { return $0 }
var neta = $0
ChineseConverter.hardenVerticalPunctuations(target: &neta, convert: delegate.isVerticalTyping)
return neta
}
var composedStringCursorIndex = 0 var composedStringCursorIndex = 0
var readingCursorIndex = 0 var readingCursorIndex = 0
/// IMK UTF8 emoji /// IMK UTF8 emoji

View File

@ -39,16 +39,6 @@ class ctlInputMethod: IMKInputController {
/// ctlInputMethod /// ctlInputMethod
var isASCIIMode: Bool = false var isASCIIMode: Bool = false
///
public var isVerticalTyping: Bool {
guard let client = client() else { return false }
var textFrame = NSRect.zero
let attributes: [AnyHashable: Any]? = client.attributes(
forCharacterIndex: 0, lineHeightRectangle: &textFrame
)
return (attributes?["IMKTextOrientation"] as? NSNumber)?.intValue == 0 || false
}
/// ctlInputMethod /// ctlInputMethod
func toggleASCIIMode() -> Bool { func toggleASCIIMode() -> Bool {
resetKeyHandler() resetKeyHandler()
@ -313,9 +303,15 @@ class ctlInputMethod: IMKInputController {
if let state = state as? InputState.AssociatedPhrases { if let state = state as? InputState.AssociatedPhrases {
handleCandidatesPrepared(state.candidates, prefix: "") handleCandidatesPrepared(state.candidates, prefix: "")
} else if let state = state as? InputState.SymbolTable { } else if let state = state as? InputState.SymbolTable {
handleCandidatesPrepared(state.candidates) // / JIS 使
arrResult = state.candidates.map(\.1)
} else if let state = state as? InputState.ChoosingCandidate { } else if let state = state as? InputState.ChoosingCandidate {
handleCandidatesPrepared(state.candidates) guard !state.candidates.isEmpty else { return .init() }
if state.candidates[0].0.contains("_punctuation") {
arrResult = state.candidates.map(\.1) //
} else {
handleCandidatesPrepared(state.candidates)
}
} }
return arrResult return arrResult
@ -372,12 +368,27 @@ class ctlInputMethod: IMKInputController {
} }
} }
// / JIS 使
func handleSymbolCandidatesSelected(_ candidates: [(String, String)]) {
for (i, neta) in candidates.enumerated() {
if candidateString.string == neta.1 {
indexDeducted = i
break
}
}
}
if let state = state as? InputState.AssociatedPhrases { if let state = state as? InputState.AssociatedPhrases {
handleCandidatesSelected(state.candidates, prefix: "") handleCandidatesSelected(state.candidates, prefix: "")
} else if let state = state as? InputState.SymbolTable { } else if let state = state as? InputState.SymbolTable {
handleCandidatesSelected(state.candidates) handleSymbolCandidatesSelected(state.candidates)
} else if let state = state as? InputState.ChoosingCandidate { } else if let state = state as? InputState.ChoosingCandidate {
handleCandidatesSelected(state.candidates) guard !state.candidates.isEmpty else { return }
if state.candidates[0].0.contains("_punctuation") {
handleSymbolCandidatesSelected(state.candidates) //
} else {
handleCandidatesSelected(state.candidates)
}
} }
keyHandler( keyHandler(
keyHandler, keyHandler,

View File

@ -13,6 +13,16 @@ import Cocoa
// MARK: - KeyHandler Delegate // MARK: - KeyHandler Delegate
extension ctlInputMethod: KeyHandlerDelegate { extension ctlInputMethod: KeyHandlerDelegate {
///
public var isVerticalTyping: Bool {
guard let client = client() else { return false }
var textFrame = NSRect.zero
let attributes: [AnyHashable: Any]? = client.attributes(
forCharacterIndex: 0, lineHeightRectangle: &textFrame
)
return (attributes?["IMKTextOrientation"] as? NSNumber)?.intValue == 0 || false
}
var clientBundleIdentifier: String { var clientBundleIdentifier: String {
guard let client = client() else { return "" } guard let client = client() else { return "" }
return client.bundleIdentifier() ?? "" return client.bundleIdentifier() ?? ""

View File

@ -53,6 +53,7 @@ public enum UserDef: String, CaseIterable {
case kUpperCaseLetterKeyBehavior = "UpperCaseLetterKeyBehavior" case kUpperCaseLetterKeyBehavior = "UpperCaseLetterKeyBehavior"
case kDisableShiftTogglingAlphanumericalMode = "DisableShiftTogglingAlphanumericalMode" case kDisableShiftTogglingAlphanumericalMode = "DisableShiftTogglingAlphanumericalMode"
case kConsolidateContextOnCandidateSelection = "ConsolidateContextOnCandidateSelection" case kConsolidateContextOnCandidateSelection = "ConsolidateContextOnCandidateSelection"
case kHardenVerticalPunctuations = "HardenVerticalPunctuations"
case kUseIMKCandidateWindow = "UseIMKCandidateWindow" case kUseIMKCandidateWindow = "UseIMKCandidateWindow"
case kHandleDefaultCandidateFontsByLangIdentifier = "HandleDefaultCandidateFontsByLangIdentifier" case kHandleDefaultCandidateFontsByLangIdentifier = "HandleDefaultCandidateFontsByLangIdentifier"
@ -297,6 +298,9 @@ public enum mgrPrefs {
UserDefaults.standard.setDefault( UserDefaults.standard.setDefault(
mgrPrefs.consolidateContextOnCandidateSelection, forKey: UserDef.kConsolidateContextOnCandidateSelection.rawValue mgrPrefs.consolidateContextOnCandidateSelection, forKey: UserDef.kConsolidateContextOnCandidateSelection.rawValue
) )
UserDefaults.standard.setDefault(
mgrPrefs.hardenVerticalPunctuations, forKey: UserDef.kHardenVerticalPunctuations.rawValue
)
// ----- // -----
@ -425,6 +429,9 @@ public enum mgrPrefs {
@UserDefault(key: UserDef.kConsolidateContextOnCandidateSelection.rawValue, defaultValue: true) @UserDefault(key: UserDef.kConsolidateContextOnCandidateSelection.rawValue, defaultValue: true)
static var consolidateContextOnCandidateSelection: Bool static var consolidateContextOnCandidateSelection: Bool
@UserDefault(key: UserDef.kHardenVerticalPunctuations.rawValue, defaultValue: false)
static var hardenVerticalPunctuations: Bool
// MARK: - Settings (Tier 2) // MARK: - Settings (Tier 2)
@UserDefault(key: UserDef.kUseIMKCandidateWindow.rawValue, defaultValue: false) @UserDefault(key: UserDef.kUseIMKCandidateWindow.rawValue, defaultValue: false)
@ -718,18 +725,6 @@ extension mgrPrefs {
mgrPrefs.disableShiftTogglingAlphanumericalMode = false mgrPrefs.disableShiftTogglingAlphanumericalMode = false
mgrPrefs.togglingAlphanumericalModeWithLShift = false mgrPrefs.togglingAlphanumericalModeWithLShift = false
} }
//
var filteredAppleLanguages = Set<String>()
appleLanguages.forEach {
if IME.arrSupportedLocales.contains($0) {
filteredAppleLanguages.insert($0)
}
}
if !filteredAppleLanguages.isEmpty {
appleLanguages = Array(filteredAppleLanguages)
} else {
UserDefaults.standard.removeObject(forKey: UserDef.kAppleLanguages.rawValue)
}
// //
var isMandarinParserOptionValid = false var isMandarinParserOptionValid = false
MandarinParser.allCases.forEach { MandarinParser.allCases.forEach {

View File

@ -25,6 +25,11 @@ class SymbolNode {
children = Array(symbols).map { SymbolNode(String($0), nil) } children = Array(symbols).map { SymbolNode(String($0), nil) }
} }
init(_ title: String, symbols: [String]) {
self.title = title
children = symbols.map { SymbolNode($0, nil) }
}
static func parseUserSymbolNodeData() { static func parseUserSymbolNodeData() {
let url = mgrLangModel.userSymbolNodeDataURL() let url = mgrLangModel.userSymbolNodeDataURL()
// //
@ -55,8 +60,10 @@ class SymbolNode {
format: NSLocalizedString("catHoriBrackets", comment: "")) format: NSLocalizedString("catHoriBrackets", comment: ""))
static let catVertBrackets = String( static let catVertBrackets = String(
format: NSLocalizedString("catVertBrackets", comment: "")) format: NSLocalizedString("catVertBrackets", comment: ""))
static let catGreekLetters = String( static let catAlphabets = String(
format: NSLocalizedString("catGreekLetters", comment: "")) format: NSLocalizedString("catAlphabets", comment: ""))
static let catSpecialNumbers = String(
format: NSLocalizedString("catSpecialNumbers", comment: ""))
static let catMathSymbols = String( static let catMathSymbols = String(
format: NSLocalizedString("catMathSymbols", comment: "")) format: NSLocalizedString("catMathSymbols", comment: ""))
static let catCurrencyUnits = String( static let catCurrencyUnits = String(
@ -79,6 +86,22 @@ class SymbolNode {
format: NSLocalizedString("catFillingBlocks", comment: "")) format: NSLocalizedString("catFillingBlocks", comment: ""))
static let catLineSegments = String( static let catLineSegments = String(
format: NSLocalizedString("catLineSegments", comment: "")) format: NSLocalizedString("catLineSegments", comment: ""))
static let catKana = String(
format: NSLocalizedString("catKana", comment: ""))
static let catCombinations = String(
format: NSLocalizedString("catCombinations", comment: ""))
static let catPhonabets = String(
format: NSLocalizedString("catPhonabets", comment: ""))
static let catCircledASCII = String(
format: NSLocalizedString("catCircledASCII", comment: ""))
static let catBracketedASCII = String(
format: NSLocalizedString("catBracketedASCII", comment: ""))
static let catMusicSymbols = String(
format: NSLocalizedString("catMusicSymbols", comment: ""))
static let catThai = String(
format: NSLocalizedString("catThai", comment: ""))
static let catYi = String(
format: NSLocalizedString("catYi", comment: ""))
private(set) static var root: SymbolNode = .init("/") private(set) static var root: SymbolNode = .init("/")
@ -87,25 +110,84 @@ class SymbolNode {
[ [
SymbolNode(" "), SymbolNode(" "),
SymbolNode(""), SymbolNode(""),
SymbolNode(catCommonSymbols, symbols: ",、。.?!;:‧‥﹐﹒˙·‘’“”〝〞‵′〃~$%@&#*"), SymbolNode(catCommonSymbols, symbols: ",、。.?!;:‧‥﹐﹒˙·‘’“”〝〞‵′〃~$%﹪@&#*・…—〜/\_―‖﹫﹟﹠﹡"),
SymbolNode(catHoriBrackets, symbols: "()「」〔〕{}〈〉『』《》【】﹙﹚﹝﹞﹛﹜"), SymbolNode(
catHoriBrackets,
symbols:
"()[]{}〈〉《》「」『』【】〔〕〖〗〘〙〚〛︗︘︷︸︹︺︻︼︽︾︿﹀﹁﹂﹃﹄﹇﹈︵︶[]{}⁅⁆⎡⎢⎣⎤⎥⎦⎧⎨⎩⎪⎫⎬⎭⎰⎱「」❬❭❰❱❲❳❴❵⟦⟧⟨⟩⟪⟫⟬⟭⦃⦄⦇⦈⦉⦊⦋⦌⦍⦎⦏⦐⦑⦒⦓⦔⦕⦖⦗⦘⧼⧽⸂⸃⸄⸅⸉⸊⸌⸍⸜⸝⸢⸣⸤⸥⸦⸧⎴⎵⎶⏞⏟⏠⏡﹙﹚﹛﹜﹝﹞﹤﹥‘’“”〝〞‵′″'"
),
SymbolNode(catVertBrackets, symbols: "︵︶﹁﹂︹︺︷︸︿﹀﹃﹄︽︾︻︼"), SymbolNode(catVertBrackets, symbols: "︵︶﹁﹂︹︺︷︸︿﹀﹃﹄︽︾︻︼"),
SymbolNode( SymbolNode(
catGreekLetters, symbols: "αβγδεζηθικλμνξοπρστυφχψωΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ" catAlphabets,
symbols:
"αβγδεζηθικλμνξοπρστυφχψωΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩабвгдежзийклмнопрстуфхцчшщъыьэюяёАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯЁàáèéêìíòóùúüāēěīńňōūǎǐǒǔǖǘǚǜɑɡ¨·"
), ),
SymbolNode(catMathSymbols, symbols: "+-×÷=≠≒∞±√<>﹤﹥≦≧∩∪ˇ⊥∠∟⊿㏒㏑∫∮∵∴╳﹢"),
SymbolNode(catCurrencyUnits, symbols: "$€¥¢£₽₨₩฿₺₮₱₭₴₦৲৳૱௹﷼₹₲₪₡₫៛₵₢₸₤₳₥₠₣₰₧₯₶₷"),
SymbolNode(catSpecialSymbols, symbols: "↑↓←→↖↗↙↘↺⇧⇩⇦⇨⇄⇆⇅⇵↻◎○●⊕⊙※△▲☆★◇◆□■▽▼§¥〒¢£♀♂↯"),
SymbolNode(catUnicodeSymbols, symbols: "♨☀☁☂☃♠♥♣♦♩♪♫♬☺☻"),
SymbolNode(catCircledKanjis, symbols: "㊟㊞㊚㊛㊊㊋㊌㊍㊎㊏㊐㊑㊒㊓㊔㊕㊖㊗︎㊘㊙︎㊜㊝㊠㊡㊢㊣㊤㊥㊦㊧㊨㊩㊪㊫㊬㊭㊮㊯㊰🈚︎🈯︎"),
SymbolNode( SymbolNode(
catCircledKataKana, symbols: "㋐㋑㋒㋓㋔㋕㋖㋗㋘㋙㋚㋛㋜㋝㋞㋟㋠㋡㋢㋣㋤㋥㋦㋧㋨㋩㋪㋫㋬㋭㋮㋯㋰㋱㋲㋳㋴㋵㋶㋷㋸㋹㋺㋻㋼㋾" catSpecialNumbers, symbols: "ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹⅺⅻ〇〡〢〣〤〥〦〧〨〩"
),
SymbolNode(
catMathSymbols,
symbols:
"﹢﹤﹥+-<=>✕%+<=>¡¢«°±µ»¼½¾¿×÷ˇθπ‰₠₡₢₣₤₥₦₧₨₩₪₫€℀℁℃℅℆℉⅓⅔⅕⅖⅗⅘⅙⅚⅛⅜⅝⅞⅟∀∁∂∃∄∅∆∇∈∉∊∋∌∍∎∏∐∑−∓∔∕∖∗∘∙√∛∜∝∞∟∠∡∢∣∤∥∧∨∩∪∫∬∭∮∯∰∱∲∳∴∵∶∷∸∹∺∻∼∽∾∿≀≁≂≃≄≅≆≇≈≉≊≋≌≍≎≏≐≑≒≓≔≕≖≗≘≙≚≛≜≝≞≟≠≡≢≣≤≥≦≧≨≩≪≫≬≭≮≯≰≱≲≳≴≵≶≷≸≹≺≻≼≽≾≿⊀⊁⊂⊃⊄⊅⊆⊇⊈⊉⊊⊋⊌⊍⊎⊏⊐⊑⊒⊓⊔⊕⊖⊗⊘⊙⊚⊛⊜⊝⊞⊟⊠⊡⊢⊣⊤⊥⊦⊧⊨⊩⊪⊫⊬⊭⊮⊯⊰⊱⊲⊳⊴⊵⊶⊷⊸⊹⊺⊻⊼⊽⊾⊿⋀⋁⋂⋃⋄⋅⋆⋇⋈⋉⋊⋋⋌⋍⋎⋏⋐⋑⋒⋓⋔⋕⋖⋗⋘⋙⋚⋛⋜⋝⋞⋟⋠⋡⋢⋣⋤⋥⋦⋧⋨⋩⋪⋫⋬⋭⋮⋯⋰⋱"
),
SymbolNode(catCurrencyUnits, symbols: "$€¥¢£₽₨₩฿₺₮₱₭₴₦৲৳૱௹﷼₹₲₪₡₫៛₵₢₸₤₳₥₠₣₰₧₯₶₷¤¢¥£$﹩₩"),
SymbolNode(
catSpecialSymbols,
symbols:
"↩⌘⎋⏏⇥⇤⇪⇧⌤⌥⎇␣⌃⌄⌅⌆⌦⌫⌧⇱↖↸⇲↘⇞⇟↑↓←→⇡⇣⇠⇢⚙⇭⌽⌀⌁⌂⌐⌑⌒⌓⌔⌕⌖⌗⌙⌨⎄⎅⎆⎈⎉⎊⎌⌚⌛⎗⎘⎙⎚⎀⎁⎂⎃⌇⌈⌉⌊⌋⌌⌍⌏⌠⎮⌡⌢⌣⌜⌝⌞⌟⁒〈〉⌬⌭⌮⌯⌰⌱⌲⌳↗↙↺⇩⇦⇨⇄⇆⇅⇵↻◎○●⊕⊙※△▲☆★◇◆□■▽▼№℡§〒♀♂↯¶©®™🜀🜁🜂🜃🜄🜅🜆🜇🜈🜉🜊🜋🜌🜍🜎🜏🜐🜑🜒🜓🜔🜕🜖🜗🜘🜙🜚🜛🜜🜝🜞🜟🜠🜡🜢🜣🜤🜥🜦🜧🜨🜩🜪🜫🜬🜭🜮🜯🜰🜱🜲🜳🜴🜵🜶🜷🜸🜹🜺🜻🜼🜽🜾🜿🝀🝁🝂🝃🝄🝅🝆🝇🝈🝉🝊🝋🝌🝍🝎🝏🝐🝑🝒🝓🝔🝕🝖🝗🝘🝙🝚🝛🝜🝝🝞🝟🝠🝡🝢🝣🝤🝥🝦🝧🝨🝩🝪🝫🝬🝭🝮🝯🝰🝱🝲🝳↚↛↜↝↞↟↠↡↢↣↤↥↦↧↨↪↫↬↭↮"
),
SymbolNode(
catUnicodeSymbols,
symbols:
"※∮∴∵∽☀☁☂☃☺☻♠♣♥♦♨♩♪♫♬♭♯■□▢▣▤▥▦▧▨▩▪▫▬▭▮▯▰▱▲△▴▵▶▷▸▹►▻▼▽▾▿◀◁◂◃◄◅◆◇◈◉◊○◌◍◎●◐◑◒◓◔◕◖◗◘◙◚◛◜◝◞◟◠◡◢◣◤◥◦◧◨◩◪◫◬◭◮◯◰◱◲◳◴◵◶◷◸◹◺◻◼◽◾◿☄★☆☇☈☉☊☋☌☍☎☏☐☑☒☓☔☕☖☗☘☙☚☛☜☝☞☟☠☡☢☣☤☥☦☧☨☩☪☫☬☭☮☯☰☱☲☳☴☵☶☷☸☹☼☽☾☿♀♁♂♃♄♅♆♇♈♉♊♋♌♍♎♏♐♑♒♓♔♕♖♗♘♙♚♛♜♝♞♟♡♢♤♧♮♰♱♲♳♴♵♶♷♸♹♺♻♼♽♾♿⚀⚁⚂⚃⚄⚅⚆⚇⚈⚉⚊⚋⚌⚍⚎⚏⚐⚑⚒⚓⚔⚕⚖⚗⚘⚙⚚⚛⚜⚝⚞⚟⚠⚡⚢⚣⚤⚥⚦⚧⚨⚩⚪⚫⚬⚭⚮⚯⚰⚱⚲⚳⚴⚵⚶⚷⚸⚹⚺⚻⚼⚽⚾⚿⛀⛁⛂⛃⛄⛅⛆⛇⛈⛉⛊⛋⛌⛍⛎⛏⛐⛑⛒⛓⛔⛕⛖⛗⛘⛙⛚⛛⛜⛝⛞⛟⛠⛡⛢⛣⛤⛥⛦⛧⛨⛩⛪⛫⛬⛭⛮⛯⛰⛱⛲⛳⛴⛵⛶⛷⛸⛹⛺⛻⛼⛽⛾⛿✁✂✃✄✅✆✇✈✉✊✋✌✍✎✏✐✑✒✓✔✕✖✗✘✙✚✛✜✝✞✟✠✡✢✣✤✥✦✧✨✩✪✫✬✭✮✯✰✱✲✳✴✵✶✷✸✹✺✻✼✽✾✿❀❁❂❃❄❅❆❇❈❉❊❋❌❍❎❏❐❑❒❓❔❕❖❗❘❙❚❛❜❝❞❟❠❡❢❣❤❥❦❧❨❩❪❫❬❭❮❯❰❱❲❳❴❵➔➕➖➗➘➙➚➛➜➝➞➟➠➡➢➣➤➥➦➧➨➩➪➫➬➭➮➯➰➱➲➳➴➵➶➷➸➹➺➻➼➽➾➿⬀⬁⬂⬃⬄⬅⬆⬇⬈⬉⬊⬋⬌⬍⬎⬏⬐⬑⬒⬓⬔⬕⬖⬗⬘⬙⬚⬛⬜⬝⬞⬟⬠⬡⬢⬣⬤⬥⬦⬧⬨⬩⬪⬫⬬⬭⬮⬯⬰⬱⬲⬳⬴⬵⬶⬷⬸⬹⬺⬻⬼⬽⬾⬿⭀⭁⭂⭃⭄⭅⭆⭇⭈⭉⭊⭋⭌⭐⭑⭒⭓⭔⭕⭖⭗⭘⭙₮〠〶ↀↁↂ₭〇〄㉿〆₯ℂ℄"
),
SymbolNode(
catMusicSymbols,
symbols:
"𝄀𝄁𝄂𝄃𝄄𝄅𝄆𝄇𝄈𝄉𝄊𝄋𝄌𝄍𝄎𝄏𝄐𝄑𝄒𝄓𝄔𝄕𝄖𝄗𝄘𝄙𝄚𝄛𝄜𝄝𝄞𝄟𝄠𝄡𝄢𝄣𝄤𝄥𝄦𝄩𝄪𝄫𝄬𝄭𝄮𝄯𝄰𝄱𝄲𝄳𝄴𝄵𝄶𝄷𝄸𝄹𝄺𝄻𝄼𝄽𝄾𝄿𝅀𝅁𝅂𝅃𝅄𝅅𝅆𝅇𝅈𝅉𝅊𝅋𝅌𝅍𝅎𝅏𝅐𝅑𝅒𝅓𝅔𝅕𝅖𝅗𝅗𝅥𝅘𝅘𝅥𝅘𝅥𝅮𝅘𝅥𝅯𝅘𝅥𝅰𝅘𝅥𝅱𝅘𝅧𝅨𝅩𝅥𝅲𝅥𝅦𝅙𝅚𝅛𝅜𝅝𝅪𝅫𝅬𝅮𝅯𝅰𝅱𝅲𝅭𝅳𝅴𝅵𝅶𝅷𝅸𝅹𝅺𝅻𝅼𝅽𝅾𝅿𝆀𝆁𝆂𝆃𝆄𝆊𝆋𝆅𝆆𝆇𝆈𝆉𝆌𝆍𝆎𝆏𝆐𝆑𝆒𝆓𝆔𝆕𝆖𝆗𝆘𝆙𝆚𝆛𝆜𝆝𝆞𝆟𝆠𝆡𝆢𝆣𝆤𝆥𝆦𝆧𝆨𝆩𝆪𝆫𝆬𝆭𝆮𝆯𝆰𝆱𝆲𝆳𝆴𝆵𝆶𝆷𝆸𝆹𝆹𝅥𝆹𝅥𝅮𝆹𝅥𝅯𝆺𝆺𝅥𝆺𝅥𝅮𝆺𝅥𝅯𝇁𝇂𝇃𝇄𝇅𝇆𝇇𝇈𝇉𝇊𝇋𝇌𝇍𝇎𝇏𝇐𝇑𝇒𝇓𝇔𝇕𝇖𝇗𝇘𝇙𝇚𝇛𝇜𝇝𝇞𝇟𝇠𝇡𝇢𝇣𝇤𝇥𝇦𝇧𝇨"
),
SymbolNode(catCircledKanjis, symbols: "㊊㊋㊌㊍㊎㊏㊐㊑㊒㊓㊔㊕㊖㊗︎㊘㊙︎㊚㊛㊜㊝㊞㊟㊠㊡㊢㊣㊤㊥㊦㊧㊨㊩㊪㊫㊬㊭㊮㊯㊰㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉🈚︎🈯︎"),
SymbolNode(
catCircledKataKana, symbols: "㋐㋑㋒㋓㋔㋕㋖㋗㋘㋙㋚㋛㋜㋝㋞㋟㋠㋡㋢㋣㋤㋥㋦㋧㋨㋩㋪㋫㋬㋭㋮㋯㋰㋱㋲㋳㋴㋵㋶㋷㋸㋹㋺㋻㋼㋽㋾"
), ),
SymbolNode(catBracketKanjis, symbols: "㈪㈫㈬㈭㈮㈯㈰㈱㈲㈳㈴㈵㈶㈷㈸㈹㈺㈻㈼㈽㈾㈿㉀㉁㉂㉃"), SymbolNode(catBracketKanjis, symbols: "㈪㈫㈬㈭㈮㈯㈰㈱㈲㈳㈴㈵㈶㈷㈸㈹㈺㈻㈼㈽㈾㈿㉀㉁㉂㉃"),
SymbolNode(catSingleTableLines, symbols: "├─┼┴┬┤┌┐╞═╪╡│▕└┘╭╮╰╯"), SymbolNode(catSingleTableLines, symbols: "─│┌┐└┕┘├┤┬┴┼═╞╡╪╭╮╯╰▕"),
SymbolNode(catDoubleTableLines, symbols: "╔╦╗╠═╬╣╓╥╖╒╤╕║╚╩╝╟╫╢╙╨╜╞╪╡╘╧╛"), SymbolNode(catDoubleTableLines, symbols: "═║╒╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡╢╣╤╥╦╧╨╩╪╫╬"),
SymbolNode(catFillingBlocks, symbols: "_ˍ▁▂▃▄▅▆▇█▏▎▍▌▋▊▉◢◣◥◤"), SymbolNode(catFillingBlocks, symbols: "_ˍ▁▂▃▄▅▆▇█▏▎▍▌▋▊▉◢◣◥◤"),
SymbolNode(catLineSegments, symbols: "﹣﹦≡|∣∥–︱—︳╴¯ ̄﹉﹊﹍﹎﹋﹌﹏︴∕﹨╱╲/\"), SymbolNode(catLineSegments, symbols: "﹣﹦≡|∣∥–︱—︳╴¯ ̄﹉﹊﹍﹎﹋﹌﹏︴∕﹨╱╲/\ˍ━┃▕〓╳∏ˆ⌒┄┅┆┇┈┉┊┋"),
SymbolNode(
catKana,
symbols:
"ぁあぃいぅうゔぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばひびふぶへべほぼまみむめもゃやゅゆょよらら゚りり゚るる゚れれ゚ろろ゚ゎわわ゙ゐゐ゙ゑゑ゙をを゙んゕゖゝゞゟ〻゠ァアィイゥウヴェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨララ゚リリ゚ルル゚レレ゚ロロ゚ヮワヷヰヸヱヹヲヺンヵヶ・ーヽヾヿ々ㇰㇱㇲㇳㇴㇵㇶㇷㇸㇹㇺㇻㇼㇽㇾㇿ・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン ゙ ゚〲〱〳〴〵"
),
SymbolNode(
catCombinations,
symbols:
"㍘㍙㍚㍛㍜㍝㍞㍟㍠㍡㍢㍣㍤㍥㍦㍧㍨㍩㍪㍫㍬㍭㍮㍯㍰㏠㏡㏢㏣㏤㏥㏦㏧㏨㏩㏪㏫㏬㏭㏮㏯㏰㏱㏲㏳㏴㏵㏶㏷㏸㏹㏺㏻㏼㏽㏾㍱㍲㍳㍴㍵㍶㍷㍸㍹㍺㎀㎁㎂㎃㎄㎅㎆㎇㎈㎉㎊㎋㎌㎍㎎㎏㎐㎑㎒㎓㎔㎕㎖㎗㎘㎙㎚㎛㎜㎝㎞㎟㎠㎡㎢㎣㎤㎥㎦㎧㎨㎩㎪㎫㎬㎭㎮㎯㎰㎱㎲㎳㎴㎵㎶㎷㎸㎹㎺㎻㎼㎽㎾㎿㏀㏁㏂㏃㏄㏅㏆㏇㏈㏉㏊㏋㏌㏍㏎㏏㏐㏑㏒㏓㏔㏕㏖㏗㏘㏙㏚㏛㏜㏝㏞㏟㏿㋿㍼㍽㍾㍻㍿㌀㌁㌂㌃㌄㌅㌆㌇㌈㌉㌊㌋㌌㌍㌎㌏㌐㌑㌒㌓㌔㌕㌖㌗㌘㌙㌚㌛㌜㌝㌞㌟㌠㌡㌢㌣㌤㌥㌦㌧㌨㌩㌪㌫㌬㌭㌮㌯㌰㌱㌲㌳㌴㌵㌶㌷㌸㌹㌺㌻㌼㌽㌾㌿㍀㍁㍂㍃㍄㍅㍆㍇㍈㍉㍊㍋㍌㍍㍎㍏㍐㍑㍒㍓㍔㍕㍖㍗"
),
SymbolNode(
catPhonabets, symbols: "ㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦㄧㄨㄩㄪㄫㄬㄭㄮㄯㆵㆠㆡㆢㆣㆤㆥㆦㆧㆨㆩㆪㆫㆬㆭㆮㆯㆰㆱㆲㆳㆴㆶㆷㆸㆹㆺㆻㆼㆽㆾㆿ˙ˊˇˋ˪˫"
),
SymbolNode(
catCircledASCII,
symbols:
"①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳ⒶⒷⒸⒹⒺⒻⒼⒽⒾⒿⓀⓁⓂⓂ︎ⓃⓄⓅⓆⓇⓈⓉⓊⓋⓌⓍⓎⓏⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ⓪⓫⓬⓭⓮⓯⓰⓱⓲⓳⓴⓵⓶⓷⓸⓹⓺⓻⓼⓽⓾⓿❶❷❸❹❺❻❼❽❾❿➀➁➂➃➄➅➆➇➈➉➊➋➌➍➎➏➐➑➒➓🄰🄱🄲🄳🄴🄵🄶🄷🄸🄹🄺🄻🄼🄽🄾🄿🅀🅁🅂🅃🅄🅅🅆🅇🅈🅉🅐🅑🅒🅓🅔🅕🅖🅗🅘🅙🅚🅛🅜🅝🅞🅟🅠🅡🅢🅣🅤🅥🅦🅧🅨🅩🅰🅱🅲🅳🅴🅵🅶🅷🅸🅹🅺🅻🅼🅽🅾🅿︎🆀🆁🆂🆃🆄🆅🆆🆇🆈🆉"
),
SymbolNode(catBracketedASCII, symbols: "⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵🄐🄑🄒🄓🄔🄕🄖🄗🄘🄙🄚🄛🄜🄝🄞🄟🄠🄡🄢🄣🄤🄥🄦🄧🄨🄩"),
SymbolNode(
catThai,
symbols: [
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
]
),
SymbolNode(
catYi,
symbols:
"ꀀꀁꀂꀃꀄꀅꀆꀇꀈꀉꀊꀋꀌꀍꀎꀏꀐꀑꀒꀓꀔꀕꀖꀗꀘꀙꀚꀛꀜꀝꀞꀟꀠꀡꀢꀣꀤꀥꀦꀧꀨꀩꀪꀫꀬꀭꀮꀯꀰꀱꀲꀳꀴꀵꀶꀷꀸꀹꀺꀻꀼꀽꀾꀿꁀꁁꁂꁃꁄꁅꁆꁇꁈꁉꁊꁋꁌꁍꁎꁏꁐꁑꁒꁓꁔꁕꁖꁗꁘꁙꁚꁛꁜꁝꁞꁟꁠꁡꁢꁣꁤꁥꁦꁧꁨꁩꁪꁫꁬꁭꁮꁯꁰꁱꁲꁳꁴꁵꁶꁷꁸꁹꁺꁻꁼꁽꁾꁿꂀꂁꂂꂃꂄꂅꂆꂇꂈꂉꂊꂋꂌꂍꂎꂏꂐꂑꂒꂓꂔꂕꂖꂗꂘꂙꂚꂛꂜꂝꂞꂟꂠꂡꂢꂣꂤꂥꂦꂧꂨꂩꂪꂫꂬꂭꂮꂯꂰꂱꂲꂳꂴꂵꂶꂷꂸꂹꂺꂻꂼꂽꂾꂿꃀꃁꃂꃃꃄꃅꃆꃇꃈꃉꃊꃋꃌꃍꃎꃏꃐꃑꃒꃓꃔꃕꃖꃗꃘꃙꃚꃛꃜꃝꃞꃟꃠꃡꃢꃣꃤꃥꃦꃧꃨꃩꃪꃫꃬꃭꃮꃯꃰꃱꃲꃳꃴꃵꃶꃷꃸꃹꃺꃻꃼꃽꃾꃿꄀꄁꄂꄃꄄꄅꄆꄇꄈꄉꄊꄋꄌꄍꄎꄏꄐꄑꄒꄓꄔꄕꄖꄗꄘꄙꄚꄛꄜꄝꄞꄟꄠꄡꄢꄣꄤꄥꄦꄧꄨꄩꄪꄫꄬꄭꄮꄯꄰꄱꄲꄳꄴꄵꄶꄷꄸꄹꄺꄻꄼꄽꄾꄿꅀꅁꅂꅃꅄꅅꅆꅇꅈꅉꅊꅋꅌꅍꅎꅏꅐꅑꅒꅓꅔꅕꅖꅗꅘꅙꅚꅛꅜꅝꅞꅟꅠꅡꅢꅣꅤꅥꅦꅧꅨꅩꅪꅫꅬꅭꅮꅯꅰꅱꅲꅳꅴꅵꅶꅷꅸꅹꅺꅻꅼꅽꅾꅿꆀꆁꆂꆃꆄꆅꆆꆇꆈꆉꆊꆋꆌꆍꆎꆏꆐꆑꆒꆓꆔꆕꆖꆗꆘꆙꆚꆛꆜꆝꆞꆟꆠꆡꆢꆣꆤꆥꆦꆧꆨꆩꆪꆫꆬꆭꆮꆯꆰꆱꆲꆳꆴꆵꆶꆷꆸꆹꆺꆻꆼꆽꆾꆿꇀꇁꇂꇃꇄꇅꇆꇇꇈꇉꇊꇋꇌꇍꇎꇏꇐꇑꇒꇓꇔꇕꇖꇗꇘꇙꇚꇛꇜꇝꇞꇟꇠꇡꇢꇣꇤꇥꇦꇧꇨꇩꇪꇫꇬꇭꇮꇯꇰꇱꇲꇳꇴꇵꇶꇷꇸꇹꇺꇻꇼꇽꇾꇿꈀꈁꈂꈃꈄꈅꈆꈇꈈꈉꈊꈋꈌꈍꈎꈏꈐꈑꈒꈓꈔꈕꈖꈗꈘꈙꈚꈛꈜꈝꈞꈟꈠꈡꈢꈣꈤꈥꈦꈧꈨꈩꈪꈫꈬꈭꈮꈯꈰꈱꈲꈳꈴꈵꈶꈷꈸꈹꈺꈻꈼꈽꈾꈿꉀꉁꉂꉃꉄꉅꉆꉇꉈꉉꉊꉋꉌꉍꉎꉏꉐꉑꉒꉓꉔꉕꉖꉗꉘꉙꉚꉛꉜꉝꉞꉟꉠꉡꉢꉣꉤꉥꉦꉧꉨꉩꉪꉫꉬꉭꉮꉯꉰꉱꉲꉳꉴꉵꉶꉷꉸꉹꉺꉻꉼꉽꉾꉿꊀꊁꊂꊃꊄꊅꊆꊇꊈꊉꊊꊋꊌꊍꊎꊏꊐꊑꊒꊓꊔꊕꊖꊗꊘꊙꊚꊛꊜꊝꊞꊟꊠꊡꊢꊣꊤꊥꊦꊧꊨꊩꊪꊫꊬꊭꊮꊯꊰꊱꊲꊳꊴꊵꊶꊷꊸꊹꊺꊻꊼꊽꊾꊿꋀꋁꋂꋃꋄꋅꋆꋇꋈꋉꋊꋋꋌꋍꋎꋏꋐꋑꋒꋓꋔꋕꋖꋗꋘꋙꋚꋛꋜꋝꋞꋟꋠꋡꋢꋣꋤꋥꋦꋧꋨꋩꋪꋫꋬꋭꋮꋯꋰꋱꋲꋳꋴꋵꋶꋷꋸꋹꋺꋻꋼꋽꋾꋿꌀꌁꌂꌃꌄꌅꌆꌇꌈꌉꌊꌋꌌꌍꌎꌏꌐꌑꌒꌓꌔꌕꌖꌗꌘꌙꌚꌛꌜꌝꌞꌟꌠꌡꌢꌣꌤꌥꌦꌧꌨꌩꌪꌫꌬꌭꌮꌯꌰꌱꌲꌳꌴꌵꌶꌷꌸꌹꌺꌻꌼꌽꌾꌿꍀꍁꍂꍃꍄꍅꍆꍇꍈꍉꍊꍋꍌꍍꍎꍏꍐꍑꍒꍓꍔꍕꍖꍗꍘꍙꍚꍛꍜꍝꍞꍟꍠꍡꍢꍣꍤꍥꍦꍧꍨꍩꍪꍫꍬꍭꍮꍯꍰꍱꍲꍳꍴꍵꍶꍷꍸꍹꍺꍻꍼꍽꍾꍿꎀꎁꎂꎃꎄꎅꎆꎇꎈꎉꎊꎋꎌꎍꎎꎏꎐꎑꎒꎓꎔꎕꎖꎗꎘꎙꎚꎛꎜꎝꎞꎟꎠꎡꎢꎣꎤꎥꎦꎧꎨꎩꎪꎫꎬꎭꎮꎯꎰꎱꎲꎳꎴꎵꎶꎷꎸꎹꎺꎻꎼꎽꎾꎿꏀꏁꏂꏃꏄꏅꏆꏇꏈꏉꏊꏋꏌꏍꏎꏏꏐꏑꏒꏓꏔꏕꏖꏗꏘꏙꏚꏛꏜꏝꏞꏟꏠꏡꏢꏣꏤꏥꏦꏧꏨꏩꏪꏫꏬꏭꏮꏯꏰꏱꏲꏳꏴꏵꏶꏷꏸꏹꏺꏻꏼꏽꏾꏿꐀꐁꐂꐃꐄꐅꐆꐇꐈꐉꐊꐋꐌꐍꐎꐏꐐꐑꐒꐓꐔꐕꐖꐗꐘꐙꐚꐛꐜꐝꐞꐟꐠꐡꐢꐣꐤꐥꐦꐧꐨꐩꐪꐫꐬꐭꐮꐯꐰꐱꐲꐳꐴꐵꐶꐷꐸꐹꐺꐻꐼꐽꐾꐿꑀꑁꑂꑃꑄꑅꑆꑇꑈꑉꑊꑋꑌꑍꑎꑏꑐꑑꑒꑓꑔꑕꑖꑗꑘꑙꑚꑛꑜꑝꑞꑟꑠꑡꑢꑣꑤꑥꑦꑧꑨꑩꑪꑫꑬꑭꑮꑯꑰꑱꑲꑳꑴꑵꑶꑷꑸꑹꑺꑻꑼꑽꑾꑿꒀꒁꒂꒃꒄꒅꒆꒇꒈꒉꒊꒋꒌ꒐꒑꒒꒓꒔꒕꒖꒗꒘꒙꒚꒛꒜꒝꒞꒟꒠꒡꒢꒣꒤꒥꒦꒧꒨꒩꒪꒫꒬꒭꒮꒯꒰꒱꒲꒳꒴꒵꒶꒷꒸꒹꒺꒻꒼꒽꒾꒿꓀꓁꓂꓃꓄꓅꓆"
),
] ]
) )
} }

View File

@ -32,7 +32,7 @@ extension vChewing {
) { ) {
// //
guard !walkedAfter.isEmpty, !walkedBefore.isEmpty else { return } guard !walkedAfter.isEmpty, !walkedBefore.isEmpty else { return }
guard walkedBefore.totalReadingsCount == walkedAfter.totalReadingsCount else { return } guard walkedBefore.totalKeyCount == walkedAfter.totalKeyCount else { return }
// //
var actualCursor = 0 var actualCursor = 0
guard let currentNode = walkedAfter.findNode(at: cursor, target: &actualCursor) else { return } guard let currentNode = walkedAfter.findNode(at: cursor, target: &actualCursor) else { return }
@ -213,18 +213,6 @@ extension vChewing.LMUserOverride {
} }
} }
// MARK: - Array Extensions.
extension Array where Element == Megrez.Compositor.Node {
public var totalReadingsCount: Int {
var counter = 0
for node in self {
counter += node.keyArray.count
}
return counter
}
}
// MARK: - Private Methods // MARK: - Private Methods
extension vChewing.LMUserOverride { extension vChewing.LMUserOverride {

View File

@ -140,6 +140,43 @@ extension Array where Element == Megrez.Compositor.Node {
/// ///
public var keys: [String] { map(\.key) } public var keys: [String] { map(\.key) }
/// (Result A, Result B)
/// Result A Result B
public var nodeBorderPointDictPair: ([Int: Int], [Int: Int]) {
// Result A Result B
var resultA = [Int: Int]()
var resultB = [Int: Int]()
var i = 0
for (j, neta) in enumerated() {
resultA[j] = i
neta.keyArray.forEach { _ in
resultB[i] = j
i += 1
}
}
resultA[resultA.count] = i
resultB[i] = resultB.count
return (resultA, resultB)
}
///
public var totalKeyCount: Int { map(\.keyArray.count).reduce(0, +) }
///
/// - Parameter cursor:
public func contextRange(ofGivenCursor cursor: Int) -> Range<Int> {
guard !isEmpty else { return 0..<0 }
let lastSpanningLength = reversed()[0].keyArray.count
var nilReturn = (totalKeyCount - lastSpanningLength)..<totalKeyCount
if cursor >= totalKeyCount { return nilReturn } //
let cursor = Swift.max(0, cursor) //
nilReturn = cursor..<cursor
guard let rearNodeID = nodeBorderPointDictPair.1[cursor] else { return nilReturn } // nilReturn
guard let rearIndex = nodeBorderPointDictPair.0[rearNodeID] else { return nilReturn } // nilReturn
guard let frontIndex = nodeBorderPointDictPair.0[rearNodeID + 1] else { return nilReturn } // nilReturn
return rearIndex..<frontIndex
}
/// ///
/// - Parameters: /// - Parameters:
/// - cursor: /// - cursor:
@ -147,30 +184,11 @@ extension Array where Element == Megrez.Compositor.Node {
/// - Returns: /// - Returns:
public func findNode(at cursor: Int, target outCursorPastNode: inout Int) -> Megrez.Compositor.Node? { public func findNode(at cursor: Int, target outCursorPastNode: inout Int) -> Megrez.Compositor.Node? {
guard !isEmpty else { return nil } guard !isEmpty else { return nil }
let cursor = Swift.max(0, Swift.min(cursor, keys.count)) let cursor = Swift.min(Swift.max(0, cursor), totalKeyCount - 1) //
let range = contextRange(ofGivenCursor: cursor)
if cursor == 0, let theFirst = first { outCursorPastNode = range.upperBound
outCursorPastNode = theFirst.spanLength guard let rearNodeID = nodeBorderPointDictPair.1[cursor] else { return nil }
return theFirst return count - 1 >= rearNodeID ? self[rearNodeID] : nil
}
//
if cursor >= keys.count - 1, let theLast = last {
outCursorPastNode = keys.count
return theLast
}
var accumulated = 0
for neta in self {
accumulated += neta.spanLength
if accumulated > cursor {
outCursorPastNode = accumulated
return neta
}
}
//
return nil
} }
/// ///

View File

@ -17,7 +17,7 @@ struct suiPrefPaneDevZone: View {
@State private var selShouldAlwaysUseShiftKeyAccommodation: Bool = UserDefaults.standard.bool( @State private var selShouldAlwaysUseShiftKeyAccommodation: Bool = UserDefaults.standard.bool(
forKey: UserDef.kShouldAlwaysUseShiftKeyAccommodation.rawValue) forKey: UserDef.kShouldAlwaysUseShiftKeyAccommodation.rawValue)
private let contentMaxHeight: Double = 430 private let contentMaxHeight: Double = 432
private let contentWidth: Double = { private let contentWidth: Double = {
switch mgrPrefs.appleLanguages[0] { switch mgrPrefs.appleLanguages[0] {
case "ja": case "ja":

View File

@ -27,8 +27,10 @@ struct suiPrefPaneDictionary: View {
forKey: UserDef.kUseFixecCandidateOrderOnSelection.rawValue) forKey: UserDef.kUseFixecCandidateOrderOnSelection.rawValue)
@State private var selConsolidateContextOnCandidateSelection: Bool = UserDefaults.standard.bool( @State private var selConsolidateContextOnCandidateSelection: Bool = UserDefaults.standard.bool(
forKey: UserDef.kConsolidateContextOnCandidateSelection.rawValue) forKey: UserDef.kConsolidateContextOnCandidateSelection.rawValue)
@State private var selHardenVerticalPunctuations: Bool = UserDefaults.standard.bool(
forKey: UserDef.kHardenVerticalPunctuations.rawValue)
private let contentMaxHeight: Double = 430 private let contentMaxHeight: Double = 432
private let contentWidth: Double = { private let contentWidth: Double = {
switch mgrPrefs.appleLanguages[0] { switch mgrPrefs.appleLanguages[0] {
case "ja": case "ja":
@ -112,7 +114,8 @@ struct suiPrefPaneDictionary: View {
mgrPrefs.shouldAutoReloadUserDataFiles = selAutoReloadUserData mgrPrefs.shouldAutoReloadUserDataFiles = selAutoReloadUserData
} }
).controlSize(.small) ).controlSize(.small)
Divider() }
Preferences.Section(title: "") {
Toggle( Toggle(
LocalizedStringKey("Enable CNS11643 Support (2022-08-02)"), LocalizedStringKey("Enable CNS11643 Support (2022-08-02)"),
isOn: $selEnableCNS11643.onChange { isOn: $selEnableCNS11643.onChange {
@ -151,6 +154,24 @@ struct suiPrefPaneDictionary: View {
mgrPrefs.consolidateContextOnCandidateSelection = selConsolidateContextOnCandidateSelection mgrPrefs.consolidateContextOnCandidateSelection = selConsolidateContextOnCandidateSelection
} }
) )
Text(
LocalizedStringKey(
"For example: When typing “章太炎” and you want to override the “太” with “泰”, and the raw operation index range [1,2) which bounds are cutting the current node “章太炎” in range [0,3). If having lack of the pre-consolidation process, this word will become something like “張泰言” after the candidate selection. Only if we enable this consolidation, this word will become “章泰炎” which is the expected result that the context is kept as-is."
)
)
.preferenceDescription().fixedSize(horizontal: false, vertical: true)
Toggle(
LocalizedStringKey("Harden vertical punctuations during vertical typing (not recommended)"),
isOn: $selHardenVerticalPunctuations.onChange {
mgrPrefs.hardenVerticalPunctuations = selHardenVerticalPunctuations
}
)
Text(
LocalizedStringKey(
"⚠︎ This feature is useful ONLY WHEN the font you are using doesn't support dynamic vertical punctuations. However, typed vertical punctuations will always shown as vertical punctuations EVEN IF your editor has changed the typing direction to horizontal."
)
)
.preferenceDescription().fixedSize(horizontal: false, vertical: true)
} }
} }
} }

View File

@ -42,7 +42,7 @@ struct suiPrefPaneExperience: View {
@State private var selSpecifyShiftBackSpaceKeyBehavior = UserDefaults.standard.integer( @State private var selSpecifyShiftBackSpaceKeyBehavior = UserDefaults.standard.integer(
forKey: UserDef.kSpecifyShiftBackSpaceKeyBehavior.rawValue) forKey: UserDef.kSpecifyShiftBackSpaceKeyBehavior.rawValue)
private let contentMaxHeight: Double = 430 private let contentMaxHeight: Double = 432
private let contentWidth: Double = { private let contentWidth: Double = {
switch mgrPrefs.appleLanguages[0] { switch mgrPrefs.appleLanguages[0] {
case "ja": case "ja":

View File

@ -37,7 +37,7 @@ struct suiPrefPaneGeneral: View {
forKey: UserDef.kCheckUpdateAutomatically.rawValue) forKey: UserDef.kCheckUpdateAutomatically.rawValue)
@State private var selEnableDebugMode = UserDefaults.standard.bool(forKey: UserDef.kIsDebugModeEnabled.rawValue) @State private var selEnableDebugMode = UserDefaults.standard.bool(forKey: UserDef.kIsDebugModeEnabled.rawValue)
private let contentMaxHeight: Double = 430 private let contentMaxHeight: Double = 432
private let contentWidth: Double = { private let contentWidth: Double = {
switch mgrPrefs.appleLanguages[0] { switch mgrPrefs.appleLanguages[0] {
case "ja": case "ja":

View File

@ -28,7 +28,7 @@ struct suiPrefPaneKeyboard: View {
@State private var selUsingHotKeyCurrencyNumerals = UserDefaults.standard.bool( @State private var selUsingHotKeyCurrencyNumerals = UserDefaults.standard.bool(
forKey: UserDef.kUsingHotKeyCurrencyNumerals.rawValue) forKey: UserDef.kUsingHotKeyCurrencyNumerals.rawValue)
private let contentMaxHeight: Double = 430 private let contentMaxHeight: Double = 432
private let contentWidth: Double = { private let contentWidth: Double = {
switch mgrPrefs.appleLanguages[0] { switch mgrPrefs.appleLanguages[0] {
case "ja": case "ja":

View File

@ -71,7 +71,8 @@
"catCommonSymbols" = "CommonSymbols"; "catCommonSymbols" = "CommonSymbols";
"catHoriBrackets" = "HorizontalBrackets"; "catHoriBrackets" = "HorizontalBrackets";
"catVertBrackets" = "VerticalBrackets"; "catVertBrackets" = "VerticalBrackets";
"catGreekLetters" = "GreekLetters"; "catAlphabets" = "Alphabets";
"catSpecialNumbers" = "SpecialNumbers";
"catMathSymbols" = "MathSymbols"; "catMathSymbols" = "MathSymbols";
"catCurrencyUnits" = "CurrencyUnits"; "catCurrencyUnits" = "CurrencyUnits";
"catSpecialSymbols" = "SpecialSymbols"; "catSpecialSymbols" = "SpecialSymbols";
@ -83,6 +84,14 @@
"catDoubleTableLines" = "DoubleTableLines"; "catDoubleTableLines" = "DoubleTableLines";
"catFillingBlocks" = "FillingBlocks"; "catFillingBlocks" = "FillingBlocks";
"catLineSegments" = "LineSegments"; "catLineSegments" = "LineSegments";
"catKana" = "Kana";
"catCombinations" = "Combinations";
"catPhonabets" = "Phonabets";
"catCircledASCII" = "CircledASCII";
"catBracketedASCII" = "BracketASCII";
"catMusicSymbols" = "MusicSymbols";
"catThai" = "Thaiphabets";
"catYi" = "Yiphabets";
// SwiftUI Preferences // SwiftUI Preferences
"(Shift+)Space:" = "(Shift+)Space:"; "(Shift+)Space:" = "(Shift+)Space:";
@ -148,6 +157,8 @@
"for cycling pages" = "for cycling pages"; "for cycling pages" = "for cycling pages";
"General" = "General"; "General" = "General";
"Hanyu Pinyin with Numeral Intonation" = "Hanyu Pinyin with Numeral Intonation"; "Hanyu Pinyin with Numeral Intonation" = "Hanyu Pinyin with Numeral Intonation";
"Harden vertical punctuations during vertical typing (not recommended)" = "Harden vertical punctuations during vertical typing (not recommended)";
"⚠︎ This feature is useful ONLY WHEN the font you are using doesn't support dynamic vertical punctuations. However, typed vertical punctuations will always shown as vertical punctuations EVEN IF your editor has changed the typing direction to horizontal." = "⚠︎ This feature is useful ONLY WHEN the font you are using doesn't support dynamic vertical punctuations. However, typed vertical punctuations will always shown as vertical punctuations EVEN IF your editor has changed the typing direction to horizontal.";
"Horizontal" = "Horizontal"; "Horizontal" = "Horizontal";
"Hsu" = "Hsu"; "Hsu" = "Hsu";
"Hualuo Pinyin with Numeral Intonation" = "Hualuo Pinyin with Numeral Intonation"; "Hualuo Pinyin with Numeral Intonation" = "Hualuo Pinyin with Numeral Intonation";
@ -194,4 +205,5 @@
"Use Shift Key Accommodation in all cases" = "Use Shift Key Accommodation in all cases"; "Use Shift Key Accommodation in all cases" = "Use Shift Key Accommodation in all cases";
"Vertical" = "Vertical"; "Vertical" = "Vertical";
"Warning: This page is for testing future features. \nFeatures listed here may not work as expected." = "Warning: This page is for testing future features. \nFeatures listed here may not work as expected."; "Warning: This page is for testing future features. \nFeatures listed here may not work as expected." = "Warning: This page is for testing future features. \nFeatures listed here may not work as expected.";
"For example: When typing “章太炎” and you want to override the “太” with “泰”, and the raw operation index range [1,2) which bounds are cutting the current node “章太炎” in range [0,3). If having lack of the pre-consolidation process, this word will become something like “張泰言” after the candidate selection. Only if we enable this consolidation, this word will become “章泰炎” which is the expected result that the context is kept as-is." = "For example: When typing “章太炎” and you want to override the “太” with “泰”, and the raw operation index range [1,2) which bounds are cutting the current node “章太炎” in range [0,3). If having lack of the pre-consolidation process, this word will become something like “張泰言” after the candidate selection. Only if we enable this consolidation, this word will become “章泰炎” which is the expected result that the context is kept as-is.";
"Yale Pinyin with Numeral Intonation" = "Yale Pinyin with Numeral Intonation"; "Yale Pinyin with Numeral Intonation" = "Yale Pinyin with Numeral Intonation";

View File

@ -71,7 +71,8 @@
"catCommonSymbols" = "CommonSymbols"; "catCommonSymbols" = "CommonSymbols";
"catHoriBrackets" = "HorizontalBrackets"; "catHoriBrackets" = "HorizontalBrackets";
"catVertBrackets" = "VerticalBrackets"; "catVertBrackets" = "VerticalBrackets";
"catGreekLetters" = "GreekLetters"; "catAlphabets" = "Alphabets";
"catSpecialNumbers" = "SpecialNumbers";
"catMathSymbols" = "MathSymbols"; "catMathSymbols" = "MathSymbols";
"catCurrencyUnits" = "CurrencyUnits"; "catCurrencyUnits" = "CurrencyUnits";
"catSpecialSymbols" = "SpecialSymbols"; "catSpecialSymbols" = "SpecialSymbols";
@ -83,6 +84,14 @@
"catDoubleTableLines" = "DoubleTableLines"; "catDoubleTableLines" = "DoubleTableLines";
"catFillingBlocks" = "FillingBlocks"; "catFillingBlocks" = "FillingBlocks";
"catLineSegments" = "LineSegments"; "catLineSegments" = "LineSegments";
"catKana" = "Kana";
"catCombinations" = "Combinations";
"catPhonabets" = "Phonabets";
"catCircledASCII" = "CircledASCII";
"catBracketedASCII" = "BracketASCII";
"catMusicSymbols" = "MusicSymbols";
"catThai" = "Thaiphabets";
"catYi" = "Yiphabets";
// SwiftUI Preferences // SwiftUI Preferences
"(Shift+)Space:" = "(Shift+)Space:"; "(Shift+)Space:" = "(Shift+)Space:";
@ -148,6 +157,8 @@
"for cycling pages" = "for cycling pages"; "for cycling pages" = "for cycling pages";
"General" = "General"; "General" = "General";
"Hanyu Pinyin with Numeral Intonation" = "Hanyu Pinyin with Numeral Intonation"; "Hanyu Pinyin with Numeral Intonation" = "Hanyu Pinyin with Numeral Intonation";
"Harden vertical punctuations during vertical typing (not recommended)" = "Harden vertical punctuations during vertical typing (not recommended)";
"⚠︎ This feature is useful ONLY WHEN the font you are using doesn't support dynamic vertical punctuations. However, typed vertical punctuations will always shown as vertical punctuations EVEN IF your editor has changed the typing direction to horizontal." = "⚠︎ This feature is useful ONLY WHEN the font you are using doesn't support dynamic vertical punctuations. However, typed vertical punctuations will always shown as vertical punctuations EVEN IF your editor has changed the typing direction to horizontal.";
"Horizontal" = "Horizontal"; "Horizontal" = "Horizontal";
"Hsu" = "Hsu"; "Hsu" = "Hsu";
"Hualuo Pinyin with Numeral Intonation" = "Hualuo Pinyin with Numeral Intonation"; "Hualuo Pinyin with Numeral Intonation" = "Hualuo Pinyin with Numeral Intonation";
@ -194,4 +205,5 @@
"Use Shift Key Accommodation in all cases" = "Use Shift Key Accommodation in all cases"; "Use Shift Key Accommodation in all cases" = "Use Shift Key Accommodation in all cases";
"Vertical" = "Vertical"; "Vertical" = "Vertical";
"Warning: This page is for testing future features. \nFeatures listed here may not work as expected." = "Warning: This page is for testing future features. \nFeatures listed here may not work as expected."; "Warning: This page is for testing future features. \nFeatures listed here may not work as expected." = "Warning: This page is for testing future features. \nFeatures listed here may not work as expected.";
"For example: When typing “章太炎” and you want to override the “太” with “泰”, and the raw operation index range [1,2) which bounds are cutting the current node “章太炎” in range [0,3). If having lack of the pre-consolidation process, this word will become something like “張泰言” after the candidate selection. Only if we enable this consolidation, this word will become “章泰炎” which is the expected result that the context is kept as-is." = "For example: When typing “章太炎” and you want to override the “太” with “泰”, and the raw operation index range [1,2) which bounds are cutting the current node “章太炎” in range [0,3). If having lack of the pre-consolidation process, this word will become something like “張泰言” after the candidate selection. Only if we enable this consolidation, this word will become “章泰炎” which is the expected result that the context is kept as-is.";
"Yale Pinyin with Numeral Intonation" = "Yale Pinyin with Numeral Intonation"; "Yale Pinyin with Numeral Intonation" = "Yale Pinyin with Numeral Intonation";

View File

@ -30,7 +30,7 @@
"\"%@\" length must ≥ 2 for a user phrase." = "「%@」もう1つ文字のお選びを。"; "\"%@\" length must ≥ 2 for a user phrase." = "「%@」もう1つ文字のお選びを。";
"\"%@\" length should ≤ %d for a user phrase." = "「%@」文字数過剰で登録不可、%d 文字以内にして下さい。"; "\"%@\" length should ≤ %d for a user phrase." = "「%@」文字数過剰で登録不可、%d 文字以内にして下さい。";
"\"%@\" selected. ENTER to add user phrase." = "「%@」を ENTER で辞書に登録。"; "\"%@\" selected. ENTER to add user phrase." = "「%@」を ENTER で辞書に登録。";
"\"%@\" already exists: ENTER to boost, SHIFT+COMMAND+ENTER to nerf, \n BackSpace or Delete key to exclude." = "「%@」は既存語彙ENTER で最優先にし、SHIFT+COMMAND+ENTER で優先順位を下げる;\n BackSpace 或いは Delete で排除。"; "\"%@\" already exists: ENTER to boost, SHIFT+COMMAND+ENTER to nerf, \n BackSpace or Delete key to exclude." = "「%@」は既存語彙ENTER で最優先にし、SHIFT+COMMAND+ENTER で優先順位を下げる;\n BackSpace 或いは Delete で排除。";
"Edit Phrase Replacement Table…" = "言葉置換表を編集…"; "Edit Phrase Replacement Table…" = "言葉置換表を編集…";
"Use Phrase Replacement" = "言葉置換機能"; "Use Phrase Replacement" = "言葉置換機能";
"Candidates keys cannot be empty." = "言選り用キー陣列に何かキーをご登録ください。"; "Candidates keys cannot be empty." = "言選り用キー陣列に何かキーをご登録ください。";
@ -71,7 +71,8 @@
"catCommonSymbols" = "常用"; "catCommonSymbols" = "常用";
"catHoriBrackets" = "横括"; "catHoriBrackets" = "横括";
"catVertBrackets" = "縦括"; "catVertBrackets" = "縦括";
"catGreekLetters" = "ギリシャ"; "catAlphabets" = "字母";
"catSpecialNumbers" = "数字";
"catMathSymbols" = "数学"; "catMathSymbols" = "数学";
"catCurrencyUnits" = "貨幣"; "catCurrencyUnits" = "貨幣";
"catSpecialSymbols" = "特殊"; "catSpecialSymbols" = "特殊";
@ -83,6 +84,14 @@
"catDoubleTableLines" = "双線"; "catDoubleTableLines" = "双線";
"catFillingBlocks" = "ブロック"; "catFillingBlocks" = "ブロック";
"catLineSegments" = "線分"; "catLineSegments" = "線分";
"catKana" = "仮名";
"catCombinations" = "組合文字";
"catPhonabets" = "注音";
"catCircledASCII" = "丸付英数";
"catBracketedASCII" = "括付英数";
"catMusicSymbols" = "音楽記号";
"catThai" = "タイ文字";
"catYi" = "彝族文字";
// SwiftUI Preferences // SwiftUI Preferences
"(Shift+)Space:" = "(Shift+)Space:"; "(Shift+)Space:" = "(Shift+)Space:";
@ -148,6 +157,8 @@
"for cycling pages" = "候補陳列ページ"; "for cycling pages" = "候補陳列ページ";
"General" = "全般設定"; "General" = "全般設定";
"Hanyu Pinyin with Numeral Intonation" = "漢語弁音 (ローマ字+数字音調)"; "Hanyu Pinyin with Numeral Intonation" = "漢語弁音 (ローマ字+数字音調)";
"Harden vertical punctuations during vertical typing (not recommended)" = "縦書きの時に、引用符・括弧などを強制的に縦書き文字と変換する(不推奨)";
"⚠︎ This feature is useful ONLY WHEN the font you are using doesn't support dynamic vertical punctuations. However, typed vertical punctuations will always shown as vertical punctuations EVEN IF your editor has changed the typing direction to horizontal." = "⚠︎ 該当の組版用フォントには縦書き(引用符・括弧)変換機能が備えていない限り、この機能を使う甲斐がある。一旦使うと、入力した全ての引用符・括弧は永遠的に縦書きの様式になる。例え入力を受けているアプリ(例えばワープロソフとなど)の書写方向は横書きと変えたとしても、これらの入力済みの引用符・括弧は全て縦書きの見た目であり、削除してから入力し直す必要になる。";
"Horizontal" = "横型陳列"; "Horizontal" = "横型陳列";
"Hsu" = "許氏国音自然配列"; "Hsu" = "許氏国音自然配列";
"Hualuo Pinyin with Numeral Intonation" = "中華ローマ弁音 (ローマ字+数字音調)"; "Hualuo Pinyin with Numeral Intonation" = "中華ローマ弁音 (ローマ字+数字音調)";
@ -194,4 +205,5 @@
"Use Shift Key Accommodation in all cases" = "いずれの客体アプリにも Shift キーの互換性措置を起用"; "Use Shift Key Accommodation in all cases" = "いずれの客体アプリにも Shift キーの互換性措置を起用";
"Vertical" = "縦型陳列"; "Vertical" = "縦型陳列";
"Warning: This page is for testing future features. \nFeatures listed here may not work as expected." = "警告:これからの新機能テストのために作ったページですから、\nここで陳列されている諸機能は予想通り動けるだと思わないでください。"; "Warning: This page is for testing future features. \nFeatures listed here may not work as expected." = "警告:これからの新機能テストのために作ったページですから、\nここで陳列されている諸機能は予想通り動けるだと思わないでください。";
"For example: When typing “章太炎” and you want to override the “太” with “泰”, and the raw operation index range [1,2) which bounds are cutting the current node “章太炎” in range [0,3). If having lack of the pre-consolidation process, this word will become something like “張泰言” after the candidate selection. Only if we enable this consolidation, this word will become “章泰炎” which is the expected result that the context is kept as-is." = "例えば、入力緩衝列には「章太炎」という節点があり、その範囲は [0,3) である。もし、「太」を「泰」にしたいのなら、今回の作業範囲は [1,2) で、「章太炎」の範囲と重ねてしまう。この場合、もし、事前強固措置がなければ、今回の作業でこの単語は「張泰言」のような望ましくない変換結果になってしまう。事前強固措置があるからこそ、「章泰炎」のような正確な作業結果の保証である。";
"Yale Pinyin with Numeral Intonation" = "イェール弁音 (ローマ字+数字音調)"; "Yale Pinyin with Numeral Intonation" = "イェール弁音 (ローマ字+数字音調)";

View File

@ -71,7 +71,8 @@
"catCommonSymbols" = "常用"; "catCommonSymbols" = "常用";
"catHoriBrackets" = "横括"; "catHoriBrackets" = "横括";
"catVertBrackets" = "纵括"; "catVertBrackets" = "纵括";
"catGreekLetters" = "希腊"; "catAlphabets" = "字母";
"catSpecialNumbers" = "数字";
"catMathSymbols" = "数学"; "catMathSymbols" = "数学";
"catCurrencyUnits" = "货币"; "catCurrencyUnits" = "货币";
"catSpecialSymbols" = "特殊"; "catSpecialSymbols" = "特殊";
@ -83,6 +84,14 @@
"catDoubleTableLines" = "双线"; "catDoubleTableLines" = "双线";
"catFillingBlocks" = "填色"; "catFillingBlocks" = "填色";
"catLineSegments" = "线段"; "catLineSegments" = "线段";
"catKana" = "假名";
"catCombinations" = "组字";
"catPhonabets" = "注音";
"catCircledASCII" = "圈英";
"catBracketedASCII" = "括英";
"catMusicSymbols" = "音乐";
"catThai" = "泰文";
"catYi" = "彝文";
// SwiftUI Preferences // SwiftUI Preferences
"(Shift+)Space:" = "(Shift+)空格键:"; "(Shift+)Space:" = "(Shift+)空格键:";
@ -123,7 +132,7 @@
"Clear the entire inline composition buffer like Shift+Delete" = "像 Shift+Delete 那样清空当前组字区内容"; "Clear the entire inline composition buffer like Shift+Delete" = "像 Shift+Delete 那样清空当前组字区内容";
"Commit Hanyu-Pinyin instead on Ctrl(+Option)+Command+Enter" = "Ctrl(+Option)+Command+Enter 输出汉语拼音而非注音"; "Commit Hanyu-Pinyin instead on Ctrl(+Option)+Command+Enter" = "Ctrl(+Option)+Command+Enter 输出汉语拼音而非注音";
"Completely disable using Shift key to toggle alphanumerical mode" = "彻底禁止使用 Shift 键切换英数模式"; "Completely disable using Shift key to toggle alphanumerical mode" = "彻底禁止使用 Shift 键切换英数模式";
"Consolidate the context on confirming candidate selection" = "在使用选字窗选字时,自巩固上下文"; "Consolidate the context on confirming candidate selection" = "在使用选字窗选字时,自巩固上下文";
"Cursor Selection:" = "选字游标:"; "Cursor Selection:" = "选字游标:";
"Dachen (Microsoft Standard / Wang / 01, etc.)" = "大千排列 (微软标准/王安/零壹/仲鼎/国乔)"; "Dachen (Microsoft Standard / Wang / 01, etc.)" = "大千排列 (微软标准/王安/零壹/仲鼎/国乔)";
"Dachen 26 (libChewing)" = "酷音大千二十六键排列"; "Dachen 26 (libChewing)" = "酷音大千二十六键排列";
@ -148,6 +157,8 @@
"for cycling pages" = "轮替页面"; "for cycling pages" = "轮替页面";
"General" = "通用设定"; "General" = "通用设定";
"Hanyu Pinyin with Numeral Intonation" = "汉语拼音+数字标调"; "Hanyu Pinyin with Numeral Intonation" = "汉语拼音+数字标调";
"Harden vertical punctuations during vertical typing (not recommended)" = "在纵排书写时,强制转换标点为纵排形式(不推荐)";
"⚠︎ This feature is useful ONLY WHEN the font you are using doesn't support dynamic vertical punctuations. However, typed vertical punctuations will always shown as vertical punctuations EVEN IF your editor has changed the typing direction to horizontal." = "⚠︎ 该功能当且仅当目前的排版字型不支援纵排标点动态显示转义的情况下才有用。一旦使用了,所有敲出去的标点都会被永久转换为静态纵排标点:哪怕当前编辑器的排版模式已经改成横排,这些已经输入的标点也都还是纵排标点字符。";
"Horizontal" = "横向布局"; "Horizontal" = "横向布局";
"Hsu" = "许氏国音自然排列"; "Hsu" = "许氏国音自然排列";
"Hualuo Pinyin with Numeral Intonation" = "华罗拼音+数字标调"; "Hualuo Pinyin with Numeral Intonation" = "华罗拼音+数字标调";
@ -194,4 +205,5 @@
"Use Shift Key Accommodation in all cases" = "对任何客体应用均启用 Shift 键相容性措施"; "Use Shift Key Accommodation in all cases" = "对任何客体应用均启用 Shift 键相容性措施";
"Vertical" = "纵向布局"; "Vertical" = "纵向布局";
"Warning: This page is for testing future features. \nFeatures listed here may not work as expected." = "警告:该页面仅作未来功能测试所用。\n在此列出的功能并非处于完全可用之状态。"; "Warning: This page is for testing future features. \nFeatures listed here may not work as expected." = "警告:该页面仅作未来功能测试所用。\n在此列出的功能并非处于完全可用之状态。";
"For example: When typing “章太炎” and you want to override the “太” with “泰”, and the raw operation index range [1,2) which bounds are cutting the current node “章太炎” in range [0,3). If having lack of the pre-consolidation process, this word will become something like “張泰言” after the candidate selection. Only if we enable this consolidation, this word will become “章泰炎” which is the expected result that the context is kept as-is." = "打比方说,你敲了「章太炎」,你想将「太」改成「泰」。这个操作的作业索引范围是开闭区间 [1,2),会切到「章太炎」这个节点的所在索引范围 [0,3)。如果没有事前巩固处理的话,这个词会在你选字之后变成诸如「张泰言」这种你不想要的自动选字结果。当且仅当你启用了这个巩固功能的前提下,你选字之后的结果才会是「章泰炎」这种你想要的结果。";
"Yale Pinyin with Numeral Intonation" = "耶鲁拼音+数字标调"; "Yale Pinyin with Numeral Intonation" = "耶鲁拼音+数字标调";

View File

@ -71,7 +71,8 @@
"catCommonSymbols" = "常用"; "catCommonSymbols" = "常用";
"catHoriBrackets" = "橫括"; "catHoriBrackets" = "橫括";
"catVertBrackets" = "縱括"; "catVertBrackets" = "縱括";
"catGreekLetters" = "希臘"; "catAlphabets" = "字母";
"catSpecialNumbers" = "數字";
"catMathSymbols" = "數學"; "catMathSymbols" = "數學";
"catCurrencyUnits" = "貨幣"; "catCurrencyUnits" = "貨幣";
"catSpecialSymbols" = "特殊"; "catSpecialSymbols" = "特殊";
@ -83,6 +84,14 @@
"catDoubleTableLines" = "雙線"; "catDoubleTableLines" = "雙線";
"catFillingBlocks" = "填色"; "catFillingBlocks" = "填色";
"catLineSegments" = "線段"; "catLineSegments" = "線段";
"catKana" = "假名";
"catCombinations" = "組字";
"catPhonabets" = "注音";
"catCircledASCII" = "圈英";
"catBracketedASCII" = "括英";
"catMusicSymbols" = "音樂";
"catThai" = "泰文";
"catYi" = "彝文";
// SwiftUI Preferences // SwiftUI Preferences
"(Shift+)Space:" = "(Shift+)空格鍵:"; "(Shift+)Space:" = "(Shift+)空格鍵:";
@ -148,6 +157,8 @@
"for cycling pages" = "輪替頁面"; "for cycling pages" = "輪替頁面";
"General" = "通用設定"; "General" = "通用設定";
"Hanyu Pinyin with Numeral Intonation" = "漢語拼音+數字標調"; "Hanyu Pinyin with Numeral Intonation" = "漢語拼音+數字標調";
"Harden vertical punctuations during vertical typing (not recommended)" = "在縱排書寫時,強制轉換標點為縱排形式(不推薦)";
"⚠︎ This feature is useful ONLY WHEN the font you are using doesn't support dynamic vertical punctuations. However, typed vertical punctuations will always shown as vertical punctuations EVEN IF your editor has changed the typing direction to horizontal." = "⚠︎ 該功能當且僅當目前的排版字型不支援縱排標點動態顯示轉義的情況下才有用。一旦使用了,所有敲出去的標點都會被永久轉換為靜態縱排標點:哪怕當前編輯器的排版模式已經改成橫排,這些已經輸入的標點也都還是縱排標點字符。";
"Horizontal" = "橫向佈局"; "Horizontal" = "橫向佈局";
"Hsu" = "許氏國音自然排列"; "Hsu" = "許氏國音自然排列";
"Hualuo Pinyin with Numeral Intonation" = "華羅拼音+數字標調"; "Hualuo Pinyin with Numeral Intonation" = "華羅拼音+數字標調";
@ -194,4 +205,5 @@
"Use Shift Key Accommodation in all cases" = "對任何客體應用均啟用 Shift 鍵相容性措施"; "Use Shift Key Accommodation in all cases" = "對任何客體應用均啟用 Shift 鍵相容性措施";
"Vertical" = "縱向佈局"; "Vertical" = "縱向佈局";
"Warning: This page is for testing future features. \nFeatures listed here may not work as expected." = "警告:該頁面僅作未來功能測試所用。\n在此列出的功能並非處於完全可用之狀態。"; "Warning: This page is for testing future features. \nFeatures listed here may not work as expected." = "警告:該頁面僅作未來功能測試所用。\n在此列出的功能並非處於完全可用之狀態。";
"For example: When typing “章太炎” and you want to override the “太” with “泰”, and the raw operation index range [1,2) which bounds are cutting the current node “章太炎” in range [0,3). If having lack of the pre-consolidation process, this word will become something like “張泰言” after the candidate selection. Only if we enable this consolidation, this word will become “章泰炎” which is the expected result that the context is kept as-is." = "打比方說,你敲了「章太炎」,你想將「太」改成「泰」。這個操作的作業索引範圍是開閉區間 [1,2),會切到「章太炎」這個節點的所在索引範圍 [0,3)。如果沒有事前鞏固處理的話,這個詞會在你選字之後變成諸如「張泰言」這種你不想要的自動選字結果。當且僅當你啟用了這個鞏固功能的前提下,你選字之後的結果才會是「章泰炎」這種你想要的結果。";
"Yale Pinyin with Numeral Intonation" = "耶魯拼音+數字標調"; "Yale Pinyin with Numeral Intonation" = "耶魯拼音+數字標調";

View File

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="20037" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES"> <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21223" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies> <dependencies>
<deployment identifier="macosx"/> <deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="20037"/> <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21223"/>
</dependencies> </dependencies>
<objects> <objects>
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication"> <customObject id="-2" userLabel="File's Owner" customClass="NSApplication">

File diff suppressed because it is too large Load Diff

View File

@ -43,7 +43,9 @@
"chkAllowBoostingSingleKanjiAsUserPhrase.title" = "Allow boosting / excluding a candidate of single kanji"; "chkAllowBoostingSingleKanjiAsUserPhrase.title" = "Allow boosting / excluding a candidate of single kanji";
"chkAlsoConfirmAssociatedCandidatesByEnter.title" = "Allow using Enter key to confirm associated candidate selection"; "chkAlsoConfirmAssociatedCandidatesByEnter.title" = "Allow using Enter key to confirm associated candidate selection";
"chkAutoCorrectReadingCombination.title" = "Automatically correct reading combinations when typing"; "chkAutoCorrectReadingCombination.title" = "Automatically correct reading combinations when typing";
"chkConsolidateContextOnCandidateSelection.title" = "Consolidate the context on confirming candidate selection";
"chkFetchSuggestionsFromUserOverrideModel.title" = "Applying typing suggestions from half-life user override model"; "chkFetchSuggestionsFromUserOverrideModel.title" = "Applying typing suggestions from half-life user override model";
"chkHardenVerticalPunctuations.title" = "Harden vertical punctuations during vertical typing";
"chkKeepReadingUponCompositionError.title" = "Allow backspace-editing miscomposed readings"; "chkKeepReadingUponCompositionError.title" = "Allow backspace-editing miscomposed readings";
"chkUseFixecCandidateOrderOnSelection.title" = "Always use fixed listing order in candidate window"; "chkUseFixecCandidateOrderOnSelection.title" = "Always use fixed listing order in candidate window";
"DbW-eq-ZdB.title" = "Starlight"; "DbW-eq-ZdB.title" = "Starlight";
@ -64,6 +66,8 @@
"jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3"; "jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3";
"lblDevZoneIMKCandidate.title" = "IMK candidate window relies on certain Apple private APIs which are force-exposed by using bridging headers. Its usability, at this moment, is only guaranteed from macOS 10.14 Mojave to macOS 13 Ventura. Further tests are required in the future in order to tell whether it is usable in newer macOS releases."; "lblDevZoneIMKCandidate.title" = "IMK candidate window relies on certain Apple private APIs which are force-exposed by using bridging headers. Its usability, at this moment, is only guaranteed from macOS 10.14 Mojave to macOS 13 Ventura. Further tests are required in the future in order to tell whether it is usable in newer macOS releases.";
"lblDevZoneTitleDescription.title" = "Warning: This page is for testing future features. \nFeatures listed here may not work as expected."; "lblDevZoneTitleDescription.title" = "Warning: This page is for testing future features. \nFeatures listed here may not work as expected.";
"lblIntonationKeyBehavior.title" = "Specify what intonation key does when syllable composer is empty.";
"lblShiftBkspKeyBehavior.title" = "Choose the attempted behavior of Shift+BackSpace key.";
"lblUpperCaseLetterKeyBehavior.title" = "Choose the behavior of Shift+Letter key with letter inputs."; "lblUpperCaseLetterKeyBehavior.title" = "Choose the behavior of Shift+Letter key with letter inputs.";
"Parser11.title" = "Secondary Pinyin with Numeral Intonation"; "Parser11.title" = "Secondary Pinyin with Numeral Intonation";
"Parser12.title" = "Yale Pinyin with Numeral Intonation"; "Parser12.title" = "Yale Pinyin with Numeral Intonation";
@ -71,6 +75,12 @@
"Parser14.title" = "Universal Pinyin with Numeral Intonation"; "Parser14.title" = "Universal Pinyin with Numeral Intonation";
"Pg5-G9-pY5.title" = "Choose the behavior of (Shift+)Space key with candidates."; "Pg5-G9-pY5.title" = "Choose the behavior of (Shift+)Space key with candidates.";
"QUQ-oY-4Hc.label" = "General"; "QUQ-oY-4Hc.label" = "General";
"rdoIntonationKeyBehavior0.title" = "Override the previous reading's intonation with candidate-reset";
"rdoIntonationKeyBehavior1.title" = "Only override the intonation of the previous reading if different";
"rdoIntonationKeyBehavior2.title" = "Always type intonations to the inline composition buffer";
"rdoShiftBkspKeyBehavior0.title" = "Disassemble the previous reading, dropping its intonation";
"rdoShiftBkspKeyBehavior1.title" = "Clear the entire inline composition buffer like Shift+Delete";
"rdoShiftBkspKeyBehavior2.title" = "Always drop the previous reading";
"rdoUpperCaseLetterKeyBehavior0.title" = "Type them into inline composition buffer"; "rdoUpperCaseLetterKeyBehavior0.title" = "Type them into inline composition buffer";
"rdoUpperCaseLetterKeyBehavior1.title" = "Directly commit lowercased letters"; "rdoUpperCaseLetterKeyBehavior1.title" = "Directly commit lowercased letters";
"rdoUpperCaseLetterKeyBehavior2.title" = "Directly commit uppercased letters"; "rdoUpperCaseLetterKeyBehavior2.title" = "Directly commit uppercased letters";

View File

@ -43,7 +43,9 @@
"chkAllowBoostingSingleKanjiAsUserPhrase.title" = "即排除/即最優先にできる候補の文字数の最低限は1字とする"; "chkAllowBoostingSingleKanjiAsUserPhrase.title" = "即排除/即最優先にできる候補の文字数の最低限は1字とする";
"chkAlsoConfirmAssociatedCandidatesByEnter.title" = "Enter キーを連想語彙候補の確認のために使う"; "chkAlsoConfirmAssociatedCandidatesByEnter.title" = "Enter キーを連想語彙候補の確認のために使う";
"chkAutoCorrectReadingCombination.title" = "入力中で打ち間違った発音組み合わせを自動的に訂正する"; "chkAutoCorrectReadingCombination.title" = "入力中で打ち間違った発音組み合わせを自動的に訂正する";
"chkConsolidateContextOnCandidateSelection.title" = "候補陳列ウィンドウで候補を選ぶ時に文脈を強固する";
"chkFetchSuggestionsFromUserOverrideModel.title" = "入力中で臨時記憶モジュールからお薦めの候補を自動的に選ぶ"; "chkFetchSuggestionsFromUserOverrideModel.title" = "入力中で臨時記憶モジュールからお薦めの候補を自動的に選ぶ";
"chkHardenVerticalPunctuations.title" = "縦書きの時に、引用符・括弧などを強制的に縦書き文字と変換する(不推奨)";
"chkKeepReadingUponCompositionError.title" = "効かぬ音読みを BackSpace で再編集"; "chkKeepReadingUponCompositionError.title" = "効かぬ音読みを BackSpace で再編集";
"chkUseFixecCandidateOrderOnSelection.title" = "候補文字を固定順番で陳列する"; "chkUseFixecCandidateOrderOnSelection.title" = "候補文字を固定順番で陳列する";
"DbW-eq-ZdB.title" = "星光"; "DbW-eq-ZdB.title" = "星光";
@ -64,6 +66,8 @@
"jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3"; "jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3";
"lblDevZoneIMKCandidate.title" = "IMK 候補陳列ウィンドウは、Apple の未公開のAPIを「bridging-header」という強引的な手段で引き出して利用した機能である。現時点で macOS 10.14 Mojave から macOS 13 Ventura まで利用可能であるが、その後の新しい macOS との互換性の話はまだ早い。"; "lblDevZoneIMKCandidate.title" = "IMK 候補陳列ウィンドウは、Apple の未公開のAPIを「bridging-header」という強引的な手段で引き出して利用した機能である。現時点で macOS 10.14 Mojave から macOS 13 Ventura まで利用可能であるが、その後の新しい macOS との互換性の話はまだ早い。";
"lblDevZoneTitleDescription.title" = "警告:これからの新機能テストのために作ったページですから、\nここで陳列されている諸機能は予想通り動けるだと思わないでください。"; "lblDevZoneTitleDescription.title" = "警告:これからの新機能テストのために作ったページですから、\nここで陳列されている諸機能は予想通り動けるだと思わないでください。";
"lblIntonationKeyBehavior.title" = "音調組立緩衝列が空かされた時の音調キーの行為をご指定ください。";
"lblShiftBkspKeyBehavior.title" = "Shift+BackSpace キーの優先行為をご指定ください。";
"lblUpperCaseLetterKeyBehavior.title" = "Shift+文字キーの行為をご指定ください。"; "lblUpperCaseLetterKeyBehavior.title" = "Shift+文字キーの行為をご指定ください。";
"Parser11.title" = "国音二式 (ローマ字+数字音調)"; "Parser11.title" = "国音二式 (ローマ字+数字音調)";
"Parser12.title" = "イェール弁音 (ローマ字+数字音調)"; "Parser12.title" = "イェール弁音 (ローマ字+数字音調)";
@ -71,6 +75,12 @@
"Parser14.title" = "汎用弁音 (ローマ字+数字音調)"; "Parser14.title" = "汎用弁音 (ローマ字+数字音調)";
"Pg5-G9-pY5.title" = "入力候補についての (Shift+)Space キーの輪番切替対象をご指定ください。"; "Pg5-G9-pY5.title" = "入力候補についての (Shift+)Space キーの輪番切替対象をご指定ください。";
"QUQ-oY-4Hc.label" = "全般"; "QUQ-oY-4Hc.label" = "全般";
"rdoIntonationKeyBehavior0.title" = "カーソルの後部の音読みの音調を上書きし、候補選択状態を戻す";
"rdoIntonationKeyBehavior1.title" = "カーソルの後部の音読みの異なる音調だけを上書きする";
"rdoIntonationKeyBehavior2.title" = "常に入力緩衝列に音調を入力する";
"rdoShiftBkspKeyBehavior0.title" = "カーソルの後部の音読みを解き、その音調を除く";
"rdoShiftBkspKeyBehavior1.title" = "Shift+Delete のように入力緩衝列を消す";
"rdoShiftBkspKeyBehavior2.title" = "カーソルの後部の音読みを常に削除する";
"rdoUpperCaseLetterKeyBehavior0.title" = "入力緩衝列にローマ字入力"; "rdoUpperCaseLetterKeyBehavior0.title" = "入力緩衝列にローマ字入力";
"rdoUpperCaseLetterKeyBehavior1.title" = "ローマ字(小文字)を直接出力"; "rdoUpperCaseLetterKeyBehavior1.title" = "ローマ字(小文字)を直接出力";
"rdoUpperCaseLetterKeyBehavior2.title" = "ローマ字(大文字)を直接出力"; "rdoUpperCaseLetterKeyBehavior2.title" = "ローマ字(大文字)を直接出力";

View File

@ -43,7 +43,9 @@
"chkAllowBoostingSingleKanjiAsUserPhrase.title" = "将可以就地升权/排除的候选字词的最短词长设为单个汉字"; "chkAllowBoostingSingleKanjiAsUserPhrase.title" = "将可以就地升权/排除的候选字词的最短词长设为单个汉字";
"chkAlsoConfirmAssociatedCandidatesByEnter.title" = "允许使用 Enter 确认当前选中的联想词"; "chkAlsoConfirmAssociatedCandidatesByEnter.title" = "允许使用 Enter 确认当前选中的联想词";
"chkAutoCorrectReadingCombination.title" = "敲字时自动纠正读音组合"; "chkAutoCorrectReadingCombination.title" = "敲字时自动纠正读音组合";
"chkConsolidateContextOnCandidateSelection.title" = "在使用选字窗选字时,自动巩固上下文";
"chkFetchSuggestionsFromUserOverrideModel.title" = "在敲字时自动套用来自半衰记忆模组的建议"; "chkFetchSuggestionsFromUserOverrideModel.title" = "在敲字时自动套用来自半衰记忆模组的建议";
"chkHardenVerticalPunctuations.title" = "在纵排书写时,强制转换标点为纵排形式(不推荐)";
"chkKeepReadingUponCompositionError.title" = "允许对无效的读音使用 BackSpace 编辑"; "chkKeepReadingUponCompositionError.title" = "允许对无效的读音使用 BackSpace 编辑";
"chkUseFixecCandidateOrderOnSelection.title" = "以固定顺序来陈列选字窗内的候选字"; "chkUseFixecCandidateOrderOnSelection.title" = "以固定顺序来陈列选字窗内的候选字";
"DbW-eq-ZdB.title" = "星光"; "DbW-eq-ZdB.title" = "星光";
@ -64,6 +66,8 @@
"jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3"; "jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3";
"lblDevZoneIMKCandidate.title" = "IMK 选字窗依赖于 Apple 的私有 API而且是借由桥接档案头强制曝露的方法使用的。目前该功能仅在 macOS 10.14 Mojave 至 macOS 13 Ventura 系统内有测试过可用性。至于在未来的 macOS 发行版当中是否可用,则需要另行测试、才能下结论。"; "lblDevZoneIMKCandidate.title" = "IMK 选字窗依赖于 Apple 的私有 API而且是借由桥接档案头强制曝露的方法使用的。目前该功能仅在 macOS 10.14 Mojave 至 macOS 13 Ventura 系统内有测试过可用性。至于在未来的 macOS 发行版当中是否可用,则需要另行测试、才能下结论。";
"lblDevZoneTitleDescription.title" = "警告:该页面仅作未来功能测试所用。\n在此列出的功能并非处于完全可用之状态。"; "lblDevZoneTitleDescription.title" = "警告:该页面仅作未来功能测试所用。\n在此列出的功能并非处于完全可用之状态。";
"lblIntonationKeyBehavior.title" = "指定声调键(在注拼槽为「空」状态时)的行为。";
"lblShiftBkspKeyBehavior.title" = "指定 Shift+BackSpace 组合键率先尝试的行为。";
"lblUpperCaseLetterKeyBehavior.title" = "指定 Shift+字母键 的行为。"; "lblUpperCaseLetterKeyBehavior.title" = "指定 Shift+字母键 的行为。";
"Parser11.title" = "国音二式+数字标调"; "Parser11.title" = "国音二式+数字标调";
"Parser12.title" = "耶鲁拼音+数字标调"; "Parser12.title" = "耶鲁拼音+数字标调";
@ -71,6 +75,12 @@
"Parser14.title" = "通用拼音+数字标调"; "Parser14.title" = "通用拼音+数字标调";
"Pg5-G9-pY5.title" = "指定 (Shift+)Space 热键对候选字词而言的轮替操作对象。"; "Pg5-G9-pY5.title" = "指定 (Shift+)Space 热键对候选字词而言的轮替操作对象。";
"QUQ-oY-4Hc.label" = "一般"; "QUQ-oY-4Hc.label" = "一般";
"rdoIntonationKeyBehavior0.title" = "尝试对游标正后方的字音覆写声调,且重设其选字状态";
"rdoIntonationKeyBehavior1.title" = "仅在键入的声调与游标正后方的字音不同时,尝试覆写";
"rdoIntonationKeyBehavior2.title" = "始终在内文组字区内键入声调符号";
"rdoShiftBkspKeyBehavior0.title" = "析构游标正后方的字音,且剔除其声调";
"rdoShiftBkspKeyBehavior1.title" = "像 Shift+Delete 那样清空当前组字区的内容";
"rdoShiftBkspKeyBehavior2.title" = "始终剔除游标正后方的字音";
"rdoUpperCaseLetterKeyBehavior0.title" = "直接键入内文组字区"; "rdoUpperCaseLetterKeyBehavior0.title" = "直接键入内文组字区";
"rdoUpperCaseLetterKeyBehavior1.title" = "直接递交小写字母"; "rdoUpperCaseLetterKeyBehavior1.title" = "直接递交小写字母";
"rdoUpperCaseLetterKeyBehavior2.title" = "直接递交大写字母"; "rdoUpperCaseLetterKeyBehavior2.title" = "直接递交大写字母";

View File

@ -43,7 +43,9 @@
"chkAllowBoostingSingleKanjiAsUserPhrase.title" = "將可以就地升權/排除的候選字詞的最短詞長設為單個漢字"; "chkAllowBoostingSingleKanjiAsUserPhrase.title" = "將可以就地升權/排除的候選字詞的最短詞長設為單個漢字";
"chkAlsoConfirmAssociatedCandidatesByEnter.title" = "允許使用 Enter 確認當前選中的聯想詞"; "chkAlsoConfirmAssociatedCandidatesByEnter.title" = "允許使用 Enter 確認當前選中的聯想詞";
"chkAutoCorrectReadingCombination.title" = "敲字時自動糾正讀音組合"; "chkAutoCorrectReadingCombination.title" = "敲字時自動糾正讀音組合";
"chkConsolidateContextOnCandidateSelection.title" = "在使用選字窗選字時,自動鞏固上下文";
"chkFetchSuggestionsFromUserOverrideModel.title" = "在敲字時自動套用來自半衰記憶模組的建議"; "chkFetchSuggestionsFromUserOverrideModel.title" = "在敲字時自動套用來自半衰記憶模組的建議";
"chkHardenVerticalPunctuations.title" = "在縱排書寫時,強制轉換標點為縱排形式(不推薦)";
"chkKeepReadingUponCompositionError.title" = "允許對無效的讀音使用 BackSpace 編輯"; "chkKeepReadingUponCompositionError.title" = "允許對無效的讀音使用 BackSpace 編輯";
"chkUseFixecCandidateOrderOnSelection.title" = "以固定順序來陳列選字窗內的候選字"; "chkUseFixecCandidateOrderOnSelection.title" = "以固定順序來陳列選字窗內的候選字";
"DbW-eq-ZdB.title" = "星光"; "DbW-eq-ZdB.title" = "星光";
@ -64,6 +66,8 @@
"jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3"; "jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3";
"lblDevZoneIMKCandidate.title" = "IMK 選字窗依賴於 Apple 的私有 API而且是藉由橋接檔案頭強制曝露的方法使用的。目前該功能僅在 macOS 10.14 Mojave 至 macOS 13 Ventura 系統內有測試過可用性。至於在未來的 macOS 發行版當中是否可用,則需要另行測試、才能下結論。"; "lblDevZoneIMKCandidate.title" = "IMK 選字窗依賴於 Apple 的私有 API而且是藉由橋接檔案頭強制曝露的方法使用的。目前該功能僅在 macOS 10.14 Mojave 至 macOS 13 Ventura 系統內有測試過可用性。至於在未來的 macOS 發行版當中是否可用,則需要另行測試、才能下結論。";
"lblDevZoneTitleDescription.title" = "警告:該頁面僅作未來功能測試所用。\n在此列出的功能並非處於完全可用之狀態。"; "lblDevZoneTitleDescription.title" = "警告:該頁面僅作未來功能測試所用。\n在此列出的功能並非處於完全可用之狀態。";
"lblIntonationKeyBehavior.title" = "指定聲調鍵(在注拼槽為「空」狀態時)的行為。";
"lblShiftBkspKeyBehavior.title" = "指定 Shift+BackSpace 組合鍵率先嘗試的行為。";
"lblUpperCaseLetterKeyBehavior.title" = "指定 Shift+字母鍵 的行為。"; "lblUpperCaseLetterKeyBehavior.title" = "指定 Shift+字母鍵 的行為。";
"Parser11.title" = "國音二式+數字標調"; "Parser11.title" = "國音二式+數字標調";
"Parser12.title" = "耶魯拼音+數字標調"; "Parser12.title" = "耶魯拼音+數字標調";
@ -71,6 +75,12 @@
"Parser14.title" = "通用拼音+數字標調"; "Parser14.title" = "通用拼音+數字標調";
"Pg5-G9-pY5.title" = "指定 (Shift+)Space 熱鍵對候選字詞而言的輪替操作對象。"; "Pg5-G9-pY5.title" = "指定 (Shift+)Space 熱鍵對候選字詞而言的輪替操作對象。";
"QUQ-oY-4Hc.label" = "一般"; "QUQ-oY-4Hc.label" = "一般";
"rdoIntonationKeyBehavior0.title" = "嘗試對游標正後方的字音覆寫聲調,且重設其選字狀態";
"rdoIntonationKeyBehavior1.title" = "僅在鍵入的聲調與游標正後方的字音不同時,嘗試覆寫";
"rdoIntonationKeyBehavior2.title" = "始終在內文組字區內鍵入聲調符號";
"rdoShiftBkspKeyBehavior0.title" = "析構游標正後方的字音,且剔除其聲調";
"rdoShiftBkspKeyBehavior1.title" = "像 Shift+Delete 那樣清空當前組字區的內容";
"rdoShiftBkspKeyBehavior2.title" = "始終剔除游標正後方的字音";
"rdoUpperCaseLetterKeyBehavior0.title" = "直接鍵入內文組字區"; "rdoUpperCaseLetterKeyBehavior0.title" = "直接鍵入內文組字區";
"rdoUpperCaseLetterKeyBehavior1.title" = "直接遞交小寫字母"; "rdoUpperCaseLetterKeyBehavior1.title" = "直接遞交小寫字母";
"rdoUpperCaseLetterKeyBehavior2.title" = "直接遞交大寫字母"; "rdoUpperCaseLetterKeyBehavior2.title" = "直接遞交大寫字母";

View File

@ -3,9 +3,9 @@
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>2.1.0</string> <string>2.2.0</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>2101</string> <string>2201</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>2.1.0</string> <string>2.2.0</string>
</dict> </dict>
<key>TYPE</key> <key>TYPE</key>
<integer>0</integer> <integer>0</integer>

View File

@ -1449,7 +1449,7 @@
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 2101; CURRENT_PROJECT_VERSION = 2201;
GCC_C_LANGUAGE_STANDARD = gnu11; GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO; GCC_DYNAMIC_NO_PIC = NO;
GCC_PREPROCESSOR_DEFINITIONS = ( GCC_PREPROCESSOR_DEFINITIONS = (
@ -1459,7 +1459,7 @@
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 2.1.0; MARKETING_VERSION = 2.2.0;
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.vChewingTests; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewingTests;
@ -1488,13 +1488,13 @@
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 2101; CURRENT_PROJECT_VERSION = 2201;
ENABLE_NS_ASSERTIONS = NO; ENABLE_NS_ASSERTIONS = NO;
GCC_C_LANGUAGE_STANDARD = gnu11; GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 2.1.0; MARKETING_VERSION = 2.2.0;
MTL_ENABLE_DEBUG_INFO = NO; MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewingTests; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewingTests;
@ -1525,7 +1525,7 @@
CODE_SIGN_IDENTITY = "-"; CODE_SIGN_IDENTITY = "-";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 2101; CURRENT_PROJECT_VERSION = 2201;
DEAD_CODE_STRIPPING = YES; DEAD_CODE_STRIPPING = YES;
GCC_C_LANGUAGE_STANDARD = gnu11; GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO; GCC_DYNAMIC_NO_PIC = NO;
@ -1546,7 +1546,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
MARKETING_VERSION = 2.1.0; MARKETING_VERSION = 2.2.0;
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;
@ -1575,7 +1575,7 @@
CODE_SIGN_IDENTITY = "-"; CODE_SIGN_IDENTITY = "-";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 2101; CURRENT_PROJECT_VERSION = 2201;
DEAD_CODE_STRIPPING = YES; DEAD_CODE_STRIPPING = YES;
ENABLE_NS_ASSERTIONS = NO; ENABLE_NS_ASSERTIONS = NO;
GCC_C_LANGUAGE_STANDARD = gnu11; GCC_C_LANGUAGE_STANDARD = gnu11;
@ -1592,7 +1592,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
MARKETING_VERSION = 2.1.0; MARKETING_VERSION = 2.2.0;
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;
@ -1707,7 +1707,7 @@
CODE_SIGN_IDENTITY = "-"; CODE_SIGN_IDENTITY = "-";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 2101; CURRENT_PROJECT_VERSION = 2201;
DEAD_CODE_STRIPPING = YES; DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_ASSET_PATHS = "";
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = "";
@ -1735,7 +1735,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
MARKETING_VERSION = 2.1.0; MARKETING_VERSION = 2.2.0;
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)";
@ -1764,7 +1764,7 @@
CODE_SIGN_IDENTITY = "-"; CODE_SIGN_IDENTITY = "-";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 2101; CURRENT_PROJECT_VERSION = 2201;
DEAD_CODE_STRIPPING = YES; DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_ASSET_PATHS = "";
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = "";
@ -1786,7 +1786,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
MARKETING_VERSION = 2.1.0; MARKETING_VERSION = 2.2.0;
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 = "";
@ -1809,7 +1809,7 @@
CODE_SIGN_IDENTITY = "-"; CODE_SIGN_IDENTITY = "-";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 2101; CURRENT_PROJECT_VERSION = 2201;
DEAD_CODE_STRIPPING = YES; DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = "";
GCC_C_LANGUAGE_STANDARD = gnu99; GCC_C_LANGUAGE_STANDARD = gnu99;
@ -1829,7 +1829,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
MARKETING_VERSION = 2.1.0; MARKETING_VERSION = 2.2.0;
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewing.vChewingInstaller; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewing.vChewingInstaller;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
@ -1851,7 +1851,7 @@
CODE_SIGN_IDENTITY = "-"; CODE_SIGN_IDENTITY = "-";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 2101; CURRENT_PROJECT_VERSION = 2201;
DEAD_CODE_STRIPPING = YES; DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = "";
GCC_C_LANGUAGE_STANDARD = gnu99; GCC_C_LANGUAGE_STANDARD = gnu99;
@ -1865,7 +1865,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
MARKETING_VERSION = 2.1.0; MARKETING_VERSION = 2.2.0;
PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewing.vChewingInstaller; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewing.vChewingInstaller;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";