PrefWindow // +checkAbusersOfSecureEventInputAPI().

This commit is contained in:
ShikiSuen 2023-10-23 20:54:56 +08:00
parent 6e946f5db1
commit 7f744589af
6 changed files with 140 additions and 77 deletions

View File

@ -62,6 +62,8 @@ class CtlPrefWindow: NSWindowController, NSWindowDelegate {
@IBOutlet var vwrKeyboard: NSView! @IBOutlet var vwrKeyboard: NSView!
@IBOutlet var vwrDevZone: NSView! @IBOutlet var vwrDevZone: NSView!
var previousView: NSView?
public static var shared: CtlPrefWindow? public static var shared: CtlPrefWindow?
@objc var observation: NSKeyValueObservation? @objc var observation: NSKeyValueObservation?
@ -124,7 +126,7 @@ class CtlPrefWindow: NSWindowController, NSWindowDelegate {
toolbar.delegate = self toolbar.delegate = self
toolbar.selectedItemIdentifier = PrefUITabs.tabGeneral.toolbarIdentifier toolbar.selectedItemIdentifier = PrefUITabs.tabGeneral.toolbarIdentifier
toolbar.showsBaselineSeparator = true toolbar.showsBaselineSeparator = true
if #available(macOS 13, *) { if #available(macOS 11.0, *) {
window?.toolbarStyle = .preference window?.toolbarStyle = .preference
} }
window?.toolbar = toolbar window?.toolbar = toolbar
@ -467,14 +469,29 @@ class CtlPrefWindow: NSWindowController, NSWindowDelegate {
extension CtlPrefWindow: NSToolbarDelegate { extension CtlPrefWindow: NSToolbarDelegate {
func use(view newView: NSView, animate: Bool = true) { func use(view newView: NSView, animate: Bool = true) {
guard let window = window, let existingContentView = window.contentView else { return } guard let window = window, let existingContentView = window.contentView else { return }
guard previousView != newView else { return }
previousView = newView
let temporaryViewOld = NSView(frame: existingContentView.frame) let temporaryViewOld = NSView(frame: existingContentView.frame)
window.contentView = temporaryViewOld window.contentView = temporaryViewOld
var newWindowRect = NSRect(origin: window.frame.origin, size: newView.bounds.size) var newWindowRect = NSRect(origin: window.frame.origin, size: newView.bounds.size)
let shouldScroll: Bool = newWindowRect.size.height > 577
if shouldScroll { newWindowRect.size.height = 577 }
newWindowRect.size.height += kWindowTitleHeight newWindowRect.size.height += kWindowTitleHeight
newWindowRect.origin.y = window.frame.maxY - newWindowRect.height newWindowRect.origin.y = window.frame.maxY - newWindowRect.height
window.setFrame(newWindowRect, display: true, animate: animate) window.setFrame(newWindowRect, display: true, animate: animate)
if shouldScroll {
let scrollview = NSScrollView(frame: NSRect(x: 0, y: 0, width: 577, height: 577))
scrollview.borderType = .noBorder
scrollview.hasVerticalScroller = true
scrollview.hasHorizontalScroller = false
scrollview.verticalScroller?.scrollerStyle = .legacy
scrollview.autoresizingMask = [.width, .height]
scrollview.documentView = newView
window.contentView = scrollview
} else {
window.contentView = newView window.contentView = newView
} }
}
var toolbarIdentifiers: [NSToolbarItem.Identifier] { var toolbarIdentifiers: [NSToolbarItem.Identifier] {
PrefUITabs.allCases.filter { PrefUITabs.allCases.filter {

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="22154" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES"> <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="22155" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies> <dependencies>
<deployment identifier="macosx"/> <deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="22154"/> <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="22155"/>
<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>
@ -928,14 +928,14 @@
</view> </view>
<customObject id="-3" userLabel="Application" customClass="NSObject"/> <customObject id="-3" userLabel="Application" customClass="NSObject"/>
<view id="XWo-36-xGi" userLabel="vwrBehavior"> <view id="XWo-36-xGi" userLabel="vwrBehavior">
<rect key="frame" x="0.0" y="0.0" width="577" height="589"/> <rect key="frame" x="0.0" y="0.0" width="577" height="695"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews> <subviews>
<stackView distribution="fill" orientation="vertical" alignment="leading" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" translatesAutoresizingMaskIntoConstraints="NO" id="j9R-fB-ttM"> <stackView distribution="fill" orientation="vertical" alignment="leading" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" translatesAutoresizingMaskIntoConstraints="NO" id="j9R-fB-ttM">
<rect key="frame" x="20" y="38" width="530" height="531"/> <rect key="frame" x="20" y="32" width="537" height="643"/>
<subviews> <subviews>
<stackView distribution="fill" orientation="vertical" alignment="leading" spacing="4" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" translatesAutoresizingMaskIntoConstraints="NO" id="pwZ-0Z-1ID"> <stackView distribution="fill" orientation="vertical" alignment="leading" spacing="4" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" translatesAutoresizingMaskIntoConstraints="NO" id="pwZ-0Z-1ID">
<rect key="frame" x="0.0" y="390" width="530" height="141"/> <rect key="frame" x="0.0" y="502" width="530" height="141"/>
<subviews> <subviews>
<button translatesAutoresizingMaskIntoConstraints="NO" id="109"> <button translatesAutoresizingMaskIntoConstraints="NO" id="109">
<rect key="frame" x="-1" y="124.5" width="285" height="17"/> <rect key="frame" x="-1" y="124.5" width="285" height="17"/>
@ -1057,7 +1057,7 @@
</customSpacing> </customSpacing>
</stackView> </stackView>
<stackView distribution="fill" orientation="vertical" alignment="leading" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" translatesAutoresizingMaskIntoConstraints="NO" id="fO5-4y-X0y"> <stackView distribution="fill" orientation="vertical" alignment="leading" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" translatesAutoresizingMaskIntoConstraints="NO" id="fO5-4y-X0y">
<rect key="frame" x="0.0" y="344" width="365" height="38"/> <rect key="frame" x="0.0" y="456" width="365" height="38"/>
<subviews> <subviews>
<textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="TMn-LX-3Ub"> <textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="TMn-LX-3Ub">
<rect key="frame" x="-2" y="23" width="369" height="15"/> <rect key="frame" x="-2" y="23" width="369" height="15"/>
@ -1105,7 +1105,7 @@
</customSpacing> </customSpacing>
</stackView> </stackView>
<stackView distribution="fill" orientation="vertical" alignment="leading" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" translatesAutoresizingMaskIntoConstraints="NO" id="EOx-os-rU9"> <stackView distribution="fill" orientation="vertical" alignment="leading" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" translatesAutoresizingMaskIntoConstraints="NO" id="EOx-os-rU9">
<rect key="frame" x="0.0" y="262" width="381" height="74"/> <rect key="frame" x="0.0" y="374" width="381" height="74"/>
<subviews> <subviews>
<textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="sjl-L6-qdY"> <textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="sjl-L6-qdY">
<rect key="frame" x="-2" y="59" width="385" height="15"/> <rect key="frame" x="-2" y="59" width="385" height="15"/>
@ -1155,7 +1155,7 @@
</customSpacing> </customSpacing>
</stackView> </stackView>
<stackView distribution="fill" orientation="vertical" alignment="leading" spacing="7" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" translatesAutoresizingMaskIntoConstraints="NO" id="L1h-Ce-g4Z"> <stackView distribution="fill" orientation="vertical" alignment="leading" spacing="7" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" translatesAutoresizingMaskIntoConstraints="NO" id="L1h-Ce-g4Z">
<rect key="frame" x="0.0" y="145" width="449" height="109"/> <rect key="frame" x="0.0" y="257" width="449" height="109"/>
<subviews> <subviews>
<textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="6q5-OP-iEb"> <textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="6q5-OP-iEb">
<rect key="frame" x="-2" y="94" width="332" height="15"/> <rect key="frame" x="-2" y="94" width="332" height="15"/>
@ -1213,7 +1213,7 @@
</customSpacing> </customSpacing>
</stackView> </stackView>
<stackView distribution="fill" orientation="vertical" alignment="leading" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" translatesAutoresizingMaskIntoConstraints="NO" id="NOW-jd-XBh"> <stackView distribution="fill" orientation="vertical" alignment="leading" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" translatesAutoresizingMaskIntoConstraints="NO" id="NOW-jd-XBh">
<rect key="frame" x="0.0" y="81" width="358" height="56"/> <rect key="frame" x="0.0" y="193" width="358" height="56"/>
<subviews> <subviews>
<textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="J0f-Aw-dxC"> <textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="J0f-Aw-dxC">
<rect key="frame" x="-2" y="41" width="336" height="15"/> <rect key="frame" x="-2" y="41" width="336" height="15"/>
@ -1259,7 +1259,7 @@
</customSpacing> </customSpacing>
</stackView> </stackView>
<stackView distribution="fill" orientation="vertical" alignment="leading" spacing="7" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" translatesAutoresizingMaskIntoConstraints="NO" id="s47-wG-vKA"> <stackView distribution="fill" orientation="vertical" alignment="leading" spacing="7" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" translatesAutoresizingMaskIntoConstraints="NO" id="s47-wG-vKA">
<rect key="frame" x="0.0" y="0.0" width="348" height="73"/> <rect key="frame" x="0.0" y="112" width="348" height="73"/>
<subviews> <subviews>
<textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="iCL-n8-VTP"> <textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="iCL-n8-VTP">
<rect key="frame" x="-2" y="58" width="323" height="15"/> <rect key="frame" x="-2" y="58" width="323" height="15"/>
@ -1308,12 +1308,76 @@
<real value="3.4028234663852886e+38"/> <real value="3.4028234663852886e+38"/>
</customSpacing> </customSpacing>
</stackView> </stackView>
<stackView distribution="fill" orientation="vertical" alignment="leading" spacing="5" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="UFf-Pi-9Jt" userLabel="stkShiftKeyASCIITogglesPane">
<rect key="frame" x="0.0" y="0.0" width="537" height="104"/>
<subviews>
<box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="2zC-9V-ryy">
<rect key="frame" x="0.0" y="101" width="530" height="5"/>
<constraints>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="530" id="ppo-kg-vfE"/>
</constraints>
</box>
<button translatesAutoresizingMaskIntoConstraints="NO" id="47z-Kc-MdV">
<rect key="frame" x="-1" y="81.5" width="268" height="17"/>
<buttonCell key="cell" type="check" title="Toggle alphanumerical mode with Left-Shift" bezelStyle="regularSquare" imagePosition="left" controlSize="small" inset="2" id="CVy-8U-3qQ">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="cellTitle"/>
</buttonCell>
<constraints>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="70" id="JyP-8L-nph"/>
<constraint firstAttribute="height" constant="16" id="uE2-0S-Bgm"/>
</constraints>
<connections>
<binding destination="32" name="value" keyPath="values.TogglingAlphanumericalModeWithLShift" id="L1D-gV-tCC"/>
</connections>
</button>
<button translatesAutoresizingMaskIntoConstraints="NO" id="taP-hv-eg2">
<rect key="frame" x="-1" y="60.5" width="276" height="17"/>
<buttonCell key="cell" type="check" title="Toggle alphanumerical mode with Right-Shift" bezelStyle="regularSquare" imagePosition="left" controlSize="small" inset="2" id="nxP-CV-ZAu">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="cellTitle"/>
</buttonCell>
<constraints>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="70" id="mzA-do-IWc"/>
<constraint firstAttribute="height" constant="16" id="uiX-bl-Lww"/>
</constraints>
<connections>
<binding destination="32" name="value" keyPath="values.TogglingAlphanumericalModeWithRShift" id="4qK-TY-SFb"/>
</connections>
</button>
<textField wantsLayer="YES" focusRingType="none" verticalHuggingPriority="750" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Dec-3q-bsx">
<rect key="frame" x="-2" y="0.0" width="541" height="56"/>
<constraints>
<constraint firstAttribute="width" constant="537" id="wkg-gt-KuK"/>
</constraints>
<textFieldCell key="cell" controlSize="small" sendsActionOnEndEditing="YES" alignment="left" id="Rl7-3a-RDn">
<font key="font" metaFont="smallSystem"/>
<string key="title">This feature only needs to parse consecutive NSEvents passed by macOS built-in InputMethodKit framework, hence no necessity of asking end-users for extra privileges of monitoring global keyboard inputs. You are free to investigate our codebase or reverse-engineer this input method to see whether the above statement is trustable.</string>
<color key="textColor" name="secondaryLabelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews> </subviews>
<visibilityPriorities> <visibilityPriorities>
<integer value="1000"/> <integer value="1000"/>
<integer value="1000"/> <integer value="1000"/>
<integer value="1000"/> <integer value="1000"/>
<integer value="1000"/> <integer value="1000"/>
</visibilityPriorities>
<customSpacing>
<real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
</customSpacing>
</stackView>
</subviews>
<visibilityPriorities>
<integer value="1000"/>
<integer value="1000"/>
<integer value="1000"/>
<integer value="1000"/>
<integer value="1000"/>
<integer value="1000"/> <integer value="1000"/>
<integer value="1000"/> <integer value="1000"/>
</visibilityPriorities> </visibilityPriorities>
@ -1324,6 +1388,7 @@
<real value="3.4028234663852886e+38"/> <real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/> <real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/> <real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
</customSpacing> </customSpacing>
</stackView> </stackView>
</subviews> </subviews>
@ -1332,7 +1397,7 @@
<constraint firstItem="j9R-fB-ttM" firstAttribute="top" secondItem="XWo-36-xGi" secondAttribute="top" constant="20" symbolic="YES" id="CuZ-dn-mQZ"/> <constraint firstItem="j9R-fB-ttM" firstAttribute="top" secondItem="XWo-36-xGi" secondAttribute="top" constant="20" symbolic="YES" id="CuZ-dn-mQZ"/>
</constraints> </constraints>
<accessibility identifier="vwrBehavior"/> <accessibility identifier="vwrBehavior"/>
<point key="canvasLocation" x="-1351.5" y="615.5"/> <point key="canvasLocation" x="-1351.5" y="668.5"/>
</view> </view>
<userDefaultsController representsSharedInstance="YES" id="32"/> <userDefaultsController representsSharedInstance="YES" id="32"/>
<view id="Rnp-LM-RIF" userLabel="vwrDictionary"> <view id="Rnp-LM-RIF" userLabel="vwrDictionary">
@ -1685,7 +1750,7 @@
<rect key="frame" x="0.0" y="71" width="538" height="370"/> <rect key="frame" x="0.0" y="71" width="538" height="370"/>
<clipView key="contentView" drawsBackground="NO" id="x8s-wo-bxi"> <clipView key="contentView" drawsBackground="NO" id="x8s-wo-bxi">
<rect key="frame" x="0.0" y="0.0" width="538" height="370"/> <rect key="frame" x="0.0" y="0.0" width="538" height="370"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<textView wantsLayer="YES" importsGraphics="NO" richText="NO" verticallyResizable="YES" allowsUndo="YES" smartInsertDelete="YES" id="kSG-dz-P2N"> <textView wantsLayer="YES" importsGraphics="NO" richText="NO" verticallyResizable="YES" allowsUndo="YES" smartInsertDelete="YES" id="kSG-dz-P2N">
<rect key="frame" x="0.0" y="0.0" width="538" height="370"/> <rect key="frame" x="0.0" y="0.0" width="538" height="370"/>
@ -2454,17 +2519,17 @@ DQ
<constraint firstItem="0gn-BJ-qid" firstAttribute="top" secondItem="U4q-xw-mc0" secondAttribute="top" constant="20" symbolic="YES" id="qgB-J1-68N"/> <constraint firstItem="0gn-BJ-qid" firstAttribute="top" secondItem="U4q-xw-mc0" secondAttribute="top" constant="20" symbolic="YES" id="qgB-J1-68N"/>
</constraints> </constraints>
<accessibility identifier="vwrKeyboard"/> <accessibility identifier="vwrKeyboard"/>
<point key="canvasLocation" x="-716" y="453"/> <point key="canvasLocation" x="-716" y="475"/>
</view> </view>
<view id="MaQ-Xm-8TB" userLabel="vwrDevZone"> <view id="MaQ-Xm-8TB" userLabel="vwrDevZone">
<rect key="frame" x="0.0" y="0.0" width="577" height="364"/> <rect key="frame" x="0.0" y="0.0" width="577" height="364"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<stackView distribution="fill" orientation="vertical" alignment="leading" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" translatesAutoresizingMaskIntoConstraints="NO" id="gjM-uG-XkW"> <stackView distribution="fill" orientation="vertical" alignment="leading" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" translatesAutoresizingMaskIntoConstraints="NO" id="gjM-uG-XkW">
<rect key="frame" x="20" y="39" width="537" height="305"/> <rect key="frame" x="20" y="43" width="537" height="301"/>
<subviews> <subviews>
<textField wantsLayer="YES" focusRingType="none" verticalHuggingPriority="750" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="hBd-sS-cWq"> <textField wantsLayer="YES" focusRingType="none" verticalHuggingPriority="750" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="hBd-sS-cWq">
<rect key="frame" x="-2" y="277" width="541" height="28"/> <rect key="frame" x="-2" y="273" width="541" height="28"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="537" id="Kvp-PL-Pes"/> <constraint firstAttribute="width" constant="537" id="Kvp-PL-Pes"/>
</constraints> </constraints>
@ -2477,14 +2542,14 @@ Features listed here may not work as expected.</string>
</textFieldCell> </textFieldCell>
</textField> </textField>
<box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="ul4-N6-Ybi"> <box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="ul4-N6-Ybi">
<rect key="frame" x="0.0" y="266" width="537" height="5"/> <rect key="frame" x="0.0" y="262" width="537" height="5"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="537" id="2lI-El-JtD"/> <constraint firstAttribute="width" constant="537" id="2lI-El-JtD"/>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="400" id="kJZ-E8-eDL"/> <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="400" id="kJZ-E8-eDL"/>
</constraints> </constraints>
</box> </box>
<button translatesAutoresizingMaskIntoConstraints="NO" id="mCf-kK-FJc"> <button translatesAutoresizingMaskIntoConstraints="NO" id="mCf-kK-FJc">
<rect key="frame" x="-1" y="243.5" width="321" height="17"/> <rect key="frame" x="-1" y="239.5" width="321" height="17"/>
<buttonCell key="cell" type="check" title="Security-harden the composition buffer for all clients" bezelStyle="regularSquare" imagePosition="left" controlSize="small" inset="2" id="3N6-LT-HPv"> <buttonCell key="cell" type="check" title="Security-harden the composition buffer for all clients" bezelStyle="regularSquare" imagePosition="left" controlSize="small" inset="2" id="3N6-LT-HPv">
<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"/>
@ -2498,7 +2563,7 @@ Features listed here may not work as expected.</string>
</connections> </connections>
</button> </button>
<textField wantsLayer="YES" focusRingType="none" verticalHuggingPriority="750" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="uTe-PD-0NE"> <textField wantsLayer="YES" focusRingType="none" verticalHuggingPriority="750" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="uTe-PD-0NE">
<rect key="frame" x="-2" y="208" width="541" height="28"/> <rect key="frame" x="-2" y="204" width="541" height="28"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="537" id="RXL-dq-gV0"/> <constraint firstAttribute="width" constant="537" id="RXL-dq-gV0"/>
</constraints> </constraints>
@ -2510,7 +2575,7 @@ Features listed here may not work as expected.</string>
</textFieldCell> </textFieldCell>
</textField> </textField>
<button translatesAutoresizingMaskIntoConstraints="NO" id="yJg-tV-hH6"> <button translatesAutoresizingMaskIntoConstraints="NO" id="yJg-tV-hH6">
<rect key="frame" x="-1" y="183.5" width="429" height="17"/> <rect key="frame" x="-1" y="179.5" width="429" height="17"/>
<buttonCell key="cell" type="check" title="Disable segmented thick underline in marking mode for managed clients" bezelStyle="regularSquare" imagePosition="left" controlSize="small" inset="2" id="N6e-bR-mVa"> <buttonCell key="cell" type="check" title="Disable segmented thick underline in marking mode for managed clients" bezelStyle="regularSquare" imagePosition="left" controlSize="small" inset="2" id="N6e-bR-mVa">
<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"/>
@ -2524,7 +2589,7 @@ Features listed here may not work as expected.</string>
</connections> </connections>
</button> </button>
<textField wantsLayer="YES" focusRingType="none" verticalHuggingPriority="750" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="uK3-cc-UcW"> <textField wantsLayer="YES" focusRingType="none" verticalHuggingPriority="750" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="uK3-cc-UcW">
<rect key="frame" x="-2" y="106" width="541" height="70"/> <rect key="frame" x="-2" y="102" width="541" height="70"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="537" id="qOi-aV-LQX"/> <constraint firstAttribute="width" constant="537" id="qOi-aV-LQX"/>
</constraints> </constraints>
@ -2535,45 +2600,28 @@ Features listed here may not work as expected.</string>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell> </textFieldCell>
</textField> </textField>
<stackView distribution="fill" orientation="vertical" alignment="leading" spacing="5" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="UFf-Pi-9Jt" userLabel="stkShiftKeyASCIITogglesPane"> <button translatesAutoresizingMaskIntoConstraints="NO" id="PAX-gG-dDq">
<rect key="frame" x="0.0" y="0.0" width="537" height="98"/> <rect key="frame" x="-1" y="77.5" width="395" height="17"/>
<subviews> <buttonCell key="cell" type="check" title="Actively check those processes abusing the SecureEventInput API" bezelStyle="regularSquare" imagePosition="left" controlSize="small" inset="2" id="chkCheckAbusersOfSecureEventInputAPI">
<button translatesAutoresizingMaskIntoConstraints="NO" id="47z-Kc-MdV">
<rect key="frame" x="-1" y="81.5" width="268" height="17"/>
<buttonCell key="cell" type="check" title="Toggle alphanumerical mode with Left-Shift" bezelStyle="regularSquare" imagePosition="left" controlSize="small" inset="2" id="CVy-8U-3qQ">
<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>
<constraints> <constraints>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="70" id="JyP-8L-nph"/> <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="70" id="CPH-Ec-61k"/>
<constraint firstAttribute="height" constant="16" id="uE2-0S-Bgm"/> <constraint firstAttribute="height" constant="16" id="Sl3-ON-r6A"/>
</constraints> </constraints>
<connections> <connections>
<binding destination="32" name="value" keyPath="values.TogglingAlphanumericalModeWithLShift" id="L1D-gV-tCC"/> <binding destination="32" name="value" keyPath="values.CheckAbusersOfSecureEventInputAPI" id="j92-od-32w"/>
</connections> </connections>
</button> </button>
<button translatesAutoresizingMaskIntoConstraints="NO" id="taP-hv-eg2"> <textField wantsLayer="YES" focusRingType="none" verticalHuggingPriority="750" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="7xr-bA-Gg5">
<rect key="frame" x="-1" y="60.5" width="276" height="17"/> <rect key="frame" x="-2" y="0.0" width="541" height="70"/>
<buttonCell key="cell" type="check" title="Toggle alphanumerical mode with Right-Shift" bezelStyle="regularSquare" imagePosition="left" controlSize="small" inset="2" id="nxP-CV-ZAu">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="cellTitle"/>
</buttonCell>
<constraints> <constraints>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="70" id="mzA-do-IWc"/> <constraint firstAttribute="width" constant="537" id="uIU-Qp-xCh"/>
<constraint firstAttribute="height" constant="16" id="uiX-bl-Lww"/>
</constraints> </constraints>
<connections> <textFieldCell key="cell" controlSize="small" sendsActionOnEndEditing="YES" alignment="left" id="lblCheckAbusersOfSecureEventInputAPI">
<binding destination="32" name="value" keyPath="values.TogglingAlphanumericalModeWithRShift" id="4qK-TY-SFb"/>
</connections>
</button>
<textField wantsLayer="YES" focusRingType="none" verticalHuggingPriority="750" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Dec-3q-bsx">
<rect key="frame" x="-2" y="0.0" width="541" height="56"/>
<constraints>
<constraint firstAttribute="width" constant="537" id="wkg-gt-KuK"/>
</constraints>
<textFieldCell key="cell" controlSize="small" sendsActionOnEndEditing="YES" alignment="left" id="Rl7-3a-RDn">
<font key="font" metaFont="smallSystem"/> <font key="font" metaFont="smallSystem"/>
<string key="title">This feature only needs to parse consecutive NSEvents passed by macOS built-in InputMethodKit framework, hence no necessity of asking end-users for extra privileges of monitoring global keyboard inputs. You are free to investigate our codebase or reverse-engineer this input method to see whether the above statement is trustable.</string> <string key="title">Such abuse of SecureEventInput API in the background can hinder all 3rd-party input methods from being able to switch to. It is fine to use SecureEventInput for sensitive input fields. However, an app calling EnableSecureEventInput() is responsible to call DisableSecureEventInput() immediately right after the input field loses focus. This situation may also happen if an app is hanging in the background (or working as a helper application in the background) with its SecureEventInput left enabled.</string>
<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>
@ -2583,17 +2631,6 @@ Features listed here may not work as expected.</string>
<integer value="1000"/> <integer value="1000"/>
<integer value="1000"/> <integer value="1000"/>
<integer value="1000"/> <integer value="1000"/>
</visibilityPriorities>
<customSpacing>
<real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
</customSpacing>
</stackView>
</subviews>
<visibilityPriorities>
<integer value="1000"/>
<integer value="1000"/>
<integer value="1000"/> <integer value="1000"/>
<integer value="1000"/> <integer value="1000"/>
<integer value="1000"/> <integer value="1000"/>
@ -2608,6 +2645,7 @@ Features listed here may not work as expected.</string>
<real value="3.4028234663852886e+38"/> <real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/> <real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/> <real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
</customSpacing> </customSpacing>
</stackView> </stackView>
</subviews> </subviews>

View File

@ -47,6 +47,7 @@
"chkAllowBoostingSingleKanjiAsUserPhrase.title" = "Allow boosting / excluding a candidate of single kanji when marking"; "chkAllowBoostingSingleKanjiAsUserPhrase.title" = "Allow boosting / excluding a candidate of single kanji when marking";
"chkAlsoConfirmAssociatedCandidatesByEnter.title" = "Allow using Enter key to confirm associated candidate selection"; "chkAlsoConfirmAssociatedCandidatesByEnter.title" = "Allow using Enter key to confirm associated candidate selection";
"chkAutoCorrectReadingCombination.title" = "Automatically correct reading combinations when typing"; "chkAutoCorrectReadingCombination.title" = "Automatically correct reading combinations when typing";
"chkCheckAbusersOfSecureEventInputAPI.title" = "Actively check those processes abusing the SecureEventInput API";
"chkConsolidateContextOnCandidateSelection.title" = "Consolidate the context on confirming candidate selection"; "chkConsolidateContextOnCandidateSelection.title" = "Consolidate the context on confirming candidate selection";
"chkFetchSuggestionsFromUserOverrideModel.title" = "Applying typing suggestions from half-life user override model"; "chkFetchSuggestionsFromUserOverrideModel.title" = "Applying typing suggestions from half-life user override model";
"chkHardenVerticalPunctuations.title" = "Harden vertical punctuations during vertical typing"; "chkHardenVerticalPunctuations.title" = "Harden vertical punctuations during vertical typing";
@ -84,6 +85,7 @@
"kcM-O6-mLN.title" = "This hinders all client apps from unwelcomely accessing your uncommitted contents in the composition buffer. A popup composition buffer will be shown instead."; "kcM-O6-mLN.title" = "This hinders all client apps from unwelcomely accessing your uncommitted contents in the composition buffer. A popup composition buffer will be shown instead.";
"lblAcceptLeadingIntonations.title" = "Accept leading intonations in rare cases"; "lblAcceptLeadingIntonations.title" = "Accept leading intonations in rare cases";
"lblAlwaysShowTooltipTextsHorizontally.title" = "Always show tooltip texts horizontally"; "lblAlwaysShowTooltipTextsHorizontally.title" = "Always show tooltip texts horizontally";
"lblCheckAbusersOfSecureEventInputAPI.title" = "Such abuse of SecureEventInput API in the background can hinder all 3rd-party input methods from being able to switch to. It is fine to use SecureEventInput for sensitive input fields. However, an app calling EnableSecureEventInput() is responsible to call DisableSecureEventInput() immediately right after the input field loses focus. This situation may also happen if an app is hanging in the background (or working as a helper application in the background) with its SecureEventInput left enabled.";
"lblDevZoneTitleDescription.title" = "Warning: This page is for testing future features. \nFeatures listed here may not work as expected."; "lblDevZoneTitleDescription.title" = "Warning: This page is for testing future features. \nFeatures listed here may not work as expected.";
"lblIntonationKeyBehavior.title" = "Specify what intonation key does when syllable composer is empty."; "lblIntonationKeyBehavior.title" = "Specify what intonation key does when syllable composer is empty.";
"lblShiftBkspKeyBehavior.title" = "Choose the attempted behavior of Shift+BackSpace key."; "lblShiftBkspKeyBehavior.title" = "Choose the attempted behavior of Shift+BackSpace key.";

View File

@ -47,6 +47,7 @@
"chkAllowBoostingSingleKanjiAsUserPhrase.title" = "マーキングモードで即排除/即最優先にできる候補の文字数の最低限は1字とする"; "chkAllowBoostingSingleKanjiAsUserPhrase.title" = "マーキングモードで即排除/即最優先にできる候補の文字数の最低限は1字とする";
"chkAlsoConfirmAssociatedCandidatesByEnter.title" = "Enter キーを連想語彙候補の確認のために使う"; "chkAlsoConfirmAssociatedCandidatesByEnter.title" = "Enter キーを連想語彙候補の確認のために使う";
"chkAutoCorrectReadingCombination.title" = "入力中で打ち間違った発音組み合わせを自動的に訂正する"; "chkAutoCorrectReadingCombination.title" = "入力中で打ち間違った発音組み合わせを自動的に訂正する";
"chkCheckAbusersOfSecureEventInputAPI.title" = "SecureEventInput API を不正利用しているバクグラウンド・プロセスを自動検知";
"chkConsolidateContextOnCandidateSelection.title" = "候補陳列ウィンドウで候補を選ぶ時に文脈を強固する"; "chkConsolidateContextOnCandidateSelection.title" = "候補陳列ウィンドウで候補を選ぶ時に文脈を強固する";
"chkFetchSuggestionsFromUserOverrideModel.title" = "入力中で臨時記憶モジュールからお薦めの候補を自動的に選ぶ"; "chkFetchSuggestionsFromUserOverrideModel.title" = "入力中で臨時記憶モジュールからお薦めの候補を自動的に選ぶ";
"chkHardenVerticalPunctuations.title" = "縦書きの時に、引用符・括弧などを強制的に縦書き文字と変換する(不推奨)"; "chkHardenVerticalPunctuations.title" = "縦書きの時に、引用符・括弧などを強制的に縦書き文字と変換する(不推奨)";
@ -84,6 +85,7 @@
"kcM-O6-mLN.title" = "これで、どの客体アプリも、入力緩衝列の送り出さなかった内容を(勝手に)読み用いることは不可能になる。すなわち「吹き出し入力緩衝列ウィンドウ」の「常に出番」である。"; "kcM-O6-mLN.title" = "これで、どの客体アプリも、入力緩衝列の送り出さなかった内容を(勝手に)読み用いることは不可能になる。すなわち「吹き出し入力緩衝列ウィンドウ」の「常に出番」である。";
"lblAcceptLeadingIntonations.title" = "まれな場合には、音調記号の優先入力を許容する"; "lblAcceptLeadingIntonations.title" = "まれな場合には、音調記号の優先入力を許容する";
"lblAlwaysShowTooltipTextsHorizontally.title" = "ヒントを常に横書きにする"; "lblAlwaysShowTooltipTextsHorizontally.title" = "ヒントを常に横書きにする";
"lblCheckAbusersOfSecureEventInputAPI.title" = "このような不正利用は「システム内蔵入力以外の全ての入力アプリがメニューで灰色状態で選べなくて使えない」の元凶である。センシティブな資料の記入どころでSecureEventInputをEnableSecureEventInput()で使うのは当然であるが、「入力中」状態が終わった後必ずDisableSecureEventInput()で状態解消すべきだと義務である。いくつかヘルパーアプリも、あるいはSecureEventInputを呼び起こしてからすぐ固まったアプリも、この状態になりやすい。特に、他のアプリの画面へ切り替えたとしても、固まったアプリのSecureEventInput状態は自動的に解消できぬ。";
"lblDevZoneTitleDescription.title" = "警告:これからの新機能テストのために作ったページですから、\nここで陳列されている諸機能は予想通り動けるだと思わないでください。"; "lblDevZoneTitleDescription.title" = "警告:これからの新機能テストのために作ったページですから、\nここで陳列されている諸機能は予想通り動けるだと思わないでください。";
"lblIntonationKeyBehavior.title" = "音調組立緩衝列が空かされた時の音調キーの行為をご指定ください。"; "lblIntonationKeyBehavior.title" = "音調組立緩衝列が空かされた時の音調キーの行為をご指定ください。";
"lblShiftBkspKeyBehavior.title" = "Shift+BackSpace キーの優先行為をご指定ください。"; "lblShiftBkspKeyBehavior.title" = "Shift+BackSpace キーの優先行為をご指定ください。";

View File

@ -47,6 +47,7 @@
"chkAllowBoostingSingleKanjiAsUserPhrase.title" = "允许借由标记模式将可以就地升权/排除的候选字词的最短词长设为单个汉字"; "chkAllowBoostingSingleKanjiAsUserPhrase.title" = "允许借由标记模式将可以就地升权/排除的候选字词的最短词长设为单个汉字";
"chkAlsoConfirmAssociatedCandidatesByEnter.title" = "允许使用 Enter 确认当前选中的联想词"; "chkAlsoConfirmAssociatedCandidatesByEnter.title" = "允许使用 Enter 确认当前选中的联想词";
"chkAutoCorrectReadingCombination.title" = "敲字时自动纠正读音组合"; "chkAutoCorrectReadingCombination.title" = "敲字时自动纠正读音组合";
"chkCheckAbusersOfSecureEventInputAPI.title" = "主动检测正在滥用 SecureEventInput API 的后台进程";
"chkConsolidateContextOnCandidateSelection.title" = "在使用选字窗选字时,自动巩固上下文"; "chkConsolidateContextOnCandidateSelection.title" = "在使用选字窗选字时,自动巩固上下文";
"chkFetchSuggestionsFromUserOverrideModel.title" = "在敲字时自动套用来自半衰记忆模组的建议"; "chkFetchSuggestionsFromUserOverrideModel.title" = "在敲字时自动套用来自半衰记忆模组的建议";
"chkHardenVerticalPunctuations.title" = "在纵排书写时,强制转换标点为纵排形式(不推荐)"; "chkHardenVerticalPunctuations.title" = "在纵排书写时,强制转换标点为纵排形式(不推荐)";
@ -84,6 +85,7 @@
"kcM-O6-mLN.title" = "这会阻止任何客体擅自存取尚未递交的组字区内容。此举也会全局启用浮动组字窗。"; "kcM-O6-mLN.title" = "这会阻止任何客体擅自存取尚未递交的组字区内容。此举也会全局启用浮动组字窗。";
"lblAcceptLeadingIntonations.title" = "在个别情况下,允许声调前置键入"; "lblAcceptLeadingIntonations.title" = "在个别情况下,允许声调前置键入";
"lblAlwaysShowTooltipTextsHorizontally.title" = "始终使用横排来显示工具提示视窗"; "lblAlwaysShowTooltipTextsHorizontally.title" = "始终使用横排来显示工具提示视窗";
"lblCheckAbusersOfSecureEventInputAPI.title" = "这种滥用会导致系统内的所有第三方输入法全都无法正常使用(在输入法选单内会变成灰色)。针对需要填写敏感数据的场合,使用 SecureEventInput 无可厚非。但是,用 EnableSecureEventInput() 开启该模式之后,就有义务在输入窗格失焦的那一刻呼叫 DisableSecureEventInput() 来结束这种状态。这种状态还常见于后台辅助 App 当中、或者某个 App 在叫出该模式之后失去响应这样的话哪怕被切换到后台SecureEventInput 也不会自动解除)。";
"lblDevZoneTitleDescription.title" = "警告:该页面仅作未来功能测试所用。\n在此列出的功能并非处于完全可用之状态。"; "lblDevZoneTitleDescription.title" = "警告:该页面仅作未来功能测试所用。\n在此列出的功能并非处于完全可用之状态。";
"lblIntonationKeyBehavior.title" = "指定声调键(在注拼槽为「空」状态时)的行为。"; "lblIntonationKeyBehavior.title" = "指定声调键(在注拼槽为「空」状态时)的行为。";
"lblShiftBkspKeyBehavior.title" = "指定 Shift+BackSpace 组合键率先尝试的行为。"; "lblShiftBkspKeyBehavior.title" = "指定 Shift+BackSpace 组合键率先尝试的行为。";

View File

@ -47,6 +47,7 @@
"chkAllowBoostingSingleKanjiAsUserPhrase.title" = "允許藉由標記模式將可以就地升權/排除的候選字詞的最短詞長設為單個漢字"; "chkAllowBoostingSingleKanjiAsUserPhrase.title" = "允許藉由標記模式將可以就地升權/排除的候選字詞的最短詞長設為單個漢字";
"chkAlsoConfirmAssociatedCandidatesByEnter.title" = "允許使用 Enter 確認當前選中的聯想詞"; "chkAlsoConfirmAssociatedCandidatesByEnter.title" = "允許使用 Enter 確認當前選中的聯想詞";
"chkAutoCorrectReadingCombination.title" = "敲字時自動糾正讀音組合"; "chkAutoCorrectReadingCombination.title" = "敲字時自動糾正讀音組合";
"chkCheckAbusersOfSecureEventInputAPI.title" = "主動偵測正在濫用 SecureEventInput API 的後檯執行緒";
"chkConsolidateContextOnCandidateSelection.title" = "在使用選字窗選字時,自動鞏固上下文"; "chkConsolidateContextOnCandidateSelection.title" = "在使用選字窗選字時,自動鞏固上下文";
"chkFetchSuggestionsFromUserOverrideModel.title" = "在敲字時自動套用來自半衰記憶模組的建議"; "chkFetchSuggestionsFromUserOverrideModel.title" = "在敲字時自動套用來自半衰記憶模組的建議";
"chkHardenVerticalPunctuations.title" = "在縱排書寫時,強制轉換標點為縱排形式(不推薦)"; "chkHardenVerticalPunctuations.title" = "在縱排書寫時,強制轉換標點為縱排形式(不推薦)";
@ -84,6 +85,7 @@
"kcM-O6-mLN.title" = "這會阻止任何客體擅自存取尚未遞交的組字區內容。此舉也會全局啟用浮動組字窗。"; "kcM-O6-mLN.title" = "這會阻止任何客體擅自存取尚未遞交的組字區內容。此舉也會全局啟用浮動組字窗。";
"lblAcceptLeadingIntonations.title" = "在個別情況下,允許聲調前置鍵入"; "lblAcceptLeadingIntonations.title" = "在個別情況下,允許聲調前置鍵入";
"lblAlwaysShowTooltipTextsHorizontally.title" = "始終使用橫排來顯示工具提示視窗"; "lblAlwaysShowTooltipTextsHorizontally.title" = "始終使用橫排來顯示工具提示視窗";
"lblCheckAbusersOfSecureEventInputAPI.title" = "這種濫用會導致系統內的所有第三方輸入法全都無法正常使用(在輸入法選單內會變成灰色)。針對需要填寫敏感資料的場合,使用 SecureEventInput 無可厚非。但是,用 EnableSecureEventInput() 開啟該模式之後,就有義務在輸入窗格失焦的那一刻呼叫 DisableSecureEventInput() 來結束這種狀態。這種狀態還常見於後檯輔助 App 當中、或者某個 App 在叫出該模式之後失去回應這樣的話哪怕被切換到後檯SecureEventInput 也不會自動解除)。";
"lblDevZoneTitleDescription.title" = "警告:該頁面僅作未來功能測試所用。\n在此列出的功能並非處於完全可用之狀態。"; "lblDevZoneTitleDescription.title" = "警告:該頁面僅作未來功能測試所用。\n在此列出的功能並非處於完全可用之狀態。";
"lblIntonationKeyBehavior.title" = "指定聲調鍵(在注拼槽為「空」狀態時)的行為。"; "lblIntonationKeyBehavior.title" = "指定聲調鍵(在注拼槽為「空」狀態時)的行為。";
"lblShiftBkspKeyBehavior.title" = "指定 Shift+BackSpace 組合鍵率先嘗試的行為。"; "lblShiftBkspKeyBehavior.title" = "指定 Shift+BackSpace 組合鍵率先嘗試的行為。";