Pre Merge pull request !91 from ShikiSuen/upd/2.0.0

This commit is contained in:
ShikiSuen 2022-08-20 10:24:57 +00:00 committed by Gitee
commit 17c3edd64d
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
47 changed files with 1189 additions and 844 deletions

View File

@ -25,7 +25,7 @@
為了不讓參與者們浪費各自的熱情,特設此文以說明該專案目前最需要協助的地方。 為了不讓參與者們浪費各自的熱情,特設此文以說明該專案目前最需要協助的地方。
1. 將選字窗換成 IMK 內建的矩陣選字窗。 (暫無)
除了上述各項以外的貢獻,除非特邀、或者有足夠的說服理由與吸引力(比如語法錯誤或更好的重構方法等),否則敝專案可能會無視或者拒絕。 除了上述各項以外的貢獻,除非特邀、或者有足夠的說服理由與吸引力(比如語法錯誤或更好的重構方法等),否則敝專案可能會無視或者拒絕。

Binary file not shown.

Before

Width:  |  Height:  |  Size: 430 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

After

Width:  |  Height:  |  Size: 76 KiB

View File

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="19529" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES"> <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21223" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies> <dependencies>
<deployment identifier="macosx"/> <deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="19529"/> <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21223"/>
<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>
<objects> <objects>
@ -125,7 +125,10 @@
</constraints> </constraints>
<buttonCell key="cell" type="push" title="I Accept" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="576"> <buttonCell key="cell" type="push" title="I Accept" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="576">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/> <font key="font" size="13" name="Tahoma-Bold"/>
<string key="keyEquivalent" base64-UTF8="YES">
DQ
</string>
</buttonCell> </buttonCell>
<connections> <connections>
<action selector="agreeAndInstallAction:" target="494" id="708"/> <action selector="agreeAndInstallAction:" target="494" id="708"/>
@ -167,17 +170,17 @@
</scroller> </scroller>
</scrollView> </scrollView>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ir5-sQ-sJc"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ir5-sQ-sJc">
<rect key="frame" x="89" y="442" width="123" height="15"/> <rect key="frame" x="89" y="442" width="130" height="15"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="vChewing for macOS" id="GNc-8S-1VG" userLabel="appNameLabel"> <textFieldCell key="cell" lineBreakMode="clipping" title="vChewing for macOS" id="GNc-8S-1VG" userLabel="appNameLabel">
<font key="font" metaFont="cellTitle"/> <font key="font" size="12" name="Tahoma-Bold"/>
<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>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="bzR-Oa-BZa"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="bzR-Oa-BZa">
<rect key="frame" x="89" y="426" width="281" height="15"/> <rect key="frame" x="89" y="426" width="263" height="15"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Derived from OpenVanilla McBopopmofo Project." id="QYf-Nf-hoi"> <textFieldCell key="cell" lineBreakMode="clipping" title="Derived from OpenVanilla McBopopmofo Project." id="QYf-Nf-hoi">
<font key="font" metaFont="cellTitle"/> <font key="font" size="12" name="Tahoma"/>
<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>
@ -188,7 +191,7 @@
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="293" id="v2b-OK-WGD"/> <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="293" id="v2b-OK-WGD"/>
</constraints> </constraints>
<textFieldCell key="cell" lineBreakMode="clipping" title="Placeholder for showing copyright information." id="eo3-TK-0rB" userLabel="appCopyrightLabel"> <textFieldCell key="cell" lineBreakMode="clipping" title="Placeholder for showing copyright information." id="eo3-TK-0rB" userLabel="appCopyrightLabel">
<font key="font" metaFont="cellTitle"/> <font key="font" size="12" name="Tahoma"/>
<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>
@ -196,7 +199,7 @@
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="XLb-mv-73s"> <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="XLb-mv-73s">
<rect key="frame" x="89" y="387" width="431" height="15"/> <rect key="frame" x="89" y="387" width="431" height="15"/>
<textFieldCell key="cell" selectable="YES" title="Placeholder for detailed credits." id="VW8-s5-Wpn"> <textFieldCell key="cell" selectable="YES" title="Placeholder for detailed credits." id="VW8-s5-Wpn">
<font key="font" metaFont="cellTitle"/> <font key="font" size="12" name="Tahoma"/>
<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>
@ -207,18 +210,18 @@
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="k5O-zZ-gQY"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="k5O-zZ-gQY">
<rect key="frame" x="89" y="364" width="431" height="15"/> <rect key="frame" x="89" y="364" width="431" height="15"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="MIT-NTL License:" id="AVS-ih-FXM"> <textFieldCell key="cell" lineBreakMode="clipping" title="MIT-NTL License:" id="AVS-ih-FXM">
<font key="font" metaFont="cellTitle"/> <font key="font" size="12" name="Tahoma"/>
<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>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="miu-08-dZk"> <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="miu-08-dZk">
<rect key="frame" x="13" y="26" width="360" height="105"/> <rect key="frame" x="13" y="41" width="360" height="90"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="356" id="pu3-zr-hJy"/> <constraint firstAttribute="width" constant="356" id="pu3-zr-hJy"/>
</constraints> </constraints>
<textFieldCell key="cell" selectable="YES" id="Q9M-ni-kUM"> <textFieldCell key="cell" selectable="YES" id="Q9M-ni-kUM">
<font key="font" metaFont="cellTitle"/> <font key="font" size="12" name="Tahoma"/>
<string key="title">DISCLAIMER: The vChewing project, having no relationship of cooperation or affiliation with the OpenVanilla project, is not responsible for the phrase database shipped in the original McBopomofo project. Certain geopolitical and ideological contents, which are potentially harmful to the global spread of this software, are not included in vChewing official phrase database.</string> <string key="title">DISCLAIMER: The vChewing project, having no relationship of cooperation or affiliation with the OpenVanilla project, is not responsible for the phrase database shipped in the original McBopomofo project. Certain geopolitical and ideological contents, which are potentially harmful to the global spread of this software, are not included in vChewing official phrase database.</string>
<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"/>
@ -232,12 +235,12 @@
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" animates="YES" imageScaling="proportionallyDown" image="AboutBanner" id="akk-zO-Abm"/> <imageCell key="cell" refusesFirstResponder="YES" alignment="left" animates="YES" imageScaling="proportionallyDown" image="AboutBanner" id="akk-zO-Abm"/>
</imageView> </imageView>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="z1m-8k-Z63"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="z1m-8k-Z63">
<rect key="frame" x="211" y="442" width="126" height="15"/> <rect key="frame" x="218" y="442" width="126" height="15"/>
<constraints> <constraints>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="122" id="yKq-Fv-W1J"/> <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="122" id="yKq-Fv-W1J"/>
</constraints> </constraints>
<textFieldCell key="cell" lineBreakMode="clipping" title="version_placeholder" id="JRP-At-H9q" userLabel="appVersionLabel"> <textFieldCell key="cell" lineBreakMode="clipping" title="version_placeholder" id="JRP-At-H9q" userLabel="appVersionLabel">
<font key="font" metaFont="cellTitle"/> <font key="font" size="12" name="Tahoma"/>
<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>
@ -245,7 +248,7 @@
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="nul-TQ-gOI"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="nul-TQ-gOI">
<rect key="frame" x="89" y="148" width="431" height="15"/> <rect key="frame" x="89" y="148" width="431" height="15"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="By installing the software, you must accept the terms above." id="mf8-6e-z7X"> <textFieldCell key="cell" lineBreakMode="clipping" title="By installing the software, you must accept the terms above." id="mf8-6e-z7X">
<font key="font" metaFont="systemBold" size="12"/> <font key="font" size="12" name="Tahoma-Bold"/>
<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>
@ -254,7 +257,7 @@
<rect key="frame" x="378" y="74" width="147" height="32"/> <rect key="frame" x="378" y="74" width="147" height="32"/>
<buttonCell key="cell" type="push" title="Cancel" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="593"> <buttonCell key="cell" type="push" title="Cancel" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="593">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/> <font key="font" size="13" name="Tahoma"/>
<string key="keyEquivalent" base64-UTF8="YES"> <string key="keyEquivalent" base64-UTF8="YES">
Gw Gw
</string> </string>
@ -338,7 +341,7 @@ Gw
<constraint firstAttribute="height" constant="17" id="MLj-KG-mL8"/> <constraint firstAttribute="height" constant="17" id="MLj-KG-mL8"/>
</constraints> </constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="Stopping the old version. This may take up to one minute…" id="nTo-dx-qfZ"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="Stopping the old version. This may take up to one minute…" id="nTo-dx-qfZ">
<font key="font" metaFont="system"/> <font key="font" size="13" name="Tahoma"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell> </textFieldCell>

View File

@ -57,7 +57,7 @@
"QYf-Nf-hoi.title" = "該專案由 OpenVanilla 小麥注音專案衍生而來。"; "QYf-Nf-hoi.title" = "該專案由 OpenVanilla 小麥注音專案衍生而來。";
/* Class = "NSTextFieldCell"; title = "vChewing macOS Development: Shiki Suen, Isaac Xen, Hiraku Wang, etc.\nvChewing Phrase Database Maintained by Shiki Suen."; ObjectID = "VW8-s5-Wpn"; */ /* Class = "NSTextFieldCell"; title = "vChewing macOS Development: Shiki Suen, Isaac Xen, Hiraku Wang, etc.\nvChewing Phrase Database Maintained by Shiki Suen."; ObjectID = "VW8-s5-Wpn"; */
"VW8-s5-Wpn.title" = "威注音 macOS 程式研Shiki Suen, Isaac Xen, Hiraku Wang, 等。\n威注音词库维护Shiki Suen。"; "VW8-s5-Wpn.title" = "威注音 macOS 程式研Shiki Suen, Isaac Xen, Hiraku Wang, 等。\n威注音詞庫維護Shiki Suen。";
/* Class = "NSTextFieldCell"; title = "Placeholder for showing copyright information."; ObjectID = "eo3-TK-0rB"; */ /* Class = "NSTextFieldCell"; title = "Placeholder for showing copyright information."; ObjectID = "eo3-TK-0rB"; */
// "eo3-TK-0rB.title" = "Placeholder for showing copyright information."; // "eo3-TK-0rB.title" = "Placeholder for showing copyright information.";

@ -1 +1 @@
Subproject commit e43d8432ef24dc1a01511c0d891717a6406aafe7 Subproject commit 8378080fb4d7c0593ed9054132d9ece589bace81

View File

