1.6.3 // HotKey Switches, etc. Merge Gitee PR!38 from upd/1.6.3

This commit is contained in:
ShikiSuen 2022-05-31 14:57:12 +00:00 committed by Gitee
commit 9cde097c59
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
37 changed files with 853 additions and 1088 deletions

@ -1 +1 @@
Subproject commit 5560b6d252259f624cd614dfec84b1cfe2e83ec4 Subproject commit 924c8f4156edf2f034b45f5f06d488e5e81d351c

View File

@ -83,12 +83,8 @@ class InputState {
// MARK: - // MARK: -
/// Represents that the composing buffer is empty. /// Represents that the composing buffer is empty.
class EmptyIgnoringPreviousState: InputState { class EmptyIgnoringPreviousState: Empty {
var composingBuffer: String { override var description: String {
""
}
var description: String {
"<InputState.EmptyIgnoringPreviousState>" "<InputState.EmptyIgnoringPreviousState>"
} }
} }

View File

@ -48,6 +48,7 @@ protocol KeyHandlerDelegate {
class KeyHandler { class KeyHandler {
let kEpsilon: Double = 0.000001 let kEpsilon: Double = 0.000001
let kMaxComposingBufferNeedsToWalkSize: Int = 10
var _composer: Tekkon.Composer = .init() var _composer: Tekkon.Composer = .init()
var _inputMode: String = "" var _inputMode: String = ""
var _languageModel: vChewing.LMInstantiator = .init() var _languageModel: vChewing.LMInstantiator = .init()
@ -111,10 +112,21 @@ class KeyHandler {
// Retrieve the most likely grid, i.e. a Maximum Likelihood Estimation // Retrieve the most likely grid, i.e. a Maximum Likelihood Estimation
// 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.
_walkedNodes = _builder.walk( _walkedNodes = _builder.walk()
at: _builder.grid.width, nodesLimit: 10, balanced: mgrPrefs.useScoreBalancing
) // if DEBUG mode is enabled, a GraphViz file is written to kGraphVizOutputfile.
if mgrPrefs.isDebugModeEnabled {
let result = _builder.grid.dumpDOT
do {
try result.write(
toFile: "/private/var/tmp/vChewing-visualization.dot",
atomically: true, encoding: .utf8
)
} catch {
IME.prtDebugIntel("Failed from writing dumpDOT results.")
}
}
} }
var popOverflowComposingTextAndWalk: String { var popOverflowComposingTextAndWalk: String {
@ -128,7 +140,7 @@ class KeyHandler {
var poppedText = "" var poppedText = ""
if _builder.grid.width > mgrPrefs.composingBufferSize { if _builder.grid.width > mgrPrefs.composingBufferSize {
if _walkedNodes.count > 0 { if !_walkedNodes.isEmpty {
let anchor: Megrez.NodeAnchor = _walkedNodes[0] let anchor: Megrez.NodeAnchor = _walkedNodes[0]
if let theNode = anchor.node { if let theNode = anchor.node {
poppedText = theNode.currentKeyValue.value poppedText = theNode.currentKeyValue.value
@ -148,8 +160,8 @@ class KeyHandler {
return arrResult return arrResult
} }
func fixNode(value: String) { func fixNode(value: String, respectCursorPushing: Bool = true) {
let cursorIndex: Int = actualCandidateCursorIndex let cursorIndex = min(actualCandidateCursorIndex + (mgrPrefs.useRearCursorMode ? 1 : 0), builderLength)
let selectedNode: Megrez.NodeAnchor = _builder.grid.fixNodeSelectedCandidate( let selectedNode: Megrez.NodeAnchor = _builder.grid.fixNodeSelectedCandidate(
location: cursorIndex, value: value location: cursorIndex, value: value
) )
@ -182,7 +194,7 @@ class KeyHandler {
} }
walk() walk()
if mgrPrefs.moveCursorAfterSelectingCandidate { if mgrPrefs.moveCursorAfterSelectingCandidate, respectCursorPushing {
var nextPosition = 0 var nextPosition = 0
for node in _walkedNodes { for node in _walkedNodes {
if nextPosition >= cursorIndex { break } if nextPosition >= cursorIndex { break }
@ -232,7 +244,7 @@ class KeyHandler {
IME.prtDebugIntel( IME.prtDebugIntel(
"UOM: Suggestion retrieved, overriding the node score of the selected candidate.") "UOM: Suggestion retrieved, overriding the node score of the selected candidate.")
_builder.grid.overrideNodeScoreForSelectedCandidate( _builder.grid.overrideNodeScoreForSelectedCandidate(
location: actualCandidateCursorIndex, location: min(actualCandidateCursorIndex + (mgrPrefs.useRearCursorMode ? 1 : 0), builderLength),
value: overrideValue, value: overrideValue,
overridingScore: findHighestScore(nodes: rawNodes, epsilon: kEpsilon) overridingScore: findHighestScore(nodes: rawNodes, epsilon: kEpsilon)
) )
@ -297,10 +309,9 @@ class KeyHandler {
var rawNodes: [Megrez.NodeAnchor] { var rawNodes: [Megrez.NodeAnchor] {
/// 使 nodesCrossing macOS /// 使 nodesCrossing macOS
/// nodeCrossing Megrez /// nodeCrossing
/// Windows mgrPrefs.useRearCursorMode
mgrPrefs.setRearCursorMode ? _builder.grid.nodesBeginningAt(location: actualCandidateCursorIndex)
? _builder.grid.nodesCrossingOrEndingAt(location: actualCandidateCursorIndex)
: _builder.grid.nodesEndingAt(location: actualCandidateCursorIndex) : _builder.grid.nodesEndingAt(location: actualCandidateCursorIndex)
} }

View File

@ -310,10 +310,12 @@ extension KeyHandler {
if mgrPrefs.useSCPCTypingMode { if mgrPrefs.useSCPCTypingMode {
var punctuationNamePrefix = "" var punctuationNamePrefix = ""
if input.isOptionHold { if input.isOptionHold && !input.isControlHold {
punctuationNamePrefix = "_alt_punctuation_" punctuationNamePrefix = "_alt_punctuation_"
} else if input.isControlHold { } else if input.isControlHold && !input.isOptionHold {
punctuationNamePrefix = "_ctrl_punctuation_" punctuationNamePrefix = "_ctrl_punctuation_"
} else if input.isControlHold && input.isOptionHold {
punctuationNamePrefix = "_alt_ctrl_punctuation_"
} else if mgrPrefs.halfWidthPunctuationEnabled { } else if mgrPrefs.halfWidthPunctuationEnabled {
punctuationNamePrefix = "_half_punctuation_" punctuationNamePrefix = "_half_punctuation_"
} else { } else {

View File

@ -25,6 +25,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/ */
import Cocoa import Cocoa
import SwiftUI
// MARK: - § Handle Input with States. // MARK: - § Handle Input with States.
@ -237,11 +238,11 @@ extension KeyHandler {
return true return true
} }
// MARK: Calling candidate window using Space or Down or PageUp / PageDn. // MARK: Calling candidate window using Up / Down or PageUp / PageDn.
if let currentState = state as? InputState.NotEmpty, _composer.isEmpty, if let currentState = state as? InputState.NotEmpty, _composer.isEmpty,
input.isExtraChooseCandidateKey || input.isExtraChooseCandidateKeyReverse || input.isSpace input.isExtraChooseCandidateKey || input.isExtraChooseCandidateKeyReverse || input.isSpace
|| input.isPageDown || input.isPageUp || input.isTab || input.isPageDown || input.isPageUp || (input.isTab && mgrPrefs.specifyShiftTabKeyBehavior)
|| (input.useVerticalMode && (input.isVerticalModeOnlyChooseCandidateKey)) || (input.useVerticalMode && (input.isVerticalModeOnlyChooseCandidateKey))
{ {
if input.isSpace { if input.isSpace {
@ -275,6 +276,14 @@ extension KeyHandler {
if input.isESC { return handleEsc(state: state, stateCallback: stateCallback, errorCallback: errorCallback) } if input.isESC { return handleEsc(state: state, stateCallback: stateCallback, errorCallback: errorCallback) }
// MARK: Tab
if input.isTab {
return handleTab(
state: state, isShiftHold: input.isShiftHold, stateCallback: stateCallback, errorCallback: errorCallback
)
}
// MARK: Cursor backward // MARK: Cursor backward
if input.isCursorBackward || input.emacsKey == vChewingEmacsKey.backward { if input.isCursorBackward || input.emacsKey == vChewingEmacsKey.backward {
@ -382,10 +391,12 @@ extension KeyHandler {
var punctuationNamePrefix = "" var punctuationNamePrefix = ""
if input.isOptionHold { if input.isOptionHold && !input.isControlHold {
punctuationNamePrefix = "_alt_punctuation_" punctuationNamePrefix = "_alt_punctuation_"
} else if input.isControlHold { } else if input.isControlHold && !input.isOptionHold {
punctuationNamePrefix = "_ctrl_punctuation_" punctuationNamePrefix = "_ctrl_punctuation_"
} else if input.isControlHold && input.isOptionHold {
punctuationNamePrefix = "_alt_ctrl_punctuation_"
} else if mgrPrefs.halfWidthPunctuationEnabled { } else if mgrPrefs.halfWidthPunctuationEnabled {
punctuationNamePrefix = "_half_punctuation_" punctuationNamePrefix = "_half_punctuation_"
} else { } else {

View File

@ -35,19 +35,27 @@ extension KeyHandler {
var actualCandidateCursorIndex: Int { var actualCandidateCursorIndex: Int {
var cursorIndex = builderCursorIndex var cursorIndex = builderCursorIndex
// Windows Yahoo Kimo IME style, phrase is *at the rear of* the cursor. switch mgrPrefs.useRearCursorMode {
// (i.e. the cursor is always *before* the phrase.) case false:
// This is different from MS Phonetics IME style ... do {
// ... since Windows Yahoo Kimo allows "node crossing". // macOS built-in Zhuyin style.
if (mgrPrefs.setRearCursorMode // (i.e. the cursor is always in front of the phrase.)
&& (cursorIndex < builderLength)) // No crossing.
|| cursorIndex == 0 switch cursorIndex {
{ case 0: cursorIndex = 1
if cursorIndex == 0, !mgrPrefs.setRearCursorMode { default: break
cursorIndex += keyLengthAtIndexZero }
} else { }
cursorIndex += 1 case true:
} do {
// Microsoft new phonetics style.
// (i.e. the cursor is always at the rear of the phrase.)
// No crossing.
switch cursorIndex {
case builderLength: cursorIndex -= 1
default: break
}
}
} }
return cursorIndex return cursorIndex
} }

View File

@ -94,7 +94,7 @@ extension KeyHandler {
func buildCandidate( func buildCandidate(
state currentState: InputState.NotEmpty, state currentState: InputState.NotEmpty,
useVerticalMode: Bool useVerticalMode: Bool = false
) -> InputState.ChoosingCandidate { ) -> InputState.ChoosingCandidate {
InputState.ChoosingCandidate( InputState.ChoosingCandidate(
composingBuffer: currentState.composingBuffer, composingBuffer: currentState.composingBuffer,
@ -590,4 +590,105 @@ extension KeyHandler {
return true return true
} }
// MARK: - Tab
func handleTab(
state: InputState,
isShiftHold: Bool,
stateCallback: @escaping (InputState) -> Void,
errorCallback: @escaping () -> Void
) -> Bool {
guard let state = state as? InputState.Inputting else {
guard state is InputState.Empty else {
IME.prtDebugIntel("6044F081")
errorCallback()
return true
}
// 使 Tab
return false
}
guard _composer.isEmpty else {
IME.prtDebugIntel("A2DAF7BC")
errorCallback()
return true
}
//
let candidates = buildCandidate(state: state).candidates
guard !candidates.isEmpty else {
IME.prtDebugIntel("3378A6DF")
errorCallback()
return true
}
var length = 0
var currentAnchor = Megrez.NodeAnchor()
let cursorIndex = min(
actualCandidateCursorIndex + (mgrPrefs.useRearCursorMode ? 1 : 0), builderLength
)
for anchor in _walkedNodes {
length += anchor.spanningLength
if length >= cursorIndex {
currentAnchor = anchor
break
}
}
guard let currentNode = currentAnchor.node else {
IME.prtDebugIntel("4F2DEC2F")
errorCallback()
return true
}
let currentValue = currentNode.currentKeyValue.value
var currentIndex = 0
if currentNode.score < currentNode.kSelectedCandidateScore {
// Once the user never select a candidate for the node,
// we start from the first candidate, so the user has a
// chance to use the unigram with two or more characters
// when type the tab key for the first time.
//
// In other words, if a user type two BPMF readings,
// but the score of seeing them as two unigrams is higher
// than a phrase with two characters, the user can just
// use the longer phrase by tapping the tab key.
if candidates[0] == currentValue {
// If the first candidate is the value of the
// current node, we use next one.
if isShiftHold {
currentIndex = candidates.count - 1
} else {
currentIndex = 1
}
}
} else {
for candidate in candidates {
if candidate == currentValue {
if isShiftHold {
if currentIndex == 0 {
currentIndex = candidates.count - 1
} else {
currentIndex -= 1
}
} else {
currentIndex += 1
}
break
}
currentIndex += 1
}
}
if currentIndex >= candidates.count {
currentIndex = 0
}
fixNode(value: candidates[currentIndex], respectCursorPushing: false)
stateCallback(buildInputtingState)
return true
}
} }

View File

@ -719,6 +719,10 @@ public struct Tekkon {
consonant.selfReplace("", "") consonant.selfReplace("", "")
} }
if vowel == "", semivowel.isEmpty { consonant.selfReplace("", "") } if vowel == "", semivowel.isEmpty { consonant.selfReplace("", "") }
if consonant == "", semivowel.isEmpty, vowel.isEmpty {
consonant = ""
vowel = ""
}
} }
// //

View File

@ -308,7 +308,9 @@ extension ctlInputMethod {
return return
} }
if let previous = previous as? InputState.NotEmpty { if let previous = previous as? InputState.NotEmpty,
!(state is InputState.EmptyIgnoringPreviousState)
{
commit(text: previous.composingBuffer, client: client) commit(text: previous.composingBuffer, client: client)
} }
client.setMarkedText( client.setMarkedText(
@ -694,7 +696,7 @@ extension ctlInputMethod: ctlCandidateDelegate {
if let state = state as? InputState.ChoosingCandidate { if let state = state as? InputState.ChoosingCandidate {
let selectedValue = state.candidates[Int(index)] let selectedValue = state.candidates[Int(index)]
keyHandler.fixNode(value: selectedValue) keyHandler.fixNode(value: selectedValue, respectCursorPushing: true)
let inputting = keyHandler.buildInputtingState let inputting = keyHandler.buildInputtingState

View File

@ -44,21 +44,21 @@ extension ctlInputMethod {
let useSCPCTypingModeItem = menu.addItem( let useSCPCTypingModeItem = menu.addItem(
withTitle: NSLocalizedString("Per-Char Select Mode", comment: ""), withTitle: NSLocalizedString("Per-Char Select Mode", comment: ""),
action: #selector(toggleSCPCTypingMode(_:)), keyEquivalent: "P" action: #selector(toggleSCPCTypingMode(_:)), keyEquivalent: mgrPrefs.usingHotKeySCPC ? "P" : ""
) )
useSCPCTypingModeItem.keyEquivalentModifierMask = [.command, .control] useSCPCTypingModeItem.keyEquivalentModifierMask = [.command, .control]
useSCPCTypingModeItem.state = mgrPrefs.useSCPCTypingMode.state useSCPCTypingModeItem.state = mgrPrefs.useSCPCTypingMode.state
let userAssociatedPhrasesItem = menu.addItem( let userAssociatedPhrasesItem = menu.addItem(
withTitle: NSLocalizedString("Per-Char Associated Phrases", comment: ""), withTitle: NSLocalizedString("Per-Char Associated Phrases", comment: ""),
action: #selector(toggleAssociatedPhrasesEnabled(_:)), keyEquivalent: "O" action: #selector(toggleAssociatedPhrasesEnabled(_:)), keyEquivalent: mgrPrefs.usingHotKeyAssociates ? "O" : ""
) )
userAssociatedPhrasesItem.keyEquivalentModifierMask = [.command, .control] userAssociatedPhrasesItem.keyEquivalentModifierMask = [.command, .control]
userAssociatedPhrasesItem.state = mgrPrefs.associatedPhrasesEnabled.state userAssociatedPhrasesItem.state = mgrPrefs.associatedPhrasesEnabled.state
let useCNS11643SupportItem = menu.addItem( let useCNS11643SupportItem = menu.addItem(
withTitle: NSLocalizedString("CNS11643 Mode", comment: ""), withTitle: NSLocalizedString("CNS11643 Mode", comment: ""),
action: #selector(toggleCNS11643Enabled(_:)), keyEquivalent: "L" action: #selector(toggleCNS11643Enabled(_:)), keyEquivalent: mgrPrefs.usingHotKeyCNS ? "L" : ""
) )
useCNS11643SupportItem.keyEquivalentModifierMask = [.command, .control] useCNS11643SupportItem.keyEquivalentModifierMask = [.command, .control]
useCNS11643SupportItem.state = mgrPrefs.cns11643Enabled.state useCNS11643SupportItem.state = mgrPrefs.cns11643Enabled.state
@ -66,14 +66,14 @@ extension ctlInputMethod {
if IME.getInputMode() == InputMode.imeModeCHT { if IME.getInputMode() == InputMode.imeModeCHT {
let chineseConversionItem = menu.addItem( let chineseConversionItem = menu.addItem(
withTitle: NSLocalizedString("Force KangXi Writing", comment: ""), withTitle: NSLocalizedString("Force KangXi Writing", comment: ""),
action: #selector(toggleChineseConverter(_:)), keyEquivalent: "K" action: #selector(toggleChineseConverter(_:)), keyEquivalent: mgrPrefs.usingHotKeyKangXi ? "K" : ""
) )
chineseConversionItem.keyEquivalentModifierMask = [.command, .control] chineseConversionItem.keyEquivalentModifierMask = [.command, .control]
chineseConversionItem.state = mgrPrefs.chineseConversionEnabled.state chineseConversionItem.state = mgrPrefs.chineseConversionEnabled.state
let shiftJISConversionItem = menu.addItem( let shiftJISConversionItem = menu.addItem(
withTitle: NSLocalizedString("JIS Shinjitai Output", comment: ""), withTitle: NSLocalizedString("JIS Shinjitai Output", comment: ""),
action: #selector(toggleShiftJISShinjitaiOutput(_:)), keyEquivalent: "J" action: #selector(toggleShiftJISShinjitaiOutput(_:)), keyEquivalent: mgrPrefs.usingHotKeyJIS ? "J" : ""
) )
shiftJISConversionItem.keyEquivalentModifierMask = [.command, .control] shiftJISConversionItem.keyEquivalentModifierMask = [.command, .control]
shiftJISConversionItem.state = mgrPrefs.shiftJISShinjitaiOutputEnabled.state shiftJISConversionItem.state = mgrPrefs.shiftJISShinjitaiOutputEnabled.state
@ -81,7 +81,7 @@ extension ctlInputMethod {
let halfWidthPunctuationItem = menu.addItem( let halfWidthPunctuationItem = menu.addItem(
withTitle: NSLocalizedString("Half-Width Punctuation Mode", comment: ""), withTitle: NSLocalizedString("Half-Width Punctuation Mode", comment: ""),
action: #selector(toggleHalfWidthPunctuation(_:)), keyEquivalent: "H" action: #selector(toggleHalfWidthPunctuation(_:)), keyEquivalent: mgrPrefs.usingHotKeyHalfWidthASCII ? "H" : ""
) )
halfWidthPunctuationItem.keyEquivalentModifierMask = [.command, .control] halfWidthPunctuationItem.keyEquivalentModifierMask = [.command, .control]
halfWidthPunctuationItem.state = mgrPrefs.halfWidthPunctuationEnabled.state halfWidthPunctuationItem.state = mgrPrefs.halfWidthPunctuationEnabled.state

View File

@ -28,7 +28,6 @@ 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"
@ -38,7 +37,7 @@ struct UserDef {
static let kCandidateListTextSize = "CandidateListTextSize" static let kCandidateListTextSize = "CandidateListTextSize"
static let kAppleLanguages = "AppleLanguages" static let kAppleLanguages = "AppleLanguages"
static let kShouldAutoReloadUserDataFiles = "ShouldAutoReloadUserDataFiles" static let kShouldAutoReloadUserDataFiles = "ShouldAutoReloadUserDataFiles"
static let kSetRearCursorMode = "SetRearCursorMode" static let kuseRearCursorMode = "useRearCursorMode"
static let kUseHorizontalCandidateList = "UseHorizontalCandidateList" static let kUseHorizontalCandidateList = "UseHorizontalCandidateList"
static let kComposingBufferSize = "ComposingBufferSize" static let kComposingBufferSize = "ComposingBufferSize"
static let kChooseCandidateUsingSpace = "ChooseCandidateUsingSpace" static let kChooseCandidateUsingSpace = "ChooseCandidateUsingSpace"
@ -63,6 +62,13 @@ struct UserDef {
static let kAssociatedPhrasesEnabled = "AssociatedPhrasesEnabled" static let kAssociatedPhrasesEnabled = "AssociatedPhrasesEnabled"
static let kPhraseReplacementEnabled = "PhraseReplacementEnabled" static let kPhraseReplacementEnabled = "PhraseReplacementEnabled"
static let kUsingHotKeySCPC = "UsingHotKeySCPC"
static let kUsingHotKeyAssociates = "UsingHotKeyAssociates"
static let kUsingHotKeyCNS = "UsingHotKeyCNS"
static let kUsingHotKeyKangXi = "UsingHotKeyKangXi"
static let kUsingHotKeyJIS = "UsingHotKeyJIS"
static let kUsingHotKeyHalfWidthASCII = "UsingHotKeyHalfWidthASCII"
} }
private let kDefaultCandidateListTextSize: CGFloat = 18 private let kDefaultCandidateListTextSize: CGFloat = 18
@ -76,8 +82,8 @@ private let kMaxCandidateListTextSize: CGFloat = 196
// will start to sputter beyond 12 such is the algorithmatic complexity // will start to sputter beyond 12 such is the algorithmatic complexity
// of the Viterbi algorithm used in the builder library (at O(N^2)) // of the Viterbi algorithm used in the builder library (at O(N^2))
private let kDefaultComposingBufferSize = 20 private let kDefaultComposingBufferSize = 20
private let kMinComposingBufferSize = 4 private let kMinComposingBufferSize = 10
private let kMaxComposingBufferSize = 30 private let kMaxComposingBufferSize = 40
private let kDefaultKeys = "123456789" private let kDefaultKeys = "123456789"
@ -217,49 +223,8 @@ enum MandarinParser: Int {
// MARK: - // MARK: -
public enum mgrPrefs { public enum mgrPrefs {
static var allKeys: [String] {
[
UserDef.kIsDebugModeEnabled,
UserDef.kUseScoreBalancing,
UserDef.kMostRecentInputMode,
UserDef.kUserDataFolderSpecified,
UserDef.kMandarinParser,
UserDef.kBasicKeyboardLayout,
UserDef.kShowPageButtonsInCandidateWindow,
UserDef.kCandidateListTextSize,
UserDef.kAppleLanguages,
UserDef.kShouldAutoReloadUserDataFiles,
UserDef.kSetRearCursorMode,
UserDef.kUseHorizontalCandidateList,
UserDef.kComposingBufferSize,
UserDef.kChooseCandidateUsingSpace,
UserDef.kCNS11643Enabled,
UserDef.kSymbolInputEnabled,
UserDef.kChineseConversionEnabled,
UserDef.kShiftJISShinjitaiOutputEnabled,
UserDef.kHalfWidthPunctuationEnabled,
UserDef.kSpecifyShiftTabKeyBehavior,
UserDef.kSpecifyShiftSpaceKeyBehavior,
UserDef.kEscToCleanInputBuffer,
UserDef.kCandidateTextFontName,
UserDef.kCandidateKeyLabelFontName,
UserDef.kCandidateKeys,
UserDef.kMoveCursorAfterSelectingCandidate,
UserDef.kPhraseReplacementEnabled,
UserDef.kUseSCPCTypingMode,
UserDef.kMaxCandidateLength,
UserDef.kShouldNotFartInLieuOfBeep,
UserDef.kShowHanyuPinyinInCompositionBuffer,
UserDef.kInlineDumpPinyinInLieuOfZhuyin,
UserDef.kAssociatedPhrasesEnabled,
]
}
// MARK: - Preferences Module plist
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(
@ -280,7 +245,7 @@ public enum mgrPrefs {
UserDefaults.standard.setDefault(mgrPrefs.useSCPCTypingMode, forKey: UserDef.kUseSCPCTypingMode) UserDefaults.standard.setDefault(mgrPrefs.useSCPCTypingMode, forKey: UserDef.kUseSCPCTypingMode)
UserDefaults.standard.setDefault(mgrPrefs.associatedPhrasesEnabled, forKey: UserDef.kAssociatedPhrasesEnabled) UserDefaults.standard.setDefault(mgrPrefs.associatedPhrasesEnabled, forKey: UserDef.kAssociatedPhrasesEnabled)
UserDefaults.standard.setDefault( UserDefaults.standard.setDefault(
mgrPrefs.setRearCursorMode, forKey: UserDef.kSetRearCursorMode mgrPrefs.useRearCursorMode, forKey: UserDef.kuseRearCursorMode
) )
UserDefaults.standard.setDefault( UserDefaults.standard.setDefault(
mgrPrefs.moveCursorAfterSelectingCandidate, forKey: UserDef.kMoveCursorAfterSelectingCandidate mgrPrefs.moveCursorAfterSelectingCandidate, forKey: UserDef.kMoveCursorAfterSelectingCandidate
@ -302,15 +267,19 @@ public enum mgrPrefs {
mgrPrefs.inlineDumpPinyinInLieuOfZhuyin, forKey: UserDef.kInlineDumpPinyinInLieuOfZhuyin mgrPrefs.inlineDumpPinyinInLieuOfZhuyin, forKey: UserDef.kInlineDumpPinyinInLieuOfZhuyin
) )
UserDefaults.standard.setDefault(mgrPrefs.usingHotKeySCPC, forKey: UserDef.kUsingHotKeySCPC)
UserDefaults.standard.setDefault(mgrPrefs.usingHotKeyAssociates, forKey: UserDef.kUsingHotKeyAssociates)
UserDefaults.standard.setDefault(mgrPrefs.usingHotKeyCNS, forKey: UserDef.kUsingHotKeyCNS)
UserDefaults.standard.setDefault(mgrPrefs.usingHotKeyKangXi, forKey: UserDef.kUsingHotKeyKangXi)
UserDefaults.standard.setDefault(mgrPrefs.usingHotKeyJIS, forKey: UserDef.kUsingHotKeyJIS)
UserDefaults.standard.setDefault(mgrPrefs.usingHotKeyHalfWidthASCII, forKey: UserDef.kUsingHotKeyHalfWidthASCII)
UserDefaults.standard.synchronize() UserDefaults.standard.synchronize()
} }
@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
@ -353,8 +322,8 @@ public enum mgrPrefs {
@UserDefault(key: UserDef.kShouldAutoReloadUserDataFiles, defaultValue: true) @UserDefault(key: UserDef.kShouldAutoReloadUserDataFiles, defaultValue: true)
static var shouldAutoReloadUserDataFiles: Bool static var shouldAutoReloadUserDataFiles: Bool
@UserDefault(key: UserDef.kSetRearCursorMode, defaultValue: false) @UserDefault(key: UserDef.kuseRearCursorMode, defaultValue: false)
static var setRearCursorMode: Bool static var useRearCursorMode: Bool
@UserDefault(key: UserDef.kMoveCursorAfterSelectingCandidate, defaultValue: true) @UserDefault(key: UserDef.kMoveCursorAfterSelectingCandidate, defaultValue: true)
static var moveCursorAfterSelectingCandidate: Bool static var moveCursorAfterSelectingCandidate: Bool
@ -554,4 +523,24 @@ public enum mgrPrefs {
UserDefaults.standard.set(associatedPhrasesEnabled, forKey: UserDef.kAssociatedPhrasesEnabled) UserDefaults.standard.set(associatedPhrasesEnabled, forKey: UserDef.kAssociatedPhrasesEnabled)
return associatedPhrasesEnabled return associatedPhrasesEnabled
} }
// MARK: - Keyboard HotKey Enable / Disable
@UserDefault(key: UserDef.kUsingHotKeySCPC, defaultValue: true)
static var usingHotKeySCPC: Bool
@UserDefault(key: UserDef.kUsingHotKeyAssociates, defaultValue: true)
static var usingHotKeyAssociates: Bool
@UserDefault(key: UserDef.kUsingHotKeyCNS, defaultValue: true)
static var usingHotKeyCNS: Bool
@UserDefault(key: UserDef.kUsingHotKeyKangXi, defaultValue: true)
static var usingHotKeyKangXi: Bool
@UserDefault(key: UserDef.kUsingHotKeyJIS, defaultValue: true)
static var usingHotKeyJIS: Bool
@UserDefault(key: UserDef.kUsingHotKeyHalfWidthASCII, defaultValue: true)
static var usingHotKeyHalfWidthASCII: Bool
} }

View File

@ -80,14 +80,10 @@ extension vChewing {
return false return false
} }
if allowConsolidation {
LMConsolidator.fixEOF(path: path)
LMConsolidator.consolidate(path: path, pragma: true)
}
do { do {
let rawData = try Data(contentsOf: URL(fileURLWithPath: path)) let rawData = try Data(contentsOf: URL(fileURLWithPath: path))
let rawPlist = try PropertyListSerialization.propertyList(from: rawData, format: nil) as! [String: [Data]] let rawPlist: [String: [Data]] =
try PropertyListSerialization.propertyList(from: rawData, format: nil) as? [String: [Data]] ?? .init()
rangeMap = rawPlist rangeMap = rawPlist
} catch { } catch {
IME.prtDebugIntel("↑ Exception happened when reading plist file at: \(path).") IME.prtDebugIntel("↑ Exception happened when reading plist file at: \(path).")

View File

@ -47,20 +47,9 @@ extension vChewing {
} }
} }
struct KeyObservationPair: Equatable { struct KeyObservationPair {
var key: String var key: String
var observation: Observation var observation: Observation
var hashValue: Int { key.hashValue }
init(key: String, observation: Observation) {
self.key = key
self.observation = observation
}
static func == (lhs: KeyObservationPair, rhs: KeyObservationPair) -> Bool {
lhs.key == rhs.key
}
} }
// MARK: - Main // MARK: - Main
@ -72,10 +61,7 @@ extension vChewing {
let kDecayThreshold: Double = 1.0 / 1_048_576.0 let kDecayThreshold: Double = 1.0 / 1_048_576.0
public init(capacity: Int = 500, decayConstant: Double = 5400.0) { public init(capacity: Int = 500, decayConstant: Double = 5400.0) {
mutCapacity = abs(capacity) // Ensures that this value is always > 0. mutCapacity = max(capacity, 1) // Ensures that this integer value is always > 0.
if mutCapacity == 0 {
mutCapacity = 1
}
mutDecayExponent = log(0.5) / decayConstant mutDecayExponent = log(0.5) / decayConstant
} }
@ -157,10 +143,7 @@ extension vChewing {
lambda: Double lambda: Double
) -> Double { ) -> Double {
let decay = exp((timestamp - eventTimestamp) * lambda) let decay = exp((timestamp - eventTimestamp) * lambda)
if decay < kDecayThreshold { if decay < kDecayThreshold { return 0.0 }
return 0.0
}
let prob = Double(eventCount) / Double(totalCount) let prob = Double(eventCount) / Double(totalCount)
return prob * decay return prob * decay
} }

View File

@ -26,8 +26,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
extension Megrez { extension Megrez {
/// ///
public class BlockReadingBuilder { public class BlockReadingBuilder {
/// ///
private var mutMaximumBuildSpanLength = 10 private let kDroppedPathScore: Double = -999
/// ///
private var mutCursorIndex: Int = 0 private var mutCursorIndex: Int = 0
/// ///
@ -37,6 +37,8 @@ extension Megrez {
/// 使 /// 使
private var mutLM: LanguageModel private var mutLM: LanguageModel
///
public var maxBuildSpanLength: Int { mutGrid.maxBuildSpanLength }
/// ///
public var joinSeparator: String = "" public var joinSeparator: String = ""
/// ///
@ -55,11 +57,11 @@ extension Megrez {
/// ///
/// - Parameters: /// - Parameters:
/// - lm: Megrez.LanguageModel /// - lm: Megrez.LanguageModel
/// - length: 10 /// - length: 10
/// - separator: /// - separator:
public init(lm: LanguageModel, length: Int = 10, separator: String = "") { public init(lm: LanguageModel, length: Int = 10, separator: String = "") {
mutLM = lm mutLM = lm
mutMaximumBuildSpanLength = length mutGrid = .init(spanLength: abs(length)) //
joinSeparator = separator joinSeparator = separator
} }
@ -112,6 +114,7 @@ extension Megrez {
/// ///
/// ///
@discardableResult public func removeHeadReadings(count: Int) -> Bool { @discardableResult public func removeHeadReadings(count: Int) -> Bool {
let count = abs(count) //
if count > length { if count > length {
return false return false
} }
@ -120,8 +123,10 @@ extension Megrez {
if mutCursorIndex > 0 { if mutCursorIndex > 0 {
mutCursorIndex -= 1 mutCursorIndex -= 1
} }
mutReadings.removeFirst() if !mutReadings.isEmpty {
mutGrid.shrinkGridByOneAt(location: 0) mutReadings.removeFirst()
mutGrid.shrinkGridByOneAt(location: 0)
}
build() build()
} }
@ -131,23 +136,22 @@ extension Megrez {
// MARK: - Walker // MARK: - Walker
/// ///
///
/// 使
/// - Parameters: /// - Parameters:
/// - at: /// - at:
/// - score: 0 /// - score: 0
/// - nodesLimit: /// - joinedPhrase: 使
/// - balanced: /// - longPhrases: 使
public func walk( public func walk(
at location: Int, at location: Int = 0,
score accumulatedScore: Double = 0.0, score accumulatedScore: Double = 0.0,
nodesLimit: Int = 0, joinedPhrase: String = "",
balanced: Bool = false longPhrases: [String] = .init()
) -> [NodeAnchor] { ) -> [NodeAnchor] {
Array( let newLocation = (mutGrid.width) - abs(location) //
return Array(
reverseWalk( reverseWalk(
at: location, score: accumulatedScore, at: newLocation, score: accumulatedScore,
nodesLimit: nodesLimit, balanced: balanced joinedPhrase: joinedPhrase, longPhrases: longPhrases
).reversed()) ).reversed())
} }
@ -155,91 +159,125 @@ extension Megrez {
/// - Parameters: /// - Parameters:
/// - at: /// - at:
/// - score: 0 /// - score: 0
/// - nodesLimit: /// - joinedPhrase: 使
/// - balanced: /// - longPhrases: 使
public func reverseWalk( public func reverseWalk(
at location: Int, at location: Int,
score accumulatedScore: Double = 0.0, score accumulatedScore: Double = 0.0,
nodesLimit: Int = 0, joinedPhrase: String = "",
balanced: Bool = false longPhrases: [String] = .init()
) -> [NodeAnchor] { ) -> [NodeAnchor] {
let location = abs(location) //
if location == 0 || location > mutGrid.width { if location == 0 || location > mutGrid.width {
return [] as [NodeAnchor] return .init()
} }
var paths: [[NodeAnchor]] = [] var paths = [[NodeAnchor]]()
var nodes: [NodeAnchor] = mutGrid.nodesEndingAt(location: location) var nodes = mutGrid.nodesEndingAt(location: location)
if balanced { nodes = nodes.stableSorted {
nodes.sort { $0.scoreForSort > $1.scoreForSort
$0.balancedScore > $1.balancedScore
}
} }
for (i, n) in nodes.enumerated() { if let nodeOfNodeZero = nodes[0].node, nodeOfNodeZero.score >= nodeOfNodeZero.kSelectedCandidateScore {
// X NodeAnchor node // 使
// abs var nodeZero = nodes[0]
if abs(nodesLimit) > 0, i == abs(nodesLimit) { nodeZero.accumulatedScore = accumulatedScore + nodeOfNodeZero.score
break var path: [NodeAnchor] = reverseWalk(at: location - nodeZero.spanningLength, score: nodeZero.accumulatedScore)
} path.insert(nodeZero, at: 0)
var n = n
guard let nNode = n.node else {
continue
}
n.accumulatedScore = accumulatedScore + nNode.score
//
//
if balanced {
n.accumulatedScore += n.additionalWeights
}
var path: [NodeAnchor] = reverseWalk(
at: location - n.spanningLength,
score: n.accumulatedScore
)
path.insert(n, at: 0)
paths.append(path) paths.append(path)
} else if !longPhrases.isEmpty {
// 使 var path = [NodeAnchor]()
if balanced, nNode.score >= 0 { for theAnchor in nodes {
break guard let theNode = theAnchor.node else { continue }
} var theAnchor = theAnchor
} let joinedValue = theNode.currentKeyValue.value + joinedPhrase
//
if !paths.isEmpty { // /////////使
if var result = paths.first { //
for value in paths { if longPhrases.contains(joinedValue) {
if let vLast = value.last, let rLast = result.last { theAnchor.accumulatedScore = kDroppedPathScore
if vLast.accumulatedScore > rLast.accumulatedScore { path.insert(theAnchor, at: 0)
result = value paths.append(path)
} continue
}
} }
return result theAnchor.accumulatedScore = accumulatedScore + theNode.score
if joinedValue.count >= longPhrases[0].count {
path = reverseWalk(
at: location - theAnchor.spanningLength, score: theAnchor.accumulatedScore, joinedPhrase: "",
longPhrases: .init()
)
} else {
path = reverseWalk(
at: location - theAnchor.spanningLength, score: theAnchor.accumulatedScore, joinedPhrase: joinedValue,
longPhrases: longPhrases
)
}
path.insert(theAnchor, at: 0)
paths.append(path)
}
} else {
//
var longPhrases = [String]()
for theAnchor in nodes {
guard let theNode = theAnchor.node else { continue }
if theAnchor.spanningLength > 1 {
longPhrases.append(theNode.currentKeyValue.value)
}
}
longPhrases = longPhrases.stableSorted {
$0.count > $1.count
}
for theAnchor in nodes {
var theAnchor = theAnchor
guard let theNode = theAnchor.node else { continue }
theAnchor.accumulatedScore = accumulatedScore + theNode.score
var path = [NodeAnchor]()
if theAnchor.spanningLength > 1 {
path = reverseWalk(
at: location - theAnchor.spanningLength, score: theAnchor.accumulatedScore, joinedPhrase: "",
longPhrases: .init()
)
} else {
path = reverseWalk(
at: location - theAnchor.spanningLength, score: theAnchor.accumulatedScore,
joinedPhrase: theNode.currentKeyValue.value, longPhrases: longPhrases
)
}
path.insert(theAnchor, at: 0)
paths.append(path)
} }
} }
return [] as [NodeAnchor]
guard !paths.isEmpty else {
return .init()
}
var result: [NodeAnchor] = paths[0]
for neta in paths {
if neta.last!.accumulatedScore > result.last!.accumulatedScore {
result = neta
}
}
return result
} }
// MARK: - Private functions // MARK: - Private functions
private func build() { private func build() {
let itrBegin: Int = let itrBegin: Int =
(mutCursorIndex < mutMaximumBuildSpanLength) ? 0 : mutCursorIndex - mutMaximumBuildSpanLength (mutCursorIndex < maxBuildSpanLength) ? 0 : mutCursorIndex - maxBuildSpanLength
let itrEnd: Int = min(mutCursorIndex + mutMaximumBuildSpanLength, mutReadings.count) let itrEnd: Int = min(mutCursorIndex + maxBuildSpanLength, mutReadings.count)
for p in itrBegin..<itrEnd { for p in itrBegin..<itrEnd {
for q in 1..<mutMaximumBuildSpanLength { for q in 1..<maxBuildSpanLength {
if p + q > itrEnd { if p + q > itrEnd {
break break
} }
let strSlice = mutReadings[p..<(p + q)] let arrSlice = mutReadings[p..<(p + q)]
let combinedReading: String = join(slice: strSlice, separator: joinSeparator) let combinedReading: String = join(slice: arrSlice, separator: joinSeparator)
if !mutGrid.hasMatchedNode(location: p, spanningLength: q, key: combinedReading) { if !mutGrid.hasMatchedNode(location: p, spanningLength: q, key: combinedReading) {
let unigrams: [Unigram] = mutLM.unigramsFor(key: combinedReading) let unigrams: [Unigram] = mutLM.unigramsFor(key: combinedReading)
@ -252,12 +290,35 @@ extension Megrez {
} }
} }
private func join(slice strSlice: ArraySlice<String>, separator: String) -> String { private func join(slice arrSlice: ArraySlice<String>, separator: String) -> String {
var arrResult: [String] = [] var arrResult: [String] = []
for value in strSlice { for value in arrSlice {
arrResult.append(value) arrResult.append(value)
} }
return arrResult.joined(separator: separator) return arrResult.joined(separator: separator)
} }
} }
} }
// MARK: - Stable Sort Extension
// Reference: https://stackoverflow.com/a/50545761/4162914
extension Sequence {
/// Return a stable-sorted collection.
///
/// - Parameter areInIncreasingOrder: Return nil when two element are equal.
/// - Returns: The sorted collection.
func stableSorted(
by areInIncreasingOrder: (Element, Element) throws -> Bool
)
rethrows -> [Element]
{
try enumerated()
.sorted { a, b -> Bool in
try areInIncreasingOrder(a.element, b.element)
|| (a.offset < b.offset && !areInIncreasingOrder(b.element, a.element))
}
.map(\.element)
}
}

View File

@ -29,16 +29,23 @@ extension Megrez {
/// ///
private var mutSpans: [Megrez.Span] private var mutSpans: [Megrez.Span]
///
private var mutMaxBuildSpanLength = 10
///
public var maxBuildSpanLength: Int { mutMaxBuildSpanLength }
/// ///
var width: Int { mutSpans.count } var width: Int { mutSpans.count }
public init() { public init(spanLength: Int = 10) {
mutMaxBuildSpanLength = spanLength
mutSpans = [Megrez.Span]() mutSpans = [Megrez.Span]()
} }
/// ///
public func clear() { public func clear() {
mutSpans = [Megrez.Span]() mutSpans.removeAll()
} }
/// ///
@ -47,6 +54,8 @@ extension Megrez {
/// - location: /// - location:
/// - spanningLength: /// - spanningLength:
public func insertNode(node: Node, location: Int, spanningLength: Int) { public func insertNode(node: Node, location: Int, spanningLength: Int) {
let location = abs(location) //
let spanningLength = abs(spanningLength) //
if location >= mutSpans.count { if location >= mutSpans.count {
let diff = location - mutSpans.count + 1 let diff = location - mutSpans.count + 1
for _ in 0..<diff { for _ in 0..<diff {
@ -62,24 +71,26 @@ extension Megrez {
/// - spanningLength: /// - spanningLength:
/// - key: /// - key:
public func hasMatchedNode(location: Int, spanningLength: Int, key: String) -> Bool { public func hasMatchedNode(location: Int, spanningLength: Int, key: String) -> Bool {
let location = abs(location) //
let spanningLength = abs(spanningLength) //
if location > mutSpans.count { if location > mutSpans.count {
return false return false
} }
let n = mutSpans[location].node(length: spanningLength) let n = mutSpans[location].node(length: spanningLength)
return n == nil ? false : key == n?.key return n != nil && key == n?.key
} }
/// ///
/// - Parameters: /// - Parameters:
/// - location: /// - location:
public func expandGridByOneAt(location: Int) { public func expandGridByOneAt(location: Int) {
// abs let location = abs(location) //
mutSpans.insert(Span(), at: abs(location)) mutSpans.insert(Span(), at: location)
if location != 0, abs(location) != mutSpans.count { if location != 0, location != mutSpans.count {
for i in 0..<abs(location) { for i in 0..<location {
// zaps overlapping spans // zaps overlapping spans
mutSpans[i].removeNodeOfLengthGreaterThan(abs(location) - i) mutSpans[i].removeNodeOfLengthGreaterThan(location - i)
} }
} }
} }
@ -88,6 +99,7 @@ extension Megrez {
/// - Parameters: /// - Parameters:
/// - location: /// - location:
public func shrinkGridByOneAt(location: Int) { public func shrinkGridByOneAt(location: Int) {
let location = abs(location) //
if location >= mutSpans.count { if location >= mutSpans.count {
return return
} }
@ -99,11 +111,35 @@ extension Megrez {
} }
} }
///
/// - Parameters:
/// - location:
public func nodesBeginningAt(location: Int) -> [NodeAnchor] {
let location = abs(location) //
var results = [NodeAnchor]()
if location < mutSpans.count { // mutSpans
let span = mutSpans[location]
for i in 1...maxBuildSpanLength {
if let np = span.node(length: i) {
results.append(
NodeAnchor(
node: np,
location: location,
spanningLength: i
)
)
}
}
}
return results
}
/// ///
/// - Parameters: /// - Parameters:
/// - location: /// - location:
public func nodesEndingAt(location: Int) -> [NodeAnchor] { public func nodesEndingAt(location: Int) -> [NodeAnchor] {
var results: [NodeAnchor] = [] let location = abs(location) //
var results = [NodeAnchor]()
if !mutSpans.isEmpty, location <= mutSpans.count { if !mutSpans.isEmpty, location <= mutSpans.count {
for i in 0..<location { for i in 0..<location {
let span = mutSpans[i] let span = mutSpans[i]
@ -127,7 +163,8 @@ extension Megrez {
/// - Parameters: /// - Parameters:
/// - location: /// - location:
public func nodesCrossingOrEndingAt(location: Int) -> [NodeAnchor] { public func nodesCrossingOrEndingAt(location: Int) -> [NodeAnchor] {
var results: [NodeAnchor] = [] let location = abs(location) //
var results = [NodeAnchor]()
if !mutSpans.isEmpty, location <= mutSpans.count { if !mutSpans.isEmpty, location <= mutSpans.count {
for i in 0..<location { for i in 0..<location {
let span = mutSpans[i] let span = mutSpans[i]
@ -157,6 +194,7 @@ extension Megrez {
/// - location: /// - location:
/// - value: /// - value:
@discardableResult public func fixNodeSelectedCandidate(location: Int, value: String) -> NodeAnchor { @discardableResult public func fixNodeSelectedCandidate(location: Int, value: String) -> NodeAnchor {
let location = abs(location) //
var node = NodeAnchor() var node = NodeAnchor()
for nodeAnchor in nodesCrossingOrEndingAt(location: location) { for nodeAnchor in nodesCrossingOrEndingAt(location: location) {
guard let theNode = nodeAnchor.node else { guard let theNode = nodeAnchor.node else {
@ -182,6 +220,7 @@ extension Megrez {
/// - value: /// - value:
/// - overridingScore: /// - overridingScore:
public func overrideNodeScoreForSelectedCandidate(location: Int, value: String, overridingScore: Double) { public func overrideNodeScoreForSelectedCandidate(location: Int, value: String, overridingScore: Double) {
let location = abs(location) //
for nodeAnchor in nodesCrossingOrEndingAt(location: location) { for nodeAnchor in nodesCrossingOrEndingAt(location: location) {
guard let theNode = nodeAnchor.node else { guard let theNode = nodeAnchor.node else {
continue continue

View File

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

View File

@ -47,6 +47,7 @@ extension Megrez {
/// - node: /// - node:
/// - length: /// - length:
mutating func insert(node: Node, length: Int) { mutating func insert(node: Node, length: Int) {
let length = abs(length) //
mutLengthNodeMap[length] = node mutLengthNodeMap[length] = node
if length > mutMaximumLength { if length > mutMaximumLength {
mutMaximumLength = length mutMaximumLength = length
@ -57,6 +58,7 @@ extension Megrez {
/// - Parameters: /// - Parameters:
/// - length: /// - length:
mutating func removeNodeOfLengthGreaterThan(_ length: Int) { mutating func removeNodeOfLengthGreaterThan(_ length: Int) {
let length = abs(length) //
if length > mutMaximumLength { return } if length > mutMaximumLength { return }
var max = 0 var max = 0
var removalList: [Int: Megrez.Node] = [:] var removalList: [Int: Megrez.Node] = [:]
@ -79,7 +81,7 @@ extension Megrez {
/// - Parameters: /// - Parameters:
/// - length: /// - length:
public func node(length: Int) -> Node? { public func node(length: Int) -> Node? {
mutLengthNodeMap[length] mutLengthNodeMap[abs(length)] //
} }
} }
} }

View File

@ -47,7 +47,7 @@ extension Megrez {
/// ///
private var mutSelectedUnigramIndex: Int = 0 private var mutSelectedUnigramIndex: Int = 0
/// ///
private let kSelectedCandidateScore: Double = 99 public let kSelectedCandidateScore: Double = 99
/// ///
public var description: String { public var description: String {
"(node,key:\(mutKey),fixed:\(mutCandidateFixed ? "true" : "false"),selected:\(mutSelectedUnigramIndex),\(mutUnigrams))" "(node,key:\(mutKey),fixed:\(mutCandidateFixed ? "true" : "false"),selected:\(mutSelectedUnigramIndex),\(mutUnigrams))"
@ -84,7 +84,7 @@ extension Megrez {
$0.score > $1.score $0.score > $1.score
} }
if mutUnigrams.count > 0 { if !mutUnigrams.isEmpty {
mutScore = mutUnigrams[0].score mutScore = mutUnigrams[0].score
} }
@ -133,6 +133,7 @@ extension Megrez {
/// - index: /// - index:
/// - fix: /// - fix:
public func selectCandidateAt(index: Int = 0, fix: Bool = false) { public func selectCandidateAt(index: Int = 0, fix: Bool = false) {
let index = abs(index)
mutSelectedUnigramIndex = index >= mutUnigrams.count ? 0 : index mutSelectedUnigramIndex = index >= mutUnigrams.count ? 0 : index
mutCandidateFixed = fix mutCandidateFixed = fix
mutScore = kSelectedCandidateScore mutScore = kSelectedCandidateScore
@ -152,6 +153,7 @@ extension Megrez {
/// - index: /// - index:
/// - score: /// - score:
public func selectFloatingCandidateAt(index: Int, score: Double) { public func selectFloatingCandidateAt(index: Int, score: Double) {
let index = abs(index) //
mutSelectedUnigramIndex = index >= mutUnigrams.count ? 0 : index mutSelectedUnigramIndex = index >= mutUnigrams.count ? 0 : index
mutCandidateFixed = false mutCandidateFixed = false
mutScore = score mutScore = score

View File

@ -34,10 +34,16 @@ public class clsSFX: NSObject, NSSoundDelegate {
private var currentBeep: NSSound? private var currentBeep: NSSound?
private func beep() { private func beep() {
let defaultVolume: Float = 0.4
// Stop existing beep // Stop existing beep
if let beep = currentBeep { if let beep = currentBeep {
if beep.isPlaying { if beep.isPlaying {
for i in 1..<30 {
beep.volume = (defaultVolume / Float(i))
usleep(1000)
}
beep.stop() beep.stop()
beep.volume = defaultVolume
} }
} }
// Create a new beep sound if possible // Create a new beep sound if possible
@ -54,7 +60,7 @@ public class clsSFX: NSObject, NSSoundDelegate {
return return
} }
beep.delegate = self beep.delegate = self
beep.volume = 0.4 beep.volume = defaultVolume
beep.play() beep.play()
currentBeep = beep currentBeep = beep
} }

View File

@ -85,19 +85,19 @@
"Apple Chewing - Dachen" = "Apple Chewing - Dachen"; "Apple Chewing - Dachen" = "Apple Chewing - Dachen";
"Apple Chewing - Eten Traditional" = "Apple Chewing - Eten Traditional"; "Apple Chewing - Eten Traditional" = "Apple Chewing - Eten Traditional";
"Apple Dynamic Bopomofo Basic Keyboard Layouts (Dachen & Eten Traditional) must match the Dachen parser in order to be functional." = "Apple Dynamic Bopomofo Basic Keyboard Layouts (Dachen & Eten Traditional) must match the Dachen parser in order to be functional."; "Apple Dynamic Bopomofo Basic Keyboard Layouts (Dachen & Eten Traditional) must match the Dachen parser in order to be functional." = "Apple Dynamic Bopomofo Basic Keyboard Layouts (Dachen & Eten Traditional) must match the Dachen parser in order to be functional.";
"at anyplace else (like Windows Yahoo KeyKey)" = "at anyplace else (like Windows Yahoo KeyKey)"; "at the rear of the phrase (like Microsoft New Phonetic)" = "at the rear of the phrase (like Microsoft New Phonetic)";
"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:";
"Buffer Limit:" = "Buffer Limit:";
"Candidate Layout:" = "Candidate Layout:"; "Candidate Layout:" = "Candidate Layout:";
"Candidate Size:" = "Candidate Size:"; "Candidate Size:" = "Candidate Size:";
"Change user interface language (will reboot the IME)." = "Change user interface language (will reboot the IME)."; "Change user interface language (will reboot the IME)." = "Change user interface language (will reboot the IME).";
"Check for updates automatically" = "Check for updates automatically"; "Check for updates automatically" = "Check for updates automatically";
"Choose candidate font size for better visual clarity." = "Choose candidate font size for better visual clarity."; "Choose candidate font size for better visual clarity." = "Choose candidate font size for better visual clarity.";
"Choose or hit Enter to confim your prefered keys for selecting candidates." = "Choose or hit Enter to confim your prefered keys for selecting candidates."; "Choose or hit Enter to confim your prefered keys for selecting candidates." = "Choose or hit Enter to confim your prefered keys for selecting candidates.";
"Choose the behavior of (Shift+)Space key in the candidate window." = "Choose the behavior of (Shift+)Space key in the candidate window."; "Choose the behavior of (Shift+)Space key with candidates." = "Choose the behavior of (Shift+)Space key with candidates.";
"Choose the behavior of (Shift+)Tab key in the candidate window." = "Choose the behavior of (Shift+)Tab key in the candidate window."; "Choose the behavior of (Shift+)Tab key in the candidate window." = "Choose the behavior of (Shift+)Tab key in the candidate window.";
"Choose the cursor position where you want to list possible candidates." = "Choose the cursor position where you want to list possible candidates."; "Choose the cursor position where you want to list possible candidates." = "Choose the cursor position where you want to list possible candidates.";
"Choose the macOS-level basic keyboard layout." = "Choose the macOS-level basic keyboard layout."; "Choose the macOS-level basic keyboard layout." = "Choose the macOS-level basic keyboard layout.";
@ -130,6 +130,7 @@
"in front of the phrase (like macOS built-in Zhuyin IME)" = "in front of the phrase (like macOS built-in Zhuyin IME)"; "in front of the phrase (like macOS built-in Zhuyin IME)" = "in front of the phrase (like macOS built-in Zhuyin IME)";
"Japanese" = "Japanese"; "Japanese" = "Japanese";
"Keyboard" = "Keyboard"; "Keyboard" = "Keyboard";
"Keyboard Shortcuts:" = "Keyboard Shortcuts:";
"Misc Settings:" = "Misc Settings:"; "Misc Settings:" = "Misc Settings:";
"MiTAC" = "MiTAC"; "MiTAC" = "MiTAC";
"Non-QWERTY alphanumeral keyboard layouts are for Hanyu Pinyin parser only." = "Non-QWERTY alphanumeral keyboard layouts are for Hanyu Pinyin parser only."; "Non-QWERTY alphanumeral keyboard layouts are for Hanyu Pinyin parser only." = "Non-QWERTY alphanumeral keyboard layouts are for Hanyu Pinyin parser only.";
@ -145,6 +146,7 @@
"Space & ESC Key:" = "Space & ESC Key:"; "Space & ESC Key:" = "Space & ESC Key:";
"Space to +cycle candidates, Shift+Space to +cycle pages" = "Space to +cycle candidates, Shift+Space to +cycle pages"; "Space to +cycle candidates, Shift+Space to +cycle pages" = "Space to +cycle candidates, Shift+Space to +cycle pages";
"Space to +cycle pages, Shift+Space to +cycle candidates" = "Space to +cycle pages, Shift+Space to +cycle candidates"; "Space to +cycle pages, Shift+Space to +cycle candidates" = "Space to +cycle pages, Shift+Space to +cycle candidates";
"Specify the maximum characters allowed in the composition buffer." = "Specify the maximum characters allowed in the composition buffer.";
"Stop farting (when typed phonetic combination is invalid, etc.)" = "Stop farting (when typed phonetic combination is invalid, etc.)"; "Stop farting (when typed phonetic combination is invalid, etc.)" = "Stop farting (when typed phonetic combination is invalid, etc.)";
"Traditional Chinese" = "Traditional Chinese"; "Traditional Chinese" = "Traditional Chinese";
"Typing Style:" = "Typing Style:"; "Typing Style:" = "Typing Style:";

View File

@ -85,19 +85,19 @@
"Apple Chewing - Dachen" = "Apple Chewing - Dachen"; "Apple Chewing - Dachen" = "Apple Chewing - Dachen";
"Apple Chewing - Eten Traditional" = "Apple Chewing - Eten Traditional"; "Apple Chewing - Eten Traditional" = "Apple Chewing - Eten Traditional";
"Apple Dynamic Bopomofo Basic Keyboard Layouts (Dachen & Eten Traditional) must match the Dachen parser in order to be functional." = "Apple Dynamic Bopomofo Basic Keyboard Layouts (Dachen & Eten Traditional) must match the Dachen parser in order to be functional."; "Apple Dynamic Bopomofo Basic Keyboard Layouts (Dachen & Eten Traditional) must match the Dachen parser in order to be functional." = "Apple Dynamic Bopomofo Basic Keyboard Layouts (Dachen & Eten Traditional) must match the Dachen parser in order to be functional.";
"at anyplace else (like Windows Yahoo KeyKey)" = "at anyplace else (like Windows Yahoo KeyKey)"; "at the rear of the phrase (like Microsoft New Phonetic)" = "at the rear of the phrase (like Microsoft New Phonetic)";
"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:";
"Buffer Limit:" = "Buffer Limit:";
"Candidate Layout:" = "Candidate Layout:"; "Candidate Layout:" = "Candidate Layout:";
"Candidate Size:" = "Candidate Size:"; "Candidate Size:" = "Candidate Size:";
"Change user interface language (will reboot the IME)." = "Change user interface language (will reboot the IME)."; "Change user interface language (will reboot the IME)." = "Change user interface language (will reboot the IME).";
"Check for updates automatically" = "Check for updates automatically"; "Check for updates automatically" = "Check for updates automatically";
"Choose candidate font size for better visual clarity." = "Choose candidate font size for better visual clarity."; "Choose candidate font size for better visual clarity." = "Choose candidate font size for better visual clarity.";
"Choose or hit Enter to confim your prefered keys for selecting candidates." = "Choose or hit Enter to confim your prefered keys for selecting candidates."; "Choose or hit Enter to confim your prefered keys for selecting candidates." = "Choose or hit Enter to confim your prefered keys for selecting candidates.";
"Choose the behavior of (Shift+)Space key in the candidate window." = "Choose the behavior of (Shift+)Space key in the candidate window."; "Choose the behavior of (Shift+)Space key with candidates." = "Choose the behavior of (Shift+)Space key with candidates.";
"Choose the behavior of (Shift+)Tab key in the candidate window." = "Choose the behavior of (Shift+)Tab key in the candidate window."; "Choose the behavior of (Shift+)Tab key in the candidate window." = "Choose the behavior of (Shift+)Tab key in the candidate window.";
"Choose the cursor position where you want to list possible candidates." = "Choose the cursor position where you want to list possible candidates."; "Choose the cursor position where you want to list possible candidates." = "Choose the cursor position where you want to list possible candidates.";
"Choose the macOS-level basic keyboard layout." = "Choose the macOS-level basic keyboard layout."; "Choose the macOS-level basic keyboard layout." = "Choose the macOS-level basic keyboard layout.";
@ -130,6 +130,7 @@
"in front of the phrase (like macOS built-in Zhuyin IME)" = "in front of the phrase (like macOS built-in Zhuyin IME)"; "in front of the phrase (like macOS built-in Zhuyin IME)" = "in front of the phrase (like macOS built-in Zhuyin IME)";
"Japanese" = "Japanese"; "Japanese" = "Japanese";
"Keyboard" = "Keyboard"; "Keyboard" = "Keyboard";
"Keyboard Shortcuts:" = "Keyboard Shortcuts:";
"Misc Settings:" = "Misc Settings:"; "Misc Settings:" = "Misc Settings:";
"MiTAC" = "MiTAC"; "MiTAC" = "MiTAC";
"Non-QWERTY alphanumeral keyboard layouts are for Hanyu Pinyin parser only." = "Non-QWERTY alphanumeral keyboard layouts are for Hanyu Pinyin parser only."; "Non-QWERTY alphanumeral keyboard layouts are for Hanyu Pinyin parser only." = "Non-QWERTY alphanumeral keyboard layouts are for Hanyu Pinyin parser only.";
@ -145,6 +146,7 @@
"Space & ESC Key:" = "Space & ESC Key:"; "Space & ESC Key:" = "Space & ESC Key:";
"Space to +cycle candidates, Shift+Space to +cycle pages" = "Space to +cycle candidates, Shift+Space to +cycle pages"; "Space to +cycle candidates, Shift+Space to +cycle pages" = "Space to +cycle candidates, Shift+Space to +cycle pages";
"Space to +cycle pages, Shift+Space to +cycle candidates" = "Space to +cycle pages, Shift+Space to +cycle candidates"; "Space to +cycle pages, Shift+Space to +cycle candidates" = "Space to +cycle pages, Shift+Space to +cycle candidates";
"Specify the maximum characters allowed in the composition buffer." = "Specify the maximum characters allowed in the composition buffer.";
"Stop farting (when typed phonetic combination is invalid, etc.)" = "Stop farting (when typed phonetic combination is invalid, etc.)"; "Stop farting (when typed phonetic combination is invalid, etc.)" = "Stop farting (when typed phonetic combination is invalid, etc.)";
"Traditional Chinese" = "Traditional Chinese"; "Traditional Chinese" = "Traditional Chinese";
"Typing Style:" = "Typing Style:"; "Typing Style:" = "Typing Style:";

View File

@ -85,19 +85,19 @@
"Apple Chewing - Dachen" = "Apple 大千注音キーボード"; "Apple Chewing - Dachen" = "Apple 大千注音キーボード";
"Apple Chewing - Eten Traditional" = "Apple 倚天傳統キーボード"; "Apple Chewing - Eten Traditional" = "Apple 倚天傳統キーボード";
"Apple Dynamic Bopomofo Basic Keyboard Layouts (Dachen & Eten Traditional) must match the Dachen parser in order to be functional." = "Apple 動態注音キーボード (大千と倚天伝統) を使うには、共通語分析器の配列を大千と設定すべきである。"; "Apple Dynamic Bopomofo Basic Keyboard Layouts (Dachen & Eten Traditional) must match the Dachen parser in order to be functional." = "Apple 動態注音キーボード (大千と倚天伝統) を使うには、共通語分析器の配列を大千と設定すべきである。";
"at anyplace else (like Windows Yahoo KeyKey)" = "単語の中・後で // Windows Yahoo KeyKey のやり方"; "at the rear of the phrase (like Microsoft New Phonetic)" = "単語の後で // Microsoft 新注音入力のやり方";
"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:" = "基礎キーボード:";
"Buffer Limit:" = "緩衝列の容量:";
"Candidate Layout:" = "入力候補陳列の仕様"; "Candidate Layout:" = "入力候補陳列の仕様";
"Candidate Size:" = "候補文字の字号:"; "Candidate Size:" = "候補文字の字号:";
"Change user interface language (will reboot the IME)." = "アプリ表示用言語をご指定下さい、そして入力アプリは自動的に再起動。"; "Change user interface language (will reboot the IME)." = "アプリ表示用言語をご指定下さい、そして入力アプリは自動的に再起動。";
"Check for updates automatically" = "アプリの更新通知を受く"; "Check for updates automatically" = "アプリの更新通知を受く";
"Choose candidate font size for better visual clarity." = "入力候補陳列の候補文字の字号をご指定ください。"; "Choose candidate font size for better visual clarity." = "入力候補陳列の候補文字の字号をご指定ください。";
"Choose or hit Enter to confim your prefered keys for selecting candidates." = "お好きなる言選り用キー陣列をご指定ください。新しい組み合わせは Enter で効かす。"; "Choose or hit Enter to confim your prefered keys for selecting candidates." = "お好きなる言選り用キー陣列をご指定ください。新しい組み合わせは Enter で効かす。";
"Choose the behavior of (Shift+)Space key in the candidate window." = "入力候補陳列での (Shift+)Space キーの輪番切替対象をご指定ください。"; "Choose the behavior of (Shift+)Space key with candidates." = "入力候補についての (Shift+)Space キーの輪番切替対象をご指定ください。";
"Choose the behavior of (Shift+)Tab key in the candidate window." = "入力候補陳列での (Shift+)Tab キーの輪番切替対象をご指定ください。"; "Choose the behavior of (Shift+)Tab key in the candidate window." = "入力候補陳列での (Shift+)Tab キーの輪番切替対象をご指定ください。";
"Choose the cursor position where you want to list possible candidates." = "カーソルはどこで入力候補を呼び出すかとご指定ださい。"; "Choose the cursor position where you want to list possible candidates." = "カーソルはどこで入力候補を呼び出すかとご指定ださい。";
"Choose the macOS-level basic keyboard layout." = "macOS 基礎キーボード配置をご指定ください。"; "Choose the macOS-level basic keyboard layout." = "macOS 基礎キーボード配置をご指定ください。";
@ -130,6 +130,7 @@
"in front of the phrase (like macOS built-in Zhuyin IME)" = "単語の前で // macOS 内蔵注音入力のやり方"; "in front of the phrase (like macOS built-in Zhuyin IME)" = "単語の前で // macOS 内蔵注音入力のやり方";
"Japanese" = "和語"; "Japanese" = "和語";
"Keyboard" = "配列設定"; "Keyboard" = "配列設定";
"Keyboard Shortcuts:" = "ショートカット:";
"Misc Settings:" = "他の設定:"; "Misc Settings:" = "他の設定:";
"MiTAC" = "神通配列"; "MiTAC" = "神通配列";
"Non-QWERTY alphanumeral keyboard layouts are for Hanyu Pinyin parser only." = "QWERTY 以外の英数キーボードは漢語弁音以外の配列に不適用。"; "Non-QWERTY alphanumeral keyboard layouts are for Hanyu Pinyin parser only." = "QWERTY 以外の英数キーボードは漢語弁音以外の配列に不適用。";
@ -145,6 +146,7 @@
"Space & ESC Key:" = "ESC と Space:"; "Space & ESC Key:" = "ESC と Space:";
"Space to +cycle candidates, Shift+Space to +cycle pages" = "Shift+Space で次のページ、Space で次の候補文字を"; "Space to +cycle candidates, Shift+Space to +cycle pages" = "Shift+Space で次のページ、Space で次の候補文字を";
"Space to +cycle pages, Shift+Space to +cycle candidates" = "Space で次のページ、Shift+Space で次の候補文字を"; "Space to +cycle pages, Shift+Space to +cycle candidates" = "Space で次のページ、Shift+Space で次の候補文字を";
"Specify the maximum characters allowed in the composition buffer." = "緩衝列に入れる文字の数の上限をご指定ください。";
"Stop farting (when typed phonetic combination is invalid, etc.)" = "マナーモード // 外すと入力間違った時に変な声が出る"; "Stop farting (when typed phonetic combination is invalid, etc.)" = "マナーモード // 外すと入力間違った時に変な声が出る";
"Traditional Chinese" = "繁体中国語"; "Traditional Chinese" = "繁体中国語";
"Typing Style:" = "入力習慣:"; "Typing Style:" = "入力習慣:";

View File

@ -15,7 +15,7 @@
"Not Now" = "以后再说"; "Not Now" = "以后再说";
"Visit Website" = "前往网站"; "Visit Website" = "前往网站";
"You're currently using vChewing %@ (%@), a new version %@ (%@) is now available. Do you want to visit vChewing's website to download the version?%@" = "目前使用的威注音官方版本是 %1$@ (%2$@),网路上有更新版本 %3$@ (%4$@) 可供下载。是否要前往威注音网站下载新版来安装?%5$@"; "You're currently using vChewing %@ (%@), a new version %@ (%@) is now available. Do you want to visit vChewing's website to download the version?%@" = "目前使用的威注音官方版本是 %1$@ (%2$@),网路上有更新版本 %3$@ (%4$@) 可供下载。是否要前往威注音网站下载新版来安装?%5$@";
"Force KangXi Writing" = "康熙体字模式"; "Force KangXi Writing" = "康熙体字模式";
"NotificationSwitchON" = "✔ 已启用"; "NotificationSwitchON" = "✔ 已启用";
"NotificationSwitchOFF" = "✘ 已停用"; "NotificationSwitchOFF" = "✘ 已停用";
"Edit User Phrases…" = "编辑自订语汇…"; "Edit User Phrases…" = "编辑自订语汇…";
@ -85,19 +85,19 @@
"Apple Chewing - Dachen" = "Apple 大千注音键盘排列"; "Apple Chewing - Dachen" = "Apple 大千注音键盘排列";
"Apple Chewing - Eten Traditional" = "Apple 倚天传统键盘排列"; "Apple Chewing - Eten Traditional" = "Apple 倚天传统键盘排列";
"Apple Dynamic Bopomofo Basic Keyboard Layouts (Dachen & Eten Traditional) must match the Dachen parser in order to be functional." = "Apple 动态注音键盘布局(大千与倚天)要求普通话/国音分析器得配置为大千排列。"; "Apple Dynamic Bopomofo Basic Keyboard Layouts (Dachen & Eten Traditional) must match the Dachen parser in order to be functional." = "Apple 动态注音键盘布局(大千与倚天)要求普通话/国音分析器得配置为大千排列。";
"at anyplace else (like Windows Yahoo KeyKey)" = "将游标置于词语中后方 // Windows 奇摩注音风格"; "at the rear of the phrase (like Microsoft New Phonetic)" = "将游标置于词语后方 // Windows 微软新注音风格";
"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:" = "基础键盘布局:";
"Buffer Limit:" = "组字区容量:";
"Candidate Layout:" = "候选字窗布局:"; "Candidate Layout:" = "候选字窗布局:";
"Candidate Size:" = "候选字窗字号:"; "Candidate Size:" = "候选字窗字号:";
"Change user interface language (will reboot the IME)." = "变更输入法介面语言,会自动重启输入法。"; "Change user interface language (will reboot the IME)." = "变更输入法介面语言,会自动重启输入法。";
"Check for updates automatically" = "自动检查软体更新"; "Check for updates automatically" = "自动检查软体更新";
"Choose candidate font size for better visual clarity." = "变更候选字窗的字型大小。"; "Choose candidate font size for better visual clarity." = "变更候选字窗的字型大小。";
"Choose or hit Enter to confim your prefered keys for selecting candidates." = "请选择您所偏好的用来选字的按键组合。自订组合需敲 Enter 键生效。"; "Choose or hit Enter to confim your prefered keys for selecting candidates." = "请选择您所偏好的用来选字的按键组合。自订组合需敲 Enter 键生效。";
"Choose the behavior of (Shift+)Space key in the candidate window." = "指定 (Shift+)空格键 在选字窗内的轮替操作对象。"; "Choose the behavior of (Shift+)Space key with candidates." = "指定 (Shift+)空格键 对候选字词而言的轮替操作对象。";
"Choose the behavior of (Shift+)Tab key in the candidate window." = "指定 (Shift+)Tab 在选字窗内的轮替操作对象。"; "Choose the behavior of (Shift+)Tab key in the candidate window." = "指定 (Shift+)Tab 在选字窗内的轮替操作对象。";
"Choose the cursor position where you want to list possible candidates." = "请选择用以触发选字的游标相对位置。"; "Choose the cursor position where you want to list possible candidates." = "请选择用以触发选字的游标相对位置。";
"Choose the macOS-level basic keyboard layout." = "请选择 macOS 基础键盘布局。"; "Choose the macOS-level basic keyboard layout." = "请选择 macOS 基础键盘布局。";
@ -131,6 +131,7 @@
"in front of the phrase (like macOS built-in Zhuyin IME)" = "将游标置于词语前方 // macOS 内建注音风格"; "in front of the phrase (like macOS built-in Zhuyin IME)" = "将游标置于词语前方 // macOS 内建注音风格";
"Japanese" = "和语"; "Japanese" = "和语";
"Keyboard" = "键盘"; "Keyboard" = "键盘";
"Keyboard Shortcuts:" = "键盘快捷键:";
"Misc Settings:" = "杂项:"; "Misc Settings:" = "杂项:";
"MiTAC" = "神通排列"; "MiTAC" = "神通排列";
"Non-QWERTY alphanumeral keyboard layouts are for Hanyu Pinyin parser only." = "QWERTY 以外的英数布局是为了汉语拼音排列使用者而准备的。"; "Non-QWERTY alphanumeral keyboard layouts are for Hanyu Pinyin parser only." = "QWERTY 以外的英数布局是为了汉语拼音排列使用者而准备的。";
@ -146,6 +147,7 @@
"Space & ESC Key:" = "ESC 与空格键:"; "Space & ESC Key:" = "ESC 与空格键:";
"Space to +cycle candidates, Shift+Space to +cycle pages" = "Shift+空格键 换下一页,空格键 换选下一个后选字"; "Space to +cycle candidates, Shift+Space to +cycle pages" = "Shift+空格键 换下一页,空格键 换选下一个后选字";
"Space to +cycle pages, Shift+Space to +cycle candidates" = "空格键 换下一页Shift+空格键 换选下一个后选字"; "Space to +cycle pages, Shift+Space to +cycle candidates" = "空格键 换下一页Shift+空格键 换选下一个后选字";
"Specify the maximum characters allowed in the composition buffer." = "请指定组字缓冲区内的文字数的上限。";
"Stop farting (when typed phonetic combination is invalid, etc.)" = "廉耻模式 // 取消勾选的话,敲错字时会有异音"; "Stop farting (when typed phonetic combination is invalid, etc.)" = "廉耻模式 // 取消勾选的话,敲错字时会有异音";
"Traditional Chinese" = "繁体中文"; "Traditional Chinese" = "繁体中文";
"Typing Style:" = "输入风格:"; "Typing Style:" = "输入风格:";

View File

@ -15,7 +15,7 @@
"Not Now" = "以後再說"; "Not Now" = "以後再說";
"Visit Website" = "前往網站"; "Visit Website" = "前往網站";
"You're currently using vChewing %@ (%@), a new version %@ (%@) is now available. Do you want to visit vChewing's website to download the version?%@" = "目前使用的威注音官方版本是 %1$@ (%2$@),網路上有更新版本 %3$@ (%4$@) 可供下載。是否要前往威注音網站下載新版來安裝?%5$@"; "You're currently using vChewing %@ (%@), a new version %@ (%@) is now available. Do you want to visit vChewing's website to download the version?%@" = "目前使用的威注音官方版本是 %1$@ (%2$@),網路上有更新版本 %3$@ (%4$@) 可供下載。是否要前往威注音網站下載新版來安裝?%5$@";
"Force KangXi Writing" = "康熙體字模式"; "Force KangXi Writing" = "康熙體字模式";
"NotificationSwitchON" = "✔ 已啟用"; "NotificationSwitchON" = "✔ 已啟用";
"NotificationSwitchOFF" = "✘ 已停用"; "NotificationSwitchOFF" = "✘ 已停用";
"Edit User Phrases…" = "編輯自訂語彙…"; "Edit User Phrases…" = "編輯自訂語彙…";
@ -85,19 +85,19 @@
"Apple Chewing - Dachen" = "Apple 大千注音鍵盤佈局"; "Apple Chewing - Dachen" = "Apple 大千注音鍵盤佈局";
"Apple Chewing - Eten Traditional" = "Apple 倚天傳統鍵盤佈局"; "Apple Chewing - Eten Traditional" = "Apple 倚天傳統鍵盤佈局";
"Apple Dynamic Bopomofo Basic Keyboard Layouts (Dachen & Eten Traditional) must match the Dachen parser in order to be functional." = "Apple 動態注音鍵盤佈局(大千與倚天)要求普通話/國音分析器得配置為大千排列。"; "Apple Dynamic Bopomofo Basic Keyboard Layouts (Dachen & Eten Traditional) must match the Dachen parser in order to be functional." = "Apple 動態注音鍵盤佈局(大千與倚天)要求普通話/國音分析器得配置為大千排列。";
"at anyplace else (like Windows Yahoo KeyKey)" = "將游標置於詞語中後方 // Windows 奇摩注音風格"; "at the rear of the phrase (like Microsoft New Phonetic)" = "將游標置於詞語後方 // Windows 微軟新注音風格";
"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:" = "基礎鍵盤佈局:";
"Buffer Limit:" = "組字區容量:";
"Candidate Layout:" = "候選字窗佈局:"; "Candidate Layout:" = "候選字窗佈局:";
"Candidate Size:" = "候選字窗字號:"; "Candidate Size:" = "候選字窗字號:";
"Change user interface language (will reboot the IME)." = "變更輸入法介面語言,會自動重啟輸入法。"; "Change user interface language (will reboot the IME)." = "變更輸入法介面語言,會自動重啟輸入法。";
"Check for updates automatically" = "自動檢查軟體更新"; "Check for updates automatically" = "自動檢查軟體更新";
"Choose candidate font size for better visual clarity." = "變更候選字窗的字型大小。"; "Choose candidate font size for better visual clarity." = "變更候選字窗的字型大小。";
"Choose or hit Enter to confim your prefered keys for selecting candidates." = "請選擇您所偏好的用來選字的按鍵組合。自訂組合需敲 Enter 鍵生效。"; "Choose or hit Enter to confim your prefered keys for selecting candidates." = "請選擇您所偏好的用來選字的按鍵組合。自訂組合需敲 Enter 鍵生效。";
"Choose the behavior of (Shift+)Space key in the candidate window." = "指定 (Shift+)空格鍵 在選字窗內的輪替操作對象。"; "Choose the behavior of (Shift+)Space key with candidates." = "指定 (Shift+)空格鍵 對候選字詞而言的輪替操作對象。";
"Choose the behavior of (Shift+)Tab key in the candidate window." = "指定 (Shift+)Tab 在選字窗內的輪替操作對象。"; "Choose the behavior of (Shift+)Tab key in the candidate window." = "指定 (Shift+)Tab 在選字窗內的輪替操作對象。";
"Choose the cursor position where you want to list possible candidates." = "請選擇用以觸發選字的游標相對位置。"; "Choose the cursor position where you want to list possible candidates." = "請選擇用以觸發選字的游標相對位置。";
"Choose the macOS-level basic keyboard layout." = "請選擇 macOS 基礎鍵盤佈局。"; "Choose the macOS-level basic keyboard layout." = "請選擇 macOS 基礎鍵盤佈局。";
@ -130,6 +130,7 @@
"in front of the phrase (like macOS built-in Zhuyin IME)" = "將游標置於詞語前方 // macOS 內建注音風格"; "in front of the phrase (like macOS built-in Zhuyin IME)" = "將游標置於詞語前方 // macOS 內建注音風格";
"Japanese" = "和語"; "Japanese" = "和語";
"Keyboard" = "鍵盤"; "Keyboard" = "鍵盤";
"Keyboard Shortcuts:" = "鍵盤快速鍵:";
"Misc Settings:" = "雜項:"; "Misc Settings:" = "雜項:";
"MiTAC" = "神通排列"; "MiTAC" = "神通排列";
"Non-QWERTY alphanumeral keyboard layouts are for Hanyu Pinyin parser only." = "QWERTY 以外的英數佈局是為了漢語拼音排列使用者而準備的。"; "Non-QWERTY alphanumeral keyboard layouts are for Hanyu Pinyin parser only." = "QWERTY 以外的英數佈局是為了漢語拼音排列使用者而準備的。";
@ -145,6 +146,7 @@
"Space & ESC Key:" = "ESC 與空格鍵:"; "Space & ESC Key:" = "ESC 與空格鍵:";
"Space to +cycle candidates, Shift+Space to +cycle pages" = "Shift+空格鍵 換下一頁,空格鍵 換選下一個後選字"; "Space to +cycle candidates, Shift+Space to +cycle pages" = "Shift+空格鍵 換下一頁,空格鍵 換選下一個後選字";
"Space to +cycle pages, Shift+Space to +cycle candidates" = "空格鍵 換下一頁Shift+空格鍵 換選下一個後選字"; "Space to +cycle pages, Shift+Space to +cycle candidates" = "空格鍵 換下一頁Shift+空格鍵 換選下一個後選字";
"Specify the maximum characters allowed in the composition buffer." = "請指定組字緩衝區內的文字數的上限。";
"Stop farting (when typed phonetic combination is invalid, etc.)" = "廉恥模式 // 取消勾選的話,敲錯字時會有異音"; "Stop farting (when typed phonetic combination is invalid, etc.)" = "廉恥模式 // 取消勾選的話,敲錯字時會有異音";
"Traditional Chinese" = "繁體中文"; "Traditional Chinese" = "繁體中文";
"Typing Style:" = "輸入風格:"; "Typing Style:" = "輸入風格:";

View File

@ -52,8 +52,7 @@ private class HorizontalCandidateView: NSView {
var result = NSSize.zero var result = NSSize.zero
if !elementWidths.isEmpty { if !elementWidths.isEmpty {
result.width = elementWidths.reduce(0, +) result.width = elementWidths.reduce(0, +) + CGFloat(elementWidths.count)
result.width += CGFloat(elementWidths.count)
result.height = candidateTextHeight + cellPadding result.height = candidateTextHeight + cellPadding
} }
return result return result
@ -78,7 +77,7 @@ private class HorizontalCandidateView: NSView {
if cellWidth < cellHeight * 1.35 { if cellWidth < cellHeight * 1.35 {
cellWidth = cellHeight * 1.35 cellWidth = cellHeight * 1.35
} }
newWidths.append(cellWidth) newWidths.append(round(cellWidth))
} }
elementWidths = newWidths elementWidths = newWidths
} }
@ -113,7 +112,7 @@ private class HorizontalCandidateView: NSView {
keyLabelWidth = ceil(labelFontSize) keyLabelWidth = ceil(labelFontSize)
keyLabelHeight = ceil(labelFontSize * 2) keyLabelHeight = ceil(labelFontSize * 2)
candidateTextHeight = ceil(candidateFontSize * 1.20) candidateTextHeight = ceil(candidateFontSize * 1.20)
cellPadding = ceil(biggestSize / 2.0) cellPadding = ceil(biggestSize / 4.0) * 2
} }
override func draw(_: NSRect) { override func draw(_: NSRect) {
@ -129,8 +128,8 @@ private class HorizontalCandidateView: NSView {
) )
var accuWidth: CGFloat = 0 var accuWidth: CGFloat = 0
for index in 0..<elementWidths.count { for (index, elementWidth) in elementWidths.enumerated() {
let currentWidth = elementWidths[index] let currentWidth = elementWidth
let rctCandidateArea = NSRect( let rctCandidateArea = NSRect(
x: accuWidth, y: 0.0, width: currentWidth + 1.0, x: accuWidth, y: 0.0, width: currentWidth + 1.0,
height: candidateTextHeight + cellPadding height: candidateTextHeight + cellPadding
@ -140,7 +139,7 @@ private class HorizontalCandidateView: NSView {
height: keyLabelHeight * 2.0 height: keyLabelHeight * 2.0
) )
let rctCandidatePhrase = NSRect( let rctCandidatePhrase = NSRect(
x: accuWidth + keyLabelWidth - 1, y: cellPadding / 2, x: accuWidth + keyLabelWidth - 1, y: cellPadding / 2 - 1,
width: currentWidth - keyLabelWidth, width: currentWidth - keyLabelWidth,
height: candidateTextHeight height: candidateTextHeight
) )
@ -203,8 +202,8 @@ private class HorizontalCandidateView: NSView {
return nil return nil
} }
var accuWidth: CGFloat = 0.0 var accuWidth: CGFloat = 0.0
for index in 0..<elementWidths.count { for (index, elementWidth) in elementWidths.enumerated() {
let currentWidth = elementWidths[index] let currentWidth = elementWidth
if location.x >= accuWidth, location.x <= accuWidth + currentWidth { if location.x >= accuWidth, location.x <= accuWidth + currentWidth {
return UInt(index) return UInt(index)
@ -248,7 +247,7 @@ public class ctlCandidateHorizontal: ctlCandidate {
private var candidateView: HorizontalCandidateView private var candidateView: HorizontalCandidateView
private var prevPageButton: NSButton private var prevPageButton: NSButton
private var nextPageButton: NSButton private var nextPageButton: NSButton
private var currentPage: UInt = 0 private var currentPageIndex: UInt = 0
public init() { public init() {
var contentRect = NSRect(x: 128.0, y: 128.0, width: 0.0, height: 0.0) var contentRect = NSRect(x: 128.0, y: 128.0, width: 0.0, height: 0.0)
@ -266,7 +265,7 @@ public class ctlCandidateHorizontal: ctlCandidate {
candidateView.wantsLayer = true candidateView.wantsLayer = true
candidateView.layer?.borderColor = candidateView.layer?.borderColor =
NSColor.selectedMenuItemTextColor.withAlphaComponent(0.30).cgColor NSColor.selectedMenuItemTextColor.withAlphaComponent(0.10).cgColor
candidateView.layer?.borderWidth = 1.0 candidateView.layer?.borderWidth = 1.0
if #available(macOS 10.13, *) { if #available(macOS 10.13, *) {
candidateView.layer?.cornerRadius = 6.0 candidateView.layer?.cornerRadius = 6.0
@ -325,14 +324,15 @@ public class ctlCandidateHorizontal: ctlCandidate {
override public func reloadData() { override public func reloadData() {
candidateView.highlightedIndex = 0 candidateView.highlightedIndex = 0
currentPage = 0 currentPageIndex = 0
layoutCandidateView() layoutCandidateView()
} }
override public func showNextPage() -> Bool { override public func showNextPage() -> Bool {
guard delegate != nil else { return false } guard delegate != nil else { return false }
if pageCount == 1 { return highlightNextCandidate() } if pageCount == 1 { return highlightNextCandidate() }
currentPage = (currentPage + 1 >= pageCount) ? 0 : currentPage + 1 if currentPageIndex + 1 >= pageCount { clsSFX.beep() }
currentPageIndex = (currentPageIndex + 1 >= pageCount) ? 0 : currentPageIndex + 1
candidateView.highlightedIndex = 0 candidateView.highlightedIndex = 0
layoutCandidateView() layoutCandidateView()
return true return true
@ -341,7 +341,8 @@ public class ctlCandidateHorizontal: ctlCandidate {
override public func showPreviousPage() -> Bool { override public func showPreviousPage() -> Bool {
guard delegate != nil else { return false } guard delegate != nil else { return false }
if pageCount == 1 { return highlightPreviousCandidate() } if pageCount == 1 { return highlightPreviousCandidate() }
currentPage = (currentPage == 0) ? pageCount - 1 : currentPage - 1 if currentPageIndex == 0 { clsSFX.beep() }
currentPageIndex = (currentPageIndex == 0) ? pageCount - 1 : currentPageIndex - 1
candidateView.highlightedIndex = 0 candidateView.highlightedIndex = 0
layoutCandidateView() layoutCandidateView()
return true return true
@ -368,13 +369,13 @@ public class ctlCandidateHorizontal: ctlCandidate {
return UInt.max return UInt.max
} }
let result = currentPage * UInt(keyLabels.count) + index let result = currentPageIndex * UInt(keyLabels.count) + index
return result < delegate.candidateCountForController(self) ? result : UInt.max return result < delegate.candidateCountForController(self) ? result : UInt.max
} }
override public var selectedCandidateIndex: UInt { override public var selectedCandidateIndex: UInt {
get { get {
currentPage * UInt(keyLabels.count) + candidateView.highlightedIndex currentPageIndex * UInt(keyLabels.count) + candidateView.highlightedIndex
} }
set { set {
guard let delegate = delegate else { guard let delegate = delegate else {
@ -382,7 +383,7 @@ public class ctlCandidateHorizontal: ctlCandidate {
} }
let keyLabelCount = UInt(keyLabels.count) let keyLabelCount = UInt(keyLabels.count)
if newValue < delegate.candidateCountForController(self) { if newValue < delegate.candidateCountForController(self) {
currentPage = newValue / keyLabelCount currentPageIndex = newValue / keyLabelCount
candidateView.highlightedIndex = newValue % keyLabelCount candidateView.highlightedIndex = newValue % keyLabelCount
layoutCandidateView() layoutCandidateView()
} }
@ -410,7 +411,7 @@ extension ctlCandidateHorizontal {
let count = delegate.candidateCountForController(self) let count = delegate.candidateCountForController(self)
let keyLabelCount = UInt(keyLabels.count) let keyLabelCount = UInt(keyLabels.count)
let begin = currentPage * keyLabelCount let begin = currentPageIndex * keyLabelCount
for index in begin..<min(begin + keyLabelCount, count) { for index in begin..<min(begin + keyLabelCount, count) {
let candidate = delegate.ctlCandidate(self, candidateAtIndex: index) let candidate = delegate.ctlCandidate(self, candidateAtIndex: index)
candidates.append(candidate) candidates.append(candidate)

View File

@ -86,7 +86,7 @@ private class VerticalCandidateView: NSView {
} }
elementWidths = newWidths elementWidths = newWidths
elementHeights = newHeights elementHeights = newHeights
windowWidth = calculatedWindowWidth + cellPadding windowWidth = round(calculatedWindowWidth + cellPadding) //
} }
@objc(setKeyLabelFont:candidateFont:) @objc(setKeyLabelFont:candidateFont:)
@ -119,7 +119,7 @@ private class VerticalCandidateView: NSView {
keyLabelWidth = ceil(labelFontSize) keyLabelWidth = ceil(labelFontSize)
keyLabelHeight = ceil(labelFontSize * 2) keyLabelHeight = ceil(labelFontSize * 2)
candidateTextHeight = ceil(candidateFontSize * 1.20) candidateTextHeight = ceil(candidateFontSize * 1.20)
cellPadding = ceil(biggestSize / 2.0) cellPadding = ceil(biggestSize / 4.0) * 2
} }
override func draw(_: NSRect) { override func draw(_: NSRect) {
@ -135,8 +135,8 @@ private class VerticalCandidateView: NSView {
) )
var accuHeight: CGFloat = 0 var accuHeight: CGFloat = 0
for index in 0..<elementHeights.count { for (index, elementHeight) in elementHeights.enumerated() {
let currentHeight = elementHeights[index] let currentHeight = elementHeight
let rctCandidateArea = NSRect( let rctCandidateArea = NSRect(
x: 0.0, y: accuHeight, width: windowWidth, height: candidateTextHeight + cellPadding x: 0.0, y: accuHeight, width: windowWidth, height: candidateTextHeight + cellPadding
) )
@ -207,8 +207,8 @@ private class VerticalCandidateView: NSView {
return nil return nil
} }
var accuHeight: CGFloat = 0.0 var accuHeight: CGFloat = 0.0
for index in 0..<elementHeights.count { for (index, elementHeight) in elementHeights.enumerated() {
let currentHeight = elementHeights[index] let currentHeight = elementHeight
if location.y >= accuHeight, location.y <= accuHeight + currentHeight { if location.y >= accuHeight, location.y <= accuHeight + currentHeight {
return UInt(index) return UInt(index)
@ -252,7 +252,7 @@ public class ctlCandidateVertical: ctlCandidate {
private var candidateView: VerticalCandidateView private var candidateView: VerticalCandidateView
private var prevPageButton: NSButton private var prevPageButton: NSButton
private var nextPageButton: NSButton private var nextPageButton: NSButton
private var currentPage: UInt = 0 private var currentPageIndex: UInt = 0
public init() { public init() {
var contentRect = NSRect(x: 128.0, y: 128.0, width: 0.0, height: 0.0) var contentRect = NSRect(x: 128.0, y: 128.0, width: 0.0, height: 0.0)
@ -270,7 +270,7 @@ public class ctlCandidateVertical: ctlCandidate {
candidateView.wantsLayer = true candidateView.wantsLayer = true
candidateView.layer?.borderColor = candidateView.layer?.borderColor =
NSColor.selectedMenuItemTextColor.withAlphaComponent(0.30).cgColor NSColor.selectedMenuItemTextColor.withAlphaComponent(0.10).cgColor
candidateView.layer?.borderWidth = 1.0 candidateView.layer?.borderWidth = 1.0
if #available(macOS 10.13, *) { if #available(macOS 10.13, *) {
candidateView.layer?.cornerRadius = 6.0 candidateView.layer?.cornerRadius = 6.0
@ -329,14 +329,15 @@ public class ctlCandidateVertical: ctlCandidate {
override public func reloadData() { override public func reloadData() {
candidateView.highlightedIndex = 0 candidateView.highlightedIndex = 0
currentPage = 0 currentPageIndex = 0
layoutCandidateView() layoutCandidateView()
} }
override public func showNextPage() -> Bool { override public func showNextPage() -> Bool {
guard delegate != nil else { return false } guard delegate != nil else { return false }
if pageCount == 1 { return highlightNextCandidate() } if pageCount == 1 { return highlightNextCandidate() }
currentPage = (currentPage + 1 >= pageCount) ? 0 : currentPage + 1 if currentPageIndex + 1 >= pageCount { clsSFX.beep() }
currentPageIndex = (currentPageIndex + 1 >= pageCount) ? 0 : currentPageIndex + 1
candidateView.highlightedIndex = 0 candidateView.highlightedIndex = 0
layoutCandidateView() layoutCandidateView()
return true return true
@ -345,7 +346,8 @@ public class ctlCandidateVertical: ctlCandidate {
override public func showPreviousPage() -> Bool { override public func showPreviousPage() -> Bool {
guard delegate != nil else { return false } guard delegate != nil else { return false }
if pageCount == 1 { return highlightPreviousCandidate() } if pageCount == 1 { return highlightPreviousCandidate() }
currentPage = (currentPage == 0) ? pageCount - 1 : currentPage - 1 if currentPageIndex == 0 { clsSFX.beep() }
currentPageIndex = (currentPageIndex == 0) ? pageCount - 1 : currentPageIndex - 1
candidateView.highlightedIndex = 0 candidateView.highlightedIndex = 0
layoutCandidateView() layoutCandidateView()
return true return true
@ -372,13 +374,13 @@ public class ctlCandidateVertical: ctlCandidate {
return UInt.max return UInt.max
} }
let result = currentPage * UInt(keyLabels.count) + index let result = currentPageIndex * UInt(keyLabels.count) + index
return result < delegate.candidateCountForController(self) ? result : UInt.max return result < delegate.candidateCountForController(self) ? result : UInt.max
} }
override public var selectedCandidateIndex: UInt { override public var selectedCandidateIndex: UInt {
get { get {
currentPage * UInt(keyLabels.count) + candidateView.highlightedIndex currentPageIndex * UInt(keyLabels.count) + candidateView.highlightedIndex
} }
set { set {
guard let delegate = delegate else { guard let delegate = delegate else {
@ -386,7 +388,7 @@ public class ctlCandidateVertical: ctlCandidate {
} }
let keyLabelCount = UInt(keyLabels.count) let keyLabelCount = UInt(keyLabels.count)
if newValue < delegate.candidateCountForController(self) { if newValue < delegate.candidateCountForController(self) {
currentPage = newValue / keyLabelCount currentPageIndex = newValue / keyLabelCount
candidateView.highlightedIndex = newValue % keyLabelCount candidateView.highlightedIndex = newValue % keyLabelCount
layoutCandidateView() layoutCandidateView()
} }
@ -414,7 +416,7 @@ extension ctlCandidateVertical {
let count = delegate.candidateCountForController(self) let count = delegate.candidateCountForController(self)
let keyLabelCount = UInt(keyLabels.count) let keyLabelCount = UInt(keyLabels.count)
let begin = currentPage * keyLabelCount let begin = currentPageIndex * keyLabelCount
for index in begin..<min(begin + keyLabelCount, count) { for index in begin..<min(begin + keyLabelCount, count) {
let candidate = delegate.ctlCandidate(self, candidateAtIndex: index) let candidate = delegate.ctlCandidate(self, candidateAtIndex: index)
candidates.append(candidate) candidates.append(candidate)

View File

@ -35,8 +35,6 @@ 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":
@ -128,13 +126,6 @@ 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

@ -32,7 +32,7 @@ struct suiPrefPaneExperience: View {
(UserDefaults.standard.string(forKey: UserDef.kCandidateKeys) ?? mgrPrefs.defaultCandidateKeys) as String (UserDefaults.standard.string(forKey: UserDef.kCandidateKeys) ?? mgrPrefs.defaultCandidateKeys) as String
@State private var selCursorPosition = @State private var selCursorPosition =
UserDefaults.standard.bool( UserDefaults.standard.bool(
forKey: UserDef.kSetRearCursorMode) ? 1 : 0 forKey: UserDef.kuseRearCursorMode) ? 1 : 0
@State private var selPushCursorAfterSelection = UserDefaults.standard.bool( @State private var selPushCursorAfterSelection = UserDefaults.standard.bool(
forKey: UserDef.kMoveCursorAfterSelectingCandidate) forKey: UserDef.kMoveCursorAfterSelectingCandidate)
@State private var selKeyBehaviorShiftTab = @State private var selKeyBehaviorShiftTab =
@ -45,6 +45,7 @@ struct suiPrefPaneExperience: View {
@State private var selKeyBehaviorESCForClearingTheBuffer = UserDefaults.standard.bool( @State private var selKeyBehaviorESCForClearingTheBuffer = UserDefaults.standard.bool(
forKey: UserDef.kEscToCleanInputBuffer) forKey: UserDef.kEscToCleanInputBuffer)
@State private var selEnableSCPCTypingMode = UserDefaults.standard.bool(forKey: UserDef.kUseSCPCTypingMode) @State private var selEnableSCPCTypingMode = UserDefaults.standard.bool(forKey: UserDef.kUseSCPCTypingMode)
@State private var selComposingBufferSize = UserDefaults.standard.integer(forKey: UserDef.kComposingBufferSize)
private let contentWidth: Double = { private let contentWidth: Double = {
switch mgrPrefs.appleLanguages[0] { switch mgrPrefs.appleLanguages[0] {
case "ja": case "ja":
@ -88,12 +89,30 @@ struct suiPrefPaneExperience: View {
) )
.preferenceDescription() .preferenceDescription()
} }
Preferences.Section(bottomDivider: true, label: { Text(LocalizedStringKey("Buffer Limit:")) }) {
Picker("", selection: $selComposingBufferSize) {
Text("10").tag(10)
Text("15").tag(15)
Text("20").tag(20)
Text("25").tag(25)
Text("30").tag(30)
Text("35").tag(35)
Text("40").tag(40)
}.onChange(of: selComposingBufferSize) { value in
mgrPrefs.composingBufferSize = value
}
.labelsHidden()
.horizontalRadioGroupLayout()
.pickerStyle(RadioGroupPickerStyle())
Text(LocalizedStringKey("Specify the maximum characters allowed in the composition buffer."))
.preferenceDescription()
}
Preferences.Section(bottomDivider: true, label: { Text(LocalizedStringKey("Cursor Selection:")) }) { Preferences.Section(bottomDivider: true, label: { Text(LocalizedStringKey("Cursor Selection:")) }) {
Picker("", selection: $selCursorPosition) { Picker("", selection: $selCursorPosition) {
Text(LocalizedStringKey("in front of the phrase (like macOS built-in Zhuyin IME)")).tag(0) Text(LocalizedStringKey("in front of the phrase (like macOS built-in Zhuyin IME)")).tag(0)
Text(LocalizedStringKey("at anyplace else (like Windows Yahoo KeyKey)")).tag(1) Text(LocalizedStringKey("at the rear of the phrase (like Microsoft New Phonetic)")).tag(1)
}.onChange(of: selCursorPosition) { value in }.onChange(of: selCursorPosition) { value in
mgrPrefs.setRearCursorMode = (value == 1) ? true : false mgrPrefs.useRearCursorMode = (value == 1) ? true : false
} }
.labelsHidden() .labelsHidden()
.pickerStyle(RadioGroupPickerStyle()) .pickerStyle(RadioGroupPickerStyle())
@ -128,7 +147,7 @@ struct suiPrefPaneExperience: View {
} }
.labelsHidden() .labelsHidden()
.pickerStyle(RadioGroupPickerStyle()) .pickerStyle(RadioGroupPickerStyle())
Text(LocalizedStringKey("Choose the behavior of (Shift+)Space key in the candidate window.")) Text(LocalizedStringKey("Choose the behavior of (Shift+)Space key with candidates."))
.preferenceDescription() .preferenceDescription()
} }
Preferences.Section(bottomDivider: true, label: { Text(LocalizedStringKey("Space & ESC Key:")) }) { Preferences.Section(bottomDivider: true, label: { Text(LocalizedStringKey("Space & ESC Key:")) }) {

View File

@ -29,6 +29,15 @@ struct suiPrefPaneKeyboard: View {
@State private var selMandarinParser = UserDefaults.standard.integer(forKey: UserDef.kMandarinParser) @State private var selMandarinParser = UserDefaults.standard.integer(forKey: UserDef.kMandarinParser)
@State private var selBasicKeyboardLayout: String = @State private var selBasicKeyboardLayout: String =
UserDefaults.standard.string(forKey: UserDef.kBasicKeyboardLayout) ?? mgrPrefs.basicKeyboardLayout UserDefaults.standard.string(forKey: UserDef.kBasicKeyboardLayout) ?? mgrPrefs.basicKeyboardLayout
@State private var selUsingHotKeySCPC = UserDefaults.standard.bool(forKey: UserDef.kUsingHotKeySCPC)
@State private var selUsingHotKeyAssociates = UserDefaults.standard.bool(forKey: UserDef.kUsingHotKeyAssociates)
@State private var selUsingHotKeyCNS = UserDefaults.standard.bool(forKey: UserDef.kUsingHotKeyCNS)
@State private var selUsingHotKeyKangXi = UserDefaults.standard.bool(forKey: UserDef.kUsingHotKeyKangXi)
@State private var selUsingHotKeyJIS = UserDefaults.standard.bool(forKey: UserDef.kUsingHotKeyJIS)
@State private var selUsingHotKeyHalfWidthASCII = UserDefaults.standard.bool(
forKey: UserDef.kUsingHotKeyHalfWidthASCII)
private let contentWidth: Double = { private let contentWidth: Double = {
switch mgrPrefs.appleLanguages[0] { switch mgrPrefs.appleLanguages[0] {
case "ja": case "ja":
@ -122,6 +131,50 @@ struct suiPrefPaneKeyboard: View {
Text(LocalizedStringKey("Choose the macOS-level basic keyboard layout.")) Text(LocalizedStringKey("Choose the macOS-level basic keyboard layout."))
.preferenceDescription() .preferenceDescription()
} }
Preferences.Section(bottomDivider: true, label: { Text(LocalizedStringKey("Keyboard Shortcuts:")) }) {
Toggle(
LocalizedStringKey("Per-Char Select Mode"),
isOn: $selUsingHotKeySCPC
).onChange(of: selUsingHotKeySCPC) { value in
mgrPrefs.usingHotKeySCPC = value
selUsingHotKeySCPC = value
}
Toggle(
LocalizedStringKey("Per-Char Associated Phrases"),
isOn: $selUsingHotKeyAssociates
).onChange(of: selUsingHotKeyAssociates) { value in
mgrPrefs.usingHotKeyAssociates = value
selUsingHotKeyAssociates = value
}
Toggle(
LocalizedStringKey("CNS11643 Mode"),
isOn: $selUsingHotKeyCNS
).onChange(of: selUsingHotKeyCNS) { value in
mgrPrefs.usingHotKeyCNS = value
selUsingHotKeyCNS = value
}
Toggle(
LocalizedStringKey("Force KangXi Writing"),
isOn: $selUsingHotKeyKangXi
).onChange(of: selUsingHotKeyKangXi) { value in
mgrPrefs.usingHotKeyKangXi = value
selUsingHotKeyKangXi = value
}
Toggle(
LocalizedStringKey("JIS Shinjitai Output"),
isOn: $selUsingHotKeyJIS
).onChange(of: selUsingHotKeyJIS) { value in
mgrPrefs.usingHotKeyJIS = value
selUsingHotKeyJIS = value
}
Toggle(
LocalizedStringKey("Half-Width Punctuation Mode"),
isOn: $selUsingHotKeyHalfWidthASCII
).onChange(of: selUsingHotKeyHalfWidthASCII) { value in
mgrPrefs.usingHotKeyHalfWidthASCII = value
selUsingHotKeyHalfWidthASCII = value
}
}
} }
Divider() Divider()
Preferences.Container(contentWidth: contentWidth) { Preferences.Container(contentWidth: contentWidth) {

View File

@ -1,7 +1,6 @@
<?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="19529" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES"> <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="19529" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies> <dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="19529"/> <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="19529"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies> </dependencies>
@ -351,10 +350,7 @@
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<textField autoresizesSubviews="NO" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="IpX-f7-rTL"> <textField autoresizesSubviews="NO" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="IpX-f7-rTL">
<rect key="frame" x="18" y="360" width="317" height="16"/> <rect key="frame" x="18" y="361" width="317" height="15"/>
<constraints>
<constraint firstAttribute="height" constant="16" id="0OB-uY-HxG"/>
</constraints>
<textFieldCell key="cell" lineBreakMode="clipping" title="Choose which keys you prefer for selecting candidates." id="2pS-nv-te4"> <textFieldCell key="cell" lineBreakMode="clipping" title="Choose which keys you prefer for selecting candidates." id="2pS-nv-te4">
<font key="font" metaFont="cellTitle"/> <font key="font" metaFont="cellTitle"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -362,9 +358,9 @@
</textFieldCell> </textFieldCell>
</textField> </textField>
<comboBox verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="uHU-aL-du7"> <comboBox verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="uHU-aL-du7">
<rect key="frame" x="128" y="329" width="150" height="25"/> <rect key="frame" x="128" y="331" width="150" height="24"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="147" id="WdR-Sg-xvh"/> <constraint firstAttribute="width" constant="147" id="Luo-hb-kcY"/>
</constraints> </constraints>
<comboBoxCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" drawsBackground="YES" completes="NO" numberOfVisibleItems="5" id="jQC-12-UuK"> <comboBoxCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" drawsBackground="YES" completes="NO" numberOfVisibleItems="5" id="jQC-12-UuK">
<font key="font" metaFont="cellTitle"/> <font key="font" metaFont="cellTitle"/>
@ -381,7 +377,7 @@
</connections> </connections>
</comboBox> </comboBox>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ETa-09-qWI"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ETa-09-qWI">
<rect key="frame" x="31" y="334" width="91" height="15"/> <rect key="frame" x="31" y="335" width="91" height="15"/>
<textFieldCell key="cell" lineBreakMode="clipping" alignment="right" title="Selection Keys:" id="FnD-oH-El5"> <textFieldCell key="cell" lineBreakMode="clipping" alignment="right" title="Selection Keys:" id="FnD-oH-El5">
<font key="font" metaFont="cellTitle"/> <font key="font" metaFont="cellTitle"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -389,7 +385,7 @@
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="13"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="13">
<rect key="frame" x="18" y="310" width="403" height="15"/> <rect key="frame" x="18" y="289" width="403" height="15"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Choose the cursor position where you want to list possible candidates." id="14"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Choose the cursor position where you want to list possible candidates." id="14">
<font key="font" metaFont="cellTitle"/> <font key="font" metaFont="cellTitle"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -397,7 +393,7 @@
</textFieldCell> </textFieldCell>
</textField> </textField>
<matrix verticalHuggingPriority="751" tag="1" allowsEmptySelection="NO" translatesAutoresizingMaskIntoConstraints="NO" id="15"> <matrix verticalHuggingPriority="751" tag="1" allowsEmptySelection="NO" translatesAutoresizingMaskIntoConstraints="NO" id="15">
<rect key="frame" x="33" y="264" width="402" height="38"/> <rect key="frame" x="33" y="243" width="402" height="38"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
<size key="cellSize" width="402" height="18"/> <size key="cellSize" width="402" height="18"/>
<size key="intercellSpacing" width="4" height="2"/> <size key="intercellSpacing" width="4" height="2"/>
@ -411,7 +407,7 @@
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="cellTitle"/> <font key="font" metaFont="cellTitle"/>
</buttonCell> </buttonCell>
<buttonCell type="radio" title="Cursor at anyplace else (like Windows Yahoo KeyKey)" imagePosition="left" alignment="left" controlSize="small" tag="1" inset="2" id="17"> <buttonCell type="radio" title="Cursor at the rear of the phrase (like Microsoft New Phonetic)" imagePosition="left" alignment="left" controlSize="small" tag="1" inset="2" id="17">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="cellTitle"/> <font key="font" metaFont="cellTitle"/>
</buttonCell> </buttonCell>
@ -422,10 +418,7 @@
</connections> </connections>
</matrix> </matrix>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="7z2-DD-c58"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="7z2-DD-c58">
<rect key="frame" x="33" y="240.5" width="392" height="17"/> <rect key="frame" x="33" y="223.5" width="318" height="16"/>
<constraints>
<constraint firstAttribute="height" constant="16" id="0iq-1M-a8l"/>
</constraints>
<buttonCell key="cell" type="check" title="Push the cursor in front of the phrase after selection" bezelStyle="regularSquare" imagePosition="left" controlSize="small" state="on" inset="2" id="RUG-ls-KyA"> <buttonCell key="cell" type="check" title="Push the cursor in front of the phrase after selection" bezelStyle="regularSquare" imagePosition="left" controlSize="small" state="on" inset="2" id="RUG-ls-KyA">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="cellTitle"/> <font key="font" metaFont="cellTitle"/>
@ -435,9 +428,9 @@
</connections> </connections>
</button> </button>
<matrix verticalHuggingPriority="750" allowsEmptySelection="NO" translatesAutoresizingMaskIntoConstraints="NO" id="n7q-ew-DYu"> <matrix verticalHuggingPriority="750" allowsEmptySelection="NO" translatesAutoresizingMaskIntoConstraints="NO" id="n7q-ew-DYu">
<rect key="frame" x="33" y="172" width="386" height="38"/> <rect key="frame" x="33" y="174" width="352" height="18"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
<size key="cellSize" width="386" height="18"/> <size key="cellSize" width="174" height="18"/>
<size key="intercellSpacing" width="4" height="2"/> <size key="intercellSpacing" width="4" height="2"/>
<buttonCell key="prototype" type="radio" title="Radio" imagePosition="left" alignment="left" controlSize="small" inset="2" id="6Hs-cH-sbg"> <buttonCell key="prototype" type="radio" title="Radio" imagePosition="left" alignment="left" controlSize="small" inset="2" id="6Hs-cH-sbg">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
@ -449,6 +442,8 @@
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="cellTitle"/> <font key="font" metaFont="cellTitle"/>
</buttonCell> </buttonCell>
</column>
<column>
<buttonCell type="radio" title="Cycling Pages" imagePosition="left" alignment="left" controlSize="small" tag="1" inset="2" id="s7u-Fm-dVg"> <buttonCell type="radio" title="Cycling Pages" imagePosition="left" alignment="left" controlSize="small" tag="1" inset="2" id="s7u-Fm-dVg">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="cellTitle"/> <font key="font" metaFont="cellTitle"/>
@ -460,7 +455,7 @@
</connections> </connections>
</matrix> </matrix>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="TMn-LX-3Ub"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="TMn-LX-3Ub">
<rect key="frame" x="18" y="217" width="369" height="15"/> <rect key="frame" x="18" y="199" width="369" height="15"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Choose the behavior of (Shift+)Tab key in the candidate window." id="ueU-Rz-a1C"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Choose the behavior of (Shift+)Tab key in the candidate window." id="ueU-Rz-a1C">
<font key="font" metaFont="cellTitle"/> <font key="font" metaFont="cellTitle"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -468,7 +463,7 @@
</textFieldCell> </textFieldCell>
</textField> </textField>
<matrix verticalHuggingPriority="750" allowsEmptySelection="NO" translatesAutoresizingMaskIntoConstraints="NO" id="YkJ-lr-EP6"> <matrix verticalHuggingPriority="750" allowsEmptySelection="NO" translatesAutoresizingMaskIntoConstraints="NO" id="YkJ-lr-EP6">
<rect key="frame" x="33" y="104" width="386" height="38"/> <rect key="frame" x="33" y="106" width="386" height="38"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
<size key="cellSize" width="386" height="18"/> <size key="cellSize" width="386" height="18"/>
<size key="intercellSpacing" width="4" height="2"/> <size key="intercellSpacing" width="4" height="2"/>
@ -493,18 +488,15 @@
</connections> </connections>
</matrix> </matrix>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="J0f-Aw-dxC"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="J0f-Aw-dxC">
<rect key="frame" x="18" y="149" width="383" height="15"/> <rect key="frame" x="18" y="151" width="336" height="15"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Choose the behavior of (Shift+)Space key in the candidate window." id="Pg5-G9-pY5"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Choose the behavior of (Shift+)Space key with candidates." id="Pg5-G9-pY5">
<font key="font" metaFont="cellTitle"/> <font key="font" metaFont="cellTitle"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell> </textFieldCell>
</textField> </textField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="bE0-Lq-Pj7"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="bE0-Lq-Pj7">
<rect key="frame" x="19" y="57.5" width="266" height="17"/> <rect key="frame" x="19" y="61.5" width="266" height="16"/>
<constraints>
<constraint firstAttribute="height" constant="16" id="pOO-rh-Jhh"/>
</constraints>
<buttonCell key="cell" type="check" title="Use ESC key to clear the entire input buffer" bezelStyle="regularSquare" imagePosition="left" controlSize="small" state="on" inset="2" id="f2j-xD-4xK"> <buttonCell key="cell" type="check" title="Use ESC key to clear the entire input buffer" bezelStyle="regularSquare" imagePosition="left" controlSize="small" state="on" inset="2" id="f2j-xD-4xK">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="cellTitle"/> <font key="font" metaFont="cellTitle"/>
@ -514,7 +506,7 @@
</connections> </connections>
</button> </button>
<button translatesAutoresizingMaskIntoConstraints="NO" id="109"> <button translatesAutoresizingMaskIntoConstraints="NO" id="109">
<rect key="frame" x="19" y="79.5" width="285" height="16"/> <rect key="frame" x="19" y="82.5" width="285" height="16"/>
<buttonCell key="cell" type="check" title="Enable Space key for calling candidate window" bezelStyle="regularSquare" imagePosition="left" alignment="left" controlSize="small" state="on" inset="2" id="110"> <buttonCell key="cell" type="check" title="Enable Space key for calling candidate window" bezelStyle="regularSquare" imagePosition="left" alignment="left" controlSize="small" state="on" inset="2" id="110">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="cellTitle"/> <font key="font" metaFont="cellTitle"/>
@ -524,7 +516,7 @@
</connections> </connections>
</button> </button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="mzw-F2-aAQ"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="mzw-F2-aAQ">
<rect key="frame" x="19" y="36.5" width="314" height="16"/> <rect key="frame" x="19" y="40.5" width="295" height="16"/>
<buttonCell key="cell" type="check" title="Emulating select-candidate-per-character mode" bezelStyle="regularSquare" imagePosition="left" controlSize="small" inset="2" id="ArK-Vk-OoT"> <buttonCell key="cell" type="check" title="Emulating select-candidate-per-character mode" bezelStyle="regularSquare" imagePosition="left" controlSize="small" inset="2" id="ArK-Vk-OoT">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="cellTitle"/> <font key="font" metaFont="cellTitle"/>
@ -533,55 +525,120 @@
<binding destination="32" name="value" keyPath="values.UseSCPCTypingMode" id="PbD-wq-OsN"/> <binding destination="32" name="value" keyPath="values.UseSCPCTypingMode" id="PbD-wq-OsN"/>
</connections> </connections>
</button> </button>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="d5f-bq-dRQ">
<rect key="frame" x="26" y="312" width="74" height="15"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Buffer Limit:" id="xibLabelBufferLimit">
<font key="font" metaFont="cellTitle"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<matrix verticalHuggingPriority="750" allowsEmptySelection="NO" translatesAutoresizingMaskIntoConstraints="NO" id="JG6-RM-ZdJ">
<rect key="frame" x="106" y="312" width="297" height="15"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
<size key="cellSize" width="39" height="15"/>
<size key="intercellSpacing" width="4" height="2"/>
<buttonCell key="prototype" type="radio" title="Radio" imagePosition="left" alignment="left" controlSize="small" inset="2" id="YLE-4b-HX3">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="cellTitle"/>
</buttonCell>
<cells>
<column>
<buttonCell type="radio" title="10" imagePosition="left" alignment="left" controlSize="small" state="on" tag="10" inset="2" id="QIi-jM-Mcm">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="cellTitle"/>
</buttonCell>
</column>
<column>
<buttonCell type="radio" title="15" imagePosition="left" alignment="left" controlSize="small" tag="15" inset="2" id="3ZE-2c-qjN">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="cellTitle"/>
</buttonCell>
</column>
<column>
<buttonCell type="radio" title="20" imagePosition="left" alignment="left" controlSize="small" tag="20" inset="2" id="FJI-A2-q4K">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="cellTitle"/>
</buttonCell>
</column>
<column>
<buttonCell type="radio" title="25" imagePosition="left" alignment="left" controlSize="small" tag="25" inset="2" id="cBE-ve-Cs5">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="cellTitle"/>
</buttonCell>
</column>
<column>
<buttonCell type="radio" title="30" imagePosition="left" alignment="left" controlSize="small" tag="30" inset="2" id="1YY-sv-ibi">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="cellTitle"/>
</buttonCell>
</column>
<column>
<buttonCell type="radio" title="35" imagePosition="left" alignment="left" controlSize="small" tag="35" inset="2" id="mx7-hu-Yzy">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="cellTitle"/>
</buttonCell>
</column>
<column>
<buttonCell type="radio" title="40" imagePosition="left" alignment="left" controlSize="small" tag="40" inset="2" id="qMD-KO-AMu">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="cellTitle"/>
</buttonCell>
</column>
</cells>
<connections>
<binding destination="32" name="selectedTag" keyPath="values.ComposingBufferSize" id="DLu-Gr-ghB"/>
</connections>
</matrix>
</subviews> </subviews>
<constraints> <constraints>
<constraint firstAttribute="trailing" secondItem="15" secondAttribute="trailing" constant="10" id="3Ut-Lb-g5c"/> <constraint firstItem="J0f-Aw-dxC" firstAttribute="leading" secondItem="Zaa-dP-WdF" secondAttribute="leading" constant="20" symbolic="YES" id="0e8-Vm-lW9"/>
<constraint firstItem="IpX-f7-rTL" firstAttribute="leading" secondItem="13" secondAttribute="leading" id="68K-st-tIp"/> <constraint firstItem="bE0-Lq-Pj7" firstAttribute="leading" secondItem="Zaa-dP-WdF" secondAttribute="leading" constant="20" symbolic="YES" id="BM3-Hc-NoJ"/>
<constraint firstItem="J0f-Aw-dxC" firstAttribute="leading" secondItem="109" secondAttribute="leading" id="6Qs-pM-62E"/> <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="109" secondAttribute="trailing" constant="20" symbolic="YES" id="BZF-Di-Nvo"/>
<constraint firstItem="bE0-Lq-Pj7" firstAttribute="leading" secondItem="mzw-F2-aAQ" secondAttribute="leading" id="8lg-dI-ZNC"/> <constraint firstItem="JG6-RM-ZdJ" firstAttribute="leading" secondItem="d5f-bq-dRQ" secondAttribute="trailing" constant="8" symbolic="YES" id="Bir-Dn-WJU"/>
<constraint firstAttribute="trailing" secondItem="7z2-DD-c58" secondAttribute="trailing" constant="20" symbolic="YES" id="Avc-pt-eoO"/> <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="mzw-F2-aAQ" secondAttribute="trailing" constant="20" symbolic="YES" id="E0Z-4p-exf"/>
<constraint firstItem="uHU-aL-du7" firstAttribute="top" secondItem="IpX-f7-rTL" secondAttribute="bottom" constant="8" symbolic="YES" id="DOO-LN-cUd"/> <constraint firstItem="JG6-RM-ZdJ" firstAttribute="top" secondItem="uHU-aL-du7" secondAttribute="bottom" constant="8" id="FDe-8M-v2o"/>
<constraint firstItem="IpX-f7-rTL" firstAttribute="top" secondItem="Zaa-dP-WdF" secondAttribute="top" constant="15" id="EsV-t1-bC1"/> <constraint firstItem="YkJ-lr-EP6" firstAttribute="top" secondItem="J0f-Aw-dxC" secondAttribute="bottom" constant="7" id="FyK-PK-b8k"/>
<constraint firstItem="J0f-Aw-dxC" firstAttribute="top" secondItem="n7q-ew-DYu" secondAttribute="bottom" constant="8" symbolic="YES" id="FUN-Sk-18I"/> <constraint firstItem="109" firstAttribute="leading" secondItem="Zaa-dP-WdF" secondAttribute="leading" constant="20" symbolic="YES" id="GNN-BI-mtv"/>
<constraint firstItem="109" firstAttribute="leading" secondItem="bE0-Lq-Pj7" secondAttribute="leading" id="Inc-F1-iRQ"/> <constraint firstItem="ETa-09-qWI" firstAttribute="top" secondItem="IpX-f7-rTL" secondAttribute="bottom" constant="11" id="HBB-jl-lam"/>
<constraint firstItem="ETa-09-qWI" firstAttribute="leading" secondItem="Zaa-dP-WdF" secondAttribute="leading" constant="33" id="KmP-py-Qqz"/> <constraint firstItem="IpX-f7-rTL" firstAttribute="leading" secondItem="Zaa-dP-WdF" secondAttribute="leading" constant="20" symbolic="YES" id="HLO-fb-ikL"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="bE0-Lq-Pj7" secondAttribute="trailing" constant="20" symbolic="YES" id="LYR-cD-DqP"/> <constraint firstItem="7z2-DD-c58" firstAttribute="top" secondItem="15" secondAttribute="bottom" constant="4" id="ITw-bi-amp"/>
<constraint firstItem="n7q-ew-DYu" firstAttribute="top" secondItem="TMn-LX-3Ub" secondAttribute="bottom" constant="7" id="MIE-v4-sXo"/> <constraint firstItem="IpX-f7-rTL" firstAttribute="top" secondItem="Zaa-dP-WdF" secondAttribute="top" constant="15" id="IfF-zm-H4h"/>
<constraint firstItem="IpX-f7-rTL" firstAttribute="centerX" secondItem="mzw-F2-aAQ" secondAttribute="centerX" id="MeB-I9-I3J"/> <constraint firstItem="n7q-ew-DYu" firstAttribute="leading" secondItem="Zaa-dP-WdF" secondAttribute="leading" constant="33" id="JU9-if-dHu"/>
<constraint firstItem="TMn-LX-3Ub" firstAttribute="top" secondItem="7z2-DD-c58" secondAttribute="bottom" constant="9" id="Nhp-Ij-CJM"/> <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="bE0-Lq-Pj7" secondAttribute="trailing" constant="20" symbolic="YES" id="LEr-dZ-tQl"/>
<constraint firstItem="n7q-ew-DYu" firstAttribute="leading" secondItem="YkJ-lr-EP6" secondAttribute="leading" id="RJq-WW-QIV"/> <constraint firstItem="15" firstAttribute="leading" secondItem="Zaa-dP-WdF" secondAttribute="leading" constant="33" id="LSC-8Z-t3E"/>
<constraint firstItem="mzw-F2-aAQ" firstAttribute="top" secondItem="bE0-Lq-Pj7" secondAttribute="bottom" constant="6" symbolic="YES" id="Rfg-V4-SqR"/> <constraint firstItem="13" firstAttribute="top" secondItem="d5f-bq-dRQ" secondAttribute="bottom" constant="8" symbolic="YES" id="MnA-i7-XHq"/>
<constraint firstItem="IpX-f7-rTL" firstAttribute="leading" secondItem="Zaa-dP-WdF" secondAttribute="leading" constant="20" symbolic="YES" id="T9R-Wl-QmL"/> <constraint firstItem="uHU-aL-du7" firstAttribute="leading" secondItem="ETa-09-qWI" secondAttribute="trailing" constant="8" symbolic="YES" id="PU2-ef-oes"/>
<constraint firstItem="7z2-DD-c58" firstAttribute="top" secondItem="15" secondAttribute="bottom" constant="7" id="UW2-Dc-Ev7"/> <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="IpX-f7-rTL" secondAttribute="trailing" constant="20" symbolic="YES" id="TJm-ok-omx"/>
<constraint firstItem="uHU-aL-du7" firstAttribute="baseline" secondItem="ETa-09-qWI" secondAttribute="firstBaseline" id="Up0-Zu-yer"/> <constraint firstItem="J0f-Aw-dxC" firstAttribute="top" secondItem="n7q-ew-DYu" secondAttribute="bottom" constant="8" symbolic="YES" id="Tzp-5r-i3c"/>
<constraint firstItem="n7q-ew-DYu" firstAttribute="trailing" secondItem="YkJ-lr-EP6" secondAttribute="trailing" id="UqO-Qb-eH0"/> <constraint firstItem="15" firstAttribute="top" secondItem="13" secondAttribute="bottom" constant="8" symbolic="YES" id="UIa-Ix-lhI"/>
<constraint firstItem="13" firstAttribute="trailing" secondItem="n7q-ew-DYu" secondAttribute="trailing" id="W6s-pA-kti"/> <constraint firstItem="uHU-aL-du7" firstAttribute="top" secondItem="IpX-f7-rTL" secondAttribute="bottom" constant="8" symbolic="YES" id="ULh-hH-xKC"/>
<constraint firstItem="uHU-aL-du7" firstAttribute="leading" secondItem="ETa-09-qWI" secondAttribute="trailing" constant="8" symbolic="YES" id="cPM-bP-Gwf"/> <constraint firstItem="bE0-Lq-Pj7" firstAttribute="top" secondItem="109" secondAttribute="bottom" constant="6" symbolic="YES" id="UWL-D9-CwK"/>
<constraint firstItem="15" firstAttribute="leading" secondItem="n7q-ew-DYu" secondAttribute="leading" id="dTu-VM-Mex"/> <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="TMn-LX-3Ub" secondAttribute="trailing" constant="20" symbolic="YES" id="WrM-BI-Qka"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="13" secondAttribute="trailing" constant="20" symbolic="YES" id="eFx-fp-hkw"/> <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="13" secondAttribute="trailing" constant="20" symbolic="YES" id="XNq-db-VNS"/>
<constraint firstAttribute="trailing" secondItem="J0f-Aw-dxC" secondAttribute="trailing" constant="46" id="frg-ba-K1N"/> <constraint firstItem="mzw-F2-aAQ" firstAttribute="leading" secondItem="Zaa-dP-WdF" secondAttribute="leading" constant="20" symbolic="YES" id="Xz6-OP-PgW"/>
<constraint firstItem="15" firstAttribute="top" secondItem="13" secondAttribute="bottom" constant="8" symbolic="YES" id="hS6-Vg-wWW"/> <constraint firstItem="d5f-bq-dRQ" firstAttribute="top" secondItem="ETa-09-qWI" secondAttribute="bottom" constant="8" symbolic="YES" id="Y1x-Yb-mxp"/>
<constraint firstItem="YkJ-lr-EP6" firstAttribute="top" secondItem="J0f-Aw-dxC" secondAttribute="bottom" constant="7" id="jlj-Bh-CE9"/> <constraint firstItem="13" firstAttribute="leading" secondItem="Zaa-dP-WdF" secondAttribute="leading" constant="20" symbolic="YES" id="eGk-LL-U7g"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="109" secondAttribute="trailing" constant="20" symbolic="YES" id="mZE-TB-4fR"/> <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="7z2-DD-c58" secondAttribute="trailing" constant="20" symbolic="YES" id="fIY-vJ-kPu"/>
<constraint firstItem="7z2-DD-c58" firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="mzw-F2-aAQ" secondAttribute="trailing" id="nal-v8-hEc"/> <constraint firstItem="mzw-F2-aAQ" firstAttribute="top" secondItem="bE0-Lq-Pj7" secondAttribute="bottom" constant="6" symbolic="YES" id="fws-AB-eRF"/>
<constraint firstItem="13" firstAttribute="leading" secondItem="TMn-LX-3Ub" secondAttribute="leading" id="pKo-EY-LzQ"/> <constraint firstItem="d5f-bq-dRQ" firstAttribute="leading" secondItem="Zaa-dP-WdF" secondAttribute="leading" constant="28" id="g7m-wb-cHq"/>
<constraint firstItem="ETa-09-qWI" firstAttribute="leading" secondItem="15" secondAttribute="leading" id="pKq-I6-9MX"/> <constraint firstItem="109" firstAttribute="top" secondItem="YkJ-lr-EP6" secondAttribute="bottom" constant="8" symbolic="YES" id="i6t-Qo-A6f"/>
<constraint firstItem="13" firstAttribute="top" secondItem="uHU-aL-du7" secondAttribute="bottom" constant="8" symbolic="YES" id="pXY-Vl-fF3"/> <constraint firstItem="7z2-DD-c58" firstAttribute="leading" secondItem="Zaa-dP-WdF" secondAttribute="leading" constant="34" id="jn0-am-4VT"/>
<constraint firstItem="TMn-LX-3Ub" firstAttribute="leading" secondItem="J0f-Aw-dxC" secondAttribute="leading" id="rjf-KH-R1M"/> <constraint firstItem="ETa-09-qWI" firstAttribute="leading" secondItem="Zaa-dP-WdF" secondAttribute="leading" constant="33" id="jxy-LV-cNN"/>
<constraint firstAttribute="bottom" secondItem="mzw-F2-aAQ" secondAttribute="bottom" constant="36.5" id="rll-uD-kgj"/> <constraint firstItem="TMn-LX-3Ub" firstAttribute="top" secondItem="7z2-DD-c58" secondAttribute="bottom" constant="10" id="lN4-F5-Rso"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="TMn-LX-3Ub" secondAttribute="trailing" constant="20" symbolic="YES" id="skq-dq-2tr"/> <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="J0f-Aw-dxC" secondAttribute="trailing" constant="20" symbolic="YES" id="m7V-aO-sWq"/>
<constraint firstItem="bE0-Lq-Pj7" firstAttribute="top" secondItem="109" secondAttribute="bottom" constant="6" symbolic="YES" id="ss5-S5-eA2"/> <constraint firstItem="TMn-LX-3Ub" firstAttribute="leading" secondItem="Zaa-dP-WdF" secondAttribute="leading" constant="20" symbolic="YES" id="n41-fp-yIM"/>
<constraint firstItem="ETa-09-qWI" firstAttribute="top" secondItem="IpX-f7-rTL" secondAttribute="bottom" constant="11" id="vc8-1e-YLx"/> <constraint firstItem="YkJ-lr-EP6" firstAttribute="leading" secondItem="Zaa-dP-WdF" secondAttribute="leading" constant="33" id="oeV-di-jPe"/>
<constraint firstItem="7z2-DD-c58" firstAttribute="leading" secondItem="Zaa-dP-WdF" secondAttribute="leading" constant="34" id="wwj-Hl-v4k"/> <constraint firstItem="n7q-ew-DYu" firstAttribute="top" secondItem="TMn-LX-3Ub" secondAttribute="bottom" constant="7" id="w3R-Ed-yWK"/>
<constraint firstItem="109" firstAttribute="top" secondItem="YkJ-lr-EP6" secondAttribute="bottom" constant="9.5" id="yI5-hF-d78"/>
</constraints> </constraints>
</view> </view>
</box> </box>
</subviews> </subviews>
<constraints> <constraints>
<constraint firstItem="E1l-m8-xgb" firstAttribute="top" secondItem="bZr-iP-F6T" secondAttribute="top" constant="5" id="6G1-ic-qOE"/> <constraint firstAttribute="bottom" secondItem="E1l-m8-xgb" secondAttribute="bottom" constant="14" id="AAY-z7-YD8"/>
<constraint firstItem="E1l-m8-xgb" firstAttribute="leading" secondItem="bZr-iP-F6T" secondAttribute="leading" constant="9" id="CWs-nE-zc4"/> <constraint firstItem="E1l-m8-xgb" firstAttribute="leading" secondItem="bZr-iP-F6T" secondAttribute="leading" constant="9" id="S6O-b1-iXi"/>
<constraint firstAttribute="trailing" secondItem="E1l-m8-xgb" secondAttribute="trailing" constant="9" id="w21-Zs-a85"/> <constraint firstAttribute="trailing" secondItem="E1l-m8-xgb" secondAttribute="trailing" constant="9" id="ejr-Js-PVs"/>
<constraint firstItem="E1l-m8-xgb" firstAttribute="top" secondItem="bZr-iP-F6T" secondAttribute="top" constant="5" id="fyM-Iy-WOj"/>
</constraints> </constraints>
</view> </view>
</tabViewItem> </tabViewItem>
@ -691,25 +748,10 @@
<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="O4B-Z2-XYi" firstAttribute="trailing" secondItem="Yaj-QY-7xV" secondAttribute="trailing" id="2VU-kM-5xJ"/> <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="O4B-Z2-XYi" firstAttribute="top" secondItem="p7V-IN-OTr" secondAttribute="bottom" constant="6" id="6tf-H0-CKc"/> <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"/>
@ -721,11 +763,9 @@
<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="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="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="O2c-HS-d9s" firstAttribute="top" secondItem="Yaj-QY-7xV" secondAttribute="bottom" constant="6" symbolic="YES" id="cBe-nI-2F7"/>
<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="p7V-IN-OTr" firstAttribute="leading" secondItem="O4B-Z2-XYi" secondAttribute="leading" id="dm5-TK-PRw"/> <constraint firstItem="p7V-IN-OTr" firstAttribute="leading" secondItem="O4B-Z2-XYi" secondAttribute="leading" id="dm5-TK-PRw"/>
<constraint firstItem="O4B-Z2-XYi" firstAttribute="leading" secondItem="Yaj-QY-7xV" secondAttribute="leading" id="qHY-fz-P9H"/> <constraint firstItem="O4B-Z2-XYi" firstAttribute="leading" secondItem="Yaj-QY-7xV" secondAttribute="leading" id="qHY-fz-P9H"/>
<constraint firstItem="Yaj-QY-7xV" firstAttribute="leading" secondItem="O2c-HS-d9s" secondAttribute="leading" id="tap-dN-5Nu"/>
<constraint firstItem="p7V-IN-OTr" firstAttribute="trailing" secondItem="jXe-xz-9Sd" secondAttribute="trailing" id="uuG-Bg-2Vi"/> <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"/>
@ -748,13 +788,13 @@
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<box title="Keyboard Layout" translatesAutoresizingMaskIntoConstraints="NO" id="Wvt-HE-LOv"> <box title="Keyboard Layout" translatesAutoresizingMaskIntoConstraints="NO" id="Wvt-HE-LOv">
<rect key="frame" x="6" y="10" width="451" height="409"/> <rect key="frame" x="6" y="198" width="451" height="221"/>
<view key="contentView" id="mE9-SY-ijS"> <view key="contentView" id="mE9-SY-ijS">
<rect key="frame" x="3" y="3" width="445" height="391"/> <rect key="frame" x="3" y="3" width="445" height="203"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="onD-QP-KPf"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="onD-QP-KPf">
<rect key="frame" x="18" y="361" width="345" height="15"/> <rect key="frame" x="18" y="173" width="345" height="15"/>
<constraints> <constraints>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="242" id="7Fg-39-CRo"/> <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="242" id="7Fg-39-CRo"/>
</constraints> </constraints>
@ -765,7 +805,7 @@
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="hab-1o-1kS"> <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="hab-1o-1kS">
<rect key="frame" x="18" y="253" width="409" height="37"/> <rect key="frame" x="18" y="65" width="409" height="37"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="37" id="DuE-Bj-q43"/> <constraint firstAttribute="height" constant="37" id="DuE-Bj-q43"/>
</constraints> </constraints>
@ -777,7 +817,7 @@
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField horizontalHuggingPriority="249" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="11"> <textField horizontalHuggingPriority="249" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="11">
<rect key="frame" x="18" y="334" width="86" height="17"/> <rect key="frame" x="18" y="146" width="86" height="17"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="17" id="3Lz-Gj-jiD"/> <constraint firstAttribute="height" constant="17" id="3Lz-Gj-jiD"/>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="82" id="Vfj-gd-B0r"/> <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="82" id="Vfj-gd-B0r"/>
@ -789,7 +829,7 @@
</textFieldCell> </textFieldCell>
</textField> </textField>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="3"> <popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="3">
<rect key="frame" x="107" y="328" width="277" height="26"/> <rect key="frame" x="107" y="140" width="277" height="26"/>
<constraints> <constraints>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="270" id="s83-aB-x7j"/> <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="270" id="s83-aB-x7j"/>
</constraints> </constraints>
@ -820,7 +860,7 @@
</popUpButtonCell> </popUpButtonCell>
</popUpButton> </popUpButton>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="124"> <popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="124">
<rect key="frame" x="107" y="300" width="277" height="26"/> <rect key="frame" x="107" y="112" width="277" height="26"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="21" id="MHr-9M-m65"/> <constraint firstAttribute="height" constant="21" id="MHr-9M-m65"/>
</constraints> </constraints>
@ -834,7 +874,7 @@
</connections> </connections>
</popUpButton> </popUpButton>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="125"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="125">
<rect key="frame" x="18" y="308" width="86" height="15"/> <rect key="frame" x="18" y="120" width="86" height="15"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Basic Layout:" id="126"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Basic Layout:" id="126">
<font key="font" metaFont="cellTitle"/> <font key="font" metaFont="cellTitle"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -864,9 +904,99 @@
</constraints> </constraints>
</view> </view>
</box> </box>
<box fixedFrame="YES" title="Keyboard Shortcuts" translatesAutoresizingMaskIntoConstraints="NO" id="xibKeyboardShortcuts">
<rect key="frame" x="6" y="10" width="451" height="184"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<view key="contentView" id="rZK-cU-6Y0">
<rect key="frame" x="3" y="3" width="445" height="166"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="qAe-7E-PPO" userLabel="UsingHotKeySCPC">
<rect key="frame" x="19" y="138.5" width="406" height="16"/>
<buttonCell key="cell" type="check" title="Per-Char Select Mode" bezelStyle="regularSquare" imagePosition="left" controlSize="small" inset="2" id="xibUsingHotKeySCPC">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="cellTitle"/>
</buttonCell>
<connections>
<binding destination="32" name="value" keyPath="values.UsingHotKeySCPC" id="Bda-2Q-cWF"/>
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="LeH-0u-c97" userLabel="UsingHotKeyAssociates">
<rect key="frame" x="19" y="117.5" width="406" height="16"/>
<buttonCell key="cell" type="check" title="Per-Char Associated Phrases" bezelStyle="regularSquare" imagePosition="left" controlSize="small" inset="2" id="xibUsingHotKeyAssociates">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="cellTitle"/>
</buttonCell>
<connections>
<binding destination="32" name="value" keyPath="values.UsingHotKeyAssociates" id="knj-hU-irv"/>
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="OwI-YY-9pZ" userLabel="UsingHotKeyCNS">
<rect key="frame" x="19" y="96.5" width="406" height="16"/>
<buttonCell key="cell" type="check" title="CNS11643 Mode" bezelStyle="regularSquare" imagePosition="left" controlSize="small" inset="2" id="xibUsingHotKeyCNS">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="cellTitle"/>
</buttonCell>
<connections>
<binding destination="32" name="value" keyPath="values.UsingHotKeyCNS" id="TDq-V9-Ojp"/>
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="eNN-a4-bj8" userLabel="UsingHotKeyKangXi">
<rect key="frame" x="19" y="75.5" width="406" height="16"/>
<buttonCell key="cell" type="check" title="Force KangXi Writing" bezelStyle="regularSquare" imagePosition="left" controlSize="small" inset="2" id="xibUsingHotKeyKangXi">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="cellTitle"/>
</buttonCell>
<connections>
<binding destination="32" name="value" keyPath="values.UsingHotKeyKangXi" id="gy4-ge-8R1"/>
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="AMy-dJ-qCK" userLabel="UsingHotKeyJIS">
<rect key="frame" x="19" y="54.5" width="406" height="16"/>
<buttonCell key="cell" type="check" title="JIS Shinjitai Output" bezelStyle="regularSquare" imagePosition="left" controlSize="small" inset="2" id="xibUsingHotKeyJIS">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="cellTitle"/>
</buttonCell>
<connections>
<binding destination="32" name="value" keyPath="values.UsingHotKeyJIS" id="RBH-UU-T8y"/>
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Dsq-el-pj8" userLabel="UsingHotKeyHalfWidthASCII">
<rect key="frame" x="19" y="33.5" width="406" height="16"/>
<buttonCell key="cell" type="check" title="Half-Width Punctuation Mode" bezelStyle="regularSquare" imagePosition="left" controlSize="small" inset="2" id="xibUsingHotKeyHalfWidthASCII">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="cellTitle"/>
</buttonCell>
<connections>
<binding destination="32" name="value" keyPath="values.UsingHotKeyHalfWidthASCII" id="Bwk-BZ-dX5"/>
</connections>
</button>
</subviews>
<constraints>
<constraint firstItem="Dsq-el-pj8" firstAttribute="top" secondItem="AMy-dJ-qCK" secondAttribute="bottom" constant="6" symbolic="YES" id="0J0-wy-BA0"/>
<constraint firstItem="AMy-dJ-qCK" firstAttribute="top" secondItem="eNN-a4-bj8" secondAttribute="bottom" constant="6" symbolic="YES" id="0mV-hQ-FOz"/>
<constraint firstItem="OwI-YY-9pZ" firstAttribute="trailing" secondItem="eNN-a4-bj8" secondAttribute="trailing" id="2b4-sC-KTr"/>
<constraint firstItem="eNN-a4-bj8" firstAttribute="centerY" secondItem="rZK-cU-6Y0" secondAttribute="centerY" id="8Ux-vD-PZ9"/>
<constraint firstItem="qAe-7E-PPO" firstAttribute="leading" secondItem="LeH-0u-c97" secondAttribute="leading" id="ApK-f6-5DU"/>
<constraint firstItem="qAe-7E-PPO" firstAttribute="trailing" secondItem="LeH-0u-c97" secondAttribute="trailing" id="ERV-uG-xmS"/>
<constraint firstItem="AMy-dJ-qCK" firstAttribute="leading" secondItem="Dsq-el-pj8" secondAttribute="leading" id="KVZ-bV-wd0"/>
<constraint firstItem="qAe-7E-PPO" firstAttribute="leading" secondItem="rZK-cU-6Y0" secondAttribute="leading" constant="20" symbolic="YES" id="KdT-pB-fkI"/>
<constraint firstItem="OwI-YY-9pZ" firstAttribute="top" secondItem="LeH-0u-c97" secondAttribute="bottom" constant="6" symbolic="YES" id="LVw-1O-jqY"/>
<constraint firstItem="LeH-0u-c97" firstAttribute="top" secondItem="qAe-7E-PPO" secondAttribute="bottom" constant="6" symbolic="YES" id="Lny-6z-dUo"/>
<constraint firstItem="LeH-0u-c97" firstAttribute="leading" secondItem="OwI-YY-9pZ" secondAttribute="leading" id="NqS-74-MvJ"/>
<constraint firstItem="eNN-a4-bj8" firstAttribute="trailing" secondItem="AMy-dJ-qCK" secondAttribute="trailing" id="UOq-a5-ve5"/>
<constraint firstItem="LeH-0u-c97" firstAttribute="trailing" secondItem="OwI-YY-9pZ" secondAttribute="trailing" id="VXD-Q0-Srz"/>
<constraint firstItem="AMy-dJ-qCK" firstAttribute="trailing" secondItem="Dsq-el-pj8" secondAttribute="trailing" id="iLB-X2-YmS"/>
<constraint firstItem="eNN-a4-bj8" firstAttribute="leading" secondItem="AMy-dJ-qCK" secondAttribute="leading" id="m1a-0D-ynq"/>
<constraint firstItem="eNN-a4-bj8" firstAttribute="top" secondItem="OwI-YY-9pZ" secondAttribute="bottom" constant="6" symbolic="YES" id="m7Y-ZA-TO6"/>
<constraint firstItem="OwI-YY-9pZ" firstAttribute="leading" secondItem="eNN-a4-bj8" secondAttribute="leading" id="oiD-6a-yTH"/>
<constraint firstAttribute="trailing" secondItem="qAe-7E-PPO" secondAttribute="trailing" constant="20" symbolic="YES" id="vlT-hN-v8l"/>
</constraints>
</view>
</box>
</subviews> </subviews>
<constraints> <constraints>
<constraint firstAttribute="bottom" secondItem="Wvt-HE-LOv" secondAttribute="bottom" constant="14" id="Qmp-GR-eW4"/> <constraint firstAttribute="bottom" secondItem="Wvt-HE-LOv" secondAttribute="bottom" constant="202" id="Qmp-GR-eW4"/>
<constraint firstItem="Wvt-HE-LOv" firstAttribute="leading" secondItem="FxL-ZG-Eue" secondAttribute="leading" constant="9" id="gBD-pe-hba"/> <constraint firstItem="Wvt-HE-LOv" firstAttribute="leading" secondItem="FxL-ZG-Eue" secondAttribute="leading" constant="9" id="gBD-pe-hba"/>
<constraint firstItem="Wvt-HE-LOv" firstAttribute="top" secondItem="FxL-ZG-Eue" secondAttribute="top" constant="5" id="mpD-ld-a8z"/> <constraint firstItem="Wvt-HE-LOv" firstAttribute="top" secondItem="FxL-ZG-Eue" secondAttribute="top" constant="5" id="mpD-ld-a8z"/>
<constraint firstAttribute="trailing" secondItem="Wvt-HE-LOv" secondAttribute="trailing" constant="9" id="v0g-ad-cjW"/> <constraint firstAttribute="trailing" secondItem="Wvt-HE-LOv" secondAttribute="trailing" constant="9" id="v0g-ad-cjW"/>

View File

@ -1,252 +1,91 @@
/* Class = "NSWindow"; title = "vChewing Preferences"; ObjectID = "1"; */
"1.title" = "vChewing Preferences"; "1.title" = "vChewing Preferences";
/* Class = "NSButtonCell"; title = "Debug Mode"; ObjectID = "sZx-18-8dO"; */
"sZx-18-8dO.title" = "Debug Mode"; "sZx-18-8dO.title" = "Debug Mode";
/* Class = "NSMenu"; title = "OtherViews"; ObjectID = "5"; */
"5.title" = "OtherViews"; "5.title" = "OtherViews";
/* Class = "NSMenuItem"; title = "Standard"; ObjectID = "6"; */
"6.title" = "Microsoft, Dachen, Wang, etc."; "6.title" = "Microsoft, Dachen, Wang, etc.";
/* Class = "NSMenuItem"; title = "ETen"; ObjectID = "7"; */
"7.title" = "ETen"; "7.title" = "ETen";
/* Class = "NSMenuItem"; title = "Hsu"; ObjectID = "8"; */
"8.title" = "Hsu"; "8.title" = "Hsu";
/* Class = "NSMenuItem"; title = "ETen26"; ObjectID = "9"; */
"9.title" = "ETen26"; "9.title" = "ETen26";
/* Class = "NSMenuItem"; title = "Hanyu Pinyin with Numeral Intonation"; ObjectID = "10"; */
"10.title" = "Hanyu Pinyin with Numeral Intonation"; "10.title" = "Hanyu Pinyin with Numeral Intonation";
/* Class = "NSTextFieldCell"; title = "BPMF Parser:"; ObjectID = "12"; */
"12.title" = "BPMF Parser:"; "12.title" = "BPMF Parser:";
/* Class = "NSTextFieldCell"; title = "Choose the cursor position where you want to list possible candidates."; ObjectID = "14"; */
"14.title" = "Choose the cursor position where you want to list possible candidates."; "14.title" = "Choose the cursor position where you want to list possible candidates.";
/* Class = "NSButtonCell"; title = "Cursor in front of the phrase (like macOS built-in Zhuyin IME)"; ObjectID = "16"; */
"16.title" = "Cursor in front of the phrase (like macOS built-in Zhuyin IME)"; "16.title" = "Cursor in front of the phrase (like macOS built-in Zhuyin IME)";
"17.title" = "Cursor at the rear of the phrase (like Microsoft New Phonetic)";
/* Class = "NSButtonCell"; title = "Cursor at anyplace else (like Windows Yahoo KeyKey)"; ObjectID = "17"; */
"17.title" = "Cursor at anyplace else (like Windows Yahoo KeyKey)";
/* Class = "NSButtonCell"; title = "Radio"; ObjectID = "18"; */
"18.title" = "Radio"; "18.title" = "Radio";
/* Class = "NSButtonCell"; title = "Radio"; ObjectID = "20"; */
"20.title" = "Radio"; "20.title" = "Radio";
/* Class = "NSButtonCell"; title = "Horizontal"; ObjectID = "21"; */
"21.title" = "Horizontal"; "21.title" = "Horizontal";
/* Class = "NSButtonCell"; title = "Vertical"; ObjectID = "22"; */
"22.title" = "Vertical"; "22.title" = "Vertical";
/* Class = "NSButtonCell"; title = "Show page buttons in candidate list"; ObjectID = "shc-Nu-UsM"; */
"shc-Nu-UsM.title" = "Show page buttons in candidate list"; "shc-Nu-UsM.title" = "Show page buttons in candidate list";
/* Class = "NSTextFieldCell"; title = "Candidate List Layout:"; ObjectID = "24"; */
"24.title" = "Candidate List Layout:"; "24.title" = "Candidate List Layout:";
/* Class = "NSTextFieldCell"; title = "Candidate UI font size:"; ObjectID = "29"; */
"29.title" = "Candidate UI font size:"; "29.title" = "Candidate UI font size:";
/* Class = "NSMenu"; title = "OtherViews"; ObjectID = "92"; */
"92.title" = "OtherViews"; "92.title" = "OtherViews";
/* Class = "NSMenuItem"; title = "12"; ObjectID = "93"; */
"93.title" = "12"; "93.title" = "12";
/* Class = "NSMenuItem"; title = "14"; ObjectID = "94"; */
"94.title" = "14"; "94.title" = "14";
/* Class = "NSMenuItem"; title = "16"; ObjectID = "95"; */
"95.title" = "16"; "95.title" = "16";
/* Class = "NSMenuItem"; title = "18"; ObjectID = "96"; */
"96.title" = "18"; "96.title" = "18";
/* Class = "NSMenuItem"; title = "24"; ObjectID = "98"; */
"98.title" = "24"; "98.title" = "24";
/* Class = "NSMenuItem"; title = "32"; ObjectID = "99"; */
"99.title" = "32"; "99.title" = "32";
/* Class = "NSMenuItem"; title = "64"; ObjectID = "100"; */
"100.title" = "64"; "100.title" = "64";
/* Class = "NSMenuItem"; title = "96"; ObjectID = "101"; */
"101.title" = "96"; "101.title" = "96";
/* Class = "NSButtonCell"; title = "Enable Space key for calling candidate window"; ObjectID = "110"; */
"110.title" = "Enable Space key for calling candidate window"; "110.title" = "Enable Space key for calling candidate window";
/* Class = "NSTextFieldCell"; title = "Basic Layout:"; ObjectID = "126"; */
"126.title" = "Basic Layout:"; "126.title" = "Basic Layout:";
/* Class = "NSMenu"; title = "OtherViews"; ObjectID = "128"; */
"128.title" = "OtherViews"; "128.title" = "OtherViews";
/* Class = "NSMenuItem"; title = "IBM"; ObjectID = "137"; */
"137.title" = "IBM"; "137.title" = "IBM";
/* Class = "NSMenuItem"; title = "MiTAC"; ObjectID = "7fV-x8-WHQ"; */
"7fV-x8-WHQ.title" = "MiTAC"; "7fV-x8-WHQ.title" = "MiTAC";
/* Class = "NSMenuItem"; title = "Fake Seigyou"; ObjectID = "27F-8T-FkQ"; */
"27F-8T-FkQ.title" = "Fake Seigyou (similar to JinYei)"; "27F-8T-FkQ.title" = "Fake Seigyou (similar to JinYei)";
/* Class = "NSTabViewItem"; label = "Keyboard"; ObjectID = "1AW-xf-c2f"; */
"1AW-xf-c2f.label" = "Keyboard"; "1AW-xf-c2f.label" = "Keyboard";
/* Class = "NSBox"; title = "General Settings"; ObjectID = "2Y6-Am-WM1"; */
"2Y6-Am-WM1.title" = "General Settings"; "2Y6-Am-WM1.title" = "General Settings";
/* Class = "NSTextFieldCell"; title = "Choose which keys you prefer for selecting candidates."; ObjectID = "2pS-nv-te4"; */
"2pS-nv-te4.title" = "Choose which keys you prefer for selecting candidates."; "2pS-nv-te4.title" = "Choose which keys you prefer for selecting candidates.";
/* Class = "NSButtonCell"; title = "Stop farting (when typed phonetic combination is invalid, etc.)"; ObjectID = "62u-jY-BRh"; */
"62u-jY-BRh.title" = "Stop farting (when typed phonetic combination is invalid, etc.)"; "62u-jY-BRh.title" = "Stop farting (when typed phonetic combination is invalid, etc.)";
/* Class = "NSTextFieldCell"; title = "UI language setting:"; ObjectID = "9DS-Rc-TXq"; */
"9DS-Rc-TXq.title" = "UI language setting:"; "9DS-Rc-TXq.title" = "UI language setting:";
/* Class = "NSButtonCell"; title = "Emulating select-candidate-per-character mode"; ObjectID = "ArK-Vk-OoT"; */
"ArK-Vk-OoT.title" = "Emulating select-candidate-per-character mode"; "ArK-Vk-OoT.title" = "Emulating select-candidate-per-character mode";
/* Class = "NSButtonCell"; title = "Auto-convert traditional Chinese glyphs to KangXi characters"; ObjectID = "BSK-bH-Gct"; */
"BSK-bH-Gct.title" = "Auto-convert traditional Chinese glyphs to KangXi characters"; "BSK-bH-Gct.title" = "Auto-convert traditional Chinese glyphs to KangXi characters";
/* Class = "NSButtonCell"; title = "Auto-convert traditional Chinese glyphs to KangXi characters"; ObjectID = "eia-1F-Do0"; */
"eia-1F-Do0.title" = "Auto-convert traditional Chinese glyphs to JIS Shinjitai characters"; "eia-1F-Do0.title" = "Auto-convert traditional Chinese glyphs to JIS Shinjitai characters";
/* Class = "NSBox"; title = "Advanced Settings"; ObjectID = "E1l-m8-xgb"; */
"E1l-m8-xgb.title" = "Advanced Settings"; "E1l-m8-xgb.title" = "Advanced Settings";
/* Class = "NSMenuItem"; title = "English"; ObjectID = "FSG-lN-CJO"; */
"FSG-lN-CJO.title" = "English"; "FSG-lN-CJO.title" = "English";
/* Class = "NSTextFieldCell"; title = "Selection Keys:"; ObjectID = "FnD-oH-El5"; */
"FnD-oH-El5.title" = "Selection Keys:"; "FnD-oH-El5.title" = "Selection Keys:";
/* Class = "NSMenuItem"; title = "Auto-Select"; ObjectID = "GlJ-Ns-9eE"; */
"GlJ-Ns-9eE.title" = "Auto-Select"; "GlJ-Ns-9eE.title" = "Auto-Select";
/* Class = "NSTabViewItem"; label = "General"; ObjectID = "QUQ-oY-4Hc"; */
"QUQ-oY-4Hc.label" = "General"; "QUQ-oY-4Hc.label" = "General";
/* Class = "NSTextFieldCell"; title = "Choose your preferred keyboard layout and phonetic parser."; ObjectID = "RQ6-MS-m4C"; */
"RQ6-MS-m4C.title" = "Choose your preferred keyboard layout and phonetic parser."; "RQ6-MS-m4C.title" = "Choose your preferred keyboard layout and phonetic parser.";
/* Class = "NSButtonCell"; title = "Push the cursor in front of the phrase after selection"; ObjectID = "RUG-ls-KyA"; */
"RUG-ls-KyA.title" = "Push the cursor in front of the phrase after selection"; "RUG-ls-KyA.title" = "Push the cursor in front of the phrase after selection";
/* Class = "NSMenuItem"; title = "Traditional Chinese"; ObjectID = "TXr-FF-ehw"; */
"TXr-FF-ehw.title" = "Traditional Chinese"; "TXr-FF-ehw.title" = "Traditional Chinese";
/* Class = "NSBox"; title = "Output Settings"; ObjectID = "Uyz-xL-TVN"; */
"Uyz-xL-TVN.title" = "Output Settings"; "Uyz-xL-TVN.title" = "Output Settings";
/* Class = "NSButtonCell"; title = "Enable CNS11643 Support (2022-04-27)"; ObjectID = "W24-T4-cg0"; */
"W24-T4-cg0.title" = "Enable CNS11643 Support (2022-04-27)"; "W24-T4-cg0.title" = "Enable CNS11643 Support (2022-04-27)";
/* Class = "NSBox"; title = "Keyboard Layout"; ObjectID = "Wvt-HE-LOv"; */
"Wvt-HE-LOv.title" = "Keyboard Layout"; "Wvt-HE-LOv.title" = "Keyboard Layout";
/* Class = "NSButtonCell"; title = "Check for updates automatically"; ObjectID = "Z9t-P0-BLF"; */
"Z9t-P0-BLF.title" = "Check for updates automatically"; "Z9t-P0-BLF.title" = "Check for updates automatically";
/* Class = "NSTextFieldCell"; title = "Change user interface language (will reboot the IME)."; ObjectID = "ZEv-Q2-mYL"; */
"ZEv-Q2-mYL.title" = "Change user interface language (will reboot the IME)."; "ZEv-Q2-mYL.title" = "Change user interface language (will reboot the IME).";
/* Class = "NSMenuItem"; title = "Simplified Chinese"; ObjectID = "akC-2g-ybz"; */
"akC-2g-ybz.title" = "Simplified Chinese"; "akC-2g-ybz.title" = "Simplified Chinese";
/* Class = "NSButtonCell"; title = "Use ESC key to clear the entire input buffer"; ObjectID = "f2j-xD-4xK"; */
"f2j-xD-4xK.title" = "Use ESC key to clear the entire input buffer"; "f2j-xD-4xK.title" = "Use ESC key to clear the entire input buffer";
/* Class = "NSButtonCell"; title = "Automatically reload user data files if changes detected"; ObjectID = "f8i-69-zxm"; */
"f8i-69-zxm.title" = "Automatically reload user data files if changes detected"; "f8i-69-zxm.title" = "Automatically reload user data files if changes detected";
/* Class = "NSTextFieldCell"; title = "Change UI font size of candidate window for a better visual clarity."; ObjectID = "iRg-wx-Nx2"; */
"iRg-wx-Nx2.title" = "Change UI font size of candidate window for a better visual clarity."; "iRg-wx-Nx2.title" = "Change UI font size of candidate window for a better visual clarity.";
/* Class = "NSComboBoxCell"; jQC-12-UuK.ibShadowedObjectValues[0] = "Item 1"; ObjectID = "jQC-12-UuK"; */
"jQC-12-UuK.ibShadowedObjectValues[0]" = "Item 1"; "jQC-12-UuK.ibShadowedObjectValues[0]" = "Item 1";
/* Class = "NSComboBoxCell"; jQC-12-UuK.ibShadowedObjectValues[1] = "Item 2"; ObjectID = "jQC-12-UuK"; */
"jQC-12-UuK.ibShadowedObjectValues[1]" = "Item 2"; "jQC-12-UuK.ibShadowedObjectValues[1]" = "Item 2";
/* Class = "NSComboBoxCell"; jQC-12-UuK.ibShadowedObjectValues[2] = "Item 3"; ObjectID = "jQC-12-UuK"; */
"jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3"; "jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3";
/* Class = "NSMenuItem"; title = "Japanese"; ObjectID = "rVQ-Hx-cGi"; */
"rVQ-Hx-cGi.title" = "Japanese"; "rVQ-Hx-cGi.title" = "Japanese";
/* Class = "NSBox"; title = "Dictionary and Language Models"; ObjectID = "cf2-se-PDO"; */
"cf2-se-PDO.title" = "Dictionary and Language Models"; "cf2-se-PDO.title" = "Dictionary and Language Models";
/* Class = "NSTextFieldCell"; title = "Choose your preferred layout of the candidate window."; ObjectID = "xC5-yV-1W1"; */
"xC5-yV-1W1.title" = "Choose your preferred layout of the candidate window."; "xC5-yV-1W1.title" = "Choose your preferred layout of the candidate window.";
/* Class = "NSTabViewItem"; label = "Advanced"; ObjectID = "xrE-8T-WKO"; */
"xrE-8T-WKO.label" = "Advanced"; "xrE-8T-WKO.label" = "Advanced";
/* Class = "NSTabViewItem"; label = "Dictionary"; ObjectID = "2iG-Ic-gbl"; */
"2iG-Ic-gbl.label" = "Dictionary"; "2iG-Ic-gbl.label" = "Dictionary";
/* Class = "NSTextFieldCell"; title = "Apple Dynamic Bopomofo Basic Keyboard Layouts (Dachen & Eten Traditional) must match the Dachen parser in order to be functional."; ObjectID = "wQ9-px-b07"; */
"wQ9-px-b07.title" = "Apple Dynamic Bopomofo Basic Keyboard Layouts (Dachen & Eten Traditional) must match the Dachen parser in order to be functional."; "wQ9-px-b07.title" = "Apple Dynamic Bopomofo Basic Keyboard Layouts (Dachen & Eten Traditional) must match the Dachen parser in order to be functional.";
/* Class = "NSTextFieldCell"; title = "Choose the behavior of (Shift+)Tab key in the candidate window."; ObjectID = "ueU-Rz-a1C"; */
"ueU-Rz-a1C.title" = "Choose the behavior of (Shift+)Tab key in the candidate window."; "ueU-Rz-a1C.title" = "Choose the behavior of (Shift+)Tab key in the candidate window.";
/* Class = "NSButtonCell"; title = "Cycling Pages"; ObjectID = "s7u-Fm-dVg"; */
"s7u-Fm-dVg.title" = "Cycling Pages"; "s7u-Fm-dVg.title" = "Cycling Pages";
/* Class = "NSButtonCell"; title = "Cycling Candidates"; ObjectID = "FVC-br-H57"; */
"FVC-br-H57.title" = "Cycling Candidates"; "FVC-br-H57.title" = "Cycling Candidates";
"Pg5-G9-pY5.title" = "Choose the behavior of (Shift+)Space key with candidates.";
/* Class = "NSTextFieldCell"; title = "Choose the behavior of (Shift+)Space key in the candidate window."; ObjectID = "Pg5-G9-pY5"; */
"Pg5-G9-pY5.title" = "Choose the behavior of (Shift+)Space key in the candidate window.";
/* Class = "NSButtonCell"; title = "Space to +cycle pages, Shift+Space to +cycle candidates"; ObjectID = "XqL-rf-X6d"; */
"XqL-rf-X6d.title" = "Space to +cycle pages, Shift+Space to +cycle candidates"; "XqL-rf-X6d.title" = "Space to +cycle pages, Shift+Space to +cycle candidates";
/* Class = "NSButtonCell"; title = "Space to +cycle candidates, Shift+Space to +cycle pages"; ObjectID = "dIN-TZ-67g"; */
"dIN-TZ-67g.title" = "Space to +cycle candidates, Shift+Space to +cycle pages"; "dIN-TZ-67g.title" = "Space to +cycle candidates, Shift+Space to +cycle pages";
/* Class = "NSButtonCell"; title = "Enable symbol input support (incl. certain emoji symbols)"; ObjectID = "hSv-LJ-Cq3"; */
"hSv-LJ-Cq3.title" = "Enable symbol input support (incl. certain emoji symbols)"; "hSv-LJ-Cq3.title" = "Enable symbol input support (incl. certain emoji symbols)";
/* Class = "NSTextFieldCell"; title = "Choose your desired user data folder path. Will be omitted if invalid."; ObjectID = "wN3-k3-b2a"; */
"wN3-k3-b2a.title" = "Choose your desired user data folder path. Will be omitted if invalid."; "wN3-k3-b2a.title" = "Choose your desired user data folder path. Will be omitted if invalid.";
/* Class = "NSButtonCell"; title = "Show Hanyu-Pinyin in the inline composition buffer"; ObjectID = "wFR-zX-M8H"; */
"wFR-zX-M8H.title" = "Show Hanyu-Pinyin in the inline composition buffer"; "wFR-zX-M8H.title" = "Show Hanyu-Pinyin in the inline composition buffer";
/* Class = "NSButtonCell"; title = "Output Hanyu-Pinyin in lieu of Zhuyin when Ctrl(+Alt)+CMD+Enter"; ObjectID = "iWy-Nw-QKB"; */
"iWy-Nw-QKB.title" = "Output Hanyu-Pinyin in lieu of Zhuyin when Ctrl(+Alt)+CMD+Enter"; "iWy-Nw-QKB.title" = "Output Hanyu-Pinyin in lieu of Zhuyin when Ctrl(+Alt)+CMD+Enter";
/* Class = "NSMenuItem"; title = "Dachen 26 (libChewing)"; ObjectID = "xjP-r7-GaK"; */
"xjP-r7-GaK.title" = "Dachen 26 (libChewing)"; "xjP-r7-GaK.title" = "Dachen 26 (libChewing)";
/* Class = "NSMenuItem"; title = "Secondary Pinyin with Numeral Intonation"; ObjectID = "Parser11"; */
"Parser11.title" = "Secondary Pinyin with Numeral Intonation"; "Parser11.title" = "Secondary Pinyin with Numeral Intonation";
/* Class = "NSMenuItem"; title = "Yale Pinyin with Numeral Intonation"; ObjectID = "Parser12"; */
"Parser12.title" = "Yale Pinyin with Numeral Intonation"; "Parser12.title" = "Yale Pinyin with Numeral Intonation";
/* Class = "NSMenuItem"; title = "Hualuo Pinyin with Numeral Intonation"; ObjectID = "Parser13"; */
"Parser13.title" = "Hualuo Pinyin with Numeral Intonation"; "Parser13.title" = "Hualuo Pinyin with Numeral Intonation";
/* Class = "NSMenuItem"; title = "Universal Pinyin with Numeral Intonation"; ObjectID = "Parser14"; */
"Parser14.title" = "Universal Pinyin with Numeral Intonation"; "Parser14.title" = "Universal Pinyin with Numeral Intonation";
"xibKeyboardShortcuts.title" = "Keyboard Shortcuts";
/* Class = "NSButtonCell"; title = "Balance the score according to candidate length"; ObjectID = "Wh1-iz-pwM"; */ "xibUsingHotKeySCPC.title" = "Per-Char Select Mode";
"Wh1-iz-pwM.title" = "Balance the score according to candidate length"; "xibUsingHotKeyAssociates.title" = "Per-Char Associated Phrases";
"xibUsingHotKeyCNS.title" = "CNS11643 Mode";
"xibUsingHotKeyKangXi.title" = "Force KangXi Writing";
"xibUsingHotKeyJIS.title" = "JIS Shinjitai Output";
"xibUsingHotKeyHalfWidthASCII.title" = "Half-Width Punctuation Mode";
"xibLabelBufferLimit.title" = "Buffer Limit:";

View File

@ -1,252 +1,91 @@
/* Class = "NSWindow"; title = "vChewing Preferences"; ObjectID = "1"; */
"1.title" = "威注音アプリ機能設定"; "1.title" = "威注音アプリ機能設定";
/* Class = "NSButtonCell"; title = "Debug Mode"; ObjectID = "sZx-18-8dO"; */
"sZx-18-8dO.title" = "欠陥辿着モード"; "sZx-18-8dO.title" = "欠陥辿着モード";
/* Class = "NSMenu"; title = "OtherViews"; ObjectID = "5"; */
"5.title" = "OtherViews"; "5.title" = "OtherViews";
/* Class = "NSMenuItem"; title = "Standard"; ObjectID = "6"; */
"6.title" = "大千配列Microsoft 標準・王安など)"; "6.title" = "大千配列Microsoft 標準・王安など)";
/* Class = "NSMenuItem"; title = "ETen"; ObjectID = "7"; */
"7.title" = "倚天伝統配列"; "7.title" = "倚天伝統配列";
/* Class = "NSMenuItem"; title = "Hsu"; ObjectID = "8"; */
"8.title" = "許氏国音自然配列"; "8.title" = "許氏国音自然配列";
/* Class = "NSMenuItem"; title = "ETen26"; ObjectID = "9"; */
"9.title" = "倚天形忘れ配列 (26キー)"; "9.title" = "倚天形忘れ配列 (26キー)";
/* Class = "NSMenuItem"; title = "Hanyu Pinyin with Numeral Intonation"; ObjectID = "10"; */
"10.title" = "漢語弁音(ローマ字+数字音調)"; "10.title" = "漢語弁音(ローマ字+数字音調)";
/* Class = "NSTextFieldCell"; title = "BPMF Parser:"; ObjectID = "12"; */
"12.title" = "注音配列:"; "12.title" = "注音配列:";
/* Class = "NSTextFieldCell"; title = "Choose the cursor position where you want to list possible candidates."; ObjectID = "14"; */
"14.title" = "カーソルはどこで入力候補を呼び出すかとご選択ください:"; "14.title" = "カーソルはどこで入力候補を呼び出すかとご選択ください:";
"16.title" = "単語の前で // macOS 内蔵注音入力のやり方";
/* Class = "NSButtonCell"; title = "Cursor in front of the phrase (like macOS built-in Zhuyin IME)"; ObjectID = "16"; */ "17.title" = "単語の後で // Microsoft 新注音入力のやり方";
"16.title" = "単語の前で // macOS 内蔵注音入力の入力スタイル";
/* Class = "NSButtonCell"; title = "Cursor at anyplace else (like Windows Yahoo KeyKey)"; ObjectID = "17"; */
"17.title" = "単語の中・後で // Windows Yahoo KeyKey の入力スタイル";
/* Class = "NSButtonCell"; title = "Radio"; ObjectID = "18"; */
"18.title" = "Radio"; "18.title" = "Radio";
/* Class = "NSButtonCell"; title = "Radio"; ObjectID = "20"; */
"20.title" = "Radio"; "20.title" = "Radio";
/* Class = "NSButtonCell"; title = "Horizontal"; ObjectID = "21"; */
"21.title" = "横型陳列"; "21.title" = "横型陳列";
/* Class = "NSButtonCell"; title = "Vertical"; ObjectID = "22"; */
"22.title" = "縦型陳列"; "22.title" = "縦型陳列";
/* Class = "NSButtonCell"; title = "Show page buttons in candidate list"; ObjectID = "shc-Nu-UsM"; */
"shc-Nu-UsM.title" = "ページボタンを表示"; "shc-Nu-UsM.title" = "ページボタンを表示";
/* Class = "NSTextFieldCell"; title = "Candidate List Layout:"; ObjectID = "24"; */
"24.title" = "入力候補陳列の仕様:"; "24.title" = "入力候補陳列の仕様:";
/* Class = "NSTextFieldCell"; title = "Candidate UI font size:"; ObjectID = "29"; */
"29.title" = "候補文字の字号:"; "29.title" = "候補文字の字号:";
/* Class = "NSMenu"; title = "OtherViews"; ObjectID = "92"; */
"92.title" = "OtherViews"; "92.title" = "OtherViews";
/* Class = "NSMenuItem"; title = "12"; ObjectID = "93"; */
"93.title" = "12"; "93.title" = "12";
/* Class = "NSMenuItem"; title = "14"; ObjectID = "94"; */
"94.title" = "14"; "94.title" = "14";
/* Class = "NSMenuItem"; title = "16"; ObjectID = "95"; */
"95.title" = "16"; "95.title" = "16";
/* Class = "NSMenuItem"; title = "18"; ObjectID = "96"; */
"96.title" = "18"; "96.title" = "18";
/* Class = "NSMenuItem"; title = "24"; ObjectID = "98"; */
"98.title" = "24"; "98.title" = "24";
/* Class = "NSMenuItem"; title = "32"; ObjectID = "99"; */
"99.title" = "32"; "99.title" = "32";
/* Class = "NSMenuItem"; title = "64"; ObjectID = "100"; */
"100.title" = "64"; "100.title" = "64";
/* Class = "NSMenuItem"; title = "96"; ObjectID = "101"; */
"101.title" = "96"; "101.title" = "96";
/* Class = "NSButtonCell"; title = "Enable Space key for calling candidate window"; ObjectID = "110"; */
"110.title" = "Space キーで入力候補を呼び出す"; "110.title" = "Space キーで入力候補を呼び出す";
/* Class = "NSTextFieldCell"; title = "Basic Layout:"; ObjectID = "126"; */
"126.title" = "基礎キーボード:"; "126.title" = "基礎キーボード:";
/* Class = "NSMenu"; title = "OtherViews"; ObjectID = "128"; */
"128.title" = "OtherViews"; "128.title" = "OtherViews";
/* Class = "NSMenuItem"; title = "IBM"; ObjectID = "137"; */
"137.title" = "IBM 配列"; "137.title" = "IBM 配列";
/* Class = "NSMenuItem"; title = "MiTAC"; ObjectID = "7fV-x8-WHQ"; */
"7fV-x8-WHQ.title" = "神通配列"; "7fV-x8-WHQ.title" = "神通配列";
/* Class = "NSMenuItem"; title = "Fake Seigyou"; ObjectID = "27F-8T-FkQ"; */
"27F-8T-FkQ.title" = "偽精業配列"; "27F-8T-FkQ.title" = "偽精業配列";
/* Class = "NSTabViewItem"; label = "Keyboard"; ObjectID = "1AW-xf-c2f"; */
"1AW-xf-c2f.label" = "キーボード"; "1AW-xf-c2f.label" = "キーボード";
/* Class = "NSBox"; title = "General Settings"; ObjectID = "2Y6-Am-WM1"; */
"2Y6-Am-WM1.title" = "全般設定"; "2Y6-Am-WM1.title" = "全般設定";
/* Class = "NSTextFieldCell"; title = "Choose which keys you prefer for selecting candidates."; ObjectID = "2pS-nv-te4"; */
"2pS-nv-te4.title" = "お好きなる言選り用キー陣列をお選びください。"; "2pS-nv-te4.title" = "お好きなる言選り用キー陣列をお選びください。";
/* Class = "NSButtonCell"; title = "Stop farting (when typed phonetic combination is invalid, etc.)"; ObjectID = "62u-jY-BRh"; */
"62u-jY-BRh.title" = "マナーモード // 外すと入力間違の時に変な音が出る"; "62u-jY-BRh.title" = "マナーモード // 外すと入力間違の時に変な音が出る";
/* Class = "NSTextFieldCell"; title = "UI language setting:"; ObjectID = "9DS-Rc-TXq"; */
"9DS-Rc-TXq.title" = "アプリ表示用言語:"; "9DS-Rc-TXq.title" = "アプリ表示用言語:";
/* Class = "NSButtonCell"; title = "Emulating select-candidate-per-character mode"; ObjectID = "ArK-Vk-OoT"; */
"ArK-Vk-OoT.title" = "漢字1つづつ全候補選択入力モード"; "ArK-Vk-OoT.title" = "漢字1つづつ全候補選択入力モード";
/* Class = "NSButtonCell"; title = "Auto-convert traditional Chinese glyphs to KangXi characters"; ObjectID = "BSK-bH-Gct"; */
"BSK-bH-Gct.title" = "入力した繁体字を康熙字体と自動変換"; "BSK-bH-Gct.title" = "入力した繁体字を康熙字体と自動変換";
/* Class = "NSButtonCell"; title = "Auto-convert traditional Chinese glyphs to KangXi characters"; ObjectID = "eia-1F-Do0"; */
"eia-1F-Do0.title" = "入力した繁体字を日文 JIS 新字体と自動変換"; "eia-1F-Do0.title" = "入力した繁体字を日文 JIS 新字体と自動変換";
/* Class = "NSBox"; title = "Advanced Settings"; ObjectID = "E1l-m8-xgb"; */
"E1l-m8-xgb.title" = "詳細設定"; "E1l-m8-xgb.title" = "詳細設定";
/* Class = "NSMenuItem"; title = "English"; ObjectID = "FSG-lN-CJO"; */
"FSG-lN-CJO.title" = "英語"; "FSG-lN-CJO.title" = "英語";
/* Class = "NSTextFieldCell"; title = "Selection Keys:"; ObjectID = "FnD-oH-El5"; */
"FnD-oH-El5.title" = "言選り用キー:"; "FnD-oH-El5.title" = "言選り用キー:";
/* Class = "NSMenuItem"; title = "Auto-Select"; ObjectID = "GlJ-Ns-9eE"; */
"GlJ-Ns-9eE.title" = "システム設定に準ずる"; "GlJ-Ns-9eE.title" = "システム設定に準ずる";
/* Class = "NSTabViewItem"; label = "General"; ObjectID = "QUQ-oY-4Hc"; */
"QUQ-oY-4Hc.label" = "全般"; "QUQ-oY-4Hc.label" = "全般";
/* Class = "NSTextFieldCell"; title = "Choose your preferred keyboard layout and phonetic parser."; ObjectID = "RQ6-MS-m4C"; */
"RQ6-MS-m4C.title" = "お好きなるキーボードとそれに相応しい注音配列をお選びください。"; "RQ6-MS-m4C.title" = "お好きなるキーボードとそれに相応しい注音配列をお選びください。";
/* Class = "NSButtonCell"; title = "Push the cursor in front of the phrase after selection"; ObjectID = "RUG-ls-KyA"; */
"RUG-ls-KyA.title" = "候補選択の直後、すぐカーソルを単語の向こうに推す"; "RUG-ls-KyA.title" = "候補選択の直後、すぐカーソルを単語の向こうに推す";
/* Class = "NSMenuItem"; title = "Traditional Chinese"; ObjectID = "TXr-FF-ehw"; */
"TXr-FF-ehw.title" = "繁体中国語"; "TXr-FF-ehw.title" = "繁体中国語";
/* Class = "NSBox"; title = "Output Settings"; ObjectID = "Uyz-xL-TVN"; */
"Uyz-xL-TVN.title" = "出力設定"; "Uyz-xL-TVN.title" = "出力設定";
/* Class = "NSButtonCell"; title = "Enable CNS11643 Support (2022-04-27)"; ObjectID = "W24-T4-cg0"; */
"W24-T4-cg0.title" = "全字庫モード // 入力可能の漢字数倍増 (2022-04-27)"; "W24-T4-cg0.title" = "全字庫モード // 入力可能の漢字数倍増 (2022-04-27)";
/* Class = "NSBox"; title = "Keyboard Layout"; ObjectID = "Wvt-HE-LOv"; */
"Wvt-HE-LOv.title" = "キーボード"; "Wvt-HE-LOv.title" = "キーボード";
/* Class = "NSButtonCell"; title = "Check for updates automatically"; ObjectID = "Z9t-P0-BLF"; */
"Z9t-P0-BLF.title" = "アプリの更新通知を受く"; "Z9t-P0-BLF.title" = "アプリの更新通知を受く";
/* Class = "NSTextFieldCell"; title = "Change user interface language (will reboot the IME)."; ObjectID = "ZEv-Q2-mYL"; */
"ZEv-Q2-mYL.title" = "アプリ表示用言語をご指定ください、そして入力アプリは自動的に再起動。"; "ZEv-Q2-mYL.title" = "アプリ表示用言語をご指定ください、そして入力アプリは自動的に再起動。";
/* Class = "NSMenuItem"; title = "Simplified Chinese"; ObjectID = "akC-2g-ybz"; */
"akC-2g-ybz.title" = "簡体中国語"; "akC-2g-ybz.title" = "簡体中国語";
/* Class = "NSButtonCell"; title = "Use ESC key to clear entire input buffer"; ObjectID = "f2j-xD-4xK"; */
"f2j-xD-4xK.title" = "ESC キーで入力緩衝列を消す"; "f2j-xD-4xK.title" = "ESC キーで入力緩衝列を消す";
/* Class = "NSButtonCell"; title = "Automatically reload user data files if changes detected"; ObjectID = "f8i-69-zxm"; */
"f8i-69-zxm.title" = "変更されたユーザー辞書データを自動的に再読込"; "f8i-69-zxm.title" = "変更されたユーザー辞書データを自動的に再読込";
/* Class = "NSTextFieldCell"; title = "Change UI font size of candidate window for a better visual clarity."; ObjectID = "iRg-wx-Nx2"; */
"iRg-wx-Nx2.title" = "入力候補陣列の候補文字の字号をご指定ください。"; "iRg-wx-Nx2.title" = "入力候補陣列の候補文字の字号をご指定ください。";
/* Class = "NSComboBoxCell"; jQC-12-UuK.ibShadowedObjectValues[0] = "Item 1"; ObjectID = "jQC-12-UuK"; */
"jQC-12-UuK.ibShadowedObjectValues[0]" = "Item 1"; "jQC-12-UuK.ibShadowedObjectValues[0]" = "Item 1";
/* Class = "NSComboBoxCell"; jQC-12-UuK.ibShadowedObjectValues[1] = "Item 2"; ObjectID = "jQC-12-UuK"; */
"jQC-12-UuK.ibShadowedObjectValues[1]" = "Item 2"; "jQC-12-UuK.ibShadowedObjectValues[1]" = "Item 2";
/* Class = "NSComboBoxCell"; jQC-12-UuK.ibShadowedObjectValues[2] = "Item 3"; ObjectID = "jQC-12-UuK"; */
"jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3"; "jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3";
/* Class = "NSMenuItem"; title = "Japanese"; ObjectID = "rVQ-Hx-cGi"; */
"rVQ-Hx-cGi.title" = "和語"; "rVQ-Hx-cGi.title" = "和語";
/* Class = "NSBox"; title = "Dictionary and Language Models"; ObjectID = "cf2-se-PDO"; */
"cf2-se-PDO.title" = "辞書と言語モデル"; "cf2-se-PDO.title" = "辞書と言語モデル";
/* Class = "NSTextFieldCell"; title = "Choose your preferred layout of the candidate window."; ObjectID = "xC5-yV-1W1"; */
"xC5-yV-1W1.title" = "入力候補陳列の仕様をご指定ください。"; "xC5-yV-1W1.title" = "入力候補陳列の仕様をご指定ください。";
/* Class = "NSTabViewItem"; label = "Advanced"; ObjectID = "xrE-8T-WKO"; */
"xrE-8T-WKO.label" = "詳細"; "xrE-8T-WKO.label" = "詳細";
/* Class = "NSTabViewItem"; label = "Dictionary"; ObjectID = "2iG-Ic-gbl"; */
"2iG-Ic-gbl.label" = "辞書"; "2iG-Ic-gbl.label" = "辞書";
/* Class = "NSTextFieldCell"; title = "Apple Dynamic Bopomofo Basic Keyboard Layouts (Dachen & Eten Traditional) must match the Dachen parser in order to be functional."; ObjectID = "wQ9-px-b07"; */
"wQ9-px-b07.title" = "Apple 動態注音キーボード (大千と倚天伝統) を使うには、共通語分析器の注音配列を大千と設定すべきである。"; "wQ9-px-b07.title" = "Apple 動態注音キーボード (大千と倚天伝統) を使うには、共通語分析器の注音配列を大千と設定すべきである。";
/* Class = "NSTextFieldCell"; title = "Choose the behavior of (Shift+)Tab key in the candidate window."; ObjectID = "ueU-Rz-a1C"; */
"ueU-Rz-a1C.title" = "入力候補陳列での (Shift+)Tab キーの輪番切替対象をご指定ください。"; "ueU-Rz-a1C.title" = "入力候補陳列での (Shift+)Tab キーの輪番切替対象をご指定ください。";
/* Class = "NSButtonCell"; title = "Cycling Pages"; ObjectID = "s7u-Fm-dVg"; */
"s7u-Fm-dVg.title" = "ページ"; "s7u-Fm-dVg.title" = "ページ";
/* Class = "NSButtonCell"; title = "Cycling Candidates"; ObjectID = "FVC-br-H57"; */
"FVC-br-H57.title" = "候補文字そのもの"; "FVC-br-H57.title" = "候補文字そのもの";
"Pg5-G9-pY5.title" = "入力候補についての (Shift+)Space キーの輪番切替対象をご指定ください。";
/* Class = "NSTextFieldCell"; title = "Choose the behavior of (Shift+)Space key in the candidate window."; ObjectID = "Pg5-G9-pY5"; */
"Pg5-G9-pY5.title" = "入力候補陳列での (Shift+)Space キーの輪番切替対象をご指定ください。";
/* Class = "NSButtonCell"; title = "Space to +cycle pages, Shift+Space to +cycle candidates"; ObjectID = "XqL-rf-X6d"; */
"XqL-rf-X6d.title" = "Space で次のページ、Shift+Space で次の候補文字を"; "XqL-rf-X6d.title" = "Space で次のページ、Shift+Space で次の候補文字を";
/* Class = "NSButtonCell"; title = "Space to +cycle candidates, Shift+Space to +cycle pages"; ObjectID = "dIN-TZ-67g"; */
"dIN-TZ-67g.title" = "Shift+Space で次のページ、Space で次の候補文字を"; "dIN-TZ-67g.title" = "Shift+Space で次のページ、Space で次の候補文字を";
/* Class = "NSButtonCell"; title = "Enable symbol input support (incl. certain emoji symbols)"; ObjectID = "hSv-LJ-Cq3"; */
"hSv-LJ-Cq3.title" = "僅かなる絵文字も含む符号入力サポートを起用"; "hSv-LJ-Cq3.title" = "僅かなる絵文字も含む符号入力サポートを起用";
/* Class = "NSTextFieldCell"; title = "Choose your desired user data folder path. Will be omitted if invalid."; ObjectID = "wN3-k3-b2a"; */
"wN3-k3-b2a.title" = "欲しがるユーザー辞書保存先をご指定ください。無効の保存先設定は効かぬ。"; "wN3-k3-b2a.title" = "欲しがるユーザー辞書保存先をご指定ください。無効の保存先設定は効かぬ。";
/* Class = "NSButtonCell"; title = "Show Hanyu-Pinyin in the inline composition buffer"; ObjectID = "wFR-zX-M8H"; */
"wFR-zX-M8H.title" = "弁音合併入力(入力緩衝列で代わりに漢語弁音の音読み)"; "wFR-zX-M8H.title" = "弁音合併入力(入力緩衝列で代わりに漢語弁音の音読み)";
/* Class = "NSButtonCell"; title = "Output Hanyu-Pinyin in lieu of Zhuyin when Ctrl(+Alt)+CMD+Enter"; ObjectID = "iWy-Nw-QKB"; */
"iWy-Nw-QKB.title" = "Ctrl(+Alt)+CMD+Enter で出すのを漢語弁音と変換"; "iWy-Nw-QKB.title" = "Ctrl(+Alt)+CMD+Enter で出すのを漢語弁音と変換";
/* Class = "NSMenuItem"; title = "Dachen 26 (libChewing)"; ObjectID = "xjP-r7-GaK"; */
"xjP-r7-GaK.title" = "酷音大千 26 キー配列"; "xjP-r7-GaK.title" = "酷音大千 26 キー配列";
/* Class = "NSMenuItem"; title = "Secondary Pinyin with Numeral Intonation"; ObjectID = "Parser11"; */
"Parser11.title" = "国音二式 (ローマ字+数字音調)"; "Parser11.title" = "国音二式 (ローマ字+数字音調)";
/* Class = "NSMenuItem"; title = "Yale Pinyin with Numeral Intonation"; ObjectID = "Parser12"; */
"Parser12.title" = "イェール弁音 (ローマ字+数字音調)"; "Parser12.title" = "イェール弁音 (ローマ字+数字音調)";
/* Class = "NSMenuItem"; title = "Hualuo Pinyin with Numeral Intonation"; ObjectID = "Parser13"; */
"Parser13.title" = "中華ローマ弁音 (ローマ字+数字音調)"; "Parser13.title" = "中華ローマ弁音 (ローマ字+数字音調)";
/* Class = "NSMenuItem"; title = "Universal Pinyin with Numeral Intonation"; ObjectID = "Parser14"; */
"Parser14.title" = "汎用弁音 (ローマ字+数字音調)"; "Parser14.title" = "汎用弁音 (ローマ字+数字音調)";
"xibKeyboardShortcuts.title" = "ショートカット";
/* Class = "NSButtonCell"; title = "Balance the score according to candidate length"; ObjectID = "Wh1-iz-pwM"; */ "xibUsingHotKeySCPC.title" = "全候補入力モード";
"Wh1-iz-pwM.title" = "候補文字の長さによる重みの調整"; "xibUsingHotKeyAssociates.title" = "全候補入力で連想語彙";
"xibUsingHotKeyCNS.title" = "全字庫モード";
"xibUsingHotKeyKangXi.title" = "康熙文字変換モード";
"xibUsingHotKeyJIS.title" = "JIS 新字体モード";
"xibUsingHotKeyHalfWidthASCII.title" = "半角句読モード";
"xibLabelBufferLimit.title" = "緩衝列の容量:";

View File

@ -1,252 +1,91 @@
/* Class = "NSWindow"; title = "vChewing Preferences"; ObjectID = "1"; */
"1.title" = "威注音偏好设定"; "1.title" = "威注音偏好设定";
/* Class = "NSButtonCell"; title = "Debug Mode"; ObjectID = "sZx-18-8dO"; */
"sZx-18-8dO.title" = "侦错模式"; "sZx-18-8dO.title" = "侦错模式";
/* Class = "NSMenu"; title = "OtherViews"; ObjectID = "5"; */
"5.title" = "OtherViews"; "5.title" = "OtherViews";
/* Class = "NSMenuItem"; title = "Standard"; ObjectID = "6"; */
"6.title" = "微软/大千/王安/国乔/零壹/仲鼎"; "6.title" = "微软/大千/王安/国乔/零壹/仲鼎";
/* Class = "NSMenuItem"; title = "ETen"; ObjectID = "7"; */
"7.title" = "倚天传统"; "7.title" = "倚天传统";
/* Class = "NSMenuItem"; title = "Hsu"; ObjectID = "8"; */
"8.title" = "许氏(国音&自然)"; "8.title" = "许氏(国音&自然)";
/* Class = "NSMenuItem"; title = "ETen26"; ObjectID = "9"; */
"9.title" = "倚天二十六键"; "9.title" = "倚天二十六键";
/* Class = "NSMenuItem"; title = "Hanyu Pinyin with Numeral Intonation"; ObjectID = "10"; */
"10.title" = "汉语拼音+数字标调"; "10.title" = "汉语拼音+数字标调";
/* Class = "NSTextFieldCell"; title = "BPMF Parser:"; ObjectID = "12"; */
"12.title" = "基础键盘布局:"; "12.title" = "基础键盘布局:";
/* Class = "NSTextFieldCell"; title = "Choose the cursor position where you want to list possible candidates."; ObjectID = "14"; */
"14.title" = "用以触发选字的光标相对位置:"; "14.title" = "用以触发选字的光标相对位置:";
/* Class = "NSButtonCell"; title = "Cursor in front of the phrase (like macOS built-in Zhuyin IME)"; ObjectID = "16"; */
"16.title" = "光标置于词语前方 // macOS 内建注音风格"; "16.title" = "光标置于词语前方 // macOS 内建注音风格";
"17.title" = "光标置于词语后方 // Windows 微软新注音风格";
/* Class = "NSButtonCell"; title = "Cursor at anyplace else (like Windows Yahoo KeyKey)"; ObjectID = "17"; */
"17.title" = "光标置于词语中后方 // Windows 奇摩注音风格";
/* Class = "NSButtonCell"; title = "Radio"; ObjectID = "18"; */
"18.title" = "Radio"; "18.title" = "Radio";
/* Class = "NSButtonCell"; title = "Radio"; ObjectID = "20"; */
"20.title" = "Radio"; "20.title" = "Radio";
/* Class = "NSButtonCell"; title = "Horizontal"; ObjectID = "21"; */
"21.title" = "横向布局"; "21.title" = "横向布局";
/* Class = "NSButtonCell"; title = "Vertical"; ObjectID = "22"; */
"22.title" = "纵向布局"; "22.title" = "纵向布局";
/* Class = "NSButtonCell"; title = "Show page buttons in candidate list"; ObjectID = "shc-Nu-UsM"; */
"shc-Nu-UsM.title" = "在选字窗内显示翻页按钮"; "shc-Nu-UsM.title" = "在选字窗内显示翻页按钮";
/* Class = "NSTextFieldCell"; title = "Candidate List Layout:"; ObjectID = "24"; */
"24.title" = "候选字窗布局:"; "24.title" = "候选字窗布局:";
/* Class = "NSTextFieldCell"; title = "Candidate UI font size:"; ObjectID = "29"; */
"29.title" = "字型大小设定:"; "29.title" = "字型大小设定:";
/* Class = "NSMenu"; title = "OtherViews"; ObjectID = "92"; */
"92.title" = "OtherViews"; "92.title" = "OtherViews";
/* Class = "NSMenuItem"; title = "12"; ObjectID = "93"; */
"93.title" = "12"; "93.title" = "12";
/* Class = "NSMenuItem"; title = "14"; ObjectID = "94"; */
"94.title" = "14"; "94.title" = "14";
/* Class = "NSMenuItem"; title = "16"; ObjectID = "95"; */
"95.title" = "16"; "95.title" = "16";
/* Class = "NSMenuItem"; title = "18"; ObjectID = "96"; */
"96.title" = "18"; "96.title" = "18";
/* Class = "NSMenuItem"; title = "24"; ObjectID = "98"; */
"98.title" = "24"; "98.title" = "24";
/* Class = "NSMenuItem"; title = "32"; ObjectID = "99"; */
"99.title" = "32"; "99.title" = "32";
/* Class = "NSMenuItem"; title = "64"; ObjectID = "100"; */
"100.title" = "64"; "100.title" = "64";
/* Class = "NSMenuItem"; title = "96"; ObjectID = "101"; */
"101.title" = "96"; "101.title" = "96";
/* Class = "NSButtonCell"; title = "Enable Space key for calling candidate window"; ObjectID = "110"; */
"110.title" = "敲空格键以选字"; "110.title" = "敲空格键以选字";
/* Class = "NSTextFieldCell"; title = "Basic Layout:"; ObjectID = "126"; */
"126.title" = "英数键盘布局:"; "126.title" = "英数键盘布局:";
/* Class = "NSMenu"; title = "OtherViews"; ObjectID = "128"; */
"128.title" = "OtherViews"; "128.title" = "OtherViews";
/* Class = "NSMenuItem"; title = "IBM"; ObjectID = "137"; */
"137.title" = "IBM"; "137.title" = "IBM";
/* Class = "NSMenuItem"; title = "MiTAC"; ObjectID = "7fV-x8-WHQ"; */
"7fV-x8-WHQ.title" = "神通"; "7fV-x8-WHQ.title" = "神通";
/* Class = "NSMenuItem"; title = "Fake Seigyou"; ObjectID = "27F-8T-FkQ"; */
"27F-8T-FkQ.title" = "伪精业"; "27F-8T-FkQ.title" = "伪精业";
/* Class = "NSTabViewItem"; label = "Keyboard"; ObjectID = "1AW-xf-c2f"; */
"1AW-xf-c2f.label" = "键盘"; "1AW-xf-c2f.label" = "键盘";
/* Class = "NSBox"; title = "General Settings"; ObjectID = "2Y6-Am-WM1"; */
"2Y6-Am-WM1.title" = "一般设定"; "2Y6-Am-WM1.title" = "一般设定";
/* Class = "NSTextFieldCell"; title = "Choose which keys you prefer for selecting candidates."; ObjectID = "2pS-nv-te4"; */
"2pS-nv-te4.title" = "选择您所偏好的用来选字的按键组合。"; "2pS-nv-te4.title" = "选择您所偏好的用来选字的按键组合。";
/* Class = "NSButtonCell"; title = "Stop farting (when typed phonetic combination is invalid, etc.)"; ObjectID = "62u-jY-BRh"; */
"62u-jY-BRh.title" = "廉耻模式 // 取消勾选的话,敲错字时会有异音"; "62u-jY-BRh.title" = "廉耻模式 // 取消勾选的话,敲错字时会有异音";
/* Class = "NSTextFieldCell"; title = "UI language setting:"; ObjectID = "9DS-Rc-TXq"; */
"9DS-Rc-TXq.title" = "接口语言设定:"; "9DS-Rc-TXq.title" = "接口语言设定:";
/* Class = "NSButtonCell"; title = "Emulating select-candidate-per-character mode"; ObjectID = "ArK-Vk-OoT"; */
"ArK-Vk-OoT.title" = "仿真 90 年代前期注音逐字选字输入风格"; "ArK-Vk-OoT.title" = "仿真 90 年代前期注音逐字选字输入风格";
/* Class = "NSButtonCell"; title = "Auto-convert traditional Chinese glyphs to KangXi characters"; ObjectID = "BSK-bH-Gct"; */
"BSK-bH-Gct.title" = "自动将繁体中文字转换为康熙正体字"; "BSK-bH-Gct.title" = "自动将繁体中文字转换为康熙正体字";
/* Class = "NSButtonCell"; title = "Auto-convert traditional Chinese glyphs to KangXi characters"; ObjectID = "eia-1F-Do0"; */
"eia-1F-Do0.title" = "自动将繁体中文字转换为日本简化字JIS 新字体)"; "eia-1F-Do0.title" = "自动将繁体中文字转换为日本简化字JIS 新字体)";
/* Class = "NSBox"; title = "Advanced Settings"; ObjectID = "E1l-m8-xgb"; */
"E1l-m8-xgb.title" = "进阶设定"; "E1l-m8-xgb.title" = "进阶设定";
/* Class = "NSMenuItem"; title = "English"; ObjectID = "FSG-lN-CJO"; */
"FSG-lN-CJO.title" = "英文"; "FSG-lN-CJO.title" = "英文";
/* Class = "NSTextFieldCell"; title = "Selection Keys:"; ObjectID = "FnD-oH-El5"; */
"FnD-oH-El5.title" = "选字键:"; "FnD-oH-El5.title" = "选字键:";
/* Class = "NSMenuItem"; title = "Auto-Select"; ObjectID = "GlJ-Ns-9eE"; */
"GlJ-Ns-9eE.title" = "自动选择"; "GlJ-Ns-9eE.title" = "自动选择";
/* Class = "NSTabViewItem"; label = "General"; ObjectID = "QUQ-oY-4Hc"; */
"QUQ-oY-4Hc.label" = "一般"; "QUQ-oY-4Hc.label" = "一般";
/* Class = "NSTextFieldCell"; title = "Choose your preferred keyboard layout and phonetic parser."; ObjectID = "RQ6-MS-m4C"; */
"RQ6-MS-m4C.title" = "选择您所偏好的系统键盘布局与注音分析器排列。"; "RQ6-MS-m4C.title" = "选择您所偏好的系统键盘布局与注音分析器排列。";
/* Class = "NSButtonCell"; title = "Push the cursor in front of the phrase after selection"; ObjectID = "RUG-ls-KyA"; */
"RUG-ls-KyA.title" = "在选字后将光标置于该字词的前方"; "RUG-ls-KyA.title" = "在选字后将光标置于该字词的前方";
/* Class = "NSMenuItem"; title = "Traditional Chinese"; ObjectID = "TXr-FF-ehw"; */
"TXr-FF-ehw.title" = "繁体中文"; "TXr-FF-ehw.title" = "繁体中文";
/* Class = "NSBox"; title = "Output Settings"; ObjectID = "Uyz-xL-TVN"; */
"Uyz-xL-TVN.title" = "输出设定"; "Uyz-xL-TVN.title" = "输出设定";
/* Class = "NSButtonCell"; title = "Enable CNS11643 Support (2022-04-27)"; ObjectID = "W24-T4-cg0"; */
"W24-T4-cg0.title" = "启用 CNS11643 全字库支援 (2022-04-27)"; "W24-T4-cg0.title" = "启用 CNS11643 全字库支援 (2022-04-27)";
/* Class = "NSBox"; title = "Keyboard Layout"; ObjectID = "Wvt-HE-LOv"; */
"Wvt-HE-LOv.title" = "键盘布局"; "Wvt-HE-LOv.title" = "键盘布局";
/* Class = "NSButtonCell"; title = "Check for updates automatically"; ObjectID = "Z9t-P0-BLF"; */
"Z9t-P0-BLF.title" = "自动检查软件更新"; "Z9t-P0-BLF.title" = "自动检查软件更新";
/* Class = "NSTextFieldCell"; title = "Change user interface language (will reboot the IME)."; ObjectID = "ZEv-Q2-mYL"; */
"ZEv-Q2-mYL.title" = "变更使用者接口语言,会自动重新启动输入法。"; "ZEv-Q2-mYL.title" = "变更使用者接口语言,会自动重新启动输入法。";
/* Class = "NSMenuItem"; title = "Simplified Chinese"; ObjectID = "akC-2g-ybz"; */
"akC-2g-ybz.title" = "简体中文"; "akC-2g-ybz.title" = "简体中文";
/* Class = "NSButtonCell"; title = "Use ESC key to clear entire input buffer"; ObjectID = "f2j-xD-4xK"; */
"f2j-xD-4xK.title" = "敲 ESC 键以清空整个输入缓冲区"; "f2j-xD-4xK.title" = "敲 ESC 键以清空整个输入缓冲区";
/* Class = "NSButtonCell"; title = "Automatically reload user data files if changes detected"; ObjectID = "f8i-69-zxm"; */
"f8i-69-zxm.title" = "自动重新加载变更过的使用者资料内容"; "f8i-69-zxm.title" = "自动重新加载变更过的使用者资料内容";
/* Class = "NSTextFieldCell"; title = "Change UI font size of candidate window for a better visual clarity."; ObjectID = "iRg-wx-Nx2"; */
"iRg-wx-Nx2.title" = "变更候选字窗的字型大小。"; "iRg-wx-Nx2.title" = "变更候选字窗的字型大小。";
/* Class = "NSComboBoxCell"; jQC-12-UuK.ibShadowedObjectValues[0] = "Item 1"; ObjectID = "jQC-12-UuK"; */
"jQC-12-UuK.ibShadowedObjectValues[0]" = "Item 1"; "jQC-12-UuK.ibShadowedObjectValues[0]" = "Item 1";
/* Class = "NSComboBoxCell"; jQC-12-UuK.ibShadowedObjectValues[1] = "Item 2"; ObjectID = "jQC-12-UuK"; */
"jQC-12-UuK.ibShadowedObjectValues[1]" = "Item 2"; "jQC-12-UuK.ibShadowedObjectValues[1]" = "Item 2";
/* Class = "NSComboBoxCell"; jQC-12-UuK.ibShadowedObjectValues[2] = "Item 3"; ObjectID = "jQC-12-UuK"; */
"jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3"; "jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3";
/* Class = "NSMenuItem"; title = "Japanese"; ObjectID = "rVQ-Hx-cGi"; */
"rVQ-Hx-cGi.title" = "和语"; "rVQ-Hx-cGi.title" = "和语";
/* Class = "NSBox"; title = "Dictionary and Language Models"; ObjectID = "cf2-se-PDO"; */
"cf2-se-PDO.title" = "辞典&語言模型"; "cf2-se-PDO.title" = "辞典&語言模型";
/* Class = "NSTextFieldCell"; title = "Choose your preferred layout of the candidate window."; ObjectID = "xC5-yV-1W1"; */
"xC5-yV-1W1.title" = "选择您所偏好的候选字窗布局。"; "xC5-yV-1W1.title" = "选择您所偏好的候选字窗布局。";
/* Class = "NSTabViewItem"; label = "Advanced"; ObjectID = "xrE-8T-WKO"; */
"xrE-8T-WKO.label" = "进阶"; "xrE-8T-WKO.label" = "进阶";
/* Class = "NSTabViewItem"; label = "Dictionary"; ObjectID = "2iG-Ic-gbl"; */
"2iG-Ic-gbl.label" = "辞典"; "2iG-Ic-gbl.label" = "辞典";
/* Class = "NSTextFieldCell"; title = "Apple Dynamic Bopomofo Basic Keyboard Layouts (Dachen & Eten Traditional) must match the Dachen parser in order to be functional."; ObjectID = "wQ9-px-b07"; */
"wQ9-px-b07.title" = "Apple 动态注音键盘布局(大千与倚天)要求普通话/国音分析器的注音排列得配置为大千排列。"; "wQ9-px-b07.title" = "Apple 动态注音键盘布局(大千与倚天)要求普通话/国音分析器的注音排列得配置为大千排列。";
/* Class = "NSTextFieldCell"; title = "Choose the behavior of (Shift+)Tab key in the candidate window."; ObjectID = "ueU-Rz-a1C"; */
"ueU-Rz-a1C.title" = "指定 (Shift+)Tab 热键在选字窗内的轮替操作对象。"; "ueU-Rz-a1C.title" = "指定 (Shift+)Tab 热键在选字窗内的轮替操作对象。";
/* Class = "NSButtonCell"; title = "Cycling Pages"; ObjectID = "s7u-Fm-dVg"; */
"s7u-Fm-dVg.title" = "轮替页面"; "s7u-Fm-dVg.title" = "轮替页面";
/* Class = "NSButtonCell"; title = "Cycling Candidates"; ObjectID = "FVC-br-H57"; */
"FVC-br-H57.title" = "轮替候选字"; "FVC-br-H57.title" = "轮替候选字";
"Pg5-G9-pY5.title" = "指定 (Shift+)Space 热键对候选字词而言的轮替操作对象。";
/* Class = "NSTextFieldCell"; title = "Choose the behavior of (Shift+)Space key in the candidate window."; ObjectID = "Pg5-G9-pY5"; */
"Pg5-G9-pY5.title" = "指定 (Shift+)Space 热键在选字窗内的轮替操作对象。";
/* Class = "NSButtonCell"; title = "Space to +cycle pages, Shift+Space to +cycle candidates"; ObjectID = "XqL-rf-X6d"; */
"XqL-rf-X6d.title" = "Space 换下一页Shift+Space 换选下一个候选字。"; "XqL-rf-X6d.title" = "Space 换下一页Shift+Space 换选下一个候选字。";
/* Class = "NSButtonCell"; title = "Space to +cycle candidates, Shift+Space to +cycle pages"; ObjectID = "dIN-TZ-67g"; */
"dIN-TZ-67g.title" = "Shift+Space 换下一页Space 换选下一个候选字。"; "dIN-TZ-67g.title" = "Shift+Space 换下一页Space 换选下一个候选字。";
/* Class = "NSButtonCell"; title = "Enable symbol input support (incl. certain emoji symbols)"; ObjectID = "hSv-LJ-Cq3"; */
"hSv-LJ-Cq3.title" = "启用包括少许绘文字在内的符号输入支援"; "hSv-LJ-Cq3.title" = "启用包括少许绘文字在内的符号输入支援";
/* Class = "NSTextFieldCell"; title = "Choose your desired user data folder path. Will be omitted if invalid."; ObjectID = "wN3-k3-b2a"; */
"wN3-k3-b2a.title" = "请在此指定您想指定的使用者语汇档案目录。无效值会被忽略。"; "wN3-k3-b2a.title" = "请在此指定您想指定的使用者语汇档案目录。无效值会被忽略。";
/* Class = "NSButtonCell"; title = "Show Hanyu-Pinyin in the inline composition buffer"; ObjectID = "wFR-zX-M8H"; */
"wFR-zX-M8H.title" = "拼音并击模式(组字区内看到的是汉语拼音)"; "wFR-zX-M8H.title" = "拼音并击模式(组字区内看到的是汉语拼音)";
/* Class = "NSButtonCell"; title = "Output Hanyu-Pinyin in lieu of Zhuyin when Ctrl(+Alt)+CMD+Enter"; ObjectID = "iWy-Nw-QKB"; */
"iWy-Nw-QKB.title" = "Ctrl(+Alt)+CMD+Enter 输出汉语拼音而非注音"; "iWy-Nw-QKB.title" = "Ctrl(+Alt)+CMD+Enter 输出汉语拼音而非注音";
/* Class = "NSMenuItem"; title = "Dachen 26 (libChewing)"; ObjectID = "xjP-r7-GaK"; */
"xjP-r7-GaK.title" = "酷音大千二十六键"; "xjP-r7-GaK.title" = "酷音大千二十六键";
/* Class = "NSMenuItem"; title = "Secondary Pinyin with Numeral Intonation"; ObjectID = "Parser11"; */
"Parser11.title" = "国音二式+数字标调"; "Parser11.title" = "国音二式+数字标调";
/* Class = "NSMenuItem"; title = "Yale Pinyin with Numeral Intonation"; ObjectID = "Parser12"; */
"Parser12.title" = "耶鲁拼音+数字标调"; "Parser12.title" = "耶鲁拼音+数字标调";
/* Class = "NSMenuItem"; title = "Hualuo Pinyin with Numeral Intonation"; ObjectID = "Parser13"; */
"Parser13.title" = "华罗拼音+数字标调"; "Parser13.title" = "华罗拼音+数字标调";
/* Class = "NSMenuItem"; title = "Universal Pinyin with Numeral Intonation"; ObjectID = "Parser14"; */
"Parser14.title" = "通用拼音+数字标调"; "Parser14.title" = "通用拼音+数字标调";
"xibKeyboardShortcuts.title" = "键盘快捷键";
/* Class = "NSButtonCell"; title = "Balance the score according to candidate length"; ObjectID = "Wh1-iz-pwM"; */ "xibUsingHotKeySCPC.title" = "模拟逐字选字输入";
"Wh1-iz-pwM.title" = "按候选字词的长度调整权重"; "xibUsingHotKeyAssociates.title" = "逐字选字联想模式";
"xibUsingHotKeyCNS.title" = "全字库模式";
"xibUsingHotKeyKangXi.title" = "康熙正体字模式";
"xibUsingHotKeyJIS.title" = "JIS 新字体模式";
"xibUsingHotKeyHalfWidthASCII.title" = "半形标点模式";
"xibLabelBufferLimit.title" = "组字区容量:";

View File

@ -1,252 +1,91 @@
/* Class = "NSWindow"; title = "vChewing Preferences"; ObjectID = "1"; */
"1.title" = "威注音偏好設定"; "1.title" = "威注音偏好設定";
/* Class = "NSButtonCell"; title = "Debug Mode"; ObjectID = "sZx-18-8dO"; */
"sZx-18-8dO.title" = "偵錯模式"; "sZx-18-8dO.title" = "偵錯模式";
/* Class = "NSMenu"; title = "OtherViews"; ObjectID = "5"; */
"5.title" = "OtherViews"; "5.title" = "OtherViews";
/* Class = "NSMenuItem"; title = "Standard"; ObjectID = "6"; */
"6.title" = "微軟/大千/王安/國喬/零壹/仲鼎"; "6.title" = "微軟/大千/王安/國喬/零壹/仲鼎";
/* Class = "NSMenuItem"; title = "ETen"; ObjectID = "7"; */
"7.title" = "倚天傳統"; "7.title" = "倚天傳統";
/* Class = "NSMenuItem"; title = "Hsu"; ObjectID = "8"; */
"8.title" = "許氏(國音&自然)"; "8.title" = "許氏(國音&自然)";
/* Class = "NSMenuItem"; title = "ETen26"; ObjectID = "9"; */
"9.title" = "倚天二十六鍵"; "9.title" = "倚天二十六鍵";
/* Class = "NSMenuItem"; title = "Hanyu Pinyin with Numeral Intonation"; ObjectID = "10"; */
"10.title" = "漢語拼音+數字標調"; "10.title" = "漢語拼音+數字標調";
/* Class = "NSTextFieldCell"; title = "BPMF Parser:"; ObjectID = "12"; */
"12.title" = "注音排列:"; "12.title" = "注音排列:";
/* Class = "NSTextFieldCell"; title = "Choose the cursor position where you want to list possible candidates."; ObjectID = "14"; */
"14.title" = "用以觸發選字的游標相對位置:"; "14.title" = "用以觸發選字的游標相對位置:";
/* Class = "NSButtonCell"; title = "Cursor in front of the phrase (like macOS built-in Zhuyin IME)"; ObjectID = "16"; */
"16.title" = "游標置於詞語前方 // macOS 內建注音風格"; "16.title" = "游標置於詞語前方 // macOS 內建注音風格";
"17.title" = "游標置於詞語後方 // Windows 微軟新注音風格";
/* Class = "NSButtonCell"; title = "Cursor at anyplace else (like Windows Yahoo KeyKey)"; ObjectID = "17"; */
"17.title" = "游標置於詞語中後方 // Windows 奇摩注音風格";
/* Class = "NSButtonCell"; title = "Radio"; ObjectID = "18"; */
"18.title" = "Radio"; "18.title" = "Radio";
/* Class = "NSButtonCell"; title = "Radio"; ObjectID = "20"; */
"20.title" = "Radio"; "20.title" = "Radio";
/* Class = "NSButtonCell"; title = "Horizontal"; ObjectID = "21"; */
"21.title" = "橫向佈局"; "21.title" = "橫向佈局";
/* Class = "NSButtonCell"; title = "Vertical"; ObjectID = "22"; */
"22.title" = "縱向佈局"; "22.title" = "縱向佈局";
/* Class = "NSButtonCell"; title = "Show page buttons in candidate list"; ObjectID = "shc-Nu-UsM"; */
"shc-Nu-UsM.title" = "在選字窗內顯示翻頁按鈕"; "shc-Nu-UsM.title" = "在選字窗內顯示翻頁按鈕";
/* Class = "NSTextFieldCell"; title = "Candidate List Layout:"; ObjectID = "24"; */
"24.title" = "候選字窗佈局:"; "24.title" = "候選字窗佈局:";
/* Class = "NSTextFieldCell"; title = "Candidate UI font size:"; ObjectID = "29"; */
"29.title" = "字型大小設定:"; "29.title" = "字型大小設定:";
/* Class = "NSMenu"; title = "OtherViews"; ObjectID = "92"; */
"92.title" = "OtherViews"; "92.title" = "OtherViews";
/* Class = "NSMenuItem"; title = "12"; ObjectID = "93"; */
"93.title" = "12"; "93.title" = "12";
/* Class = "NSMenuItem"; title = "14"; ObjectID = "94"; */
"94.title" = "14"; "94.title" = "14";
/* Class = "NSMenuItem"; title = "16"; ObjectID = "95"; */
"95.title" = "16"; "95.title" = "16";
/* Class = "NSMenuItem"; title = "18"; ObjectID = "96"; */
"96.title" = "18"; "96.title" = "18";
/* Class = "NSMenuItem"; title = "24"; ObjectID = "98"; */
"98.title" = "24"; "98.title" = "24";
/* Class = "NSMenuItem"; title = "32"; ObjectID = "99"; */
"99.title" = "32"; "99.title" = "32";
/* Class = "NSMenuItem"; title = "64"; ObjectID = "100"; */
"100.title" = "64"; "100.title" = "64";
/* Class = "NSMenuItem"; title = "96"; ObjectID = "101"; */
"101.title" = "96"; "101.title" = "96";
/* Class = "NSButtonCell"; title = "Enable Space key for calling candidate window"; ObjectID = "110"; */
"110.title" = "敲空格鍵以選字"; "110.title" = "敲空格鍵以選字";
/* Class = "NSTextFieldCell"; title = "Basic Layout:"; ObjectID = "126"; */
"126.title" = "基礎鍵盤佈局:"; "126.title" = "基礎鍵盤佈局:";
/* Class = "NSMenu"; title = "OtherViews"; ObjectID = "128"; */
"128.title" = "OtherViews"; "128.title" = "OtherViews";
/* Class = "NSMenuItem"; title = "IBM"; ObjectID = "137"; */
"137.title" = "IBM"; "137.title" = "IBM";
/* Class = "NSMenuItem"; title = "MiTAC"; ObjectID = "7fV-x8-WHQ"; */
"7fV-x8-WHQ.title" = "神通"; "7fV-x8-WHQ.title" = "神通";
/* Class = "NSMenuItem"; title = "Fake Seigyou"; ObjectID = "27F-8T-FkQ"; */
"27F-8T-FkQ.title" = "偽精業"; "27F-8T-FkQ.title" = "偽精業";
/* Class = "NSTabViewItem"; label = "Keyboard"; ObjectID = "1AW-xf-c2f"; */
"1AW-xf-c2f.label" = "鍵盤"; "1AW-xf-c2f.label" = "鍵盤";
/* Class = "NSBox"; title = "General Settings"; ObjectID = "2Y6-Am-WM1"; */
"2Y6-Am-WM1.title" = "一般設定"; "2Y6-Am-WM1.title" = "一般設定";
/* Class = "NSTextFieldCell"; title = "Choose which keys you prefer for selecting candidates."; ObjectID = "2pS-nv-te4"; */
"2pS-nv-te4.title" = "選擇您所偏好的用來選字的按鍵組合。"; "2pS-nv-te4.title" = "選擇您所偏好的用來選字的按鍵組合。";
/* Class = "NSButtonCell"; title = "Stop farting (when typed phonetic combination is invalid, etc.)"; ObjectID = "62u-jY-BRh"; */
"62u-jY-BRh.title" = "廉恥模式 // 取消勾選的話,敲錯字時會有異音"; "62u-jY-BRh.title" = "廉恥模式 // 取消勾選的話,敲錯字時會有異音";
/* Class = "NSTextFieldCell"; title = "UI language setting:"; ObjectID = "9DS-Rc-TXq"; */
"9DS-Rc-TXq.title" = "介面語言設定:"; "9DS-Rc-TXq.title" = "介面語言設定:";
/* Class = "NSButtonCell"; title = "Emulating select-candidate-per-character mode"; ObjectID = "ArK-Vk-OoT"; */
"ArK-Vk-OoT.title" = "模擬 90 年代前期注音逐字選字輸入風格"; "ArK-Vk-OoT.title" = "模擬 90 年代前期注音逐字選字輸入風格";
/* Class = "NSButtonCell"; title = "Auto-convert traditional Chinese glyphs to KangXi characters"; ObjectID = "BSK-bH-Gct"; */
"BSK-bH-Gct.title" = "自動將繁體中文字轉換為康熙正體字"; "BSK-bH-Gct.title" = "自動將繁體中文字轉換為康熙正體字";
/* Class = "NSButtonCell"; title = "Auto-convert traditional Chinese glyphs to KangXi characters"; ObjectID = "eia-1F-Do0"; */
"eia-1F-Do0.title" = "自動將繁體中文字轉換為日本簡化字JIS 新字體)"; "eia-1F-Do0.title" = "自動將繁體中文字轉換為日本簡化字JIS 新字體)";
/* Class = "NSBox"; title = "Advanced Settings"; ObjectID = "E1l-m8-xgb"; */
"E1l-m8-xgb.title" = "進階設定"; "E1l-m8-xgb.title" = "進階設定";
/* Class = "NSMenuItem"; title = "English"; ObjectID = "FSG-lN-CJO"; */
"FSG-lN-CJO.title" = "英文"; "FSG-lN-CJO.title" = "英文";
/* Class = "NSTextFieldCell"; title = "Selection Keys:"; ObjectID = "FnD-oH-El5"; */
"FnD-oH-El5.title" = "選字鍵:"; "FnD-oH-El5.title" = "選字鍵:";
/* Class = "NSMenuItem"; title = "Auto-Select"; ObjectID = "GlJ-Ns-9eE"; */
"GlJ-Ns-9eE.title" = "自動選擇"; "GlJ-Ns-9eE.title" = "自動選擇";
/* Class = "NSTabViewItem"; label = "General"; ObjectID = "QUQ-oY-4Hc"; */
"QUQ-oY-4Hc.label" = "一般"; "QUQ-oY-4Hc.label" = "一般";
/* Class = "NSTextFieldCell"; title = "Choose your preferred keyboard layout and phonetic parser."; ObjectID = "RQ6-MS-m4C"; */
"RQ6-MS-m4C.title" = "選擇您所偏好的系統鍵盤佈局與注音分析器排列。"; "RQ6-MS-m4C.title" = "選擇您所偏好的系統鍵盤佈局與注音分析器排列。";
/* Class = "NSButtonCell"; title = "Push the cursor in front of the phrase after selection"; ObjectID = "RUG-ls-KyA"; */
"RUG-ls-KyA.title" = "在選字後將游標置於該字詞的前方"; "RUG-ls-KyA.title" = "在選字後將游標置於該字詞的前方";
/* Class = "NSMenuItem"; title = "Traditional Chinese"; ObjectID = "TXr-FF-ehw"; */
"TXr-FF-ehw.title" = "繁體中文"; "TXr-FF-ehw.title" = "繁體中文";
/* Class = "NSBox"; title = "Output Settings"; ObjectID = "Uyz-xL-TVN"; */
"Uyz-xL-TVN.title" = "輸出設定"; "Uyz-xL-TVN.title" = "輸出設定";
/* Class = "NSButtonCell"; title = "Enable CNS11643 Support (2022-04-27)"; ObjectID = "W24-T4-cg0"; */
"W24-T4-cg0.title" = "啟用 CNS11643 全字庫支援 (2022-04-27)"; "W24-T4-cg0.title" = "啟用 CNS11643 全字庫支援 (2022-04-27)";
/* Class = "NSBox"; title = "Keyboard Layout"; ObjectID = "Wvt-HE-LOv"; */
"Wvt-HE-LOv.title" = "鍵盤佈局"; "Wvt-HE-LOv.title" = "鍵盤佈局";
/* Class = "NSButtonCell"; title = "Check for updates automatically"; ObjectID = "Z9t-P0-BLF"; */
"Z9t-P0-BLF.title" = "自動檢查軟體更新"; "Z9t-P0-BLF.title" = "自動檢查軟體更新";
/* Class = "NSTextFieldCell"; title = "Change user interface language (will reboot the IME)."; ObjectID = "ZEv-Q2-mYL"; */
"ZEv-Q2-mYL.title" = "變更使用者介面語言,會自動重新啟動輸入法。"; "ZEv-Q2-mYL.title" = "變更使用者介面語言,會自動重新啟動輸入法。";
/* Class = "NSMenuItem"; title = "Simplified Chinese"; ObjectID = "akC-2g-ybz"; */
"akC-2g-ybz.title" = "簡體中文"; "akC-2g-ybz.title" = "簡體中文";
/* Class = "NSButtonCell"; title = "Use ESC key to clear entire input buffer"; ObjectID = "f2j-xD-4xK"; */
"f2j-xD-4xK.title" = "敲 ESC 鍵以清空整個輸入緩衝區"; "f2j-xD-4xK.title" = "敲 ESC 鍵以清空整個輸入緩衝區";
/* Class = "NSButtonCell"; title = "Automatically reload user data files if changes detected"; ObjectID = "f8i-69-zxm"; */
"f8i-69-zxm.title" = "自動重新載入變更過的使用者數據內容"; "f8i-69-zxm.title" = "自動重新載入變更過的使用者數據內容";
/* Class = "NSTextFieldCell"; title = "Change UI font size of candidate window for a better visual clarity."; ObjectID = "iRg-wx-Nx2"; */
"iRg-wx-Nx2.title" = "變更候選字窗的字型大小。"; "iRg-wx-Nx2.title" = "變更候選字窗的字型大小。";
/* Class = "NSComboBoxCell"; jQC-12-UuK.ibShadowedObjectValues[0] = "Item 1"; ObjectID = "jQC-12-UuK"; */
"jQC-12-UuK.ibShadowedObjectValues[0]" = "Item 1"; "jQC-12-UuK.ibShadowedObjectValues[0]" = "Item 1";
/* Class = "NSComboBoxCell"; jQC-12-UuK.ibShadowedObjectValues[1] = "Item 2"; ObjectID = "jQC-12-UuK"; */
"jQC-12-UuK.ibShadowedObjectValues[1]" = "Item 2"; "jQC-12-UuK.ibShadowedObjectValues[1]" = "Item 2";
/* Class = "NSComboBoxCell"; jQC-12-UuK.ibShadowedObjectValues[2] = "Item 3"; ObjectID = "jQC-12-UuK"; */
"jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3"; "jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3";
/* Class = "NSMenuItem"; title = "Japanese"; ObjectID = "rVQ-Hx-cGi"; */
"rVQ-Hx-cGi.title" = "和語"; "rVQ-Hx-cGi.title" = "和語";
/* Class = "NSBox"; title = "Dictionary and Language Models"; ObjectID = "cf2-se-PDO"; */
"cf2-se-PDO.title" = "辭典&語言模型"; "cf2-se-PDO.title" = "辭典&語言模型";
/* Class = "NSTextFieldCell"; title = "Choose your preferred layout of the candidate window."; ObjectID = "xC5-yV-1W1"; */
"xC5-yV-1W1.title" = "選擇您所偏好的候選字窗佈局。"; "xC5-yV-1W1.title" = "選擇您所偏好的候選字窗佈局。";
/* Class = "NSTabViewItem"; label = "Advanced"; ObjectID = "xrE-8T-WKO"; */
"xrE-8T-WKO.label" = "進階"; "xrE-8T-WKO.label" = "進階";
/* Class = "NSTabViewItem"; label = "Dictionary"; ObjectID = "2iG-Ic-gbl"; */
"2iG-Ic-gbl.label" = "辭典"; "2iG-Ic-gbl.label" = "辭典";
/* Class = "NSTextFieldCell"; title = "Apple Dynamic Bopomofo Basic Keyboard Layouts (Dachen & Eten Traditional) must match the Dachen parser in order to be functional."; ObjectID = "wQ9-px-b07"; */
"wQ9-px-b07.title" = "Apple 動態注音鍵盤佈局(大千與倚天)要求普通話/國音分析器的注音排列得配置為大千排列。"; "wQ9-px-b07.title" = "Apple 動態注音鍵盤佈局(大千與倚天)要求普通話/國音分析器的注音排列得配置為大千排列。";
/* Class = "NSTextFieldCell"; title = "Choose the behavior of (Shift+)Tab key in the candidate window."; ObjectID = "ueU-Rz-a1C"; */
"ueU-Rz-a1C.title" = "指定 (Shift+)Tab 熱鍵在選字窗內的輪替操作對象。"; "ueU-Rz-a1C.title" = "指定 (Shift+)Tab 熱鍵在選字窗內的輪替操作對象。";
/* Class = "NSButtonCell"; title = "Cycling Pages"; ObjectID = "s7u-Fm-dVg"; */
"s7u-Fm-dVg.title" = "輪替頁面"; "s7u-Fm-dVg.title" = "輪替頁面";
/* Class = "NSButtonCell"; title = "Cycling Candidates"; ObjectID = "FVC-br-H57"; */
"FVC-br-H57.title" = "輪替候選字"; "FVC-br-H57.title" = "輪替候選字";
"Pg5-G9-pY5.title" = "指定 (Shift+)Space 熱鍵對候選字詞而言的輪替操作對象。";
/* Class = "NSTextFieldCell"; title = "Choose the behavior of (Shift+)Space key in the candidate window."; ObjectID = "Pg5-G9-pY5"; */
"Pg5-G9-pY5.title" = "指定 (Shift+)Space 熱鍵在選字窗內的輪替操作對象。";
/* Class = "NSButtonCell"; title = "Space to +cycle pages, Shift+Space to +cycle candidates"; ObjectID = "XqL-rf-X6d"; */
"XqL-rf-X6d.title" = "Space 換下一頁Shift+Space 換選下一個候選字"; "XqL-rf-X6d.title" = "Space 換下一頁Shift+Space 換選下一個候選字";
/* Class = "NSButtonCell"; title = "Space to +cycle candidates, Shift+Space to +cycle pages"; ObjectID = "dIN-TZ-67g"; */
"dIN-TZ-67g.title" = "Shift+Space 換下一頁Space 換選下一個候選字"; "dIN-TZ-67g.title" = "Shift+Space 換下一頁Space 換選下一個候選字";
/* Class = "NSButtonCell"; title = "Enable symbol input support (incl. certain emoji symbols)"; ObjectID = "hSv-LJ-Cq3"; */
"hSv-LJ-Cq3.title" = "啟用包括少許繪文字在內的符號輸入支援"; "hSv-LJ-Cq3.title" = "啟用包括少許繪文字在內的符號輸入支援";
/* Class = "NSTextFieldCell"; title = "Choose your desired user data folder path. Will be omitted if invalid."; ObjectID = "wN3-k3-b2a"; */
"wN3-k3-b2a.title" = "請在此指定您想指定的使用者語彙檔案目錄。無效值會被忽略。"; "wN3-k3-b2a.title" = "請在此指定您想指定的使用者語彙檔案目錄。無效值會被忽略。";
/* Class = "NSButtonCell"; title = "Show Hanyu-Pinyin in the inline composition buffer"; ObjectID = "wFR-zX-M8H"; */
"wFR-zX-M8H.title" = "拼音並擊模式(組字區內看到的是漢語拼音)"; "wFR-zX-M8H.title" = "拼音並擊模式(組字區內看到的是漢語拼音)";
/* Class = "NSButtonCell"; title = "Output Hanyu-Pinyin in lieu of Zhuyin when Ctrl(+Alt)+CMD+Enter"; ObjectID = "iWy-Nw-QKB"; */
"iWy-Nw-QKB.title" = "Ctrl(+Alt)+CMD+Enter 輸出漢語拼音而非注音"; "iWy-Nw-QKB.title" = "Ctrl(+Alt)+CMD+Enter 輸出漢語拼音而非注音";
/* Class = "NSMenuItem"; title = "Dachen 26 (libChewing)"; ObjectID = "xjP-r7-GaK"; */
"xjP-r7-GaK.title" = "酷音大千二十六鍵"; "xjP-r7-GaK.title" = "酷音大千二十六鍵";
/* Class = "NSMenuItem"; title = "Secondary Pinyin with Numeral Intonation"; ObjectID = "Parser11"; */
"Parser11.title" = "國音二式+數字標調"; "Parser11.title" = "國音二式+數字標調";
/* Class = "NSMenuItem"; title = "Yale Pinyin with Numeral Intonation"; ObjectID = "Parser12"; */
"Parser12.title" = "耶魯拼音+數字標調"; "Parser12.title" = "耶魯拼音+數字標調";
/* Class = "NSMenuItem"; title = "Hualuo Pinyin with Numeral Intonation"; ObjectID = "Parser13"; */
"Parser13.title" = "華羅拼音+數字標調"; "Parser13.title" = "華羅拼音+數字標調";
/* Class = "NSMenuItem"; title = "Universal Pinyin with Numeral Intonation"; ObjectID = "Parser14"; */
"Parser14.title" = "通用拼音+數字標調"; "Parser14.title" = "通用拼音+數字標調";
"xibKeyboardShortcuts.title" = "鍵盤快速鍵";
/* Class = "NSButtonCell"; title = "Balance the score according to candidate length"; ObjectID = "Wh1-iz-pwM"; */ "xibUsingHotKeySCPC.title" = "模擬逐字選字輸入";
"Wh1-iz-pwM.title" = "按候選字詞的長度調整權重"; "xibUsingHotKeyAssociates.title" = "逐字選字聯想模式";
"xibUsingHotKeyCNS.title" = "全字庫模式";
"xibUsingHotKeyKangXi.title" = "康熙正體字模式";
"xibUsingHotKeyJIS.title" = "JIS 新字體模式";
"xibUsingHotKeyHalfWidthASCII.title" = "半形標點模式";
"xibLabelBufferLimit.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.2</string> <string>1.6.3</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>1962</string> <string>1963</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.2</string> <string>1.6.3</string>
</dict> </dict>
<key>TYPE</key> <key>TYPE</key>
<integer>0</integer> <integer>0</integer>

View File

@ -1296,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 = 1962; CURRENT_PROJECT_VERSION = 1963;
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;
@ -1319,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.2; MARKETING_VERSION = 1.6.3;
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;
@ -1352,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 = 1962; CURRENT_PROJECT_VERSION = 1963;
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;
@ -1371,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.2; MARKETING_VERSION = 1.6.3;
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;
@ -1486,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 = 1962; CURRENT_PROJECT_VERSION = 1963;
DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_ASSET_PATHS = "";
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = "";
GCC_C_LANGUAGE_STANDARD = gnu99; GCC_C_LANGUAGE_STANDARD = gnu99;
@ -1521,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.2; MARKETING_VERSION = 1.6.3;
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)";
@ -1553,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 = 1962; CURRENT_PROJECT_VERSION = 1963;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_ASSET_PATHS = "";
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = "";
@ -1583,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.2; MARKETING_VERSION = 1.6.3;
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 = "";
@ -1666,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 = 1962; CURRENT_PROJECT_VERSION = 1963;
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = "";
GCC_C_LANGUAGE_STANDARD = gnu99; GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO; GCC_DYNAMIC_NO_PIC = NO;
@ -1691,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.2; MARKETING_VERSION = 1.6.3;
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)";
@ -1718,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 = 1962; CURRENT_PROJECT_VERSION = 1963;
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;
@ -1738,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.2; MARKETING_VERSION = 1.6.3;
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 = "";