@ -322,7 +322,7 @@ public enum InputState {
ctlInputMethod.tooltipController.setColor(state: .prompt) ctlInputMethod.tooltipController.setColor(state: .prompt)
return String( return String(
format: NSLocalizedString( format: NSLocalizedString(
"\"%@\" already exists: ENTER to boost, SHIFT+CMD+ENTER to nerf, \n BackSpace or Delete key to exclude.", "\"%@\" already exists: ENTER to boost, SHIFT+COMMAND+ENTER to nerf, \n BackSpace or Delete key to exclude.",
comment: "" comment: ""
) + "\n// " + literalReadingThread, text ) + "\n// " + literalReadingThread, text
) )
@ -437,6 +437,17 @@ public enum InputState {
override public var type: StateType { .ofChoosingCandidate } override public var type: StateType { .ofChoosingCandidate }
private(set) var candidates: [(String, String)] private(set) var candidates: [(String, String)]
private(set) var isTypingVertical: Bool private(set) var isTypingVertical: Bool
// ctlInputMethod.candidateSelectionChanged()
public var chosenCandidateString: String = "" {
didSet {
// / JIS
if chosenCandidateString.contains("\u{17}") {
chosenCandidateString = String(chosenCandidateString.split(separator: "\u{17}")[0])
}
if !chosenCandidateString.contains("\u{1A}") { return }
chosenCandidateString = String(chosenCandidateString.split(separator: "\u{1A}").reversed()[0])
}
}
init( init(
composingBuffer: String, cursorIndex: Int, candidates: [(String, String)], isTypingVertical: Bool, composingBuffer: String, cursorIndex: Int, candidates: [(String, String)], isTypingVertical: Bool,
@ -447,6 +458,70 @@ public enum InputState {
super.init(composingBuffer: composingBuffer, cursorIndex: cursorIndex, nodeValuesArray: nodeValuesArray) super.init(composingBuffer: composingBuffer, cursorIndex: cursorIndex, nodeValuesArray: nodeValuesArray)
} }
// 使 chosenCandidateString
// macOS
// ctlInputMethod.candidateSelectionChanged()
//
override var attributedString: NSMutableAttributedString {
guard !chosenCandidateString.isEmpty else { return super.attributedString }
let bufferTextRear = composingBuffer.utf16SubString(with: 0..<cursorIndex)
let bufferTextFront = composingBuffer.utf16SubString(with: cursorIndex..<(composingBuffer.utf16.count))
let cursorIndexU8 = bufferTextRear.count - 1
//
if (mgrPrefs.useRearCursorMode && bufferTextFront.count < chosenCandidateString.count)
|| (!mgrPrefs.useRearCursorMode && bufferTextRear.count < chosenCandidateString.count)
{
return super.attributedString
}
// u16Range NSAttributedString NSRange
let u16Range: Range<Int> = {
switch mgrPrefs.useRearCursorMode {
case false: return (max(0, cursorIndex - chosenCandidateString.utf16.count))..<cursorIndex
case true:
return
cursorIndex..<min(cursorIndex + chosenCandidateString.utf16.count, composingBuffer.utf16.count - 1)
}
}()
// u8Range
let u8Range: Range<Int> = {
switch mgrPrefs.useRearCursorMode {
case false: return (max(0, cursorIndexU8 - chosenCandidateString.count))..<cursorIndexU8
case true:
return cursorIndexU8..<min(cursorIndexU8 + chosenCandidateString.count, composingBuffer.count - 1)
}
}()
let strSegmentedRear = composingBuffer.map { String($0) }[0..<u8Range.lowerBound].joined()
let strSegmentedFront = composingBuffer.map { String($0) }[u8Range.upperBound...].joined()
let newBufferConverted: String = NotEmpty(
composingBuffer: strSegmentedRear + chosenCandidateString + strSegmentedFront, cursorIndex: 0
).composingBufferConverted
guard newBufferConverted.count == composingBuffer.count else { return super.attributedString }
///
/// JIS
let attributedStringResult = NSMutableAttributedString(string: newBufferConverted)
attributedStringResult.setAttributes(
[
.underlineStyle: NSUnderlineStyle.single.rawValue,
.markedClauseSegment: 0,
], range: NSRange(location: 0, length: u16Range.lowerBound)
)
attributedStringResult.setAttributes(
[
.underlineStyle: NSUnderlineStyle.thick.rawValue,
.markedClauseSegment: 1,
], range: NSRange(location: u16Range.lowerBound, length: u16Range.count)
)
attributedStringResult.setAttributes(
[
.underlineStyle: NSUnderlineStyle.single.rawValue,
.markedClauseSegment: 2,
], range: NSRange(location: u16Range.upperBound, length: newBufferConverted.utf16.count)
)
return attributedStringResult
}
override var description: String { override var description: String {
"<InputState.ChoosingCandidate, candidates:\(candidates), isTypingVertical:\(isTypingVertical), composingBuffer:\(composingBuffer), cursorIndex:\(cursorIndex)>" "<InputState.ChoosingCandidate, candidates:\(candidates), isTypingVertical:\(isTypingVertical), composingBuffer:\(composingBuffer), cursorIndex:\(cursorIndex)>"
} }

View File

@ -169,7 +169,7 @@ extension KeyHandler {
stateCallback(inputting) stateCallback(inputting)
} }
return true return true
} else if input.isShiftHold { // Tab Shift+CMD+Space / } else if input.isShiftHold { // Tab Shift+Command+Space /
return handleInlineCandidateRotation( return handleInlineCandidateRotation(
state: state, reverseModifier: input.isCommandHold, stateCallback: stateCallback, state: state, reverseModifier: input.isCommandHold, stateCallback: stateCallback,
errorCallback: errorCallback errorCallback: errorCallback
@ -278,7 +278,7 @@ extension KeyHandler {
// MARK: Punctuation list // MARK: Punctuation list
if input.isSymbolMenuPhysicalKey && !input.isShiftHold { if input.isSymbolMenuPhysicalKey, !input.isShiftHold, !input.isControlHold {
if input.isOptionHold { if input.isOptionHold {
if currentLM.hasUnigramsFor(key: "_punctuation_list") { if currentLM.hasUnigramsFor(key: "_punctuation_list") {
if composer.isEmpty { if composer.isEmpty {

View File

@ -328,9 +328,9 @@ extension KeyHandler {
return true return true
} }
// MARK: - CMD+Enter // MARK: - Command+Enter
/// CMD+Enter /// Command+Enter
/// - Parameters: /// - Parameters:
/// - state: /// - state:
/// - stateCallback: /// - stateCallback:
@ -356,9 +356,9 @@ extension KeyHandler {
return true return true
} }
// MARK: - CMD+Alt+Enter Ruby // MARK: - Command+Option+Enter Ruby
/// CMD+Alt+Enter Ruby /// Command+Option+Enter Ruby
/// - Parameters: /// - Parameters:
/// - state: /// - state:
/// - stateCallback: /// - stateCallback:
@ -825,7 +825,7 @@ extension KeyHandler {
/// ///
/// 使 /// 使
/// (Shift+)Tab () /// (Shift+)Tab ()
/// Shift(+CMD)+Space Alt+/ Alt+/ /// Shift(+Command)+Space Alt+/ Alt+/
/// Tab /// Tab
if candidates[0] == currentPaired { if candidates[0] == currentPaired {
/// ///

View File

@ -211,6 +211,50 @@ class ctlInputMethod: IMKInputController {
// - super.interpretKeyEvents() // - super.interpretKeyEvents()
// - delegate ctlInputMethod KeyHandler // - delegate ctlInputMethod KeyHandler
if let ctlCandidateCurrent = ctlInputMethod.ctlCandidateCurrent as? ctlCandidateIMK, ctlCandidateCurrent.visible { if let ctlCandidateCurrent = ctlInputMethod.ctlCandidateCurrent as? ctlCandidateIMK, ctlCandidateCurrent.visible {
let event: NSEvent! = ctlCandidateIMK.replaceNumPadKeyCodes(target: event) ?? event
let input = InputSignal(event: event)
// Shift+Enter delegate keyHandler
// Shift Flags
if input.isShiftHold, input.isEnter {
guard
let newEvent = NSEvent.keyEvent(
with: event.type,
location: event.locationInWindow,
modifierFlags: [],
timestamp: event.timestamp,
windowNumber: event.windowNumber,
context: nil,
characters: event.characters ?? "",
charactersIgnoringModifiers: event.charactersIgnoringModifiers ?? event.characters ?? "",
isARepeat: event.isARepeat,
keyCode: event.keyCode
)
else {
NSSound.beep()
return true
}
ctlCandidateCurrent.interpretKeyEvents([newEvent])
return true
}
if let newChar = ctlCandidateIMK.defaultIMKSelectionKey[event.keyCode], input.isShiftHold,
isAssociatedPhrasesState
{
let newEvent = NSEvent.keyEvent(
with: event.type,
location: event.locationInWindow,
modifierFlags: [],
timestamp: event.timestamp,
windowNumber: event.windowNumber,
context: nil,
characters: newChar,
charactersIgnoringModifiers: event.charactersIgnoringModifiers ?? event.characters ?? "",
isARepeat: event.isARepeat,
keyCode: event.keyCode
)
ctlCandidateCurrent.perform(Selector(("handleKeyboardEvent:")), with: newEvent)
}
ctlCandidateCurrent.interpretKeyEvents([event]) ctlCandidateCurrent.interpretKeyEvents([event])
return true return true
} }
@ -238,31 +282,43 @@ class ctlInputMethod: IMKInputController {
_ = sender // _ = sender //
var arrResult = [String]() var arrResult = [String]()
func handleCandidatesPrepared(_ candidates: [(String, String)]) { // 便 InputState
func handleCandidatesPrepared(_ candidates: [(String, String)], prefix: String = "") {
for theCandidate in candidates { for theCandidate in candidates {
let theConverted = IME.kanjiConversionIfRequired(theCandidate.1) let theConverted = IME.kanjiConversionIfRequired(theCandidate.1)
var result = (theCandidate.1 == theConverted) ? theCandidate.1 : "\(theConverted)(\(theCandidate.1))" var result = (theCandidate.1 == theConverted) ? theCandidate.1 : "\(theConverted)\u{1A}(\(theCandidate.1))"
if arrResult.contains(result) { if arrResult.contains(result) {
result = "\(result)(\(theCandidate.0))" let reading: String =
mgrPrefs.showHanyuPinyinInCompositionBuffer
? Tekkon.cnvPhonaToHanyuPinyin(target: Tekkon.restoreToneOneInZhuyinKey(target: theCandidate.0))
: theCandidate.0
result = "\(result)\u{17}(\(reading))"
} }
arrResult.append(result) arrResult.append(prefix + result)
} }
} }
if let state = state as? InputState.AssociatedPhrases { if let state = state as? InputState.AssociatedPhrases {
handleCandidatesPrepared(state.candidates) handleCandidatesPrepared(state.candidates, prefix: "")
} else if let state = state as? InputState.SymbolTable { } else if let state = state as? InputState.SymbolTable {
handleCandidatesPrepared(state.candidates) handleCandidatesPrepared(state.candidates)
} else if let state = state as? InputState.ChoosingCandidate { } else if let state = state as? InputState.ChoosingCandidate {
handleCandidatesPrepared(state.candidates) handleCandidatesPrepared(state.candidates)
} }
return arrResult return arrResult
} }
/// IMK /// IMK
/// - Parameter _: /// - Parameter _:
override open func candidateSelectionChanged(_: NSAttributedString!) { override open func candidateSelectionChanged(_: NSAttributedString!) {
// //
// IMKServer.commitCompositionWithReply() commitComposition()
// keyHandler
//
//
// ctlCandidateIMK identifier // ctlCandidateIMK identifier
// NSNotFound NSLog identifier // NSNotFound NSLog identifier
// console ips // console ips
@ -283,16 +339,20 @@ class ctlInputMethod: IMKInputController {
var indexDeducted = 0 var indexDeducted = 0
func handleCandidatesSelected(_ candidates: [(String, String)]) { // 便 InputState
func handleCandidatesSelected(_ candidates: [(String, String)], prefix: String = "") {
for (i, neta) in candidates.enumerated() { for (i, neta) in candidates.enumerated() {
let theConverted = IME.kanjiConversionIfRequired(neta.1) let theConverted = IME.kanjiConversionIfRequired(neta.1)
let netaShown = (neta.1 == theConverted) ? neta.1 : "\(theConverted)(\(neta.1))" let netaShown = (neta.1 == theConverted) ? neta.1 : "\(theConverted)\u{1A}(\(neta.1))"
let netaShownWithPronunciation = "\(theConverted)(\(neta.0))" let reading: String =
if candidateString.string == netaShownWithPronunciation { mgrPrefs.showHanyuPinyinInCompositionBuffer
? Tekkon.cnvPhonaToHanyuPinyin(target: Tekkon.restoreToneOneInZhuyinKey(target: neta.0)) : neta.0
let netaShownWithPronunciation = "\(netaShown)\u{17}(\(reading))"
if candidateString.string == prefix + netaShownWithPronunciation {
indexDeducted = i indexDeducted = i
break break
} }
if candidateString.string == netaShown { if candidateString.string == prefix + netaShown {
indexDeducted = i indexDeducted = i
break break
} }
@ -300,7 +360,7 @@ class ctlInputMethod: IMKInputController {
} }
if let state = state as? InputState.AssociatedPhrases { if let state = state as? InputState.AssociatedPhrases {
handleCandidatesSelected(state.candidates) handleCandidatesSelected(state.candidates, prefix: "")
} else if let state = state as? InputState.SymbolTable { } else if let state = state as? InputState.SymbolTable {
handleCandidatesSelected(state.candidates) handleCandidatesSelected(state.candidates)
} else if let state = state as? InputState.ChoosingCandidate { } else if let state = state as? InputState.ChoosingCandidate {

View File

@ -13,7 +13,10 @@ import Cocoa
// MARK: - KeyHandler Delegate // MARK: - KeyHandler Delegate
extension ctlInputMethod: KeyHandlerDelegate { extension ctlInputMethod: KeyHandlerDelegate {
var clientBundleIdentifier: String { client()?.bundleIdentifier() ?? "" } var clientBundleIdentifier: String {
guard let client = client() else { return "" }
return client.bundleIdentifier() ?? ""
}
func ctlCandidate() -> ctlCandidateProtocol { ctlInputMethod.ctlCandidateCurrent } func ctlCandidate() -> ctlCandidateProtocol { ctlInputMethod.ctlCandidateCurrent }
@ -52,7 +55,7 @@ extension ctlInputMethod: KeyHandlerDelegate {
// MARK: - Candidate Controller Delegate // MARK: - Candidate Controller Delegate
extension ctlInputMethod: ctlCandidateDelegate { extension ctlInputMethod: ctlCandidateDelegate {
var isAssociatedPhrasesMode: Bool { state is InputState.AssociatedPhrases } var isAssociatedPhrasesState: Bool { state is InputState.AssociatedPhrases }
/// handle() IMK /// handle() IMK
/// handle() /// handle()

View File

@ -88,42 +88,6 @@ extension ctlInputMethod {
return NSFont.systemFont(ofSize: size) return NSFont.systemFont(ofSize: size)
} }
/// FB10978412: Since macOS 11 Big Sur, CTFontCreateUIFontForLanguage cannot
/// distinguish zh-Hans and zh-Hant with correct adoptation of proper PingFang SC/TC variants.
///
/// Instructions for Apple Developer relations to reveal this bug:
///
/// 1) Remove the usage of ".languageIdentifier" from ctlCandidateUniversal.swift (already done).
/// 2) Run "make update" in the project folder to download the latest git-submodule of dictionary file.
/// 3) Compile the target "vChewingInstaller", run it. It will install the input method into
/// "~/Library/Input Methods/" folder. Remember to ENABLE BOTH "vChewing-CHS"
/// and "vChewing-CHT" input sources in System Preferences / Settings.
/// 4) Type Zhuyin "ej3" (ˇ) (or "gu3" in Pinyin if you enabled Pinyin typing in vChewing preferences.)
/// using both "vChewing-CHS" and "vChewing-CHT", and check the candidate window by pressing SPACE key.
/// 5) Do NOT enable either KangXi conversion mode nor JIS conversion mode. They are disabled by default.
/// 6) Expecting the glyph differences of the candidate "" between PingFang SC and PingFang TC when rendering
/// the candidate window in different "vChewing-CHS" and "vChewing-CHT" input modes.
func candidateFont(name: String?, size: CGFloat) -> NSFont {
let finalReturnFont: NSFont =
{
switch IME.currentInputMode {
case InputMode.imeModeCHS:
return CTFontCreateUIFontForLanguage(.system, size, "zh-Hans" as CFString)
case InputMode.imeModeCHT:
return (mgrPrefs.shiftJISShinjitaiOutputEnabled || mgrPrefs.chineseConversionEnabled)
? CTFontCreateUIFontForLanguage(.system, size, "ja" as CFString)
: CTFontCreateUIFontForLanguage(.system, size, "zh-Hant" as CFString)
default:
return CTFontCreateUIFontForLanguage(.system, size, nil)
}
}()
?? NSFont.systemFont(ofSize: size)
if let name = name {
return NSFont(name: name, size: size) ?? finalReturnFont
}
return finalReturnFont
}
ctlInputMethod.ctlCandidateCurrent.keyLabelFont = labelFont( ctlInputMethod.ctlCandidateCurrent.keyLabelFont = labelFont(
name: mgrPrefs.candidateKeyLabelFontName, size: keyLabelSize name: mgrPrefs.candidateKeyLabelFontName, size: keyLabelSize
) )
@ -142,6 +106,13 @@ extension ctlInputMethod {
ctlInputMethod.ctlCandidateCurrent.delegate = self ctlInputMethod.ctlCandidateCurrent.delegate = self
ctlInputMethod.ctlCandidateCurrent.reloadData() ctlInputMethod.ctlCandidateCurrent.reloadData()
// Spotlight IMK
if let ctlCandidateCurrent = ctlInputMethod.ctlCandidateCurrent as? ctlCandidateIMK,
mgrPrefs.adjustIMKCandidateWindowLevel
{
ctlCandidateCurrent.perform(Selector(("setWindowLevel:")), with: client.windowLevel() + 1000)
}
ctlInputMethod.ctlCandidateCurrent.visible = true ctlInputMethod.ctlCandidateCurrent.visible = true
var lineHeightRect = NSRect(x: 0.0, y: 0.0, width: 16.0, height: 16.0) var lineHeightRect = NSRect(x: 0.0, y: 0.0, width: 16.0, height: 16.0)
@ -175,4 +146,44 @@ extension ctlInputMethod {
) )
} }
} }
/// FB10978412: Since macOS 11 Big Sur, CTFontCreateUIFontForLanguage cannot
/// distinguish zh-Hans and zh-Hant with correct adoptation of proper PingFang SC/TC variants.
///
/// Instructions for Apple Developer relations to reveal this bug:
///
/// 0) Disable IMK Candidate window in the vChewing preferences (disabled by default).
/// **REASON**: IMKCandidates has bug that it does not respect font attributes attached to the
/// results generated from `candidiates() -> [Any]!` function. IMKCandidates is plagued with
/// bugs which are not dealt in the recent decade, regardless Radar complaints from input method developers.
/// 1) Remove the usage of ".languageIdentifier" from ctlCandidateUniversal.swift (already done).
/// 2) Run "make update" in the project folder to download the latest git-submodule of dictionary file.
/// 3) Compile the target "vChewingInstaller", run it. It will install the input method into
/// "~/Library/Input Methods/" folder. Remember to ENABLE BOTH "vChewing-CHS"
/// and "vChewing-CHT" input sources in System Preferences / Settings.
/// 4) Type Zhuyin "ej3" (ˇ) (or "gu3" in Pinyin if you enabled Pinyin typing in vChewing preferences.)
/// using both "vChewing-CHS" and "vChewing-CHT", and check the candidate window by pressing SPACE key.
/// 5) Do NOT enable either KangXi conversion mode nor JIS conversion mode. They are disabled by default.
/// 6) Expecting the glyph differences of the candidate "" between PingFang SC and PingFang TC when rendering
/// the candidate window in different "vChewing-CHS" and "vChewing-CHT" input modes.
func candidateFont(name: String?, size: CGFloat) -> NSFont {
let finalReturnFont: NSFont =
{
switch IME.currentInputMode {
case InputMode.imeModeCHS:
return CTFontCreateUIFontForLanguage(.system, size, "zh-Hans" as CFString)
case InputMode.imeModeCHT:
return (mgrPrefs.shiftJISShinjitaiOutputEnabled || mgrPrefs.chineseConversionEnabled)
? CTFontCreateUIFontForLanguage(.system, size, "ja" as CFString)
: CTFontCreateUIFontForLanguage(.system, size, "zh-Hant" as CFString)
default:
return CTFontCreateUIFontForLanguage(.system, size, nil)
}
}()
?? NSFont.systemFont(ofSize: size)
if let name = name {
return NSFont(name: name, size: size) ?? finalReturnFont
}
return finalReturnFont
}
} }

View File

@ -46,7 +46,7 @@ extension ctlInputMethod {
} }
/// .NotEmpty() /// .NotEmpty()
private func setInlineDisplayWithCursor() { func setInlineDisplayWithCursor() {
guard let client = client() else { return } guard let client = client() else { return }
if let state = state as? InputState.AssociatedPhrases { if let state = state as? InputState.AssociatedPhrases {
client.setMarkedText( client.setMarkedText(

View File

@ -40,16 +40,14 @@ public enum IME {
static var currentInputMode: InputMode = .init(rawValue: mgrPrefs.mostRecentInputMode) ?? .imeModeNULL static var currentInputMode: InputMode = .init(rawValue: mgrPrefs.mostRecentInputMode) ?? .imeModeNULL
static func kanjiConversionIfRequired(_ text: String) -> String { static func kanjiConversionIfRequired(_ text: String) -> String {
if currentInputMode == InputMode.imeModeCHT { guard currentInputMode == InputMode.imeModeCHT else { return text }
switch (mgrPrefs.chineseConversionEnabled, mgrPrefs.shiftJISShinjitaiOutputEnabled) { switch (mgrPrefs.chineseConversionEnabled, mgrPrefs.shiftJISShinjitaiOutputEnabled) {
case (false, true): return ChineseConverter.cnvTradToJIS(text) case (false, true): return ChineseConverter.cnvTradToJIS(text)
case (true, false): return ChineseConverter.cnvTradToKangXi(text) case (true, false): return ChineseConverter.cnvTradToKangXi(text)
// //
case (true, true): return ChineseConverter.cnvTradToJIS(text) case (true, true): return ChineseConverter.cnvTradToJIS(text)
case (false, false): return text case (false, false): return text
}
} }
return text
} }
// MARK: - ctlInputMethod // MARK: - ctlInputMethod
@ -106,17 +104,9 @@ public enum IME {
if #available(macOS 10.15, *) { if #available(macOS 10.15, *) {
let appearanceDescription = NSApplication.shared.effectiveAppearance.debugDescription let appearanceDescription = NSApplication.shared.effectiveAppearance.debugDescription
.lowercased() .lowercased()
if appearanceDescription.contains("dark") { return appearanceDescription.contains("dark")
return true } else if let appleInterfaceStyle = UserDefaults.standard.string(forKey: "AppleInterfaceStyle") {
} return appleInterfaceStyle.lowercased().contains("dark")
} else if #available(macOS 10.14, *) {
if let appleInterfaceStyle = UserDefaults.standard.object(forKey: "AppleInterfaceStyle")
as? String
{
if appleInterfaceStyle.lowercased().contains("dark") {
return true
}
}
} }
return false return false
} }

View File

@ -49,11 +49,12 @@ public enum UserDef: String, CaseIterable {
case kKeepReadingUponCompositionError = "KeepReadingUponCompositionError" case kKeepReadingUponCompositionError = "KeepReadingUponCompositionError"
case kTogglingAlphanumericalModeWithLShift = "TogglingAlphanumericalModeWithLShift" case kTogglingAlphanumericalModeWithLShift = "TogglingAlphanumericalModeWithLShift"
case kUpperCaseLetterKeyBehavior = "UpperCaseLetterKeyBehavior" case kUpperCaseLetterKeyBehavior = "UpperCaseLetterKeyBehavior"
case kDisableShiftTogglingAlphanumericalMode = "DisableShiftTogglingAlphanumericalMode"
case kUseIMKCandidateWindow = "UseIMKCandidateWindow" case kUseIMKCandidateWindow = "UseIMKCandidateWindow"
case kHandleDefaultCandidateFontsByLangIdentifier = "HandleDefaultCandidateFontsByLangIdentifier" case kHandleDefaultCandidateFontsByLangIdentifier = "HandleDefaultCandidateFontsByLangIdentifier"
case kShouldAlwaysUseShiftKeyAccommodation = "ShouldAlwaysUseShiftKeyAccommodation" case kShouldAlwaysUseShiftKeyAccommodation = "ShouldAlwaysUseShiftKeyAccommodation"
case kDisableShiftTogglingAlphanumericalMode = "DisableShiftTogglingAlphanumericalMode" case kAdjustIMKCandidateWindowLevel = "AdjustIMKCandidateWindowLevel"
case kCandidateTextFontName = "CandidateTextFontName" case kCandidateTextFontName = "CandidateTextFontName"
case kCandidateKeyLabelFontName = "CandidateKeyLabelFontName" case kCandidateKeyLabelFontName = "CandidateKeyLabelFontName"
@ -296,6 +297,9 @@ public enum mgrPrefs {
UserDefaults.standard.setDefault( UserDefaults.standard.setDefault(
mgrPrefs.shouldAlwaysUseShiftKeyAccommodation, forKey: UserDef.kShouldAlwaysUseShiftKeyAccommodation.rawValue mgrPrefs.shouldAlwaysUseShiftKeyAccommodation, forKey: UserDef.kShouldAlwaysUseShiftKeyAccommodation.rawValue
) )
UserDefaults.standard.setDefault(
mgrPrefs.adjustIMKCandidateWindowLevel, forKey: UserDef.kAdjustIMKCandidateWindowLevel.rawValue
)
// ----- // -----
@ -424,6 +428,9 @@ public enum mgrPrefs {
@UserDefault(key: UserDef.kShouldAlwaysUseShiftKeyAccommodation.rawValue, defaultValue: false) @UserDefault(key: UserDef.kShouldAlwaysUseShiftKeyAccommodation.rawValue, defaultValue: false)
static var shouldAlwaysUseShiftKeyAccommodation: Bool static var shouldAlwaysUseShiftKeyAccommodation: Bool
@UserDefault(key: UserDef.kAdjustIMKCandidateWindowLevel.rawValue, defaultValue: false)
static var adjustIMKCandidateWindowLevel: Bool
// MARK: - Settings (Tier 3) // MARK: - Settings (Tier 3)
static var minCandidateLength: Int { static var minCandidateLength: Int {
@ -544,7 +551,13 @@ public enum mgrPrefs {
static var candidateKeyLabelFontName: String? static var candidateKeyLabelFontName: String?
@UserDefault(key: UserDef.kCandidateKeys.rawValue, defaultValue: kDefaultKeys) @UserDefault(key: UserDef.kCandidateKeys.rawValue, defaultValue: kDefaultKeys)
static var candidateKeys: String static var candidateKeys: String {
didSet {
if mgrPrefs.useIMKCandidateWindow {
mgrPrefs.candidateKeys = kDefaultKeys
}
}
}
static var defaultCandidateKeys: String { static var defaultCandidateKeys: String {
kDefaultKeys kDefaultKeys
@ -682,13 +695,18 @@ public enum mgrPrefs {
extension mgrPrefs { extension mgrPrefs {
static func fixOddPreferences() { static func fixOddPreferences() {
// macOS 10.11 IMK // macOS 10.11 IMK macOS 10.13 IMK
if #unavailable(macOS 10.13) { mgrPrefs.useIMKCandidateWindow = false } // IMK macOS 10.09
// macOS 10.14 IMKCandidates
if #unavailable(macOS 10.14) {
mgrPrefs.useIMKCandidateWindow = false
mgrPrefs.adjustIMKCandidateWindowLevel = false
}
if #unavailable(macOS 10.15) { if #unavailable(macOS 10.15) {
handleDefaultCandidateFontsByLangIdentifier = false mgrPrefs.handleDefaultCandidateFontsByLangIdentifier = false
shouldAlwaysUseShiftKeyAccommodation = false mgrPrefs.shouldAlwaysUseShiftKeyAccommodation = false
disableShiftTogglingAlphanumericalMode = false mgrPrefs.disableShiftTogglingAlphanumericalMode = false
togglingAlphanumericalModeWithLShift = false mgrPrefs.togglingAlphanumericalModeWithLShift = false
} }
} }
} }

View File

@ -27,7 +27,7 @@ public class CandidateKeyLabel: NSObject {
} }
public protocol ctlCandidateDelegate: AnyObject { public protocol ctlCandidateDelegate: AnyObject {
var isAssociatedPhrasesMode: Bool { get } var isAssociatedPhrasesState: Bool { get }
func sharedEventHandler(_ event: NSEvent!) -> Bool func sharedEventHandler(_ event: NSEvent!) -> Bool
func candidateCountForController(_ controller: ctlCandidateProtocol) -> Int func candidateCountForController(_ controller: ctlCandidateProtocol) -> Int
func candidatesForController(_ controller: ctlCandidateProtocol) -> [(String, String)] func candidatesForController(_ controller: ctlCandidateProtocol) -> [(String, String)]

View File

@ -11,7 +11,7 @@ import InputMethodKit
public class ctlCandidateIMK: IMKCandidates, ctlCandidateProtocol { public class ctlCandidateIMK: IMKCandidates, ctlCandidateProtocol {
public var currentLayout: CandidateLayout = .horizontal public var currentLayout: CandidateLayout = .horizontal
private let defaultIMKSelectionKey: [UInt16: String] = [ public static let defaultIMKSelectionKey: [UInt16: String] = [
18: "1", 19: "2", 20: "3", 21: "4", 23: "5", 22: "6", 26: "7", 28: "8", 25: "9", 18: "1", 19: "2", 20: "3", 21: "4", 23: "5", 22: "6", 26: "7", 28: "8", 25: "9",
] ]
public weak var delegate: ctlCandidateDelegate? { public weak var delegate: ctlCandidateDelegate? {
@ -241,7 +241,6 @@ public class ctlCandidateIMK: IMKCandidates, ctlCandidateProtocol {
// //
// Objective-C nil // Objective-C nil
guard !eventArray.isEmpty else { return } guard !eventArray.isEmpty else { return }
var eventArray = eventArray
let event = eventArray[0] let event = eventArray[0]
let input = InputSignal(event: event) let input = InputSignal(event: event)
guard let delegate = delegate else { return } guard let delegate = delegate else { return }
@ -279,7 +278,7 @@ public class ctlCandidateIMK: IMKCandidates, ctlCandidateProtocol {
} }
} }
} else { } else {
if let newChar = defaultIMKSelectionKey[event.keyCode] { if let newChar = ctlCandidateIMK.defaultIMKSelectionKey[event.keyCode] {
/// KeyCode NSEvent Character /// KeyCode NSEvent Character
/// IMK /// IMK
let newEvent = NSEvent.keyEvent( let newEvent = NSEvent.keyEvent(
@ -295,12 +294,27 @@ public class ctlCandidateIMK: IMKCandidates, ctlCandidateProtocol {
keyCode: event.keyCode keyCode: event.keyCode
) )
if let newEvent = newEvent { if let newEvent = newEvent {
/// NSEvent if mgrPrefs.useSCPCTypingMode, delegate.isAssociatedPhrasesState {
eventArray = Array(eventArray.dropFirst(0)) // input.isShiftHold ctlInputMethod.handle()
eventArray.insert(newEvent, at: 0) if !input.isShiftHold {
_ = delegate.sharedEventHandler(event)
return
}
} else {
perform(Selector(("handleKeyboardEvent:")), with: newEvent)
return
}
} }
} }
if delegate.isAssociatedPhrasesMode,
if mgrPrefs.useSCPCTypingMode {
if !input.isReservedKey {
_ = delegate.sharedEventHandler(event)
return
}
}
if delegate.isAssociatedPhrasesState,
!input.isPageUp, !input.isPageDown, !input.isCursorForward, !input.isCursorBackward, !input.isPageUp, !input.isPageDown, !input.isCursorForward, !input.isCursorBackward,
!input.isCursorClockLeft, !input.isCursorClockRight, !input.isSpace, !input.isCursorClockLeft, !input.isCursorClockRight, !input.isSpace,
!input.isEnter || !mgrPrefs.alsoConfirmAssociatedCandidatesByEnter !input.isEnter || !mgrPrefs.alsoConfirmAssociatedCandidatesByEnter
@ -332,3 +346,25 @@ var currentTISInputSource: TISInputSource? {
} }
return result return result
} }
// MARK: - Translating NumPad KeyCodes to Default IMK Candidate Selection KeyCodes.
extension ctlCandidateIMK {
public static func replaceNumPadKeyCodes(target event: NSEvent) -> NSEvent? {
let mapNumPadKeyCodeTranslation: [UInt16: UInt16] = [
83: 18, 84: 19, 85: 20, 86: 21, 87: 23, 88: 22, 89: 26, 91: 28, 92: 25,
]
return NSEvent.keyEvent(
with: event.type,
location: event.locationInWindow,
modifierFlags: event.modifierFlags,
timestamp: event.timestamp,
windowNumber: event.windowNumber,
context: nil,
characters: event.characters ?? "",
charactersIgnoringModifiers: event.charactersIgnoringModifiers ?? event.characters ?? "",
isARepeat: event.isARepeat,
keyCode: mapNumPadKeyCodeTranslation[event.keyCode] ?? event.keyCode
)
}
}

View File

@ -168,7 +168,11 @@ private class vwrCandidateUniversal: NSView {
result = NSColor.systemBlue result = NSColor.systemBlue
default: break default: break
} }
let blendingAgainstTarget: NSColor = IME.isDarkMode ? NSColor.black : NSColor.white var blendingAgainstTarget: NSColor = IME.isDarkMode ? NSColor.black : NSColor.white
if #unavailable(macOS 10.14) {
colorBlendAmount = 0.3
blendingAgainstTarget = NSColor.white
}
return result.blended(withFraction: colorBlendAmount, of: blendingAgainstTarget)! return result.blended(withFraction: colorBlendAmount, of: blendingAgainstTarget)!
} }

View File

@ -9,68 +9,99 @@
import Cocoa import Cocoa
import SwiftUI import SwiftUI
@available(macOS 10.15, *) extension NSImage {
class ctlPrefUI { static var tabImageGeneral: NSImage! {
private(set) var tabImageGeneral: NSImage! = NSImage(named: "PrefToolbar-General") if #unavailable(macOS 11.0) {
private(set) var tabImageExperiences: NSImage! = NSImage(named: "PrefToolbar-Experiences") return NSImage(named: "PrefToolbar-General")
private(set) var tabImageDictionary: NSImage! = NSImage(named: "PrefToolbar-Dictionary") } else {
private(set) var tabImageKeyboard: NSImage! = NSImage(named: "PrefToolbar-Keyboard") return NSImage(
private(set) var tabImageDevZone: NSImage! = NSImage(named: "PrefToolbar-DevZone")
init() {
if #available(macOS 11.0, *) {
tabImageGeneral = NSImage(
systemSymbolName: "wrench.and.screwdriver.fill", accessibilityDescription: "General Preferences" systemSymbolName: "wrench.and.screwdriver.fill", accessibilityDescription: "General Preferences"
) )
tabImageExperiences = NSImage(
systemSymbolName: "person.fill.questionmark", accessibilityDescription: "Experiences Preferences"
)
tabImageDictionary = NSImage(
systemSymbolName: "character.book.closed.fill", accessibilityDescription: "Dictionary Preferences"
)
tabImageKeyboard = NSImage(
systemSymbolName: "keyboard.macwindow", accessibilityDescription: "Keyboard Preferences"
)
tabImageDevZone = NSImage(
systemSymbolName: "hand.raised.circle", accessibilityDescription: "DevZone Preferences"
)
} }
} }
static var tabImageExperience: NSImage! {
if #unavailable(macOS 11.0) {
return NSImage(named: "PrefToolbar-Experience")
} else {
return NSImage(
systemSymbolName: "person.fill.questionmark", accessibilityDescription: "Experience Preferences"
)
}
}
static var tabImageDictionary: NSImage! {
if #unavailable(macOS 11.0) {
return NSImage(named: "PrefToolbar-Dictionary")
} else {
return NSImage(
systemSymbolName: "character.book.closed.fill", accessibilityDescription: "Dictionary Preferences"
)
}
}
static var tabImageKeyboard: NSImage! {
if #unavailable(macOS 11.0) {
return NSImage(named: "PrefToolbar-Keyboard")
} else {
return NSImage(
systemSymbolName: "keyboard.macwindow", accessibilityDescription: "Keyboard Preferences"
)
}
}
static var tabImageDevZone: NSImage! {
if #available(macOS 12.0, *) {
return NSImage(
systemSymbolName: "hand.raised.circle", accessibilityDescription: "DevZone Preferences"
)
}
if #unavailable(macOS 11.0) {
return NSImage(named: "PrefToolbar-DevZone")
} else {
return NSImage(
systemSymbolName: "pc", accessibilityDescription: "DevZone Preferences"
)
}
}
}
@available(macOS 10.15, *)
class ctlPrefUI {
lazy var controller = PreferencesWindowController( lazy var controller = PreferencesWindowController(
panes: [ panes: [
Preferences.Pane( Preferences.Pane(
identifier: Preferences.PaneIdentifier(rawValue: "General"), identifier: Preferences.PaneIdentifier(rawValue: "General"),
title: NSLocalizedString("General", comment: ""), title: NSLocalizedString("General", comment: ""),
toolbarIcon: tabImageGeneral toolbarIcon: .tabImageGeneral
) { ) {
suiPrefPaneGeneral() suiPrefPaneGeneral()
}, },
Preferences.Pane( Preferences.Pane(
identifier: Preferences.PaneIdentifier(rawValue: "Experiences"), identifier: Preferences.PaneIdentifier(rawValue: "Experience"),
title: NSLocalizedString("Experience", comment: ""), title: NSLocalizedString("Experience", comment: ""),
toolbarIcon: tabImageExperiences toolbarIcon: .tabImageExperience
) { ) {
suiPrefPaneExperience() suiPrefPaneExperience()
}, },
Preferences.Pane( Preferences.Pane(
identifier: Preferences.PaneIdentifier(rawValue: "Dictionary"), identifier: Preferences.PaneIdentifier(rawValue: "Dictionary"),
title: NSLocalizedString("Dictionary", comment: ""), title: NSLocalizedString("Dictionary", comment: ""),
toolbarIcon: tabImageDictionary toolbarIcon: .tabImageDictionary
) { ) {
suiPrefPaneDictionary() suiPrefPaneDictionary()
}, },
Preferences.Pane( Preferences.Pane(
identifier: Preferences.PaneIdentifier(rawValue: "Keyboard"), identifier: Preferences.PaneIdentifier(rawValue: "Keyboard"),
title: NSLocalizedString("Keyboard", comment: ""), title: NSLocalizedString("Keyboard", comment: ""),
toolbarIcon: tabImageKeyboard toolbarIcon: .tabImageKeyboard
) { ) {
suiPrefPaneKeyboard() suiPrefPaneKeyboard()
}, },
Preferences.Pane( Preferences.Pane(
identifier: Preferences.PaneIdentifier(rawValue: "DevZone"), identifier: Preferences.PaneIdentifier(rawValue: "DevZone"),
title: NSLocalizedString("DevZone", comment: ""), title: NSLocalizedString("DevZone", comment: ""),
toolbarIcon: tabImageDevZone toolbarIcon: .tabImageDevZone
) { ) {
suiPrefPaneDevZone() suiPrefPaneDevZone()
}, },
@ -123,3 +154,26 @@ extension View {
overlay(Tooltip(tooltip: tooltip)) overlay(Tooltip(tooltip: tooltip))
} }
} }
// MARK: - Windows Aero in Swift UI
// Ref: https://stackoverflow.com/questions/62461957
@available(macOS 10.15, *)
struct VisualEffectView: NSViewRepresentable {
let material: NSVisualEffectView.Material
let blendingMode: NSVisualEffectView.BlendingMode
func makeNSView(context _: Context) -> NSVisualEffectView {
let visualEffectView = NSVisualEffectView()
visualEffectView.material = material
visualEffectView.blendingMode = blendingMode
visualEffectView.state = NSVisualEffectView.State.active
return visualEffectView
}
func updateNSView(_ visualEffectView: NSVisualEffectView, context _: Context) {
visualEffectView.material = material
visualEffectView.blendingMode = blendingMode
}
}

View File

@ -16,6 +16,10 @@ struct suiPrefPaneDevZone: View {
forKey: UserDef.kHandleDefaultCandidateFontsByLangIdentifier.rawValue) forKey: UserDef.kHandleDefaultCandidateFontsByLangIdentifier.rawValue)
@State private var selShouldAlwaysUseShiftKeyAccommodation: Bool = UserDefaults.standard.bool( @State private var selShouldAlwaysUseShiftKeyAccommodation: Bool = UserDefaults.standard.bool(
forKey: UserDef.kShouldAlwaysUseShiftKeyAccommodation.rawValue) forKey: UserDef.kShouldAlwaysUseShiftKeyAccommodation.rawValue)
@State private var selAdjustIMKCandidateWindowLevel: Bool = UserDefaults.standard.bool(
forKey: UserDef.kAdjustIMKCandidateWindowLevel.rawValue)
private let contentMaxHeight: Double = 430
private let contentWidth: Double = { private let contentWidth: Double = {
switch mgrPrefs.appleLanguages[0] { switch mgrPrefs.appleLanguages[0] {
case "ja": case "ja":
@ -30,48 +34,65 @@ struct suiPrefPaneDevZone: View {
}() }()
var body: some View { var body: some View {
Preferences.Container(contentWidth: contentWidth) { ScrollView {
Preferences.Section(title: "", bottomDivider: true) { Preferences.Container(contentWidth: contentWidth) {
Text( Preferences.Section(title: "", bottomDivider: true) {
LocalizedStringKey( Text(
"Warning: This page is for testing future features. \nFeatures listed here may not work as expected.") LocalizedStringKey(
) "Warning: This page is for testing future features. \nFeatures listed here may not work as expected.")
.fixedSize(horizontal: false, vertical: true) )
Divider() .fixedSize(horizontal: false, vertical: true)
Toggle( Divider()
LocalizedStringKey("Use IMK Candidate Window instead (will reboot the IME)"), Toggle(
isOn: $selUseIMKCandidateWindow.onChange { LocalizedStringKey("Use IMK Candidate Window instead (will reboot the IME)"),
mgrPrefs.useIMKCandidateWindow = selUseIMKCandidateWindow isOn: $selUseIMKCandidateWindow.onChange {
} mgrPrefs.useIMKCandidateWindow = selUseIMKCandidateWindow
) }
Text(LocalizedStringKey("IMK candidate window is plagued with issues like failed selection keys.")) )
Text(LocalizedStringKey("IMK candidate window is plagued with issues and incapabilities."))
.preferenceDescription().fixedSize(horizontal: false, vertical: true)
Toggle(
LocalizedStringKey("Adjust the window level of IMK Candidate Window"),
isOn: $selAdjustIMKCandidateWindowLevel.onChange {
mgrPrefs.adjustIMKCandidateWindowLevel = selAdjustIMKCandidateWindowLevel
}
).disabled(mgrPrefs.useIMKCandidateWindow == false)
Text(
LocalizedStringKey(
"IMK Candidate Window has a bug (#FB11300759) that it is always shown below NSMenu and Spotlight window by default. By toggling this checkbox, vChewing will attempt to adjust its window level according to its current context. However, this accomodation itself has a bug (also filed in #FB11300759): as long as vChewing application restarted once, IMK Candidate Window will always be shown beneath all other windows in the current desktop."
)
)
.preferenceDescription().fixedSize(horizontal: false, vertical: true) .preferenceDescription().fixedSize(horizontal: false, vertical: true)
Toggle( Toggle(
LocalizedStringKey("Use .langIdentifier to handle UI fonts in candidate window"), LocalizedStringKey("Use .langIdentifier to handle UI fonts in candidate window"),
isOn: $selHandleDefaultCandidateFontsByLangIdentifier.onChange { isOn: $selHandleDefaultCandidateFontsByLangIdentifier.onChange {
mgrPrefs.handleDefaultCandidateFontsByLangIdentifier = selHandleDefaultCandidateFontsByLangIdentifier mgrPrefs.handleDefaultCandidateFontsByLangIdentifier = selHandleDefaultCandidateFontsByLangIdentifier
} }
)
Text(
LocalizedStringKey(
"This only works since macOS 12 with non-IMK candidate window as an alternative wordaround of Apple Bug Report #FB10978412. Apple should patch that for macOS 11 and later."
) )
) Text(
.preferenceDescription().fixedSize(horizontal: false, vertical: true) LocalizedStringKey(
Toggle( "This only works since macOS 12 with non-IMK candidate window as an alternative wordaround of Apple Bug Report #FB10978412. Apple should patch that for macOS 11 and later."
LocalizedStringKey("Use Shift Key Accommodation in all cases"), )
isOn: $selShouldAlwaysUseShiftKeyAccommodation.onChange {
mgrPrefs.shouldAlwaysUseShiftKeyAccommodation = selShouldAlwaysUseShiftKeyAccommodation
}
)
Text(
LocalizedStringKey(
"Some client apps (like Chromium-cored browsers: MS Edge, Google Chrome, etc.) may duplicate Shift-key inputs due to their internal bugs, and their devs are less likely to fix their bugs of such. vChewing has its accommodation procedures enabled by default for known Chromium-cored browsers. If you want the same accommodation for other client apps, please tick this checkbox on."
) )
) .preferenceDescription().fixedSize(horizontal: false, vertical: true)
.preferenceDescription().fixedSize(horizontal: false, vertical: true) Toggle(
LocalizedStringKey("Use Shift Key Accommodation in all cases"),
isOn: $selShouldAlwaysUseShiftKeyAccommodation.onChange {
mgrPrefs.shouldAlwaysUseShiftKeyAccommodation = selShouldAlwaysUseShiftKeyAccommodation
}
)
.disabled(mgrPrefs.disableShiftTogglingAlphanumericalMode)
Text(
LocalizedStringKey(
"Some client apps (like Chromium-cored browsers: MS Edge, Google Chrome, etc.) may duplicate Shift-key inputs due to their internal bugs, and their devs are less likely to fix their bugs of such. vChewing has its accommodation procedures enabled by default for known Chromium-cored browsers. If you want the same accommodation for other client apps, please tick this checkbox on."
)
)
.preferenceDescription().fixedSize(horizontal: false, vertical: true)
}
} }
} }
.frame(maxHeight: contentMaxHeight).fixedSize(horizontal: false, vertical: true)
.background(VisualEffectView(material: .sidebar, blendingMode: .behindWindow))
} }
} }

View File

@ -25,6 +25,8 @@ struct suiPrefPaneDictionary: View {
forKey: UserDef.kFetchSuggestionsFromUserOverrideModel.rawValue) forKey: UserDef.kFetchSuggestionsFromUserOverrideModel.rawValue)
@State private var selUseFixecCandidateOrderOnSelection: Bool = UserDefaults.standard.bool( @State private var selUseFixecCandidateOrderOnSelection: Bool = UserDefaults.standard.bool(
forKey: UserDef.kUseFixecCandidateOrderOnSelection.rawValue) forKey: UserDef.kUseFixecCandidateOrderOnSelection.rawValue)
private let contentMaxHeight: Double = 430
private let contentWidth: Double = { private let contentWidth: Double = {
switch mgrPrefs.appleLanguages[0] { switch mgrPrefs.appleLanguages[0] {
case "ja": case "ja":
@ -39,109 +41,113 @@ struct suiPrefPaneDictionary: View {
}() }()
var body: some View { var body: some View {
Preferences.Container(contentWidth: contentWidth) { ScrollView {
Preferences.Section(title: "", bottomDivider: true) { Preferences.Container(contentWidth: contentWidth) {
Text(LocalizedStringKey("Choose your desired user data folder path. Will be omitted if invalid.")) Preferences.Section(title: "", bottomDivider: true) {
HStack { Text(LocalizedStringKey("Choose your desired user data folder path. Will be omitted if invalid."))
if #available(macOS 11.0, *) { HStack {
TextField(fdrDefault, text: $tbxUserDataPathSpecified).disabled(true) if #available(macOS 11.0, *) {
.help(tbxUserDataPathSpecified) TextField(fdrDefault, text: $tbxUserDataPathSpecified).disabled(true)
} else { .help(tbxUserDataPathSpecified)
TextField(fdrDefault, text: $tbxUserDataPathSpecified).disabled(true) } else {
.toolTip(tbxUserDataPathSpecified) TextField(fdrDefault, text: $tbxUserDataPathSpecified).disabled(true)
} .toolTip(tbxUserDataPathSpecified)
Button { }
IME.dlgOpenPath.title = NSLocalizedString( Button {
"Choose your desired user data folder.", comment: "" IME.dlgOpenPath.title = NSLocalizedString(
) "Choose your desired user data folder.", comment: ""
IME.dlgOpenPath.showsResizeIndicator = true )
IME.dlgOpenPath.showsHiddenFiles = true IME.dlgOpenPath.showsResizeIndicator = true
IME.dlgOpenPath.canChooseFiles = false IME.dlgOpenPath.showsHiddenFiles = true
IME.dlgOpenPath.canChooseDirectories = true IME.dlgOpenPath.canChooseFiles = false
IME.dlgOpenPath.canChooseDirectories = true
let bolPreviousFolderValidity = mgrLangModel.checkIfSpecifiedUserDataFolderValid( let bolPreviousFolderValidity = mgrLangModel.checkIfSpecifiedUserDataFolderValid(
mgrPrefs.userDataFolderSpecified.expandingTildeInPath) mgrPrefs.userDataFolderSpecified.expandingTildeInPath)
if let window = ctlPrefUI.shared.controller.window { if let window = ctlPrefUI.shared.controller.window {
IME.dlgOpenPath.beginSheetModal(for: window) { result in IME.dlgOpenPath.beginSheetModal(for: window) { result in
if result == NSApplication.ModalResponse.OK { if result == NSApplication.ModalResponse.OK {
if IME.dlgOpenPath.url != nil { if IME.dlgOpenPath.url != nil {
// CommonDialog // CommonDialog
// //
var newPath = IME.dlgOpenPath.url!.path var newPath = IME.dlgOpenPath.url!.path
newPath.ensureTrailingSlash() newPath.ensureTrailingSlash()
if mgrLangModel.checkIfSpecifiedUserDataFolderValid(newPath) { if mgrLangModel.checkIfSpecifiedUserDataFolderValid(newPath) {
mgrPrefs.userDataFolderSpecified = newPath mgrPrefs.userDataFolderSpecified = newPath
tbxUserDataPathSpecified = mgrPrefs.userDataFolderSpecified tbxUserDataPathSpecified = mgrPrefs.userDataFolderSpecified
IME.initLangModels(userOnly: true) IME.initLangModels(userOnly: true)
(NSApplication.shared.delegate as! AppDelegate).updateStreamHelperPath() (NSApplication.shared.delegate as! AppDelegate).updateStreamHelperPath()
} else { } else {
clsSFX.beep() clsSFX.beep()
if !bolPreviousFolderValidity { if !bolPreviousFolderValidity {
mgrPrefs.resetSpecifiedUserDataFolder() mgrPrefs.resetSpecifiedUserDataFolder()
}
return
} }
return
} }
} else {
if !bolPreviousFolderValidity {
mgrPrefs.resetSpecifiedUserDataFolder()
}
return
} }
} else {
if !bolPreviousFolderValidity {
mgrPrefs.resetSpecifiedUserDataFolder()
}
return
} }
} }
} label: {
Text("...")
}
Button {
mgrPrefs.resetSpecifiedUserDataFolder()
tbxUserDataPathSpecified = ""
} label: {
Text("")
} }
} label: {
Text("...")
}
Button {
mgrPrefs.resetSpecifiedUserDataFolder()
tbxUserDataPathSpecified = ""
} label: {
Text("")
} }
Toggle(
LocalizedStringKey("Automatically reload user data files if changes detected"),
isOn: $selAutoReloadUserData.onChange {
mgrPrefs.shouldAutoReloadUserDataFiles = selAutoReloadUserData
}
).controlSize(.small)
Divider()
Toggle(
LocalizedStringKey("Enable CNS11643 Support (2022-07-20)"),
isOn: $selEnableCNS11643.onChange {
mgrPrefs.cns11643Enabled = selEnableCNS11643
mgrLangModel.setCNSEnabled(mgrPrefs.cns11643Enabled)
}
)
Toggle(
LocalizedStringKey("Enable symbol input support (incl. certain emoji symbols)"),
isOn: $selEnableSymbolInputSupport.onChange {
mgrPrefs.symbolInputEnabled = selEnableSymbolInputSupport
mgrLangModel.setSymbolEnabled(mgrPrefs.symbolInputEnabled)
}
)
Toggle(
LocalizedStringKey("Allow boosting / excluding a candidate of single kanji"),
isOn: $selAllowBoostingSingleKanjiAsUserPhrase.onChange {
mgrPrefs.allowBoostingSingleKanjiAsUserPhrase = selAllowBoostingSingleKanjiAsUserPhrase
}
)
Toggle(
LocalizedStringKey("Applying typing suggestions from half-life user override model"),
isOn: $selFetchSuggestionsFromUserOverrideModel.onChange {
mgrPrefs.fetchSuggestionsFromUserOverrideModel = selFetchSuggestionsFromUserOverrideModel
}
)
Toggle(
LocalizedStringKey("Always use fixed listing order in candidate window"),
isOn: $selUseFixecCandidateOrderOnSelection.onChange {
mgrPrefs.useFixecCandidateOrderOnSelection = selUseFixecCandidateOrderOnSelection
}
)
} }
Toggle(
LocalizedStringKey("Automatically reload user data files if changes detected"),
isOn: $selAutoReloadUserData.onChange {
mgrPrefs.shouldAutoReloadUserDataFiles = selAutoReloadUserData
}
).controlSize(.small)
Divider()
Toggle(
LocalizedStringKey("Enable CNS11643 Support (2022-07-20)"),
isOn: $selEnableCNS11643.onChange {
mgrPrefs.cns11643Enabled = selEnableCNS11643
mgrLangModel.setCNSEnabled(mgrPrefs.cns11643Enabled)
}
)
Toggle(
LocalizedStringKey("Enable symbol input support (incl. certain emoji symbols)"),
isOn: $selEnableSymbolInputSupport.onChange {
mgrPrefs.symbolInputEnabled = selEnableSymbolInputSupport
mgrLangModel.setSymbolEnabled(mgrPrefs.symbolInputEnabled)
}
)
Toggle(
LocalizedStringKey("Allow boosting / excluding a candidate of single kanji"),
isOn: $selAllowBoostingSingleKanjiAsUserPhrase.onChange {
mgrPrefs.allowBoostingSingleKanjiAsUserPhrase = selAllowBoostingSingleKanjiAsUserPhrase
}
)
Toggle(
LocalizedStringKey("Applying typing suggestions from half-life user override model"),
isOn: $selFetchSuggestionsFromUserOverrideModel.onChange {
mgrPrefs.fetchSuggestionsFromUserOverrideModel = selFetchSuggestionsFromUserOverrideModel
}
)
Toggle(
LocalizedStringKey("Always use fixed listing order in candidate window"),
isOn: $selUseFixecCandidateOrderOnSelection.onChange {
mgrPrefs.useFixecCandidateOrderOnSelection = selUseFixecCandidateOrderOnSelection
}
)
} }
} }
.frame(maxHeight: contentMaxHeight).fixedSize(horizontal: false, vertical: true)
.background(VisualEffectView(material: .sidebar, blendingMode: .behindWindow))
} }
} }

View File

@ -38,6 +38,8 @@ struct suiPrefPaneExperience: View {
forKey: UserDef.kUpperCaseLetterKeyBehavior.rawValue) forKey: UserDef.kUpperCaseLetterKeyBehavior.rawValue)
@State private var selDisableShiftTogglingAlphanumericalMode: Bool = UserDefaults.standard.bool( @State private var selDisableShiftTogglingAlphanumericalMode: Bool = UserDefaults.standard.bool(
forKey: UserDef.kDisableShiftTogglingAlphanumericalMode.rawValue) forKey: UserDef.kDisableShiftTogglingAlphanumericalMode.rawValue)
private let contentMaxHeight: Double = 430
private let contentWidth: Double = { private let contentWidth: Double = {
switch mgrPrefs.appleLanguages[0] { switch mgrPrefs.appleLanguages[0] {
case "ja": case "ja":
@ -52,128 +54,132 @@ struct suiPrefPaneExperience: View {
}() }()
var body: some View { var body: some View {
Preferences.Container(contentWidth: contentWidth) { ScrollView {
Preferences.Section(label: { Text(LocalizedStringKey("Cursor Selection:")) }) { Preferences.Container(contentWidth: contentWidth) {
Picker( Preferences.Section(label: { Text(LocalizedStringKey("Cursor Selection:")) }) {
"", Picker(
selection: $selCursorPosition.onChange { "",
mgrPrefs.useRearCursorMode = (selCursorPosition == 1) ? true : false selection: $selCursorPosition.onChange {
mgrPrefs.useRearCursorMode = (selCursorPosition == 1) ? true : false
}
) {
Text(LocalizedStringKey("in front of the phrase (like macOS built-in Zhuyin IME)")).tag(0)
Text(LocalizedStringKey("at the rear of the phrase (like Microsoft New Phonetic)")).tag(1)
} }
) { .labelsHidden()
Text(LocalizedStringKey("in front of the phrase (like macOS built-in Zhuyin IME)")).tag(0) .pickerStyle(RadioGroupPickerStyle())
Text(LocalizedStringKey("at the rear of the phrase (like Microsoft New Phonetic)")).tag(1) Text(LocalizedStringKey("Choose the cursor position where you want to list possible candidates."))
.preferenceDescription()
Toggle(
LocalizedStringKey("Push the cursor in front of the phrase after selection"),
isOn: $selPushCursorAfterSelection.onChange {
mgrPrefs.moveCursorAfterSelectingCandidate = selPushCursorAfterSelection
}
).controlSize(.small)
} }
.labelsHidden() Preferences.Section(title: "(Shift+)Tab:") {
.pickerStyle(RadioGroupPickerStyle()) Picker(
Text(LocalizedStringKey("Choose the cursor position where you want to list possible candidates.")) "",
.preferenceDescription() selection: $selKeyBehaviorShiftTab.onChange {
Toggle( mgrPrefs.specifyShiftTabKeyBehavior = (selKeyBehaviorShiftTab == 1) ? true : false
LocalizedStringKey("Push the cursor in front of the phrase after selection"), }
isOn: $selPushCursorAfterSelection.onChange { ) {
mgrPrefs.moveCursorAfterSelectingCandidate = selPushCursorAfterSelection Text(LocalizedStringKey("for cycling candidates")).tag(0)
Text(LocalizedStringKey("for cycling pages")).tag(1)
} }
).controlSize(.small) .labelsHidden()
} .horizontalRadioGroupLayout()
Preferences.Section(title: "(Shift+)Tab:") { .pickerStyle(RadioGroupPickerStyle())
Picker( Text(LocalizedStringKey("Choose the behavior of (Shift+)Tab key in the candidate window."))
"", .preferenceDescription()
selection: $selKeyBehaviorShiftTab.onChange {
mgrPrefs.specifyShiftTabKeyBehavior = (selKeyBehaviorShiftTab == 1) ? true : false
}
) {
Text(LocalizedStringKey("for cycling candidates")).tag(0)
Text(LocalizedStringKey("for cycling pages")).tag(1)
} }
.labelsHidden() Preferences.Section(label: { Text(LocalizedStringKey("(Shift+)Space:")) }) {
.horizontalRadioGroupLayout() Picker(
.pickerStyle(RadioGroupPickerStyle()) "",
Text(LocalizedStringKey("Choose the behavior of (Shift+)Tab key in the candidate window.")) selection: $selKeyBehaviorShiftSpace.onChange {
.preferenceDescription() mgrPrefs.specifyShiftSpaceKeyBehavior = (selKeyBehaviorShiftSpace == 1) ? true : false
} }
Preferences.Section(label: { Text(LocalizedStringKey("(Shift+)Space:")) }) { ) {
Picker( Text(LocalizedStringKey("Space to +cycle candidates, Shift+Space to +cycle pages")).tag(0)
"", Text(LocalizedStringKey("Space to +cycle pages, Shift+Space to +cycle candidates")).tag(1)
selection: $selKeyBehaviorShiftSpace.onChange {
mgrPrefs.specifyShiftSpaceKeyBehavior = (selKeyBehaviorShiftSpace == 1) ? true : false
} }
) { .labelsHidden()
Text(LocalizedStringKey("Space to +cycle candidates, Shift+Space to +cycle pages")).tag(0) .pickerStyle(RadioGroupPickerStyle())
Text(LocalizedStringKey("Space to +cycle pages, Shift+Space to +cycle candidates")).tag(1) Text(LocalizedStringKey("Choose the behavior of (Shift+)Space key with candidates."))
.preferenceDescription()
} }
.labelsHidden() Preferences.Section(label: { Text(LocalizedStringKey("Shift+Letter:")) }) {
.pickerStyle(RadioGroupPickerStyle()) Picker(
Text(LocalizedStringKey("Choose the behavior of (Shift+)Space key with candidates.")) "",
.preferenceDescription() selection: $selUpperCaseLetterKeyBehavior.onChange {
} mgrPrefs.upperCaseLetterKeyBehavior = selUpperCaseLetterKeyBehavior
Preferences.Section(label: { Text(LocalizedStringKey("Shift+Letter:")) }) { }
Picker( ) {
"", Text(LocalizedStringKey("Type them into inline composition buffer")).tag(0)
selection: $selUpperCaseLetterKeyBehavior.onChange { Text(LocalizedStringKey("Directly commit lowercased letters")).tag(1)
mgrPrefs.upperCaseLetterKeyBehavior = selUpperCaseLetterKeyBehavior Text(LocalizedStringKey("Directly commit uppercased letters")).tag(2)
} }
) { .labelsHidden()
Text(LocalizedStringKey("Type them into inline composition buffer")).tag(0) .pickerStyle(RadioGroupPickerStyle())
Text(LocalizedStringKey("Directly commit lowercased letters")).tag(1) Text(LocalizedStringKey("Choose the behavior of Shift+Letter key with letter inputs."))
Text(LocalizedStringKey("Directly commit uppercased letters")).tag(2) .preferenceDescription()
}
Preferences.Section(label: { Text(LocalizedStringKey("Misc Settings:")) }) {
Toggle(
LocalizedStringKey("Enable Space key for calling candidate window"),
isOn: $selKeyBehaviorSpaceForCallingCandidate.onChange {
mgrPrefs.chooseCandidateUsingSpace = selKeyBehaviorSpaceForCallingCandidate
}
)
Toggle(
LocalizedStringKey("Use ESC key to clear the entire input buffer"),
isOn: $selKeyBehaviorESCForClearingTheBuffer.onChange {
mgrPrefs.escToCleanInputBuffer = selKeyBehaviorESCForClearingTheBuffer
}
)
Toggle(
LocalizedStringKey("Automatically correct reading combinations when typing"),
isOn: $selAutoCorrectReadingCombination.onChange {
mgrPrefs.autoCorrectReadingCombination = selAutoCorrectReadingCombination
}
)
Toggle(
LocalizedStringKey("Allow using Enter key to confirm associated candidate selection"),
isOn: $selAlsoConfirmAssociatedCandidatesByEnter.onChange {
mgrPrefs.alsoConfirmAssociatedCandidatesByEnter = selAlsoConfirmAssociatedCandidatesByEnter
}
)
Toggle(
LocalizedStringKey("Also toggle alphanumerical mode with Left-Shift"),
isOn: $selTogglingAlphanumericalModeWithLShift.onChange {
mgrPrefs.togglingAlphanumericalModeWithLShift = selTogglingAlphanumericalModeWithLShift
}
).disabled(mgrPrefs.disableShiftTogglingAlphanumericalMode == true)
Toggle(
LocalizedStringKey("Completely disable using Shift key to toggling alphanumerical mode"),
isOn: $selDisableShiftTogglingAlphanumericalMode.onChange {
mgrPrefs.disableShiftTogglingAlphanumericalMode = selDisableShiftTogglingAlphanumericalMode
}
)
Toggle(
LocalizedStringKey("Allow backspace-editing miscomposed readings"),
isOn: $selKeepReadingUponCompositionError.onChange {
mgrPrefs.keepReadingUponCompositionError = selKeepReadingUponCompositionError
}
)
Toggle(
LocalizedStringKey("Emulating select-candidate-per-character mode"),
isOn: $selEnableSCPCTypingMode.onChange {
mgrPrefs.useSCPCTypingMode = selEnableSCPCTypingMode
}
)
Text(LocalizedStringKey("An accommodation for elder computer users."))
.preferenceDescription()
} }
.labelsHidden()
.pickerStyle(RadioGroupPickerStyle())
Text(LocalizedStringKey("Choose the behavior of Shift+Letter key with letter inputs."))
.preferenceDescription()
}
Preferences.Section(label: { Text(LocalizedStringKey("Misc Settings:")) }) {
Toggle(
LocalizedStringKey("Enable Space key for calling candidate window"),
isOn: $selKeyBehaviorSpaceForCallingCandidate.onChange {
mgrPrefs.chooseCandidateUsingSpace = selKeyBehaviorSpaceForCallingCandidate
}
)
Toggle(
LocalizedStringKey("Use ESC key to clear the entire input buffer"),
isOn: $selKeyBehaviorESCForClearingTheBuffer.onChange {
mgrPrefs.escToCleanInputBuffer = selKeyBehaviorESCForClearingTheBuffer
}
)
Toggle(
LocalizedStringKey("Automatically correct reading combinations when typing"),
isOn: $selAutoCorrectReadingCombination.onChange {
mgrPrefs.autoCorrectReadingCombination = selAutoCorrectReadingCombination
}
)
Toggle(
LocalizedStringKey("Allow using Enter key to confirm associated candidate selection"),
isOn: $selAlsoConfirmAssociatedCandidatesByEnter.onChange {
mgrPrefs.alsoConfirmAssociatedCandidatesByEnter = selAlsoConfirmAssociatedCandidatesByEnter
}
)
Toggle(
LocalizedStringKey("Also toggle alphanumerical mode with Left-Shift"),
isOn: $selTogglingAlphanumericalModeWithLShift.onChange {
mgrPrefs.togglingAlphanumericalModeWithLShift = selTogglingAlphanumericalModeWithLShift
}
).disabled(mgrPrefs.disableShiftTogglingAlphanumericalMode == true)
Toggle(
LocalizedStringKey("Completely disable using Shift key to toggling alphanumerical mode"),
isOn: $selDisableShiftTogglingAlphanumericalMode.onChange {
mgrPrefs.disableShiftTogglingAlphanumericalMode = selDisableShiftTogglingAlphanumericalMode
}
)
Toggle(
LocalizedStringKey("Allow backspace-editing miscomposed readings"),
isOn: $selKeepReadingUponCompositionError.onChange {
mgrPrefs.keepReadingUponCompositionError = selKeepReadingUponCompositionError
}
)
Toggle(
LocalizedStringKey("Emulating select-candidate-per-character mode"),
isOn: $selEnableSCPCTypingMode.onChange {
mgrPrefs.useSCPCTypingMode = selEnableSCPCTypingMode
}
)
Text(LocalizedStringKey("An accommodation for elder computer users."))
.preferenceDescription()
} }
} }
.frame(maxHeight: contentMaxHeight).fixedSize(horizontal: false, vertical: true)
.background(VisualEffectView(material: .sidebar, blendingMode: .behindWindow))
} }
} }

View File

@ -37,13 +37,15 @@ struct suiPrefPaneGeneral: View {
@State private var selEnableAutoUpdateCheck = UserDefaults.standard.bool( @State private var selEnableAutoUpdateCheck = UserDefaults.standard.bool(
forKey: UserDef.kCheckUpdateAutomatically.rawValue) forKey: UserDef.kCheckUpdateAutomatically.rawValue)
@State private var selEnableDebugMode = UserDefaults.standard.bool(forKey: UserDef.kIsDebugModeEnabled.rawValue) @State private var selEnableDebugMode = UserDefaults.standard.bool(forKey: UserDef.kIsDebugModeEnabled.rawValue)
private let contentMaxHeight: Double = 430
private let contentWidth: Double = { private let contentWidth: Double = {
switch mgrPrefs.appleLanguages[0] { switch mgrPrefs.appleLanguages[0] {
case "ja": case "ja":
return 465 return 520
default: default:
if mgrPrefs.appleLanguages[0].contains("zh-Han") { if mgrPrefs.appleLanguages[0].contains("zh-Han") {
return 450 return 480
} else { } else {
return 550 return 550
} }
@ -51,135 +53,141 @@ struct suiPrefPaneGeneral: View {
}() }()
var body: some View { var body: some View {
Preferences.Container(contentWidth: contentWidth) { ScrollView {
Preferences.Section(bottomDivider: false, label: { Text(LocalizedStringKey("Candidate Size:")) }) { Preferences.Container(contentWidth: contentWidth) {
Picker( Preferences.Section(bottomDivider: false, label: { Text(LocalizedStringKey("Candidate Size:")) }) {
"", Picker(
selection: $selCandidateUIFontSize.onChange { "",
mgrPrefs.candidateListTextSize = CGFloat(selCandidateUIFontSize) selection: $selCandidateUIFontSize.onChange {
} mgrPrefs.candidateListTextSize = CGFloat(selCandidateUIFontSize)
) {
Text("12").tag(12)
Text("14").tag(14)
Text("16").tag(16)
Text("18").tag(18)
Text("24").tag(24)
Text("32").tag(32)
Text("64").tag(64)
Text("96").tag(96)
}
.labelsHidden()
.frame(width: 120.0)
Text(LocalizedStringKey("Choose candidate font size for better visual clarity."))
.preferenceDescription()
}
Preferences.Section(bottomDivider: false, label: { Text(LocalizedStringKey("UI Language:")) }) {
Picker(
LocalizedStringKey("Follow OS settings"),
selection: $selUILanguage.onChange {
IME.prtDebugIntel(selUILanguage[0])
if selUILanguage == mgrPrefs.appleLanguages
|| (selUILanguage[0] == "auto"
&& UserDefaults.standard.object(forKey: UserDef.kAppleLanguages.rawValue) == nil)
{
return
} }
if selUILanguage[0] != "auto" { ) {
mgrPrefs.appleLanguages = selUILanguage Text("12").tag(12)
} else { Text("14").tag(14)
UserDefaults.standard.removeObject(forKey: UserDef.kAppleLanguages.rawValue) Text("16").tag(16)
} Text("18").tag(18)
NSLog("vChewing App self-terminated due to UI language change.") Text("24").tag(24)
NSApplication.shared.terminate(nil) Text("32").tag(32)
Text("64").tag(64)
Text("96").tag(96)
} }
) { .labelsHidden()
Text(LocalizedStringKey("Follow OS settings")).tag(["auto"]) .frame(width: 120.0)
Text(LocalizedStringKey("Simplified Chinese")).tag(["zh-Hans"]) .disabled(mgrPrefs.useIMKCandidateWindow)
Text(LocalizedStringKey("Traditional Chinese")).tag(["zh-Hant"]) Text(LocalizedStringKey("Choose candidate font size for better visual clarity."))
Text(LocalizedStringKey("Japanese")).tag(["ja"]) .preferenceDescription()
Text(LocalizedStringKey("English")).tag(["en"])
} }
.labelsHidden() Preferences.Section(bottomDivider: false, label: { Text(LocalizedStringKey("UI Language:")) }) {
.frame(width: 180.0) Picker(
LocalizedStringKey("Follow OS settings"),
selection: $selUILanguage.onChange {
IME.prtDebugIntel(selUILanguage[0])
if selUILanguage == mgrPrefs.appleLanguages
|| (selUILanguage[0] == "auto"
&& UserDefaults.standard.object(forKey: UserDef.kAppleLanguages.rawValue) == nil)
{
return
}
if selUILanguage[0] != "auto" {
mgrPrefs.appleLanguages = selUILanguage
} else {
UserDefaults.standard.removeObject(forKey: UserDef.kAppleLanguages.rawValue)
}
NSLog("vChewing App self-terminated due to UI language change.")
NSApplication.shared.terminate(nil)
}
) {
Text(LocalizedStringKey("Follow OS settings")).tag(["auto"])
Text(LocalizedStringKey("Simplified Chinese")).tag(["zh-Hans"])
Text(LocalizedStringKey("Traditional Chinese")).tag(["zh-Hant"])
Text(LocalizedStringKey("Japanese")).tag(["ja"])
Text(LocalizedStringKey("English")).tag(["en"])
}
.labelsHidden()
.frame(width: 180.0)
Text(LocalizedStringKey("Change user interface language (will reboot the IME).")) Text(LocalizedStringKey("Change user interface language (will reboot the IME)."))
.preferenceDescription() .preferenceDescription()
}
Preferences.Section(bottomDivider: true, label: { Text(LocalizedStringKey("Candidate Layout:")) }) {
Picker(
"",
selection: $selEnableHorizontalCandidateLayout.onChange {
mgrPrefs.useHorizontalCandidateList = selEnableHorizontalCandidateLayout
}
) {
Text(LocalizedStringKey("Vertical")).tag(false)
Text(LocalizedStringKey("Horizontal")).tag(true)
} }
.labelsHidden() Preferences.Section(bottomDivider: true, label: { Text(LocalizedStringKey("Candidate Layout:")) }) {
.horizontalRadioGroupLayout() Picker(
.pickerStyle(RadioGroupPickerStyle()) "",
Text(LocalizedStringKey("Choose your preferred layout of the candidate window.")) selection: $selEnableHorizontalCandidateLayout.onChange {
.preferenceDescription() mgrPrefs.useHorizontalCandidateList = selEnableHorizontalCandidateLayout
Toggle( }
LocalizedStringKey("Show page buttons in candidate window"), ) {
isOn: $selShowPageButtonsInCandidateUI.onChange { Text(LocalizedStringKey("Vertical")).tag(false)
mgrPrefs.showPageButtonsInCandidateWindow = selShowPageButtonsInCandidateUI Text(LocalizedStringKey("Horizontal")).tag(true)
} }
) .labelsHidden()
.controlSize(.small) .horizontalRadioGroupLayout()
} .pickerStyle(RadioGroupPickerStyle())
Preferences.Section(bottomDivider: true, label: { Text(LocalizedStringKey("Output Settings:")) }) { Text(LocalizedStringKey("Choose your preferred layout of the candidate window."))
Toggle( .preferenceDescription()
LocalizedStringKey("Auto-convert traditional Chinese glyphs to KangXi characters"), Toggle(
isOn: $selEnableKanjiConvToKangXi.onChange { LocalizedStringKey("Show page buttons in candidate window"),
mgrPrefs.chineseConversionEnabled = selEnableKanjiConvToKangXi isOn: $selShowPageButtonsInCandidateUI.onChange {
selEnableKanjiConvToJIS = mgrPrefs.shiftJISShinjitaiOutputEnabled mgrPrefs.showPageButtonsInCandidateWindow = selShowPageButtonsInCandidateUI
} }
) )
Toggle( .controlSize(.small)
LocalizedStringKey("Auto-convert traditional Chinese glyphs to JIS Shinjitai characters"), .disabled(mgrPrefs.useIMKCandidateWindow)
isOn: $selEnableKanjiConvToJIS.onChange { }
mgrPrefs.shiftJISShinjitaiOutputEnabled = selEnableKanjiConvToJIS Preferences.Section(bottomDivider: true, label: { Text(LocalizedStringKey("Output Settings:")) }) {
selEnableKanjiConvToKangXi = mgrPrefs.chineseConversionEnabled Toggle(
} LocalizedStringKey("Auto-convert traditional Chinese glyphs to KangXi characters"),
) isOn: $selEnableKanjiConvToKangXi.onChange {
Toggle( mgrPrefs.chineseConversionEnabled = selEnableKanjiConvToKangXi
LocalizedStringKey("Show Hanyu-Pinyin in the inline composition buffer & tooltip"), selEnableKanjiConvToJIS = mgrPrefs.shiftJISShinjitaiOutputEnabled
isOn: $selShowHanyuPinyinInCompositionBuffer.onChange { }
mgrPrefs.showHanyuPinyinInCompositionBuffer = selShowHanyuPinyinInCompositionBuffer )
} Toggle(
) LocalizedStringKey("Auto-convert traditional Chinese glyphs to JIS Shinjitai characters"),
Toggle( isOn: $selEnableKanjiConvToJIS.onChange {
LocalizedStringKey("Output Hanyu-Pinyin in lieu of Zhuyin when Ctrl(+Alt)+CMD+Enter"), mgrPrefs.shiftJISShinjitaiOutputEnabled = selEnableKanjiConvToJIS
isOn: $selInlineDumpPinyinInLieuOfZhuyin.onChange { selEnableKanjiConvToKangXi = mgrPrefs.chineseConversionEnabled
mgrPrefs.inlineDumpPinyinInLieuOfZhuyin = selInlineDumpPinyinInLieuOfZhuyin }
} )
) Toggle(
Toggle( LocalizedStringKey("Show Hanyu-Pinyin in the inline composition buffer & tooltip"),
LocalizedStringKey("Stop farting (when typed phonetic combination is invalid, etc.)"), isOn: $selShowHanyuPinyinInCompositionBuffer.onChange {
isOn: $selEnableFartSuppressor.onChange { mgrPrefs.showHanyuPinyinInCompositionBuffer = selShowHanyuPinyinInCompositionBuffer
mgrPrefs.shouldNotFartInLieuOfBeep = selEnableFartSuppressor }
clsSFX.beep() )
} Toggle(
) LocalizedStringKey("Commit Hanyu-Pinyin instead on Ctrl(+Option)+Command+Enter"),
} isOn: $selInlineDumpPinyinInLieuOfZhuyin.onChange {
Preferences.Section(label: { Text(LocalizedStringKey("Misc Settings:")).controlSize(.small) }) { mgrPrefs.inlineDumpPinyinInLieuOfZhuyin = selInlineDumpPinyinInLieuOfZhuyin
Toggle( }
LocalizedStringKey("Check for updates automatically"), )
isOn: $selEnableAutoUpdateCheck.onChange { Toggle(
mgrPrefs.checkUpdateAutomatically = selEnableAutoUpdateCheck LocalizedStringKey("Stop farting (when typed phonetic combination is invalid, etc.)"),
} isOn: $selEnableFartSuppressor.onChange {
) mgrPrefs.shouldNotFartInLieuOfBeep = selEnableFartSuppressor
.controlSize(.small) clsSFX.beep()
Toggle( }
LocalizedStringKey("Debug Mode"), )
isOn: $selEnableDebugMode.onChange { }
mgrPrefs.isDebugModeEnabled = selEnableDebugMode Preferences.Section(label: { Text(LocalizedStringKey("Misc Settings:")).controlSize(.small) }) {
} Toggle(
) LocalizedStringKey("Check for updates automatically"),
.controlSize(.small) isOn: $selEnableAutoUpdateCheck.onChange {
mgrPrefs.checkUpdateAutomatically = selEnableAutoUpdateCheck
}
)
.controlSize(.small)
Toggle(
LocalizedStringKey("Debug Mode"),
isOn: $selEnableDebugMode.onChange {
mgrPrefs.isDebugModeEnabled = selEnableDebugMode
}
)
.controlSize(.small)
}
} }
} }
.frame(maxHeight: contentMaxHeight).fixedSize(horizontal: false, vertical: true)
.background(VisualEffectView(material: .sidebar, blendingMode: .behindWindow))
} }
} }

View File

@ -28,6 +28,7 @@ struct suiPrefPaneKeyboard: View {
@State private var selUsingHotKeyCurrencyNumerals = UserDefaults.standard.bool( @State private var selUsingHotKeyCurrencyNumerals = UserDefaults.standard.bool(
forKey: UserDef.kUsingHotKeyCurrencyNumerals.rawValue) forKey: UserDef.kUsingHotKeyCurrencyNumerals.rawValue)
private let contentMaxHeight: Double = 430
private let contentWidth: Double = { private let contentWidth: Double = {
switch mgrPrefs.appleLanguages[0] { switch mgrPrefs.appleLanguages[0] {
case "ja": case "ja":
@ -42,192 +43,201 @@ struct suiPrefPaneKeyboard: View {
}() }()
var body: some View { var body: some View {
Preferences.Container(contentWidth: contentWidth) { ScrollView {
Preferences.Section(label: { Text(LocalizedStringKey("Selection Keys:")) }) { Preferences.Container(contentWidth: contentWidth) {
ComboBox( Preferences.Section(label: { Text(LocalizedStringKey("Selection Keys:")) }) {
items: mgrPrefs.suggestedCandidateKeys, ComboBox(
text: $selSelectionKeys.onChange { items: mgrPrefs.suggestedCandidateKeys,
let value = selSelectionKeys text: $selSelectionKeys.onChange {
let keys: String = value.trimmingCharacters(in: .whitespacesAndNewlines).deduplicate let value = selSelectionKeys
do { let keys: String = value.trimmingCharacters(in: .whitespacesAndNewlines).deduplicate
try mgrPrefs.validate(candidateKeys: keys) do {
mgrPrefs.candidateKeys = keys try mgrPrefs.validate(candidateKeys: keys)
selSelectionKeys = mgrPrefs.candidateKeys mgrPrefs.candidateKeys = keys
} catch mgrPrefs.CandidateKeyError.empty { selSelectionKeys = mgrPrefs.candidateKeys
selSelectionKeys = mgrPrefs.candidateKeys } catch mgrPrefs.CandidateKeyError.empty {
} catch { selSelectionKeys = mgrPrefs.candidateKeys
if let window = ctlPrefUI.shared.controller.window { } catch {
let alert = NSAlert(error: error) if let window = ctlPrefUI.shared.controller.window {
alert.beginSheetModal(for: window) { _ in let alert = NSAlert(error: error)
selSelectionKeys = mgrPrefs.candidateKeys alert.beginSheetModal(for: window) { _ in
selSelectionKeys = mgrPrefs.candidateKeys
}
clsSFX.beep()
} }
clsSFX.beep()
} }
} }
} ).frame(width: 180).disabled(mgrPrefs.useIMKCandidateWindow)
).frame(width: 180)
Text(
LocalizedStringKey(
"Choose or hit Enter to confim your prefered keys for selecting candidates."
)
)
.preferenceDescription()
}
Preferences.Section(label: { Text(LocalizedStringKey("Phonetic Parser:")) }) {
HStack {
Picker(
"",
selection: $selMandarinParser.onChange {
let value = selMandarinParser
mgrPrefs.mandarinParser = value
switch value {
case 0:
if !AppleKeyboardConverter.arrDynamicBasicKeyLayout.contains(mgrPrefs.basicKeyboardLayout) {
mgrPrefs.basicKeyboardLayout = "com.apple.keylayout.ZhuyinBopomofo"
selBasicKeyboardLayout = mgrPrefs.basicKeyboardLayout
}
default:
if AppleKeyboardConverter.arrDynamicBasicKeyLayout.contains(mgrPrefs.basicKeyboardLayout) {
mgrPrefs.basicKeyboardLayout = "com.apple.keylayout.ABC"
selBasicKeyboardLayout = mgrPrefs.basicKeyboardLayout
}
}
}
) {
Group {
Text(LocalizedStringKey("Dachen (Microsoft Standard / Wang / 01, etc.)")).tag(0)
Text(LocalizedStringKey("Eten Traditional")).tag(1)
Text(LocalizedStringKey("IBM")).tag(4)
Text(LocalizedStringKey("MiTAC")).tag(5)
Text(LocalizedStringKey("Seigyou")).tag(8)
Text(LocalizedStringKey("Fake Seigyou")).tag(6)
}
Divider()
Group {
Text(LocalizedStringKey("Dachen 26 (libChewing)")).tag(7)
Text(LocalizedStringKey("Eten 26")).tag(3)
Text(LocalizedStringKey("Hsu")).tag(2)
Text(LocalizedStringKey("Starlight")).tag(9)
}
Divider()
Group {
Text(LocalizedStringKey("Hanyu Pinyin with Numeral Intonation")).tag(10)
Text(LocalizedStringKey("Secondary Pinyin with Numeral Intonation")).tag(11)
Text(LocalizedStringKey("Yale Pinyin with Numeral Intonation")).tag(12)
Text(LocalizedStringKey("Hualuo Pinyin with Numeral Intonation")).tag(13)
Text(LocalizedStringKey("Universal Pinyin with Numeral Intonation")).tag(14)
}
}
.labelsHidden()
Button {
mgrPrefs.mandarinParser = 0
selMandarinParser = mgrPrefs.mandarinParser
mgrPrefs.basicKeyboardLayout = "com.apple.keylayout.ZhuyinBopomofo"
selBasicKeyboardLayout = mgrPrefs.basicKeyboardLayout
} label: {
Text("↻ㄅ")
}
Button {
mgrPrefs.mandarinParser = 10
selMandarinParser = mgrPrefs.mandarinParser
mgrPrefs.basicKeyboardLayout = "com.apple.keylayout.ABC"
selBasicKeyboardLayout = mgrPrefs.basicKeyboardLayout
} label: {
Text("↻A")
}
}
.frame(width: 380.0)
Text(LocalizedStringKey("Choose the phonetic layout for Mandarin parser."))
.preferenceDescription()
}
Preferences.Section(bottomDivider: true, label: { Text(LocalizedStringKey("Basic Keyboard Layout:")) }) {
HStack {
Picker(
"",
selection: $selBasicKeyboardLayout.onChange {
let value = selBasicKeyboardLayout
mgrPrefs.basicKeyboardLayout = value
if AppleKeyboardConverter.arrDynamicBasicKeyLayout.contains(value) {
mgrPrefs.mandarinParser = 0
selMandarinParser = mgrPrefs.mandarinParser
}
}
) {
ForEach(0...(IME.arrEnumerateSystemKeyboardLayouts.count - 1), id: \.self) { id in
Text(IME.arrEnumerateSystemKeyboardLayouts[id].strName).tag(
IME.arrEnumerateSystemKeyboardLayouts[id].strValue)
}.id(UUID())
}
.labelsHidden()
.frame(width: 240.0)
}
Text(LocalizedStringKey("Choose the macOS-level basic keyboard layout."))
.preferenceDescription()
}
Preferences.Section(bottomDivider: true, label: { Text(LocalizedStringKey("Keyboard Shortcuts:")) }) {
Toggle(
LocalizedStringKey("Per-Char Select Mode"),
isOn: $selUsingHotKeySCPC.onChange {
mgrPrefs.usingHotKeySCPC = selUsingHotKeySCPC
}
)
Toggle(
LocalizedStringKey("Per-Char Associated Phrases"),
isOn: $selUsingHotKeyAssociates.onChange {
mgrPrefs.usingHotKeyAssociates = selUsingHotKeyAssociates
}
)
Toggle(
LocalizedStringKey("CNS11643 Mode"),
isOn: $selUsingHotKeyCNS.onChange {
mgrPrefs.usingHotKeyCNS = selUsingHotKeyCNS
}
)
Toggle(
LocalizedStringKey("Force KangXi Writing"),
isOn: $selUsingHotKeyKangXi.onChange {
mgrPrefs.usingHotKeyKangXi = selUsingHotKeyKangXi
}
)
Toggle(
LocalizedStringKey("JIS Shinjitai Output"),
isOn: $selUsingHotKeyJIS.onChange {
mgrPrefs.usingHotKeyJIS = selUsingHotKeyJIS
}
)
Toggle(
LocalizedStringKey("Half-Width Punctuation Mode"),
isOn: $selUsingHotKeyHalfWidthASCII.onChange {
mgrPrefs.usingHotKeyHalfWidthASCII = selUsingHotKeyHalfWidthASCII
}
)
Toggle(
LocalizedStringKey("Currency Numeral Output"),
isOn: $selUsingHotKeyCurrencyNumerals.onChange {
mgrPrefs.usingHotKeyCurrencyNumerals = selUsingHotKeyCurrencyNumerals
}
)
}
}
Divider()
Preferences.Container(contentWidth: contentWidth) {
Preferences.Section(title: "") {
VStack(alignment: .leading, spacing: 10) {
Text( Text(
LocalizedStringKey( LocalizedStringKey(
"Non-QWERTY alphanumerical keyboard layouts are for Hanyu Pinyin parser only." "Choose or hit Enter to confim your prefered keys for selecting candidates."
)
)
.preferenceDescription()
Text(
LocalizedStringKey(
"Apple Dynamic Bopomofo Basic Keyboard Layouts (Dachen & Eten Traditional) must match the Dachen parser in order to be functional."
) )
) )
.preferenceDescription() .preferenceDescription()
} }
Preferences.Section(label: { Text(LocalizedStringKey("Phonetic Parser:")) }) {
HStack {
Picker(
"",
selection: $selMandarinParser.onChange {
let value = selMandarinParser
mgrPrefs.mandarinParser = value
switch value {
case 0:
if !AppleKeyboardConverter.arrDynamicBasicKeyLayout.contains(mgrPrefs.basicKeyboardLayout) {
mgrPrefs.basicKeyboardLayout = "com.apple.keylayout.ZhuyinBopomofo"
selBasicKeyboardLayout = mgrPrefs.basicKeyboardLayout
}
default:
if AppleKeyboardConverter.arrDynamicBasicKeyLayout.contains(mgrPrefs.basicKeyboardLayout) {
mgrPrefs.basicKeyboardLayout = "com.apple.keylayout.ABC"
selBasicKeyboardLayout = mgrPrefs.basicKeyboardLayout
}
}
}
) {
Group {
Text(LocalizedStringKey("Dachen (Microsoft Standard / Wang / 01, etc.)")).tag(0)
Text(LocalizedStringKey("Eten Traditional")).tag(1)
Text(LocalizedStringKey("IBM")).tag(4)
Text(LocalizedStringKey("MiTAC")).tag(5)
Text(LocalizedStringKey("Seigyou")).tag(8)
Text(LocalizedStringKey("Fake Seigyou")).tag(6)
}
Divider()
Group {
Text(LocalizedStringKey("Dachen 26 (libChewing)")).tag(7)
Text(LocalizedStringKey("Eten 26")).tag(3)
Text(LocalizedStringKey("Hsu")).tag(2)
Text(LocalizedStringKey("Starlight")).tag(9)
}
Divider()
Group {
Text(LocalizedStringKey("Hanyu Pinyin with Numeral Intonation")).tag(10)
Text(LocalizedStringKey("Secondary Pinyin with Numeral Intonation")).tag(11)
Text(LocalizedStringKey("Yale Pinyin with Numeral Intonation")).tag(12)
Text(LocalizedStringKey("Hualuo Pinyin with Numeral Intonation")).tag(13)
Text(LocalizedStringKey("Universal Pinyin with Numeral Intonation")).tag(14)
}
}
.labelsHidden()
Button {
mgrPrefs.mandarinParser = 0
selMandarinParser = mgrPrefs.mandarinParser
mgrPrefs.basicKeyboardLayout = "com.apple.keylayout.ZhuyinBopomofo"
selBasicKeyboardLayout = mgrPrefs.basicKeyboardLayout
} label: {
Text("↻ㄅ")
}
Button {
mgrPrefs.mandarinParser = 10
selMandarinParser = mgrPrefs.mandarinParser
mgrPrefs.basicKeyboardLayout = "com.apple.keylayout.ABC"
selBasicKeyboardLayout = mgrPrefs.basicKeyboardLayout
} label: {
Text("↻A")
}
}
.frame(width: 380.0)
HStack {
Text(
NSLocalizedString(
"Choose the phonetic layout for Mandarin parser.",
comment: ""
) + (mgrPrefs.appleLanguages[0].contains("en") ? " " : "")
+ NSLocalizedString(
"Apple Dynamic Bopomofo Basic Keyboard Layouts (Dachen & Eten Traditional) must match the Dachen parser in order to be functional.",
comment: ""
)
)
.preferenceDescription().fixedSize(horizontal: false, vertical: true)
Spacer().frame(width: 30)
}
}
Preferences.Section(bottomDivider: true, label: { Text(LocalizedStringKey("Basic Keyboard Layout:")) }) {
HStack {
Picker(
"",
selection: $selBasicKeyboardLayout.onChange {
let value = selBasicKeyboardLayout
mgrPrefs.basicKeyboardLayout = value
if AppleKeyboardConverter.arrDynamicBasicKeyLayout.contains(value) {
mgrPrefs.mandarinParser = 0
selMandarinParser = mgrPrefs.mandarinParser
}
}
) {
ForEach(0...(IME.arrEnumerateSystemKeyboardLayouts.count - 1), id: \.self) { id in
Text(IME.arrEnumerateSystemKeyboardLayouts[id].strName).tag(
IME.arrEnumerateSystemKeyboardLayouts[id].strValue)
}.id(UUID())
}
.labelsHidden()
.frame(width: 240.0)
}
HStack {
Text(
NSLocalizedString(
"Choose the macOS-level basic keyboard layout.",
comment: ""
) + (mgrPrefs.appleLanguages[0].contains("en") ? " " : "")
+ NSLocalizedString(
"Non-QWERTY alphanumerical keyboard layouts are for Pinyin parser only.",
comment: ""
)
)
.preferenceDescription().fixedSize(horizontal: false, vertical: true)
Spacer().frame(width: 30)
}
}
Preferences.Section(bottomDivider: true, label: { Text(LocalizedStringKey("Keyboard Shortcuts:")) }) {
Toggle(
LocalizedStringKey("Per-Char Select Mode"),
isOn: $selUsingHotKeySCPC.onChange {
mgrPrefs.usingHotKeySCPC = selUsingHotKeySCPC
}
)
Toggle(
LocalizedStringKey("Per-Char Associated Phrases"),
isOn: $selUsingHotKeyAssociates.onChange {
mgrPrefs.usingHotKeyAssociates = selUsingHotKeyAssociates
}
)
Toggle(
LocalizedStringKey("CNS11643 Mode"),
isOn: $selUsingHotKeyCNS.onChange {
mgrPrefs.usingHotKeyCNS = selUsingHotKeyCNS
}
)
Toggle(
LocalizedStringKey("Force KangXi Writing"),
isOn: $selUsingHotKeyKangXi.onChange {
mgrPrefs.usingHotKeyKangXi = selUsingHotKeyKangXi
}
)
Toggle(
LocalizedStringKey("JIS Shinjitai Output"),
isOn: $selUsingHotKeyJIS.onChange {
mgrPrefs.usingHotKeyJIS = selUsingHotKeyJIS
}
)
Toggle(
LocalizedStringKey("Half-Width Punctuation Mode"),
isOn: $selUsingHotKeyHalfWidthASCII.onChange {
mgrPrefs.usingHotKeyHalfWidthASCII = selUsingHotKeyHalfWidthASCII
}
)
Toggle(
LocalizedStringKey("Currency Numeral Output"),
isOn: $selUsingHotKeyCurrencyNumerals.onChange {
mgrPrefs.usingHotKeyCurrencyNumerals = selUsingHotKeyCurrencyNumerals
}
)
}
} }
} }
.frame(maxHeight: contentMaxHeight).fixedSize(horizontal: false, vertical: true)
.background(VisualEffectView(material: .sidebar, blendingMode: .behindWindow))
} }
} }

View File

@ -29,7 +29,7 @@
"\"%@\" length must ≥ 2 for a user phrase." = "\"%@\" length must ≥ 2 for a user phrase."; "\"%@\" length must ≥ 2 for a user phrase." = "\"%@\" length must ≥ 2 for a user phrase.";
"\"%@\" length should ≤ %d for a user phrase." = "\"%@\" length should ≤ %d for a user phrase."; "\"%@\" length should ≤ %d for a user phrase." = "\"%@\" length should ≤ %d for a user phrase.";
"\"%@\" selected. ENTER to add user phrase." = "\"%@\" selected. ENTER to add user phrase."; "\"%@\" selected. ENTER to add user phrase." = "\"%@\" selected. ENTER to add user phrase.";
"\"%@\" already exists: ENTER to boost, SHIFT+CMD+ENTER to nerf, \n BackSpace or Delete key to exclude." = "\"%@\" already exists: ENTER to boost, SHIFT+CMD+ENTER to nerf, \n BackSpace or Delete key to exclude."; "\"%@\" already exists: ENTER to boost, SHIFT+COMMAND+ENTER to nerf, \n BackSpace or Delete key to exclude." = "\"%@\" already exists: ENTER to boost, SHIFT+COMMAND+ENTER to nerf, \n BackSpace or Delete key to exclude.";
"Edit Phrase Replacement Table…" = "Edit Phrase Replacement Table…"; "Edit Phrase Replacement Table…" = "Edit Phrase Replacement Table…";
"Use Phrase Replacement" = "Use Phrase Replacement"; "Use Phrase Replacement" = "Use Phrase Replacement";
"Candidates keys cannot be empty." = "Candidates keys cannot be empty."; "Candidates keys cannot be empty." = "Candidates keys cannot be empty.";
@ -88,6 +88,7 @@
// SwiftUI Preferences // SwiftUI Preferences
"(Shift+)Space:" = "(Shift+)Space:"; "(Shift+)Space:" = "(Shift+)Space:";
"Adjust the window level of IMK Candidate Window" = "Adjust the window level of IMK Candidate Window";
"Allow backspace-editing miscomposed readings" = "Allow backspace-editing miscomposed readings"; "Allow backspace-editing miscomposed readings" = "Allow backspace-editing miscomposed readings";
"Allow boosting / excluding a candidate of single kanji" = "Allow boosting / excluding a candidate of single kanji"; "Allow boosting / excluding a candidate of single kanji" = "Allow boosting / excluding a candidate of single kanji";
"Allow using Enter key to confirm associated candidate selection" = "Allow using Enter key to confirm associated candidate selection"; "Allow using Enter key to confirm associated candidate selection" = "Allow using Enter key to confirm associated candidate selection";
@ -119,6 +120,8 @@
"Choose the phonetic layout for Mandarin parser." = "Choose the phonetic layout for Mandarin parser."; "Choose the phonetic layout for Mandarin parser." = "Choose the phonetic layout for Mandarin parser.";
"Choose your desired user data folder path. Will be omitted if invalid." = "Choose your desired user data folder path. Will be omitted if invalid."; "Choose your desired user data folder path. Will be omitted if invalid." = "Choose your desired user data folder path. Will be omitted if invalid.";
"Choose your preferred layout of the candidate window." = "Choose your preferred layout of the candidate window."; "Choose your preferred layout of the candidate window." = "Choose your preferred layout of the candidate window.";
"Commit Hanyu-Pinyin instead on Ctrl(+Option)+Command+Enter" = "Commit Hanyu-Pinyin instead on Ctrl(+Option)+Command+Enter";
"Completely disable using Shift key to toggling alphanumerical mode" = "Completely disable using Shift key to toggling alphanumerical mode";
"Cursor Selection:" = "Cursor Selection:"; "Cursor Selection:" = "Cursor Selection:";
"Dachen (Microsoft Standard / Wang / 01, etc.)" = "Dachen (Microsoft Standard / Wang / 01, etc.)"; "Dachen (Microsoft Standard / Wang / 01, etc.)" = "Dachen (Microsoft Standard / Wang / 01, etc.)";
"Dachen 26 (libChewing)" = "Dachen 26 (libChewing)"; "Dachen 26 (libChewing)" = "Dachen 26 (libChewing)";
@ -145,15 +148,15 @@
"Hsu" = "Hsu"; "Hsu" = "Hsu";
"Hualuo Pinyin with Numeral Intonation" = "Hualuo Pinyin with Numeral Intonation"; "Hualuo Pinyin with Numeral Intonation" = "Hualuo Pinyin with Numeral Intonation";
"IBM" = "IBM"; "IBM" = "IBM";
"IMK candidate window is plagued with issues like failed selection keys." = "IMK candidate window is plagued with issues like failed selection keys."; "IMK Candidate Window has a bug (#FB11300759) that it is always shown below NSMenu and Spotlight window by default. By toggling this checkbox, vChewing will attempt to adjust its window level according to its current context. However, this accomodation itself has a bug (also filed in #FB11300759): as long as vChewing application restarted once, IMK Candidate Window will always be shown beneath all other windows in the current desktop." = "IMK Candidate Window has a bug (#FB11300759) that it is always shown below NSMenu and Spotlight window by default. By toggling this checkbox, vChewing will attempt to adjust its window level according to its current context. However, this accomodation itself has a bug (also filed in #FB11300759): as long as vChewing application restarted once, IMK Candidate Window will always be shown beneath all other windows in the current desktop.";
"IMK candidate window is plagued with issues and incapabilities." = "IMK candidate window is plagued with issues and incapabilities.";
"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 Shortcuts:" = "Keyboard Shortcuts:"; "Keyboard Shortcuts:" = "Keyboard Shortcuts:";
"Keyboard" = "Keyboard"; "Keyboard" = "Keyboard";
"Misc Settings:" = "Misc Settings:"; "Misc Settings:" = "Misc Settings:";
"MiTAC" = "MiTAC"; "MiTAC" = "MiTAC";
"Non-QWERTY alphanumerical keyboard layouts are for Hanyu Pinyin parser only." = "Non-QWERTY alphanumerical keyboard layouts are for Hanyu Pinyin parser only."; "Non-QWERTY alphanumerical keyboard layouts are for Pinyin parser only." = "Non-QWERTY alphanumerical keyboard layouts are for Pinyin parser only.";
"Output Hanyu-Pinyin in lieu of Zhuyin when Ctrl(+Alt)+CMD+Enter" = "Output Hanyu-Pinyin in lieu of Zhuyin when Ctrl(+Alt)+CMD+Enter";
"Output Settings:" = "Output Settings:"; "Output Settings:" = "Output Settings:";
"Phonetic Parser:" = "Phonetic Parser:"; "Phonetic Parser:" = "Phonetic Parser:";
"Push the cursor in front of the phrase after selection" = "Push the cursor in front of the phrase after selection"; "Push the cursor in front of the phrase after selection" = "Push the cursor in front of the phrase after selection";

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 256 KiB

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

View File

@ -29,7 +29,7 @@
"\"%@\" length must ≥ 2 for a user phrase." = "\"%@\" length must ≥ 2 for a user phrase."; "\"%@\" length must ≥ 2 for a user phrase." = "\"%@\" length must ≥ 2 for a user phrase.";
"\"%@\" length should ≤ %d for a user phrase." = "\"%@\" length should ≤ %d for a user phrase."; "\"%@\" length should ≤ %d for a user phrase." = "\"%@\" length should ≤ %d for a user phrase.";
"\"%@\" selected. ENTER to add user phrase." = "\"%@\" selected. ENTER to add user phrase."; "\"%@\" selected. ENTER to add user phrase." = "\"%@\" selected. ENTER to add user phrase.";
"\"%@\" already exists: ENTER to boost, SHIFT+CMD+ENTER to nerf, \n BackSpace or Delete key to exclude." = "\"%@\" already exists: ENTER to boost, SHIFT+CMD+ENTER to nerf, \n BackSpace or Delete key to exclude."; "\"%@\" already exists: ENTER to boost, SHIFT+COMMAND+ENTER to nerf, \n BackSpace or Delete key to exclude." = "\"%@\" already exists: ENTER to boost, SHIFT+COMMAND+ENTER to nerf, \n BackSpace or Delete key to exclude.";
"Edit Phrase Replacement Table…" = "Edit Phrase Replacement Table…"; "Edit Phrase Replacement Table…" = "Edit Phrase Replacement Table…";
"Use Phrase Replacement" = "Use Phrase Replacement"; "Use Phrase Replacement" = "Use Phrase Replacement";
"Candidates keys cannot be empty." = "Candidates keys cannot be empty."; "Candidates keys cannot be empty." = "Candidates keys cannot be empty.";
@ -88,6 +88,7 @@
// SwiftUI Preferences // SwiftUI Preferences
"(Shift+)Space:" = "(Shift+)Space:"; "(Shift+)Space:" = "(Shift+)Space:";
"Adjust the window level of IMK Candidate Window" = "Adjust the window level of IMK Candidate Window";
"Allow backspace-editing miscomposed readings" = "Allow backspace-editing miscomposed readings"; "Allow backspace-editing miscomposed readings" = "Allow backspace-editing miscomposed readings";
"Allow boosting / excluding a candidate of single kanji" = "Allow boosting / excluding a candidate of single kanji"; "Allow boosting / excluding a candidate of single kanji" = "Allow boosting / excluding a candidate of single kanji";
"Allow using Enter key to confirm associated candidate selection" = "Allow using Enter key to confirm associated candidate selection"; "Allow using Enter key to confirm associated candidate selection" = "Allow using Enter key to confirm associated candidate selection";
@ -119,6 +120,7 @@
"Choose the phonetic layout for Mandarin parser." = "Choose the phonetic layout for Mandarin parser."; "Choose the phonetic layout for Mandarin parser." = "Choose the phonetic layout for Mandarin parser.";
"Choose your desired user data folder path. Will be omitted if invalid." = "Choose your desired user data folder path. Will be omitted if invalid."; "Choose your desired user data folder path. Will be omitted if invalid." = "Choose your desired user data folder path. Will be omitted if invalid.";
"Choose your preferred layout of the candidate window." = "Choose your preferred layout of the candidate window."; "Choose your preferred layout of the candidate window." = "Choose your preferred layout of the candidate window.";
"Commit Hanyu-Pinyin instead on Ctrl(+Option)+Command+Enter" = "Commit Hanyu-Pinyin instead on Ctrl(+Option)+Command+Enter";
"Completely disable using Shift key to toggling alphanumerical mode" = "Completely disable using Shift key to toggling alphanumerical mode"; "Completely disable using Shift key to toggling alphanumerical mode" = "Completely disable using Shift key to toggling alphanumerical mode";
"Cursor Selection:" = "Cursor Selection:"; "Cursor Selection:" = "Cursor Selection:";
"Dachen (Microsoft Standard / Wang / 01, etc.)" = "Dachen (Microsoft Standard / Wang / 01, etc.)"; "Dachen (Microsoft Standard / Wang / 01, etc.)" = "Dachen (Microsoft Standard / Wang / 01, etc.)";
@ -146,15 +148,15 @@
"Hsu" = "Hsu"; "Hsu" = "Hsu";
"Hualuo Pinyin with Numeral Intonation" = "Hualuo Pinyin with Numeral Intonation"; "Hualuo Pinyin with Numeral Intonation" = "Hualuo Pinyin with Numeral Intonation";
"IBM" = "IBM"; "IBM" = "IBM";
"IMK candidate window is plagued with issues like failed selection keys." = "IMK candidate window is plagued with issues like failed selection keys."; "IMK Candidate Window has a bug (#FB11300759) that it is always shown below NSMenu and Spotlight window by default. By toggling this checkbox, vChewing will attempt to adjust its window level according to its current context. However, this accomodation itself has a bug (also filed in #FB11300759): as long as vChewing application restarted once, IMK Candidate Window will always be shown beneath all other windows in the current desktop." = "IMK Candidate Window has a bug (#FB11300759) that it is always shown below NSMenu and Spotlight window by default. By toggling this checkbox, vChewing will attempt to adjust its window level according to its current context. However, this accomodation itself has a bug (also filed in #FB11300759): as long as vChewing application restarted once, IMK Candidate Window will always be shown beneath all other windows in the current desktop.";
"IMK candidate window is plagued with issues and incapabilities." = "IMK candidate window is plagued with issues and incapabilities.";
"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 Shortcuts:" = "Keyboard Shortcuts:"; "Keyboard Shortcuts:" = "Keyboard Shortcuts:";
"Keyboard" = "Keyboard"; "Keyboard" = "Keyboard";
"Misc Settings:" = "Misc Settings:"; "Misc Settings:" = "Misc Settings:";
"MiTAC" = "MiTAC"; "MiTAC" = "MiTAC";
"Non-QWERTY alphanumerical keyboard layouts are for Hanyu Pinyin parser only." = "Non-QWERTY alphanumerical keyboard layouts are for Hanyu Pinyin parser only."; "Non-QWERTY alphanumerical keyboard layouts are for Pinyin parser only." = "Non-QWERTY alphanumerical keyboard layouts are for Pinyin parser only.";
"Output Hanyu-Pinyin in lieu of Zhuyin when Ctrl(+Alt)+CMD+Enter" = "Output Hanyu-Pinyin in lieu of Zhuyin when Ctrl(+Alt)+CMD+Enter";
"Output Settings:" = "Output Settings:"; "Output Settings:" = "Output Settings:";
"Phonetic Parser:" = "Phonetic Parser:"; "Phonetic Parser:" = "Phonetic Parser:";
"Push the cursor in front of the phrase after selection" = "Push the cursor in front of the phrase after selection"; "Push the cursor in front of the phrase after selection" = "Push the cursor in front of the phrase after selection";

View File

@ -29,7 +29,7 @@
"\"%@\" length must ≥ 2 for a user phrase." = "「%@」もう1つ文字のお選びを。"; "\"%@\" length must ≥ 2 for a user phrase." = "「%@」もう1つ文字のお選びを。";
"\"%@\" length should ≤ %d for a user phrase." = "「%@」文字数過剰で登録不可、%d 文字以内にして下さい。"; "\"%@\" length should ≤ %d for a user phrase." = "「%@」文字数過剰で登録不可、%d 文字以内にして下さい。";
"\"%@\" selected. ENTER to add user phrase." = "「%@」を ENTER で辞書に登録。"; "\"%@\" selected. ENTER to add user phrase." = "「%@」を ENTER で辞書に登録。";
"\"%@\" already exists: ENTER to boost, SHIFT+CMD+ENTER to nerf, \n BackSpace or Delete key to exclude." = "「%@」は既存語彙ENTER で最優先にし、SHIFT+CMD+ENTER で優先順位を下げる;\n BackSpace 或いは Delete で排除。"; "\"%@\" already exists: ENTER to boost, SHIFT+COMMAND+ENTER to nerf, \n BackSpace or Delete key to exclude." = "「%@」は既存語彙ENTER で最優先にし、SHIFT+COMMAND+ENTER で優先順位を下げる;\n BackSpace 或いは Delete で排除。";
"Edit Phrase Replacement Table…" = "言葉置換表を編集…"; "Edit Phrase Replacement Table…" = "言葉置換表を編集…";
"Use Phrase Replacement" = "言葉置換機能"; "Use Phrase Replacement" = "言葉置換機能";
"Candidates keys cannot be empty." = "言選り用キー陣列に何かキーをご登録ください。"; "Candidates keys cannot be empty." = "言選り用キー陣列に何かキーをご登録ください。";
@ -88,6 +88,7 @@
// SwiftUI Preferences // SwiftUI Preferences
"(Shift+)Space:" = "(Shift+)Space:"; "(Shift+)Space:" = "(Shift+)Space:";
"Adjust the window level of IMK Candidate Window" = "IMK 候補陳列ウィンドウの表示の優先順位を調整する";
"Allow backspace-editing miscomposed readings" = "効かぬ音読みを BackSpace で再編集"; "Allow backspace-editing miscomposed readings" = "効かぬ音読みを BackSpace で再編集";
"Allow boosting / excluding a candidate of single kanji" = "即排除/即最優先にできる候補の文字数の最低限は1字とする"; "Allow boosting / excluding a candidate of single kanji" = "即排除/即最優先にできる候補の文字数の最低限は1字とする";
"Allow using Enter key to confirm associated candidate selection" = "Enter キーを連想語彙候補の確認のために使う"; "Allow using Enter key to confirm associated candidate selection" = "Enter キーを連想語彙候補の確認のために使う";
@ -119,6 +120,7 @@
"Choose the phonetic layout for Mandarin parser." = "共通語分析器の注音配列をご指定ください。"; "Choose the phonetic layout for Mandarin parser." = "共通語分析器の注音配列をご指定ください。";
"Choose your desired user data folder path. Will be omitted if invalid." = "欲しがるユーザー辞書保存先をご指定ください。無効なる保存先設定は省かれる。"; "Choose your desired user data folder path. Will be omitted if invalid." = "欲しがるユーザー辞書保存先をご指定ください。無効なる保存先設定は省かれる。";
"Choose your preferred layout of the candidate window." = "入力候補陳列の仕様をご指定ください。"; "Choose your preferred layout of the candidate window." = "入力候補陳列の仕様をご指定ください。";
"Commit Hanyu-Pinyin instead on Ctrl(+Option)+Command+Enter" = "Ctrl(+Option)+Command+Enter で出すのを漢語弁音と変換";
"Completely disable using Shift key to toggling alphanumerical mode" = "Shift キーの英数入力モードの切り替え機能を徹底的に禁ず"; "Completely disable using Shift key to toggling alphanumerical mode" = "Shift キーの英数入力モードの切り替え機能を徹底的に禁ず";
"Cursor Selection:" = "カーソル候補呼出:"; "Cursor Selection:" = "カーソル候補呼出:";
"Dachen (Microsoft Standard / Wang / 01, etc.)" = "大千配列 (Microsoft 標準・王安・零壹など)"; "Dachen (Microsoft Standard / Wang / 01, etc.)" = "大千配列 (Microsoft 標準・王安・零壹など)";
@ -146,15 +148,15 @@
"Hsu" = "許氏国音自然配列"; "Hsu" = "許氏国音自然配列";
"Hualuo Pinyin with Numeral Intonation" = "中華ローマ弁音 (ローマ字+数字音調)"; "Hualuo Pinyin with Numeral Intonation" = "中華ローマ弁音 (ローマ字+数字音調)";
"IBM" = "IBM 配列"; "IBM" = "IBM 配列";
"IMK candidate window is plagued with issues like failed selection keys." = "IMK 候補陳列ウィンドウで言選り用キーは現時点で利用不可、尚他故障あり。"; "IMK Candidate Window has a bug (#FB11300759) that it is always shown below NSMenu and Spotlight window by default. By toggling this checkbox, vChewing will attempt to adjust its window level according to its current context. However, this accomodation itself has a bug (also filed in #FB11300759): as long as vChewing application restarted once, IMK Candidate Window will always be shown beneath all other windows in the current desktop." = "IMK 候補陳列ウィンドウにはこういう欠陥がある (#FB11300759):何の特殊措置をしない限り、候補陳列ウィンドウは常に NSMenu と Spotlight に遮られている。これをチェックすれば、毎度候補陳列ウィンドウを呼ぶたびに、候補陳列ウィンドウの表示の優先順位を自動的に調整する。だが、この特殊措置こそが、完璧とは言えぬ(この欠陥も #FB11300759 に記されておる一旦入力アプリ自身が再起動すると、このパソコンの再起動まで、IMK 候補陳列ウィンドウは所在のデスクトップの全てのウィンドウの後ろに隠されてしまうことになる。";
"IMK candidate window is plagued with issues and incapabilities." = "IMK 候補陳列ウィンドウで言選り用キーは現時点で調整不可、且つ他故障あり。";
"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 Shortcuts:" = "ショートカット:"; "Keyboard Shortcuts:" = "ショートカット:";
"Keyboard" = "配列設定"; "Keyboard" = "配列設定";
"Misc Settings:" = "他の設定:"; "Misc Settings:" = "他の設定:";
"MiTAC" = "神通配列"; "MiTAC" = "神通配列";
"Non-QWERTY alphanumerical keyboard layouts are for Hanyu Pinyin parser only." = "QWERTY 以外の英数キーボードは漢語弁音以外の配列に不適用。"; "Non-QWERTY alphanumerical keyboard layouts are for Pinyin parser only." = "QWERTY 以外の英数キーボードは弁音以外の配列に不適用。";
"Output Hanyu-Pinyin in lieu of Zhuyin when Ctrl(+Alt)+CMD+Enter" = "Ctrl(+Alt)+CMD+Enter で出すのを漢語弁音と変換";
"Output Settings:" = "出力設定:"; "Output Settings:" = "出力設定:";
"Phonetic Parser:" = "注音配列:"; "Phonetic Parser:" = "注音配列:";
"Push the cursor in front of the phrase after selection" = "候補選択の直後、すぐカーソルを単語の向こうに推し進める"; "Push the cursor in front of the phrase after selection" = "候補選択の直後、すぐカーソルを単語の向こうに推し進める";

View File

@ -29,7 +29,7 @@
"\"%@\" length must ≥ 2 for a user phrase." = "「%@」字数不足以自订语汇。"; "\"%@\" length must ≥ 2 for a user phrase." = "「%@」字数不足以自订语汇。";
"\"%@\" length should ≤ %d for a user phrase." = "「%@」字数超过 %d、无法自订。"; "\"%@\" length should ≤ %d for a user phrase." = "「%@」字数超过 %d、无法自订。";
"\"%@\" selected. ENTER to add user phrase." = "「%@」敲 Enter 添入自订语汇。"; "\"%@\" selected. ENTER to add user phrase." = "「%@」敲 Enter 添入自订语汇。";
"\"%@\" already exists: ENTER to boost, SHIFT+CMD+ENTER to nerf, \n BackSpace or Delete key to exclude." = "「%@」已存在:敲 Enter 以升权、敲 Shift+CMD+Enter 以降权;\n 敲 BackSpace 或 Delete 以排除。"; "\"%@\" already exists: ENTER to boost, SHIFT+COMMAND+ENTER to nerf, \n BackSpace or Delete key to exclude." = "「%@」已存在:敲 Enter 以升权、敲 Shift+Command+Enter 以降权;\n 敲 BackSpace 或 Delete 以排除。";
"Edit Phrase Replacement Table…" = "编辑语汇置换表…"; "Edit Phrase Replacement Table…" = "编辑语汇置换表…";
"Use Phrase Replacement" = "使用语汇置换"; "Use Phrase Replacement" = "使用语汇置换";
"Candidates keys cannot be empty." = "您必须指定选字键。"; "Candidates keys cannot be empty." = "您必须指定选字键。";
@ -88,6 +88,7 @@
// SwiftUI Preferences // SwiftUI Preferences
"(Shift+)Space:" = "(Shift+)空格键:"; "(Shift+)Space:" = "(Shift+)空格键:";
"Adjust the window level of IMK Candidate Window" = "调整 IMK 选字窗的显示优先级";
"Allow backspace-editing miscomposed readings" = "允许对无效的读音使用 BackSpace 编辑"; "Allow backspace-editing miscomposed readings" = "允许对无效的读音使用 BackSpace 编辑";
"Allow boosting / excluding a candidate of single kanji" = "将可以就地升权/排除的候选字词的最短词长设为单个汉字"; "Allow boosting / excluding a candidate of single kanji" = "将可以就地升权/排除的候选字词的最短词长设为单个汉字";
"Allow using Enter key to confirm associated candidate selection" = "允许使用 Enter 确认当前选中的联想词"; "Allow using Enter key to confirm associated candidate selection" = "允许使用 Enter 确认当前选中的联想词";
@ -119,6 +120,7 @@
"Choose the phonetic layout for Mandarin parser." = "请指定普通话/国音分析器所使用的注音排列。"; "Choose the phonetic layout for Mandarin parser." = "请指定普通话/国音分析器所使用的注音排列。";
"Choose your desired user data folder path. Will be omitted if invalid." = "请在此指定您想指定的使用者语汇档案目录。无效值会被忽略。"; "Choose your desired user data folder path. Will be omitted if invalid." = "请在此指定您想指定的使用者语汇档案目录。无效值会被忽略。";
"Choose your preferred layout of the candidate window." = "选择您所偏好的候选字窗布局。"; "Choose your preferred layout of the candidate window." = "选择您所偏好的候选字窗布局。";
"Commit Hanyu-Pinyin instead on Ctrl(+Option)+Command+Enter" = "Ctrl(+Option)+Command+Enter 输出汉语拼音而非注音";
"Completely disable using Shift key to toggling alphanumerical mode" = "彻底禁止使用 Shift 键切换英数模式"; "Completely disable using Shift key to toggling alphanumerical mode" = "彻底禁止使用 Shift 键切换英数模式";
"Cursor Selection:" = "选字游标:"; "Cursor Selection:" = "选字游标:";
"Dachen (Microsoft Standard / Wang / 01, etc.)" = "大千排列 (微软标准/王安/零壹/仲鼎/国乔)"; "Dachen (Microsoft Standard / Wang / 01, etc.)" = "大千排列 (微软标准/王安/零壹/仲鼎/国乔)";
@ -146,15 +148,15 @@
"Hsu" = "许氏国音自然排列"; "Hsu" = "许氏国音自然排列";
"Hualuo Pinyin with Numeral Intonation" = "华罗拼音+数字标调"; "Hualuo Pinyin with Numeral Intonation" = "华罗拼音+数字标调";
"IBM" = "IBM 排列"; "IBM" = "IBM 排列";
"IMK candidate window is plagued with issues like failed selection keys." = "IMK 选字窗目前暂时无法正常使用选字键,并具其它未知故障。"; "IMK Candidate Window has a bug (#FB11300759) that it is always shown below NSMenu and Spotlight window by default. By toggling this checkbox, vChewing will attempt to adjust its window level according to its current context. However, this accomodation itself has a bug (also filed in #FB11300759): as long as vChewing application restarted once, IMK Candidate Window will always be shown beneath all other windows in the current desktop." = "IMK 选字窗有一处行为缺陷 (#FB11300759):在预设情况下,会始终被 NSMenu 和 Spotlight 挡住。启用该选项的话,威注音会试图根据当前状况自动调整该选字窗的显示优先级。然而,该保守治疗方案本身也有一个缺陷 (也备案于 #FB11300759):只要输入法本身有重新启动过,则 IMK 选字窗便会顽固地显示于当前桌面所有视窗的底部,直至重新开机为止。";
"IMK candidate window is plagued with issues and incapabilities." = "IMK 选字窗目前暂时无法正常自订选字键,并具其它未知故障。";
"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 Shortcuts:" = "键盘快捷键:"; "Keyboard Shortcuts:" = "键盘快捷键:";
"Keyboard" = "键盘设定"; "Keyboard" = "键盘设定";
"Misc Settings:" = "杂项:"; "Misc Settings:" = "杂项:";
"MiTAC" = "神通排列"; "MiTAC" = "神通排列";
"Non-QWERTY alphanumerical keyboard layouts are for Hanyu Pinyin parser only." = "QWERTY 以外的英数布局是为了汉语拼音排列使用者而准备的。"; "Non-QWERTY alphanumerical keyboard layouts are for Pinyin parser only." = "QWERTY 以外的英数布局是为了拼音排列使用者而准备的。";
"Output Hanyu-Pinyin in lieu of Zhuyin when Ctrl(+Alt)+CMD+Enter" = "Ctrl(+Alt)+CMD+Enter 输出汉语拼音而非注音";
"Output Settings:" = "输出设定:"; "Output Settings:" = "输出设定:";
"Phonetic Parser:" = "注音排列:"; "Phonetic Parser:" = "注音排列:";
"Push the cursor in front of the phrase after selection" = "在选字后将游标置于该字词的前方"; "Push the cursor in front of the phrase after selection" = "在选字后将游标置于该字词的前方";
@ -178,7 +180,7 @@
"Universal Pinyin with Numeral Intonation" = "通用拼音+数字标调"; "Universal Pinyin with Numeral Intonation" = "通用拼音+数字标调";
"Use .langIdentifier to handle UI fonts in candidate window" = "使用 .langIdentifier 来管理选字窗的预设介面字型"; "Use .langIdentifier to handle UI fonts in candidate window" = "使用 .langIdentifier 来管理选字窗的预设介面字型";
"Use ESC key to clear the entire input buffer" = "敲 ESC 键以清空整个组字缓冲区"; "Use ESC key to clear the entire input buffer" = "敲 ESC 键以清空整个组字缓冲区";
"Use IMK Candidate Window instead (will reboot the IME)" = "启用 IMK 选字窗(会自动重启输入法)"; "Use IMK Candidate Window instead (will reboot the IME)" = "启用与 macOS 内建输入法相同的 IMK 选字窗(会自动重启输入法)";
"Use Shift Key Accommodation in all cases" = "对任何客体应用均启用 Shift 键相容性措施"; "Use Shift Key Accommodation in all cases" = "对任何客体应用均启用 Shift 键相容性措施";
"Vertical" = "纵向布局"; "Vertical" = "纵向布局";
"Warning: This page is for testing future features. \nFeatures listed here may not work as expected." = "警告:该页面仅作未来功能测试所用。\n在此列出的功能并非处于完全可用之状态。"; "Warning: This page is for testing future features. \nFeatures listed here may not work as expected." = "警告:该页面仅作未来功能测试所用。\n在此列出的功能并非处于完全可用之状态。";

View File

@ -29,7 +29,7 @@
"\"%@\" length must ≥ 2 for a user phrase." = "「%@」字數不足以自訂語彙。"; "\"%@\" length must ≥ 2 for a user phrase." = "「%@」字數不足以自訂語彙。";
"\"%@\" length should ≤ %d for a user phrase." = "「%@」字數超過 %d、無法自訂。"; "\"%@\" length should ≤ %d for a user phrase." = "「%@」字數超過 %d、無法自訂。";
"\"%@\" selected. ENTER to add user phrase." = "「%@」敲 Enter 添入自訂語彙。"; "\"%@\" selected. ENTER to add user phrase." = "「%@」敲 Enter 添入自訂語彙。";
"\"%@\" already exists: ENTER to boost, SHIFT+CMD+ENTER to nerf, \n BackSpace or Delete key to exclude." = "「%@」已存在:敲 Enter 以升權、敲 Shift+CMD+Enter 以降權;\n 敲 BackSpace 或 Delete 以排除。"; "\"%@\" already exists: ENTER to boost, SHIFT+COMMAND+ENTER to nerf, \n BackSpace or Delete key to exclude." = "「%@」已存在:敲 Enter 以升權、敲 Shift+Command+Enter 以降權;\n 敲 BackSpace 或 Delete 以排除。";
"Edit Phrase Replacement Table…" = "編輯語彙置換表…"; "Edit Phrase Replacement Table…" = "編輯語彙置換表…";
"Use Phrase Replacement" = "使用語彙置換"; "Use Phrase Replacement" = "使用語彙置換";
"Candidates keys cannot be empty." = "您必須指定選字鍵。"; "Candidates keys cannot be empty." = "您必須指定選字鍵。";
@ -88,6 +88,7 @@
// SwiftUI Preferences // SwiftUI Preferences
"(Shift+)Space:" = "(Shift+)空格鍵:"; "(Shift+)Space:" = "(Shift+)空格鍵:";
"Adjust the window level of IMK Candidate Window" = "調整 IMK 選字窗的顯示優先級";
"Allow backspace-editing miscomposed readings" = "允許對無效的讀音使用 BackSpace 編輯"; "Allow backspace-editing miscomposed readings" = "允許對無效的讀音使用 BackSpace 編輯";
"Allow boosting / excluding a candidate of single kanji" = "將可以就地升權/排除的候選字詞的最短詞長設為單個漢字"; "Allow boosting / excluding a candidate of single kanji" = "將可以就地升權/排除的候選字詞的最短詞長設為單個漢字";
"Allow using Enter key to confirm associated candidate selection" = "允許使用 Enter 確認當前選中的聯想詞"; "Allow using Enter key to confirm associated candidate selection" = "允許使用 Enter 確認當前選中的聯想詞";
@ -119,6 +120,7 @@
"Choose the phonetic layout for Mandarin parser." = "請指定普通話/國音分析器所使用的注音排列。"; "Choose the phonetic layout for Mandarin parser." = "請指定普通話/國音分析器所使用的注音排列。";
"Choose your desired user data folder path. Will be omitted if invalid." = "請在此指定您想指定的使用者語彙檔案目錄。無效值會被忽略。"; "Choose your desired user data folder path. Will be omitted if invalid." = "請在此指定您想指定的使用者語彙檔案目錄。無效值會被忽略。";
"Choose your preferred layout of the candidate window." = "選擇您所偏好的候選字窗佈局。"; "Choose your preferred layout of the candidate window." = "選擇您所偏好的候選字窗佈局。";
"Commit Hanyu-Pinyin instead on Ctrl(+Option)+Command+Enter" = "Ctrl(+Option)+Command+Enter 輸出漢語拼音而非注音";
"Completely disable using Shift key to toggling alphanumerical mode" = "徹底禁止使用 Shift 鍵切換英數模式"; "Completely disable using Shift key to toggling alphanumerical mode" = "徹底禁止使用 Shift 鍵切換英數模式";
"Cursor Selection:" = "選字游標:"; "Cursor Selection:" = "選字游標:";
"Dachen (Microsoft Standard / Wang / 01, etc.)" = "大千排列 (微軟標準/王安/零壹/仲鼎/國喬)"; "Dachen (Microsoft Standard / Wang / 01, etc.)" = "大千排列 (微軟標準/王安/零壹/仲鼎/國喬)";
@ -146,15 +148,15 @@
"Hsu" = "許氏國音自然排列"; "Hsu" = "許氏國音自然排列";
"Hualuo Pinyin with Numeral Intonation" = "華羅拼音+數字標調"; "Hualuo Pinyin with Numeral Intonation" = "華羅拼音+數字標調";
"IBM" = "IBM 排列"; "IBM" = "IBM 排列";
"IMK candidate window is plagued with issues like failed selection keys." = "IMK 選字窗目前暫時無法正常使用選字鍵,併具其它未知故障。"; "IMK Candidate Window has a bug (#FB11300759) that it is always shown below NSMenu and Spotlight window by default. By toggling this checkbox, vChewing will attempt to adjust its window level according to its current context. However, this accomodation itself has a bug (also filed in #FB11300759): as long as vChewing application restarted once, IMK Candidate Window will always be shown beneath all other windows in the current desktop." = "IMK 選字窗有一處行為缺陷 (#FB11300759):在預設情況下,會始終被 NSMenu 和 Spotlight 擋住。啟用該選項的話,威注音會試圖根據當前狀況自動調整該選字窗的顯示優先級。然而,該保守治療方案本身也有一個缺陷 (也備案於 #FB11300759):只要輸入法本身有重新啟動過,則 IMK 選字窗便會頑固地顯示於當前桌面所有視窗的底部,直至重新開機為止。";
"IMK candidate window is plagued with issues and incapabilities." = "IMK 選字窗目前暫時無法正常自訂選字鍵,併具其它未知故障。";
"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 Shortcuts:" = "鍵盤快速鍵:"; "Keyboard Shortcuts:" = "鍵盤快速鍵:";
"Keyboard" = "鍵盤設定"; "Keyboard" = "鍵盤設定";
"Misc Settings:" = "雜項:"; "Misc Settings:" = "雜項:";
"MiTAC" = "神通排列"; "MiTAC" = "神通排列";
"Non-QWERTY alphanumerical keyboard layouts are for Hanyu Pinyin parser only." = "QWERTY 以外的英數佈局是為了漢語拼音排列使用者而準備的。"; "Non-QWERTY alphanumerical keyboard layouts are for Pinyin parser only." = "QWERTY 以外的英數佈局是為了拼音排列使用者而準備的。";
"Output Hanyu-Pinyin in lieu of Zhuyin when Ctrl(+Alt)+CMD+Enter" = "Ctrl(+Alt)+CMD+Enter 輸出漢語拼音而非注音";
"Output Settings:" = "輸出設定:"; "Output Settings:" = "輸出設定:";
"Phonetic Parser:" = "注音排列:"; "Phonetic Parser:" = "注音排列:";
"Push the cursor in front of the phrase after selection" = "在選字後將游標置於該字詞的前方"; "Push the cursor in front of the phrase after selection" = "在選字後將游標置於該字詞的前方";
@ -178,7 +180,7 @@
"Universal Pinyin with Numeral Intonation" = "通用拼音+數字標調"; "Universal Pinyin with Numeral Intonation" = "通用拼音+數字標調";
"Use .langIdentifier to handle UI fonts in candidate window" = "使用 .langIdentifier 來管理選字窗的預設介面字型"; "Use .langIdentifier to handle UI fonts in candidate window" = "使用 .langIdentifier 來管理選字窗的預設介面字型";
"Use ESC key to clear the entire input buffer" = "敲 ESC 鍵以清空整個組字緩衝區"; "Use ESC key to clear the entire input buffer" = "敲 ESC 鍵以清空整個組字緩衝區";
"Use IMK Candidate Window instead (will reboot the IME)" = "啟用 IMK 選字窗(會自動重啟輸入法)"; "Use IMK Candidate Window instead (will reboot the IME)" = "啟用與 macOS 內建輸入法相同的 IMK 選字窗(會自動重啟輸入法)";
"Use Shift Key Accommodation in all cases" = "對任何客體應用均啟用 Shift 鍵相容性措施"; "Use Shift Key Accommodation in all cases" = "對任何客體應用均啟用 Shift 鍵相容性措施";
"Vertical" = "縱向佈局"; "Vertical" = "縱向佈局";
"Warning: This page is for testing future features. \nFeatures listed here may not work as expected." = "警告:該頁面僅作未來功能測試所用。\n在此列出的功能並非處於完全可用之狀態。"; "Warning: This page is for testing future features. \nFeatures listed here may not work as expected." = "警告:該頁面僅作未來功能測試所用。\n在此列出的功能並非處於完全可用之狀態。";

View File

@ -336,7 +336,7 @@ extension ctlPrefWindow: NSToolbarDelegate {
} }
var toolbarIdentifiers: [NSToolbarItem.Identifier] { var toolbarIdentifiers: [NSToolbarItem.Identifier] {
if #available(macOS 10.13, *) { if #available(macOS 10.14, *) {
return [.ofGeneral, .ofExperience, .ofDictionary, .ofKeyboard, .ofDevZone] return [.ofGeneral, .ofExperience, .ofDictionary, .ofKeyboard, .ofDevZone]
} }
return [.ofGeneral, .ofExperience, .ofDictionary, .ofKeyboard] return [.ofGeneral, .ofExperience, .ofDictionary, .ofKeyboard]
@ -389,59 +389,31 @@ extension ctlPrefWindow: NSToolbarDelegate {
case .ofGeneral: case .ofGeneral:
let title = NSLocalizedString("General", comment: "") let title = NSLocalizedString("General", comment: "")
item.label = title item.label = title
if #available(macOS 11.0, *) { item.image = .tabImageGeneral
item.image = NSImage(
systemSymbolName: "wrench.and.screwdriver.fill", accessibilityDescription: "General Preferences"
)
} else {
item.image = NSImage(named: "PrefToolbar-General")
}
item.action = #selector(showGeneralView(_:)) item.action = #selector(showGeneralView(_:))
case .ofExperience: case .ofExperience:
let title = NSLocalizedString("Experience", comment: "") let title = NSLocalizedString("Experience", comment: "")
item.label = title item.label = title
if #available(macOS 11.0, *) { item.image = .tabImageExperience
item.image = NSImage(
systemSymbolName: "person.fill.questionmark", accessibilityDescription: "Experiences Preferences"
)
} else {
item.image = NSImage(named: "PrefToolbar-Experiences")
}
item.action = #selector(showExperienceView(_:)) item.action = #selector(showExperienceView(_:))
case .ofDictionary: case .ofDictionary:
let title = NSLocalizedString("Dictionary", comment: "") let title = NSLocalizedString("Dictionary", comment: "")
item.label = title item.label = title
if #available(macOS 11.0, *) { item.image = .tabImageDictionary
item.image = NSImage(
systemSymbolName: "character.book.closed.fill", accessibilityDescription: "Dictionary Preferences"
)
} else {
item.image = NSImage(named: "PrefToolbar-Dictionary")
}
item.action = #selector(showDictionaryView(_:)) item.action = #selector(showDictionaryView(_:))
case .ofKeyboard: case .ofKeyboard:
let title = NSLocalizedString("Keyboard", comment: "") let title = NSLocalizedString("Keyboard", comment: "")
item.label = title item.label = title
if #available(macOS 11.0, *) { item.image = .tabImageKeyboard
item.image = NSImage(systemSymbolName: "keyboard.macwindow", accessibilityDescription: "Keyboard Preferences")
} else {
item.image = NSImage(named: "PrefToolbar-Keyboard")
}
item.action = #selector(showKeyboardView(_:)) item.action = #selector(showKeyboardView(_:))
case .ofDevZone: case .ofDevZone:
let title = NSLocalizedString("DevZone", comment: "") let title = NSLocalizedString("DevZone", comment: "")
item.label = title item.label = title
if #available(macOS 11.0, *) { item.image = .tabImageDevZone
item.image = NSImage(
systemSymbolName: "hand.raised.circle", accessibilityDescription: "DevZone Preferences"
)
} else {
item.image = NSImage(named: "PrefToolbar-DevZone")
}
item.action = #selector(showDevZoneView(_:)) item.action = #selector(showDevZoneView(_:))
default: default:

View File

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="20037" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct"> <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21223" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies> <dependencies>
<deployment identifier="macosx"/> <deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="20037"/> <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21223"/>
<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>
<objects> <objects>
@ -27,17 +27,17 @@
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
<subviews> <subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="6Dx-DY-UG1"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="6Dx-DY-UG1">
<rect key="frame" x="89" y="442" width="123" height="15"/> <rect key="frame" x="89" y="442" width="130" height="15"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="vChewing for macOS" id="lblAppTitle" userLabel="appNameLabel"> <textFieldCell key="cell" lineBreakMode="clipping" title="vChewing for macOS" id="lblAppTitle" userLabel="appNameLabel">
<font key="font" metaFont="cellTitle"/> <font key="font" size="12" name="Tahoma-Bold"/>
<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>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Srh-ua-uQD"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Srh-ua-uQD">
<rect key="frame" x="89" y="426" width="281" height="15"/> <rect key="frame" x="89" y="426" width="263" height="15"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Derived from OpenVanilla McBopopmofo Project." id="lblProjectDescription"> <textFieldCell key="cell" lineBreakMode="clipping" title="Derived from OpenVanilla McBopopmofo Project." id="lblProjectDescription">
<font key="font" metaFont="cellTitle"/> <font key="font" size="12" name="Tahoma"/>
<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>
@ -48,7 +48,7 @@
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="293" id="I1K-WT-jie"/> <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="293" id="I1K-WT-jie"/>
</constraints> </constraints>
<textFieldCell key="cell" lineBreakMode="clipping" title="Placeholder for showing copyright information." id="lblCopyright" userLabel="appCopyrightLabel"> <textFieldCell key="cell" lineBreakMode="clipping" title="Placeholder for showing copyright information." id="lblCopyright" userLabel="appCopyrightLabel">
<font key="font" metaFont="cellTitle"/> <font key="font" size="12" name="Tahoma"/>
<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>
@ -56,7 +56,7 @@
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="8M8-3C-BZO"> <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="8M8-3C-BZO">
<rect key="frame" x="89" y="387" width="431" height="15"/> <rect key="frame" x="89" y="387" width="431" height="15"/>
<textFieldCell key="cell" selectable="YES" title="Placeholder for detailed credits." id="lblCredits"> <textFieldCell key="cell" selectable="YES" title="Placeholder for detailed credits." id="lblCredits">
<font key="font" metaFont="cellTitle"/> <font key="font" size="12" name="Tahoma"/>
<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>
@ -67,7 +67,7 @@
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="eYM-F7-drf"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="eYM-F7-drf">
<rect key="frame" x="89" y="364" width="431" height="15"/> <rect key="frame" x="89" y="364" width="431" height="15"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="MIT-NTL License:" id="lblLicense"> <textFieldCell key="cell" lineBreakMode="clipping" title="MIT-NTL License:" id="lblLicense">
<font key="font" metaFont="cellTitle"/> <font key="font" size="12" name="Tahoma"/>
<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>
@ -78,7 +78,7 @@
<constraint firstAttribute="width" constant="356" id="B0d-48-3we"/> <constraint firstAttribute="width" constant="356" id="B0d-48-3we"/>
</constraints> </constraints>
<textFieldCell key="cell" selectable="YES" id="lblDisclaimer"> <textFieldCell key="cell" selectable="YES" id="lblDisclaimer">
<font key="font" metaFont="cellTitle"/> <font key="font" size="12" name="Tahoma"/>
<string key="title">DISCLAIMER: The vChewing project, having no relationship of cooperation or affiliation with the OpenVanilla project, is not responsible for the phrase database shipped in the original McBopomofo project. Certain geopolitical and ideological contents, which are potentially harmful to the global spread of this software, are not included in vChewing official phrase database.</string> <string key="title">DISCLAIMER: The vChewing project, having no relationship of cooperation or affiliation with the OpenVanilla project, is not responsible for the phrase database shipped in the original McBopomofo project. Certain geopolitical and ideological contents, which are potentially harmful to the global spread of this software, are not included in vChewing official phrase database.</string>
<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"/>
@ -92,12 +92,12 @@
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" animates="YES" imageScaling="proportionallyDown" image="AboutBanner" id="Noc-kP-zTE"/> <imageCell key="cell" refusesFirstResponder="YES" alignment="left" animates="YES" imageScaling="proportionallyDown" image="AboutBanner" id="Noc-kP-zTE"/>
</imageView> </imageView>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="9Pk-k3-0cO"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="9Pk-k3-0cO">
<rect key="frame" x="211" y="442" width="126" height="15"/> <rect key="frame" x="218" y="442" width="126" height="15"/>
<constraints> <constraints>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="122" id="0XT-cl-6S4"/> <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="122" id="0XT-cl-6S4"/>
</constraints> </constraints>
<textFieldCell key="cell" lineBreakMode="clipping" title="version_placeholder" id="lblVersionString" userLabel="appVersionLabel"> <textFieldCell key="cell" lineBreakMode="clipping" title="version_placeholder" id="lblVersionString" userLabel="appVersionLabel">
<font key="font" metaFont="cellTitle"/> <font key="font" size="12" name="Tahoma"/>
<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>
@ -109,7 +109,7 @@
</constraints> </constraints>
<buttonCell key="cell" type="push" title="OK" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="btnConfirm"> <buttonCell key="cell" type="push" title="OK" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="btnConfirm">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/> <font key="font" size="13" name="Tahoma-Bold"/>
<string key="keyEquivalent" base64-UTF8="YES"> <string key="keyEquivalent" base64-UTF8="YES">
DQ DQ
</string> </string>
@ -157,7 +157,7 @@ DQ
<rect key="frame" x="382" y="69" width="143" height="32"/> <rect key="frame" x="382" y="69" width="143" height="32"/>
<buttonCell key="cell" type="push" title="Website" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="xCD-lx-zY7"> <buttonCell key="cell" type="push" title="Website" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="xCD-lx-zY7">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/> <font key="font" size="13" name="Tahoma"/>
</buttonCell> </buttonCell>
<connections> <connections>
<action selector="btnWebsite:" target="-1" id="KjF-Ja-Vhz"/> <action selector="btnWebsite:" target="-1" id="KjF-Ja-Vhz"/>
@ -167,7 +167,7 @@ DQ
<rect key="frame" x="382" y="42" width="143" height="32"/> <rect key="frame" x="382" y="42" width="143" height="32"/>
<buttonCell key="cell" type="push" title="Bug Report" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="7SW-k9-sId"> <buttonCell key="cell" type="push" title="Bug Report" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="7SW-k9-sId">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/> <font key="font" size="13" name="Tahoma"/>
</buttonCell> </buttonCell>
<connections> <connections>
<action selector="btnBugReport:" target="-1" id="ub1-rB-AED"/> <action selector="btnBugReport:" target="-1" id="ub1-rB-AED"/>

View File

@ -14,7 +14,6 @@
<outlet property="fontSizePopUpButton" destination="90" id="108"/> <outlet property="fontSizePopUpButton" destination="90" id="108"/>
<outlet property="lblCurrentlySpecifiedUserDataFolder" destination="REC-r4-T7m" id="eEq-XN-mMq"/> <outlet property="lblCurrentlySpecifiedUserDataFolder" destination="REC-r4-T7m" id="eEq-XN-mMq"/>
<outlet property="selectionKeyComboBox" destination="uHU-aL-du7" id="cEx-Ui-Phc"/> <outlet property="selectionKeyComboBox" destination="uHU-aL-du7" id="cEx-Ui-Phc"/>
<outlet property="tglControlDevZoneIMKCandidate" destination="tglControlDevZoneIMKCandidate" id="eyT-uP-QU6"/>
<outlet property="uiLanguageButton" destination="oS6-u5-7dP" id="V3u-XK-z7G"/> <outlet property="uiLanguageButton" destination="oS6-u5-7dP" id="V3u-XK-z7G"/>
<outlet property="vwrDevZone" destination="Qd7-ln-nNO" id="8mw-wO-gXS"/> <outlet property="vwrDevZone" destination="Qd7-ln-nNO" id="8mw-wO-gXS"/>
<outlet property="vwrDictionary" destination="Rnp-LM-RIF" id="8gY-ah-RT8"/> <outlet property="vwrDictionary" destination="Rnp-LM-RIF" id="8gY-ah-RT8"/>
@ -140,6 +139,13 @@
<binding destination="32" name="value" keyPath="values.ShowPageButtonsInCandidateWindow" id="6BK-hU-lqs"/> <binding destination="32" name="value" keyPath="values.ShowPageButtonsInCandidateWindow" id="6BK-hU-lqs"/>
</connections> </connections>
</buttonCell> </buttonCell>
<connections>
<binding destination="32" name="enabled" keyPath="values.UseIMKCandidateWindow" id="pHT-37-Eyh">
<dictionary key="options">
<string key="NSValueTransformerName">NSNegateBoolean</string>
</dictionary>
</binding>
</connections>
</button> </button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="da1-7e-els"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="da1-7e-els">
<rect key="frame" x="18" y="199" width="246" height="15"/> <rect key="frame" x="18" y="199" width="246" height="15"/>
@ -213,7 +219,7 @@
<constraints> <constraints>
<constraint firstAttribute="height" constant="18" id="zRq-Om-0dK"/> <constraint firstAttribute="height" constant="18" id="zRq-Om-0dK"/>
</constraints> </constraints>
<buttonCell key="cell" type="check" title="Output Hanyu-Pinyin in lieu of Zhuyin when Ctrl(+Alt)+CMD+Enter" bezelStyle="regularSquare" imagePosition="left" controlSize="small" inset="2" id="iWy-Nw-QKB"> <buttonCell key="cell" type="check" title="Commit Hanyu-Pinyin instead on Ctrl(+Option)+Command+Enter" bezelStyle="regularSquare" imagePosition="left" controlSize="small" inset="2" id="iWy-Nw-QKB">
<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>
@ -256,6 +262,11 @@
</popUpButtonCell> </popUpButtonCell>
<connections> <connections>
<binding destination="32" name="selectedTag" keyPath="values.CandidateListTextSize" id="107"/> <binding destination="32" name="selectedTag" keyPath="values.CandidateListTextSize" id="107"/>
<binding destination="32" name="enabled" keyPath="values.UseIMKCandidateWindow" id="bpc-Zm-I2n">
<dictionary key="options">
<string key="NSValueTransformerName">NSNegateBoolean</string>
</dictionary>
</binding>
</connections> </connections>
</popUpButton> </popUpButton>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="0Fh-O5-BKD"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="0Fh-O5-BKD">
@ -356,7 +367,7 @@
</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="127" y="471" width="151" height="23"/> <rect key="frame" x="127" y="470" width="151" height="23"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="147" id="Luo-hb-kcY"/> <constraint firstAttribute="width" constant="147" id="Luo-hb-kcY"/>
</constraints> </constraints>
@ -372,6 +383,11 @@
</comboBoxCell> </comboBoxCell>
<connections> <connections>
<action selector="changeSelectionKeyAction:" target="-2" id="REj-7y-bbQ"/> <action selector="changeSelectionKeyAction:" target="-2" id="REj-7y-bbQ"/>
<binding destination="32" name="enabled" keyPath="values.UseIMKCandidateWindow" id="BDQ-gl-txA">
<dictionary key="options">
<string key="NSValueTransformerName">NSNegateBoolean</string>
</dictionary>
</binding>
</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">
@ -594,7 +610,7 @@
<constraints> <constraints>
<constraint firstItem="n7q-ew-DYu" firstAttribute="leading" secondItem="XWo-36-xGi" secondAttribute="leading" constant="32" id="2gT-9Z-6F4"/> <constraint firstItem="n7q-ew-DYu" firstAttribute="leading" secondItem="XWo-36-xGi" secondAttribute="leading" constant="32" id="2gT-9Z-6F4"/>
<constraint firstItem="YkJ-lr-EP6" firstAttribute="top" secondItem="J0f-Aw-dxC" secondAttribute="bottom" constant="8" id="5fd-qi-hJ6"/> <constraint firstItem="YkJ-lr-EP6" firstAttribute="top" secondItem="J0f-Aw-dxC" secondAttribute="bottom" constant="8" id="5fd-qi-hJ6"/>
<constraint firstItem="13" firstAttribute="top" secondItem="uHU-aL-du7" secondAttribute="bottom" constant="11" id="5uq-In-4bN"/> <constraint firstItem="13" firstAttribute="top" secondItem="uHU-aL-du7" secondAttribute="bottom" constant="10" id="5uq-In-4bN"/>
<constraint firstItem="HaB-rc-AcW" firstAttribute="leading" secondItem="6MM-WC-Mpd" secondAttribute="leading" id="7Fs-9l-g66"/> <constraint firstItem="HaB-rc-AcW" firstAttribute="leading" secondItem="6MM-WC-Mpd" secondAttribute="leading" id="7Fs-9l-g66"/>
<constraint firstItem="TMn-LX-3Ub" firstAttribute="top" secondItem="7z2-DD-c58" secondAttribute="bottom" constant="9" id="AXY-LV-HMX"/> <constraint firstItem="TMn-LX-3Ub" firstAttribute="top" secondItem="7z2-DD-c58" secondAttribute="bottom" constant="9" id="AXY-LV-HMX"/>
<constraint firstItem="6q5-OP-iEb" firstAttribute="top" secondItem="YkJ-lr-EP6" secondAttribute="bottom" constant="9" id="AvD-Ni-GL2"/> <constraint firstItem="6q5-OP-iEb" firstAttribute="top" secondItem="YkJ-lr-EP6" secondAttribute="bottom" constant="9" id="AvD-Ni-GL2"/>
@ -616,7 +632,7 @@
<constraint firstItem="7z2-DD-c58" firstAttribute="top" secondItem="15" secondAttribute="bottom" constant="5" id="VKv-YI-AS2"/> <constraint firstItem="7z2-DD-c58" firstAttribute="top" secondItem="15" secondAttribute="bottom" constant="5" id="VKv-YI-AS2"/>
<constraint firstItem="15" firstAttribute="top" secondItem="13" secondAttribute="bottom" constant="8" symbolic="YES" id="WHr-jO-a07"/> <constraint firstItem="15" firstAttribute="top" secondItem="13" secondAttribute="bottom" constant="8" symbolic="YES" id="WHr-jO-a07"/>
<constraint firstItem="IpX-f7-rTL" firstAttribute="top" secondItem="XWo-36-xGi" secondAttribute="top" constant="20" id="YaG-ab-LJH"/> <constraint firstItem="IpX-f7-rTL" firstAttribute="top" secondItem="XWo-36-xGi" secondAttribute="top" constant="20" id="YaG-ab-LJH"/>
<constraint firstItem="uHU-aL-du7" firstAttribute="top" secondItem="IpX-f7-rTL" secondAttribute="bottom" constant="8" symbolic="YES" id="aet-Zq-v6x"/> <constraint firstItem="uHU-aL-du7" firstAttribute="top" secondItem="IpX-f7-rTL" secondAttribute="bottom" constant="9" id="aet-Zq-v6x"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="TMn-LX-3Ub" secondAttribute="trailing" constant="20" symbolic="YES" id="atz-4L-U9s"/> <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="TMn-LX-3Ub" secondAttribute="trailing" constant="20" symbolic="YES" id="atz-4L-U9s"/>
<constraint firstItem="veW-XM-HGs" firstAttribute="leading" secondItem="YkJ-lr-EP6" secondAttribute="leading" id="bS2-qk-WNJ"/> <constraint firstItem="veW-XM-HGs" firstAttribute="leading" secondItem="YkJ-lr-EP6" secondAttribute="leading" id="bS2-qk-WNJ"/>
<constraint firstItem="HaB-rc-AcW" firstAttribute="top" secondItem="6MM-WC-Mpd" secondAttribute="bottom" constant="6" symbolic="YES" id="cBa-57-gWH"/> <constraint firstItem="HaB-rc-AcW" firstAttribute="top" secondItem="6MM-WC-Mpd" secondAttribute="bottom" constant="6" symbolic="YES" id="cBa-57-gWH"/>
@ -1044,11 +1060,11 @@
<point key="canvasLocation" x="-392" y="-704"/> <point key="canvasLocation" x="-392" y="-704"/>
</visualEffectView> </visualEffectView>
<visualEffectView blendingMode="behindWindow" material="sidebar" state="followsWindowActiveState" id="Qd7-ln-nNO" userLabel="vwrDevZone"> <visualEffectView blendingMode="behindWindow" material="sidebar" state="followsWindowActiveState" id="Qd7-ln-nNO" userLabel="vwrDevZone">
<rect key="frame" x="0.0" y="0.0" width="445" height="165"/> <rect key="frame" x="0.0" y="0.0" width="445" height="272"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
<subviews> <subviews>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="lblControlDevZoneTitleDescription" userLabel="lblControlDevZoneTitleDescription"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="lblControlDevZoneTitleDescription" userLabel="lblControlDevZoneTitleDescription">
<rect key="frame" x="18" y="115" width="343" height="30"/> <rect key="frame" x="18" y="222" width="343" height="30"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" id="lblDevZoneTitleDescription"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" id="lblDevZoneTitleDescription">
<font key="font" metaFont="cellTitle"/> <font key="font" metaFont="cellTitle"/>
<string key="title">Warning: This page is for testing future features. <string key="title">Warning: This page is for testing future features.
@ -1058,49 +1074,82 @@ Features listed here may not work as expected.</string>
</textFieldCell> </textFieldCell>
</textField> </textField>
<box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="P1o-bW-Tjn"> <box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="P1o-bW-Tjn">
<rect key="frame" x="20" y="104" width="339" height="5"/> <rect key="frame" x="20" y="211" width="339" height="5"/>
</box> </box>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="tglControlDevZoneIMKCandidate" userLabel="tglControlDevZoneIMKCandidate"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="le7-59-tFK" userLabel="tglControlDevZoneIMKCandidate">
<rect key="frame" x="19" y="82.5" width="340" height="17"/> <rect key="frame" x="19" y="191.5" width="340" height="17"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="16" id="1fy-CP-mlB"/> <constraint firstAttribute="height" constant="16" id="054-U2-1Xk"/>
</constraints> </constraints>
<buttonCell key="cell" type="check" title="Use IMK Candidate Window instead (will reboot the IME)" bezelStyle="regularSquare" imagePosition="left" controlSize="small" state="on" inset="2" id="tglDevZoneIMKCandidate" userLabel="tglDevZoneIMKCandidate"> <buttonCell key="cell" type="check" title="Use IMK Candidate Window instead (will reboot the IME)" bezelStyle="regularSquare" imagePosition="left" controlSize="small" state="on" inset="2" id="tglDevZoneIMKCandidate" userLabel="tglDevZoneIMKCandidate">
<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>
<connections> <connections>
<action selector="updateIMKCandidateEnableStatusAction:" target="-2" id="mkT-P8-reE"/> <action selector="updateIMKCandidateEnableStatusAction:" target="-2" id="Gt8-3s-vDd"/>
<binding destination="32" name="value" keyPath="values.UseIMKCandidateWindow" id="XjP-hu-rUm"/> <binding destination="32" name="value" keyPath="values.UseIMKCandidateWindow" id="xRC-sa-mZn"/>
</connections> </connections>
</button> </button>
<textField wantsLayer="YES" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="lblControlDevZoneIMKCandidate" userLabel="lblControlDevZoneIMKCandidate"> <textField wantsLayer="YES" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="jrF-Cr-EDB" userLabel="lblControlDevZoneIMKCandidate">
<rect key="frame" x="18" y="46" width="409" height="28"/> <rect key="frame" x="18" y="169" width="409" height="14"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="405" id="YoB-Wx-n3h"/> <constraint firstAttribute="width" constant="405" id="eHP-6y-RUV"/>
</constraints> </constraints>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="left" title="IMK candidate window is plagued with issues like malfunctioned selection keys, etc." id="lblDevZoneIMKCandidate"> <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="left" title="IMK candidate window is plagued with issues and incapabilities." id="lblDevZoneIMKCandidate" userLabel="lblDevZoneIMKCandidate">
<font key="font" metaFont="smallSystem"/> <font key="font" metaFont="smallSystem"/>
<color key="textColor" name="secondaryLabelColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="secondaryLabelColor" 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="OJj-Hq-nF8" userLabel="tglControlDevZoneIMKCandidateLevel">
<rect key="frame" x="19" y="145.5" width="406" height="17"/>
<constraints>
<constraint firstAttribute="height" constant="16" id="pEL-6t-gbP"/>
</constraints>
<buttonCell key="cell" type="check" title="Adjust the window level of IMK Candidate Window" bezelStyle="regularSquare" imagePosition="left" controlSize="small" state="on" inset="2" id="tglDevZoneIMKCandidateLevel" userLabel="tglDevZoneIMKCandidateLevel">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="cellTitle"/>
</buttonCell>
<connections>
<action selector="updateIMKCandidateEnableStatusAction:" target="-2" id="dAG-Si-cta"/>
<binding destination="32" name="value" keyPath="values.AdjustIMKCandidateWindowLevel" id="E6Z-Rn-IHD"/>
<binding destination="32" name="enabled" keyPath="values.UseIMKCandidateWindow" id="qla-KO-plC"/>
</connections>
</button>
<textField wantsLayer="YES" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="4qO-ck-Pzw" userLabel="lblControlDevZoneIMKCandidateLevel">
<rect key="frame" x="18" y="39" width="409" height="98"/>
<constraints>
<constraint firstAttribute="height" relation="greaterThanOrEqual" constant="98" id="s4O-ec-pBz"/>
<constraint firstAttribute="width" constant="405" id="zNy-dn-yPR"/>
</constraints>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="left" id="lblDevZoneIMKCandidateLevel" userLabel="lblDevZoneIMKCandidateLevel">
<font key="font" metaFont="smallSystem"/>
<string key="title">IMK Candidate Window has a bug (#FB11300759) that it is always shown below NSMenu and Spotlight window by default. By toggling this checkbox, vChewing will attempt to adjust its window level according to its current context. However, this accomodation itself has a bug (also filed in #FB11300759): as long as vChewing application restarted once, IMK Candidate Window will always be shown beneath all other windows in the current desktop.</string>
<color key="textColor" name="secondaryLabelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews> </subviews>
<constraints> <constraints>
<constraint firstItem="lblControlDevZoneTitleDescription" firstAttribute="leading" secondItem="Qd7-ln-nNO" secondAttribute="leading" constant="20" symbolic="YES" id="0Ia-ut-ksj"/> <constraint firstItem="lblControlDevZoneTitleDescription" firstAttribute="leading" secondItem="Qd7-ln-nNO" secondAttribute="leading" constant="20" symbolic="YES" id="0Ia-ut-ksj"/>
<constraint firstItem="tglControlDevZoneIMKCandidate" firstAttribute="top" secondItem="P1o-bW-Tjn" secondAttribute="bottom" constant="7.5" id="3as-Db-NwQ"/> <constraint firstItem="OJj-Hq-nF8" firstAttribute="top" secondItem="jrF-Cr-EDB" secondAttribute="bottom" constant="6.5" id="2sJ-y7-C7J"/>
<constraint firstItem="P1o-bW-Tjn" firstAttribute="trailing" secondItem="tglControlDevZoneIMKCandidate" secondAttribute="trailing" id="LM7-ov-mng"/> <constraint firstItem="le7-59-tFK" firstAttribute="trailing" secondItem="P1o-bW-Tjn" secondAttribute="trailing" id="5G1-VY-skr"/>
<constraint firstItem="jrF-Cr-EDB" firstAttribute="trailing" secondItem="OJj-Hq-nF8" secondAttribute="trailing" id="EL1-YF-bHq"/>
<constraint firstItem="jrF-Cr-EDB" firstAttribute="leading" secondItem="le7-59-tFK" secondAttribute="leading" id="HZn-ty-n6v"/>
<constraint firstItem="4qO-ck-Pzw" firstAttribute="top" secondItem="OJj-Hq-nF8" secondAttribute="bottom" constant="9" id="L8p-vO-Fo7"/>
<constraint firstItem="lblControlDevZoneTitleDescription" firstAttribute="trailing" secondItem="P1o-bW-Tjn" secondAttribute="trailing" id="LqC-ii-aOO"/> <constraint firstItem="lblControlDevZoneTitleDescription" firstAttribute="trailing" secondItem="P1o-bW-Tjn" secondAttribute="trailing" id="LqC-ii-aOO"/>
<constraint firstAttribute="trailing" secondItem="lblControlDevZoneIMKCandidate" secondAttribute="trailing" constant="20" symbolic="YES" id="MHM-FX-JE7"/> <constraint firstItem="4qO-ck-Pzw" firstAttribute="leading" secondItem="OJj-Hq-nF8" secondAttribute="leading" id="UVx-eH-QjH"/>
<constraint firstItem="lblControlDevZoneIMKCandidate" firstAttribute="leading" secondItem="tglControlDevZoneIMKCandidate" secondAttribute="leading" id="WDx-XS-EUF"/>
<constraint firstItem="lblControlDevZoneTitleDescription" firstAttribute="leading" secondItem="P1o-bW-Tjn" secondAttribute="leading" id="Wc3-Oe-D2E"/> <constraint firstItem="lblControlDevZoneTitleDescription" firstAttribute="leading" secondItem="P1o-bW-Tjn" secondAttribute="leading" id="Wc3-Oe-D2E"/>
<constraint firstItem="P1o-bW-Tjn" firstAttribute="top" secondItem="lblControlDevZoneTitleDescription" secondAttribute="bottom" constant="8" symbolic="YES" id="Whf-Gf-g65"/> <constraint firstItem="P1o-bW-Tjn" firstAttribute="top" secondItem="lblControlDevZoneTitleDescription" secondAttribute="bottom" constant="8" symbolic="YES" id="Whf-Gf-g65"/>
<constraint firstAttribute="bottom" relation="lessThanOrEqual" secondItem="lblControlDevZoneIMKCandidate" secondAttribute="bottom" constant="142" id="ZcX-Vx-qyC"/> <constraint firstAttribute="bottom" relation="lessThanOrEqual" secondItem="4qO-ck-Pzw" secondAttribute="bottom" constant="39" id="Wrk-iz-rTZ"/>
<constraint firstItem="lblControlDevZoneIMKCandidate" firstAttribute="top" secondItem="tglControlDevZoneIMKCandidate" secondAttribute="bottom" constant="9" id="eqi-Pb-gfH"/> <constraint firstItem="jrF-Cr-EDB" firstAttribute="leading" secondItem="OJj-Hq-nF8" secondAttribute="leading" id="Z1H-NT-vGK"/>
<constraint firstItem="P1o-bW-Tjn" firstAttribute="leading" secondItem="tglControlDevZoneIMKCandidate" secondAttribute="leading" id="f2q-KJ-bvO"/> <constraint firstItem="jrF-Cr-EDB" firstAttribute="top" secondItem="le7-59-tFK" secondAttribute="bottom" constant="9" id="aj4-H1-92H"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="4qO-ck-Pzw" secondAttribute="trailing" constant="20" symbolic="YES" id="erj-vd-tL0"/>
<constraint firstItem="le7-59-tFK" firstAttribute="top" secondItem="P1o-bW-Tjn" secondAttribute="bottom" constant="5.5" id="j3c-3A-4JT"/>
<constraint firstItem="le7-59-tFK" firstAttribute="leading" secondItem="P1o-bW-Tjn" secondAttribute="leading" id="tqq-97-fHt"/>
<constraint firstItem="lblControlDevZoneTitleDescription" firstAttribute="top" secondItem="Qd7-ln-nNO" secondAttribute="top" constant="20" symbolic="YES" id="vYg-x4-tfo"/> <constraint firstItem="lblControlDevZoneTitleDescription" firstAttribute="top" secondItem="Qd7-ln-nNO" secondAttribute="top" constant="20" symbolic="YES" id="vYg-x4-tfo"/>
</constraints> </constraints>
<point key="canvasLocation" x="-393.5" y="-119.5"/> <point key="canvasLocation" x="-393.5" y="-66"/>
</visualEffectView> </visualEffectView>
</objects> </objects>
</document> </document>

View File

@ -58,11 +58,12 @@
"GlJ-Ns-9eE.title" = "Auto-Select"; "GlJ-Ns-9eE.title" = "Auto-Select";
"hSv-LJ-Cq3.title" = "Enable symbol input support (incl. certain emoji symbols)"; "hSv-LJ-Cq3.title" = "Enable symbol input support (incl. certain emoji symbols)";
"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.";
"iWy-Nw-QKB.title" = "Output Hanyu-Pinyin in lieu of Zhuyin when Ctrl(+Alt)+CMD+Enter"; "iWy-Nw-QKB.title" = "Commit Hanyu-Pinyin instead on Ctrl(+Option)+Command+Enter";
"jQC-12-UuK.ibShadowedObjectValues[0]" = "Item 1"; "jQC-12-UuK.ibShadowedObjectValues[0]" = "Item 1";
"jQC-12-UuK.ibShadowedObjectValues[1]" = "Item 2"; "jQC-12-UuK.ibShadowedObjectValues[1]" = "Item 2";
"jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3"; "jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3";
"lblDevZoneIMKCandidate.title" = "IMK candidate window is plagued with issues like failed selection keys."; "lblDevZoneIMKCandidate.title" = "IMK candidate window is plagued with issues and incapabilities.";
"lblDevZoneIMKCandidateLevel.title" = "IMK Candidate Window has a bug (#FB11300759) that it is always shown below NSMenu and Spotlight window by default. By toggling this checkbox, vChewing will attempt to adjust its window level according to its current context. However, this accomodation itself has a bug (also filed in #FB11300759): as long as vChewing application restarted once, IMK Candidate Window will always be shown beneath all other windows in the current desktop.";
"lblDevZoneTitleDescription.title" = "Warning: This page is for testing future features. \nFeatures listed here may not work as expected."; "lblDevZoneTitleDescription.title" = "Warning: This page is for testing future features. \nFeatures listed here may not work as expected.";
"lblUpperCaseLetterKeyBehavior.title" = "Choose the behavior of Shift+Letter key with letter inputs."; "lblUpperCaseLetterKeyBehavior.title" = "Choose the behavior of Shift+Letter key with letter inputs.";
"Parser11.title" = "Secondary Pinyin with Numeral Intonation"; "Parser11.title" = "Secondary Pinyin with Numeral Intonation";
@ -80,6 +81,7 @@
"s7u-Fm-dVg.title" = "Cycling Pages"; "s7u-Fm-dVg.title" = "Cycling Pages";
"shc-Nu-UsM.title" = "Show page buttons in candidate list"; "shc-Nu-UsM.title" = "Show page buttons in candidate list";
"tglDevZoneIMKCandidate.title" = "Use IMK Candidate Window instead (will reboot the IME)"; "tglDevZoneIMKCandidate.title" = "Use IMK Candidate Window instead (will reboot the IME)";
"tglDevZoneIMKCandidateLevel.title" = "Adjust the window level of IMK Candidate Window";
"TXr-FF-ehw.title" = "Traditional Chinese"; "TXr-FF-ehw.title" = "Traditional Chinese";
"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.";
"VdT-fw-7pQ.title" = "Debug Mode"; "VdT-fw-7pQ.title" = "Debug Mode";

View File

@ -58,11 +58,12 @@
"GlJ-Ns-9eE.title" = "システム設定に準ずる"; "GlJ-Ns-9eE.title" = "システム設定に準ずる";
"hSv-LJ-Cq3.title" = "僅かなる絵文字も含む符号入力サポートを起用"; "hSv-LJ-Cq3.title" = "僅かなる絵文字も含む符号入力サポートを起用";
"iRg-wx-Nx2.title" = "入力候補陣列の候補文字の字号をご指定ください。"; "iRg-wx-Nx2.title" = "入力候補陣列の候補文字の字号をご指定ください。";
"iWy-Nw-QKB.title" = "Ctrl(+Alt)+CMD+Enter で出すのを漢語弁音と変換"; "iWy-Nw-QKB.title" = "Ctrl(+Option)+Command+Enter で出すのを漢語弁音と変換";
"jQC-12-UuK.ibShadowedObjectValues[0]" = "Item 1"; "jQC-12-UuK.ibShadowedObjectValues[0]" = "Item 1";
"jQC-12-UuK.ibShadowedObjectValues[1]" = "Item 2"; "jQC-12-UuK.ibShadowedObjectValues[1]" = "Item 2";
"jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3"; "jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3";
"lblDevZoneIMKCandidate.title" = "IMK 候補陳列ウィンドウで言選り用キーは現時点で利用不可、尚他故障あり。"; "lblDevZoneIMKCandidate.title" = "IMK 候補陳列ウィンドウで言選り用キーは現時点で調整不可、且つ他故障あり。";
"lblDevZoneIMKCandidateLevel.title" = "IMK 候補陳列ウィンドウにはこういう欠陥がある (#FB11300759):何の特殊措置をしない限り、候補陳列ウィンドウは常に NSMenu と Spotlight に遮られている。これをチェックすれば、毎度候補陳列ウィンドウを呼ぶたびに、候補陳列ウィンドウの表示の優先順位を自動的に調整する。だが、この特殊措置こそが、完璧とは言えぬ(この欠陥も #FB11300759 に記されておる一旦入力アプリ自身が再起動すると、このパソコンの再起動まで、IMK 候補陳列ウィンドウは所在のデスクトップの全てのウィンドウの後ろに隠されてしまうことになる。";
"lblDevZoneTitleDescription.title" = "警告:これからの新機能テストのために作ったページですから、\nここで陳列されている諸機能は予想通り動けるだと思わないでください。"; "lblDevZoneTitleDescription.title" = "警告:これからの新機能テストのために作ったページですから、\nここで陳列されている諸機能は予想通り動けるだと思わないでください。";
"lblUpperCaseLetterKeyBehavior.title" = "Shift+文字キーの行為をご指定ください。"; "lblUpperCaseLetterKeyBehavior.title" = "Shift+文字キーの行為をご指定ください。";
"Parser11.title" = "国音二式 (ローマ字+数字音調)"; "Parser11.title" = "国音二式 (ローマ字+数字音調)";
@ -80,6 +81,7 @@
"s7u-Fm-dVg.title" = "ページ"; "s7u-Fm-dVg.title" = "ページ";
"shc-Nu-UsM.title" = "ページボタンを表示"; "shc-Nu-UsM.title" = "ページボタンを表示";
"tglDevZoneIMKCandidate.title" = "IMK 候補陳列ウィンドウを起用(入力アプリは自動的に再起動)"; "tglDevZoneIMKCandidate.title" = "IMK 候補陳列ウィンドウを起用(入力アプリは自動的に再起動)";
"tglDevZoneIMKCandidateLevel.title" = "IMK 候補陳列ウィンドウの表示の優先順位を調整する";
"TXr-FF-ehw.title" = "繁体中国語"; "TXr-FF-ehw.title" = "繁体中国語";
"ueU-Rz-a1C.title" = "入力候補陳列での (Shift+)Tab キーの輪番切替対象をご指定ください。"; "ueU-Rz-a1C.title" = "入力候補陳列での (Shift+)Tab キーの輪番切替対象をご指定ください。";
"VdT-fw-7pQ.title" = "欠陥辿着モード"; "VdT-fw-7pQ.title" = "欠陥辿着モード";

View File

@ -58,11 +58,12 @@
"GlJ-Ns-9eE.title" = "自动选择"; "GlJ-Ns-9eE.title" = "自动选择";
"hSv-LJ-Cq3.title" = "启用包括少许绘文字在内的符号输入支援"; "hSv-LJ-Cq3.title" = "启用包括少许绘文字在内的符号输入支援";
"iRg-wx-Nx2.title" = "变更候选字窗的字型大小。"; "iRg-wx-Nx2.title" = "变更候选字窗的字型大小。";
"iWy-Nw-QKB.title" = "Ctrl(+Alt)+CMD+Enter 输出汉语拼音而非注音"; "iWy-Nw-QKB.title" = "Ctrl(+Option)+Command+Enter 输出汉语拼音而非注音";
"jQC-12-UuK.ibShadowedObjectValues[0]" = "Item 1"; "jQC-12-UuK.ibShadowedObjectValues[0]" = "Item 1";
"jQC-12-UuK.ibShadowedObjectValues[1]" = "Item 2"; "jQC-12-UuK.ibShadowedObjectValues[1]" = "Item 2";
"jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3"; "jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3";
"lblDevZoneIMKCandidate.title" = "IMK 选字窗目前暂时无法正常使用选字键,并具其它未知故障。"; "lblDevZoneIMKCandidate.title" = "IMK 选字窗目前暂时无法正常自订选字键,并具其它未知故障。";
"lblDevZoneIMKCandidateLevel.title" = "IMK 选字窗有一处行为缺陷 (#FB11300759):在预设情况下,会始终被 NSMenu 和 Spotlight 挡住。启用该选项的话,威注音会试图根据当前状况自动调整该选字窗的显示优先级。然而,该保守治疗方案本身也有一个缺陷 (也备案于 #FB11300759):只要输入法本身有重新启动过,则 IMK 选字窗便会顽固地显示于当前桌面所有视窗的底部,直至重新开机为止。";
"lblDevZoneTitleDescription.title" = "警告:该页面仅作未来功能测试所用。\n在此列出的功能并非处于完全可用之状态。"; "lblDevZoneTitleDescription.title" = "警告:该页面仅作未来功能测试所用。\n在此列出的功能并非处于完全可用之状态。";
"lblUpperCaseLetterKeyBehavior.title" = "指定 Shift+字母键 的行为。"; "lblUpperCaseLetterKeyBehavior.title" = "指定 Shift+字母键 的行为。";
"Parser11.title" = "国音二式+数字标调"; "Parser11.title" = "国音二式+数字标调";
@ -79,7 +80,8 @@
"rVQ-Hx-cGi.title" = "和语"; "rVQ-Hx-cGi.title" = "和语";
"s7u-Fm-dVg.title" = "轮替页面"; "s7u-Fm-dVg.title" = "轮替页面";
"shc-Nu-UsM.title" = "在选字窗内显示翻页按钮"; "shc-Nu-UsM.title" = "在选字窗内显示翻页按钮";
"tglDevZoneIMKCandidate.title" = "启用 IMK 选字窗(会自动重启输入法)"; "tglDevZoneIMKCandidate.title" = "启用与 macOS 内建输入法相同的 IMK 选字窗(会自动重启输入法)";
"tglDevZoneIMKCandidateLevel.title" = "调整 IMK 选字窗的显示优先级";
"TXr-FF-ehw.title" = "繁体中文"; "TXr-FF-ehw.title" = "繁体中文";
"ueU-Rz-a1C.title" = "指定 (Shift+)Tab 热键在选字窗内的轮替操作对象。"; "ueU-Rz-a1C.title" = "指定 (Shift+)Tab 热键在选字窗内的轮替操作对象。";
"VdT-fw-7pQ.title" = "侦错模式"; "VdT-fw-7pQ.title" = "侦错模式";

View File

@ -58,11 +58,12 @@
"GlJ-Ns-9eE.title" = "自動選擇"; "GlJ-Ns-9eE.title" = "自動選擇";
"hSv-LJ-Cq3.title" = "啟用包括少許繪文字在內的符號輸入支援"; "hSv-LJ-Cq3.title" = "啟用包括少許繪文字在內的符號輸入支援";
"iRg-wx-Nx2.title" = "變更候選字窗的字型大小。"; "iRg-wx-Nx2.title" = "變更候選字窗的字型大小。";
"iWy-Nw-QKB.title" = "Ctrl(+Alt)+CMD+Enter 輸出漢語拼音而非注音"; "iWy-Nw-QKB.title" = "Ctrl(+Option)+Command+Enter 輸出漢語拼音而非注音";
"jQC-12-UuK.ibShadowedObjectValues[0]" = "Item 1"; "jQC-12-UuK.ibShadowedObjectValues[0]" = "Item 1";
"jQC-12-UuK.ibShadowedObjectValues[1]" = "Item 2"; "jQC-12-UuK.ibShadowedObjectValues[1]" = "Item 2";
"jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3"; "jQC-12-UuK.ibShadowedObjectValues[2]" = "Item 3";
"lblDevZoneIMKCandidate.title" = "IMK 選字窗目前暫時無法正常使用選字鍵,併具其它未知故障。"; "lblDevZoneIMKCandidate.title" = "IMK 選字窗目前暫時無法正常自訂選字鍵,併具其它未知故障。";
"lblDevZoneIMKCandidateLevel.title" = "IMK 選字窗有一處行為缺陷 (#FB11300759):在預設情況下,會始終被 NSMenu 和 Spotlight 擋住。啟用該選項的話,威注音會試圖根據當前狀況自動調整該選字窗的顯示優先級。然而,該保守治療方案本身也有一個缺陷 (也備案於 #FB11300759):只要輸入法本身有重新啟動過,則 IMK 選字窗便會頑固地顯示於當前桌面所有視窗的底部,直至重新開機為止。";
"lblDevZoneTitleDescription.title" = "警告:該頁面僅作未來功能測試所用。\n在此列出的功能並非處於完全可用之狀態。"; "lblDevZoneTitleDescription.title" = "警告:該頁面僅作未來功能測試所用。\n在此列出的功能並非處於完全可用之狀態。";
"lblUpperCaseLetterKeyBehavior.title" = "指定 Shift+字母鍵 的行為。"; "lblUpperCaseLetterKeyBehavior.title" = "指定 Shift+字母鍵 的行為。";
"Parser11.title" = "國音二式+數字標調"; "Parser11.title" = "國音二式+數字標調";
@ -79,7 +80,8 @@
"rVQ-Hx-cGi.title" = "和語"; "rVQ-Hx-cGi.title" = "和語";
"s7u-Fm-dVg.title" = "輪替頁面"; "s7u-Fm-dVg.title" = "輪替頁面";
"shc-Nu-UsM.title" = "在選字窗內顯示翻頁按鈕"; "shc-Nu-UsM.title" = "在選字窗內顯示翻頁按鈕";
"tglDevZoneIMKCandidate.title" = "啟用 IMK 選字窗(會自動重啟輸入法)"; "tglDevZoneIMKCandidate.title" = "啟用與 macOS 內建輸入法相同的 IMK 選字窗(會自動重啟輸入法)";
"tglDevZoneIMKCandidateLevel.title" = "調整 IMK 選字窗的顯示優先級";
"TXr-FF-ehw.title" = "繁體中文"; "TXr-FF-ehw.title" = "繁體中文";
"ueU-Rz-a1C.title" = "指定 (Shift+)Tab 熱鍵在選字窗內的輪替操作對象。"; "ueU-Rz-a1C.title" = "指定 (Shift+)Tab 熱鍵在選字窗內的輪替操作對象。";
"VdT-fw-7pQ.title" = "偵錯模式"; "VdT-fw-7pQ.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.9.4</string> <string>2.0.0</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>1994</string> <string>2000</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

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="20037" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct"> <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21223" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies> <dependencies>
<deployment identifier="macosx"/> <deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="20037"/> <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21223"/>
<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>
<objects> <objects>
@ -27,17 +27,17 @@
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
<subviews> <subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="6Dx-DY-UG1"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="6Dx-DY-UG1">
<rect key="frame" x="89" y="442" width="123" height="15"/> <rect key="frame" x="89" y="442" width="130" height="15"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="vChewing for macOS" id="lblAppTitle" userLabel="appNameLabel"> <textFieldCell key="cell" lineBreakMode="clipping" title="vChewing for macOS" id="lblAppTitle" userLabel="appNameLabel">
<font key="font" metaFont="cellTitle"/> <font key="font" size="12" name="Tahoma-Bold"/>
<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>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Srh-ua-uQD"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Srh-ua-uQD">
<rect key="frame" x="89" y="426" width="322" height="15"/> <rect key="frame" x="89" y="426" width="303" height="15"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="A subproduct of the vChewing Input Method for macOS." id="lblProjectDescription"> <textFieldCell key="cell" lineBreakMode="clipping" title="A subproduct of the vChewing Input Method for macOS." id="lblProjectDescription">
<font key="font" metaFont="cellTitle"/> <font key="font" size="12" name="Tahoma"/>
<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>
@ -48,7 +48,7 @@
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="293" id="I1K-WT-jie"/> <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="293" id="I1K-WT-jie"/>
</constraints> </constraints>
<textFieldCell key="cell" lineBreakMode="clipping" title="Placeholder for showing copyright information." id="lblCopyright" userLabel="appCopyrightLabel"> <textFieldCell key="cell" lineBreakMode="clipping" title="Placeholder for showing copyright information." id="lblCopyright" userLabel="appCopyrightLabel">
<font key="font" metaFont="cellTitle"/> <font key="font" size="12" name="Tahoma"/>
<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>
@ -56,7 +56,7 @@
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="8M8-3C-BZO"> <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="8M8-3C-BZO">
<rect key="frame" x="89" y="372" width="431" height="30"/> <rect key="frame" x="89" y="372" width="431" height="30"/>
<textFieldCell key="cell" selectable="YES" id="lblCredits"> <textFieldCell key="cell" selectable="YES" id="lblCredits">
<font key="font" metaFont="cellTitle"/> <font key="font" size="12" name="Tahoma"/>
<string key="title">vChewing Phrase Editor developed by Shiki Suen. <string key="title">vChewing Phrase Editor developed by Shiki Suen.
vChewing Phrase Database Maintained by Shiki Suen.</string> vChewing Phrase Database Maintained by Shiki Suen.</string>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -69,7 +69,7 @@ vChewing Phrase Database Maintained by Shiki Suen.</string>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="eYM-F7-drf"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="eYM-F7-drf">
<rect key="frame" x="89" y="349" width="431" height="15"/> <rect key="frame" x="89" y="349" width="431" height="15"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="MIT-NTL License:" id="lblLicense"> <textFieldCell key="cell" lineBreakMode="clipping" title="MIT-NTL License:" id="lblLicense">
<font key="font" metaFont="cellTitle"/> <font key="font" size="12" name="Tahoma"/>
<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>
@ -80,7 +80,7 @@ vChewing Phrase Database Maintained by Shiki Suen.</string>
<constraint firstAttribute="width" constant="356" id="B0d-48-3we"/> <constraint firstAttribute="width" constant="356" id="B0d-48-3we"/>
</constraints> </constraints>
<textFieldCell key="cell" selectable="YES" id="lblDisclaimer"> <textFieldCell key="cell" selectable="YES" id="lblDisclaimer">
<font key="font" metaFont="cellTitle"/> <font key="font" size="12" name="Tahoma"/>
<string key="title">DISCLAIMER: The vChewing project, having no relationship of cooperation or affiliation with the OpenVanilla project, is not responsible for the phrase database shipped in the original McBopomofo project. Certain geopolitical and ideological contents, which are potentially harmful to the global spread of this software, are not included in vChewing official phrase database.</string> <string key="title">DISCLAIMER: The vChewing project, having no relationship of cooperation or affiliation with the OpenVanilla project, is not responsible for the phrase database shipped in the original McBopomofo project. Certain geopolitical and ideological contents, which are potentially harmful to the global spread of this software, are not included in vChewing official phrase database.</string>
<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"/>
@ -94,12 +94,12 @@ vChewing Phrase Database Maintained by Shiki Suen.</string>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" animates="YES" imageScaling="proportionallyDown" image="AboutBanner" id="Noc-kP-zTE"/> <imageCell key="cell" refusesFirstResponder="YES" alignment="left" animates="YES" imageScaling="proportionallyDown" image="AboutBanner" id="Noc-kP-zTE"/>
</imageView> </imageView>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="9Pk-k3-0cO"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="9Pk-k3-0cO">
<rect key="frame" x="211" y="442" width="126" height="15"/> <rect key="frame" x="218" y="442" width="126" height="15"/>
<constraints> <constraints>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="122" id="0XT-cl-6S4"/> <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="122" id="0XT-cl-6S4"/>
</constraints> </constraints>
<textFieldCell key="cell" lineBreakMode="clipping" title="version_placeholder" id="lblVersionString" userLabel="appVersionLabel"> <textFieldCell key="cell" lineBreakMode="clipping" title="version_placeholder" id="lblVersionString" userLabel="appVersionLabel">
<font key="font" metaFont="cellTitle"/> <font key="font" size="12" name="Tahoma"/>
<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>
@ -111,7 +111,7 @@ vChewing Phrase Database Maintained by Shiki Suen.</string>
</constraints> </constraints>
<buttonCell key="cell" type="push" title="OK" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="btnConfirm"> <buttonCell key="cell" type="push" title="OK" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="btnConfirm">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/> <font key="font" size="13" name="Tahoma-Bold"/>
<string key="keyEquivalent" base64-UTF8="YES"> <string key="keyEquivalent" base64-UTF8="YES">
DQ DQ
</string> </string>
@ -159,7 +159,7 @@ DQ
<rect key="frame" x="382" y="69" width="143" height="32"/> <rect key="frame" x="382" y="69" width="143" height="32"/>
<buttonCell key="cell" type="push" title="Website" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="ImH-h2-3FG"> <buttonCell key="cell" type="push" title="Website" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="ImH-h2-3FG">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/> <font key="font" size="13" name="Tahoma"/>
</buttonCell> </buttonCell>
<connections> <connections>
<action selector="btnWebsite:" target="-1" id="WNO-E7-7UJ"/> <action selector="btnWebsite:" target="-1" id="WNO-E7-7UJ"/>

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.9.4</string> <string>2.0.0</string>
</dict> </dict>
<key>TYPE</key> <key>TYPE</key>
<integer>0</integer> <integer>0</integer>
@ -775,7 +775,7 @@
<key>BACKGROUND_PATH</key> <key>BACKGROUND_PATH</key>
<dict> <dict>
<key>PATH</key> <key>PATH</key>
<string>Installer/InstallerBg.png</string> <string>Installer/InstallerBg@2x.png</string>
<key>PATH_TYPE</key> <key>PATH_TYPE</key>
<integer>1</integer> <integer>1</integer>
</dict> </dict>
@ -790,7 +790,7 @@
<key>BACKGROUND_PATH</key> <key>BACKGROUND_PATH</key>
<dict> <dict>
<key>PATH</key> <key>PATH</key>
<string>Installer/InstallerBg.png</string> <string>Installer/InstallerBg@2x.png</string>
<key>PATH_TYPE</key> <key>PATH_TYPE</key>
<integer>1</integer> <integer>1</integer>
</dict> </dict>
@ -941,11 +941,11 @@
</dict> </dict>
<dict> <dict>
<key>LANGUAGE</key> <key>LANGUAGE</key>
<string>Simplified Chinese</string> <string>Traditional Chinese</string>
<key>VALUE</key> <key>VALUE</key>
<dict> <dict>
<key>PATH</key> <key>PATH</key>
<string>Installer/pkgTextWarning-CHS.txt</string> <string>Installer/pkgTextWarning-CHT.txt</string>
<key>PATH_TYPE</key> <key>PATH_TYPE</key>
<integer>1</integer> <integer>1</integer>
</dict> </dict>
@ -963,11 +963,11 @@
</dict> </dict>
<dict> <dict>
<key>LANGUAGE</key> <key>LANGUAGE</key>
<string>Traditional Chinese</string> <string>Simplified Chinese</string>
<key>VALUE</key> <key>VALUE</key>
<dict> <dict>
<key>PATH</key> <key>PATH</key>
<string>Installer/pkgTextWarning-CHT.txt</string> <string>Installer/pkgTextWarning-CHS.txt</string>
<key>PATH_TYPE</key> <key>PATH_TYPE</key>
<integer>1</integer> <integer>1</integer>
</dict> </dict>
@ -991,11 +991,11 @@
</dict> </dict>
<dict> <dict>
<key>LANGUAGE</key> <key>LANGUAGE</key>
<string>Simplified Chinese</string> <string>Traditional Chinese</string>
<key>VALUE</key> <key>VALUE</key>
<dict> <dict>
<key>PATH</key> <key>PATH</key>
<string>LICENSE-CHS.txt</string> <string>LICENSE-CHT.txt</string>
<key>PATH_TYPE</key> <key>PATH_TYPE</key>
<integer>1</integer> <integer>1</integer>
</dict> </dict>
@ -1013,11 +1013,11 @@
</dict> </dict>
<dict> <dict>
<key>LANGUAGE</key> <key>LANGUAGE</key>
<string>Traditional Chinese</string> <string>Simplified Chinese</string>
<key>VALUE</key> <key>VALUE</key>
<dict> <dict>
<key>PATH</key> <key>PATH</key>
<string>LICENSE-CHT.txt</string> <string>LICENSE-CHS.txt</string>
<key>PATH_TYPE</key> <key>PATH_TYPE</key>
<integer>1</integer> <integer>1</integer>
</dict> </dict>
@ -1048,9 +1048,9 @@
</dict> </dict>
<dict> <dict>
<key>LANGUAGE</key> <key>LANGUAGE</key>
<string>Traditional Chinese</string> <string>Simplified Chinese</string>
<key>VALUE</key> <key>VALUE</key>
<string>威注音入法</string> <string>威注音入法</string>
</dict> </dict>
<dict> <dict>
<key>LANGUAGE</key> <key>LANGUAGE</key>
@ -1060,9 +1060,9 @@
</dict> </dict>
<dict> <dict>
<key>LANGUAGE</key> <key>LANGUAGE</key>
<string>Simplified Chinese</string> <string>Traditional Chinese</string>
<key>VALUE</key> <key>VALUE</key>
<string>威注音入法</string> <string>威注音入法</string>
</dict> </dict>
</array> </array>
</dict> </dict>
@ -1099,11 +1099,11 @@
</dict> </dict>
<dict> <dict>
<key>LANGUAGE</key> <key>LANGUAGE</key>
<string>Traditional Chinese</string> <string>Simplified Chinese</string>
<key>SECONDARY_VALUE</key> <key>SECONDARY_VALUE</key>
<string>至少 macOS 10.11.5 方可滿足威注音對系統內的萬國碼版本支援的需要。</string> <string>至少 macOS 10.11.5 方可满足威注音对系统内的万国码版本支援的需要。</string>
<key>VALUE</key> <key>VALUE</key>
<string>作業系統版本太舊</string> <string>作业系统版本太旧</string>
</dict> </dict>
<dict> <dict>
<key>LANGUAGE</key> <key>LANGUAGE</key>
@ -1115,11 +1115,11 @@
</dict> </dict>
<dict> <dict>
<key>LANGUAGE</key> <key>LANGUAGE</key>
<string>Simplified Chinese</string> <string>Traditional Chinese</string>
<key>SECONDARY_VALUE</key> <key>SECONDARY_VALUE</key>
<string>至少 macOS 10.11.5 方可满足威注音对系统内的万国码版本支援的需要。</string> <string>至少 macOS 10.11.5 方可滿足威注音對系統內的萬國碼版本支援的需要。</string>
<key>VALUE</key> <key>VALUE</key>
<string>作业系统版本太旧</string> <string>作業系統版本太舊</string>
</dict> </dict>
</array> </array>
<key>NAME</key> <key>NAME</key>

View File

@ -1421,7 +1421,7 @@
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1994; CURRENT_PROJECT_VERSION = 2000;
GCC_C_LANGUAGE_STANDARD = gnu11; GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO; GCC_DYNAMIC_NO_PIC = NO;
GCC_PREPROCESSOR_DEFINITIONS = ( GCC_PREPROCESSOR_DEFINITIONS = (
@ -1431,7 +1431,7 @@
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.9.4; MARKETING_VERSION = 2.0.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewingTests; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewingTests;
@ -1460,13 +1460,13 @@
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1994; CURRENT_PROJECT_VERSION = 2000;
ENABLE_NS_ASSERTIONS = NO; ENABLE_NS_ASSERTIONS = NO;
GCC_C_LANGUAGE_STANDARD = gnu11; GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.9.4; MARKETING_VERSION = 2.0.0;
MTL_ENABLE_DEBUG_INFO = NO; MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewingTests; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewingTests;
@ -1497,7 +1497,7 @@
CODE_SIGN_IDENTITY = "-"; CODE_SIGN_IDENTITY = "-";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 1994; CURRENT_PROJECT_VERSION = 2000;
DEAD_CODE_STRIPPING = YES; DEAD_CODE_STRIPPING = YES;
GCC_C_LANGUAGE_STANDARD = gnu11; GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO; GCC_DYNAMIC_NO_PIC = NO;
@ -1518,7 +1518,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
MARKETING_VERSION = 1.9.4; MARKETING_VERSION = 2.0.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewing.vChewingPhraseEditor; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewing.vChewingPhraseEditor;
@ -1547,7 +1547,7 @@
CODE_SIGN_IDENTITY = "-"; CODE_SIGN_IDENTITY = "-";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 1994; CURRENT_PROJECT_VERSION = 2000;
DEAD_CODE_STRIPPING = YES; DEAD_CODE_STRIPPING = YES;
ENABLE_NS_ASSERTIONS = NO; ENABLE_NS_ASSERTIONS = NO;
GCC_C_LANGUAGE_STANDARD = gnu11; GCC_C_LANGUAGE_STANDARD = gnu11;
@ -1564,7 +1564,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
MARKETING_VERSION = 1.9.4; MARKETING_VERSION = 2.0.0;
MTL_ENABLE_DEBUG_INFO = NO; MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewing.vChewingPhraseEditor; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewing.vChewingPhraseEditor;
@ -1678,7 +1678,7 @@
CODE_SIGN_IDENTITY = "-"; CODE_SIGN_IDENTITY = "-";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 1994; CURRENT_PROJECT_VERSION = 2000;
DEAD_CODE_STRIPPING = YES; DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_ASSET_PATHS = "";
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = "";
@ -1706,7 +1706,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
MARKETING_VERSION = 1.9.4; MARKETING_VERSION = 2.0.0;
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.inputmethod.vChewing; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.inputmethod.vChewing;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
@ -1733,7 +1733,7 @@
CODE_SIGN_IDENTITY = "-"; CODE_SIGN_IDENTITY = "-";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 1994; CURRENT_PROJECT_VERSION = 2000;
DEAD_CODE_STRIPPING = YES; DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_ASSET_PATHS = "";
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = "";
@ -1755,7 +1755,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
MARKETING_VERSION = 1.9.4; MARKETING_VERSION = 2.0.0;
PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.inputmethod.vChewing; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.inputmethod.vChewing;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
@ -1777,7 +1777,7 @@
CODE_SIGN_IDENTITY = "-"; CODE_SIGN_IDENTITY = "-";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 1994; CURRENT_PROJECT_VERSION = 2000;
DEAD_CODE_STRIPPING = YES; DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = "";
GCC_C_LANGUAGE_STANDARD = gnu99; GCC_C_LANGUAGE_STANDARD = gnu99;
@ -1797,9 +1797,9 @@
"$(inherited)", "$(inherited)",
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
MARKETING_VERSION = 1.9.4; MARKETING_VERSION = 2.0.0;
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
PRODUCT_BUNDLE_IDENTIFIER = "org.atelierInmu.vChewing.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewing.vChewingInstaller;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
@ -1819,7 +1819,7 @@
CODE_SIGN_IDENTITY = "-"; CODE_SIGN_IDENTITY = "-";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 1994; CURRENT_PROJECT_VERSION = 2000;
DEAD_CODE_STRIPPING = YES; DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = "";
GCC_C_LANGUAGE_STANDARD = gnu99; GCC_C_LANGUAGE_STANDARD = gnu99;
@ -1833,8 +1833,8 @@
"$(inherited)", "$(inherited)",
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
MARKETING_VERSION = 1.9.4; MARKETING_VERSION = 2.0.0;
PRODUCT_BUNDLE_IDENTIFIER = "org.atelierInmu.vChewing.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewing.vChewingInstaller;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;