feat: reduce exp menu item

This commit is contained in:
yicheng 2023-07-12 14:39:53 +08:00
parent bb896b79dd
commit 860c1f82b8
18 changed files with 616 additions and 707 deletions

View File

@ -45,11 +45,8 @@ class AppDelegate: NSObject, NSApplicationDelegate {
@IBOutlet var apiPortMenuItem: NSMenuItem!
@IBOutlet var ipMenuItem: NSMenuItem!
@IBOutlet var remoteConfigAutoupdateMenuItem: NSMenuItem!
@IBOutlet var buildApiModeMenuitem: NSMenuItem!
@IBOutlet var showProxyGroupCurrentMenuItem: NSMenuItem!
@IBOutlet var copyExportCommandMenuItem: NSMenuItem!
@IBOutlet var copyExportCommandExternalMenuItem: NSMenuItem!
@IBOutlet var experimentalMenu: NSMenu!
@IBOutlet var externalControlSeparator: NSMenuItem!
var disposeBag = DisposeBag()
@ -105,7 +102,13 @@ class AppDelegate: NSObject, NSApplicationDelegate {
setupStatusMenuItemData()
AppVersionUtil.showUpgradeAlert()
ICloudManager.shared.setup()
setupExperimentalMenuItem()
if WebPortalManager.hasWebProtal {
WebPortalManager.shared.addWebProtalMenuItem(&statusMenu)
}
RemoteControlManager.setupMenuItem(separator: externalControlSeparator)
AutoUpgardeManager.shared.setup()
AutoUpgardeManager.shared.setupCheckForUpdatesMenuItem(checkForUpdateMenuItem)
// install proxy helper
_ = ClashResourceManager.check()
@ -144,7 +147,7 @@ class AppDelegate: NSObject, NSApplicationDelegate {
Logger.log("initClashCore finish")
setupData()
runAfterConfigReload = { [weak self] in
if !ConfigManager.builtInApiMode {
if !Settings.builtInApiMode {
self?.selectAllowLanWithMenory()
}
}
@ -495,7 +498,7 @@ class AppDelegate: NSObject, NSApplicationDelegate {
setUIPath(uiPath.goStringBuffer())
}
Logger.log("Trying start proxy, build-in mode: \(ConfigManager.builtInApiMode), allow lan: \(ConfigManager.allowConnectFromLan) custom port: \(Settings.proxyPort)")
Logger.log("Trying start proxy, build-in mode: \(Settings.builtInApiMode), allow lan: \(ConfigManager.allowConnectFromLan) custom port: \(Settings.proxyPort)")
var apiAddr = ""
if Settings.apiPort > 0 {
@ -505,7 +508,7 @@ class AppDelegate: NSObject, NSApplicationDelegate {
apiAddr = "127.0.0.1:\(Settings.apiPort)"
}
}
let startRes = run(ConfigManager.builtInApiMode.goObject(),
let startRes = run(Settings.builtInApiMode.goObject(),
ConfigManager.allowConnectFromLan.goObject(),
GoUint32(Settings.proxyPort),
apiAddr.goStringBuffer())?
@ -582,26 +585,6 @@ class AppDelegate: NSObject, NSApplicationDelegate {
}
}
func setupExperimentalMenuItem() {
ConnectionManager.addCloseOptionMenuItem(&experimentalMenu)
ClashResourceManager.addUpdateMMDBMenuItem(&experimentalMenu)
SystemProxyManager.shared.addDisableRestoreProxyMenuItem(&experimentalMenu)
MenuItemFactory.addExperimentalMenuItem(&experimentalMenu)
if WebPortalManager.hasWebProtal {
WebPortalManager.shared.addWebProtalMenuItem(&statusMenu)
}
AutoUpgardeManager.shared.setup()
AutoUpgardeManager.shared.addChanelMenuItem(&experimentalMenu)
AutoUpgardeManager.shared.setupCheckForUpdatesMenuItem(checkForUpdateMenuItem)
updateExperimentalFeatureStatus()
RemoteControlManager.setupMenuItem(separator: externalControlSeparator)
}
func updateExperimentalFeatureStatus() {
buildApiModeMenuitem.state = ConfigManager.builtInApiMode ? .on : .off
showProxyGroupCurrentMenuItem.state = ConfigManager.shared.disableShowCurrentProxyInMenu ? .off : .on
}
@objc func resetProxySettingOnWakeupFromSleep() {
guard !ConfigManager.shared.isProxySetByOtherVariable.value,
ConfigManager.shared.proxyPortAutoSet else { return }
@ -837,44 +820,6 @@ extension AppDelegate {
@IBAction func actionSetUpdateInterval(_ sender: Any) {
RemoteConfigManager.showAdd()
}
@IBAction func actionSetUseApiMode(_ sender: Any) {
let alert = NSAlert()
alert.informativeText = NSLocalizedString("Need to Restart the ClashX to Take effect, Please start clashX manually", comment: "")
alert.addButton(withTitle: NSLocalizedString("Apply and Quit", comment: ""))
alert.addButton(withTitle: NSLocalizedString("Cancel", comment: ""))
if alert.runModal() == .alertFirstButtonReturn {
ConfigManager.builtInApiMode = !ConfigManager.builtInApiMode
NSApp.terminate(nil)
}
}
@IBAction func actionUpdateProxyGroupMenu(_ sender: Any) {
ConfigManager.shared.disableShowCurrentProxyInMenu = !ConfigManager.shared.disableShowCurrentProxyInMenu
updateExperimentalFeatureStatus()
print("211")
MenuItemFactory.recreateProxyMenuItems()
}
@IBAction func actionSetBenchmarkUrl(_ sender: Any) {
let alert = NSAlert()
let textfiled = NSTextField(frame: NSRect(x: 0, y: 0, width: 300, height: 20))
textfiled.stringValue = ConfigManager.shared.benchMarkUrl
alert.messageText = NSLocalizedString("Benchmark", comment: "")
alert.accessoryView = textfiled
alert.addButton(withTitle: NSLocalizedString("OK", comment: ""))
alert.addButton(withTitle: NSLocalizedString("Cancel", comment: ""))
if alert.runModal() == .alertFirstButtonReturn {
if textfiled.stringValue.isUrlVaild() {
ConfigManager.shared.benchMarkUrl = textfiled.stringValue
} else {
let err = NSAlert()
err.messageText = NSLocalizedString("URL is not valid", comment: "")
err.runModal()
}
}
}
}
// MARK: crash hanlder

View File

@ -39,14 +39,14 @@
<objects>
<viewController title="General" showSeguePresentationStyle="single" id="kma-mp-ncL" customClass="GeneralSettingViewController" customModule="ClashX" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" misplaced="YES" id="dpe-v8-fF7">
<rect key="frame" x="0.0" y="0.0" width="400" height="427"/>
<rect key="frame" x="0.0" y="0.0" width="400" height="674"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<stackView distribution="fill" orientation="vertical" alignment="leading" spacing="10" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="VYa-DX-JOe">
<rect key="frame" x="20" y="20" width="432" height="538"/>
<rect key="frame" x="20" y="20" width="432" height="610"/>
<subviews>
<box borderType="line" title="Box" titlePosition="noTitle" translatesAutoresizingMaskIntoConstraints="NO" id="Gnh-m8-PAz">
<rect key="frame" x="-3" y="444" width="438" height="96"/>
<rect key="frame" x="-3" y="516" width="438" height="96"/>
<view key="contentView" id="Lai-8r-q7z">
<rect key="frame" x="4" y="5" width="430" height="88"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
@ -97,7 +97,7 @@
</view>
</box>
<box title="Port Settings (restart app to take effect)" translatesAutoresizingMaskIntoConstraints="NO" id="bcR-rG-52F">
<rect key="frame" x="-3" y="302" width="438" height="136"/>
<rect key="frame" x="-3" y="374" width="438" height="136"/>
<view key="contentView" id="baR-Ra-RV2">
<rect key="frame" x="4" y="5" width="430" height="116"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
@ -254,7 +254,7 @@
</view>
</box>
<box borderType="line" titlePosition="noTitle" translatesAutoresizingMaskIntoConstraints="NO" id="F94-On-Zm0">
<rect key="frame" x="-3" y="209" width="438" height="89"/>
<rect key="frame" x="-3" y="281" width="438" height="89"/>
<view key="contentView" id="icq-Gs-lyb">
<rect key="frame" x="4" y="5" width="430" height="81"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
@ -287,7 +287,7 @@
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
<size key="minSize" width="375" height="20"/>
<size key="maxSize" width="375" height="10000000"/>
<size key="maxSize" width="450" height="10000000"/>
<color key="insertionPointColor" name="textColor" catalog="System" colorSpace="catalog"/>
</textView>
</subviews>
@ -319,6 +319,69 @@
</constraints>
</view>
</box>
<box borderType="line" titlePosition="noTitle" translatesAutoresizingMaskIntoConstraints="NO" id="BeT-cl-vgr">
<rect key="frame" x="-3" y="209" width="438" height="68"/>
<view key="contentView" id="kkS-1K-s09">
<rect key="frame" x="4" y="5" width="430" height="60"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<stackView distribution="fill" orientation="vertical" alignment="leading" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="YUR-mA-R4I">
<rect key="frame" x="20" y="20" width="390" height="20"/>
<subviews>
<customView focusRingType="none" verticalHuggingPriority="1000" translatesAutoresizingMaskIntoConstraints="NO" id="dcS-bg-IKd">
<rect key="frame" x="0.0" y="0.0" width="390" height="20"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="1000" translatesAutoresizingMaskIntoConstraints="NO" id="Rkp-p5-5Uv">
<rect key="frame" x="-2" y="2" width="135" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Proxy Benchmark Url:" id="e0M-xf-ovR">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="m7z-Fp-ctz">
<rect key="frame" x="139" y="0.0" width="251" height="20"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" usesSingleLineMode="YES" id="nhC-xY-dyM">
<numberFormatter key="formatter" formatterBehavior="default10_4" localizesFormat="NO" usesGroupingSeparator="NO" formatWidth="-1" groupingSize="0" minimumIntegerDigits="1" maximumIntegerDigits="42" id="WfP-3f-zii">
<real key="minimum" value="0.0"/>
<real key="maximum" value="65533"/>
</numberFormatter>
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<constraints>
<constraint firstItem="m7z-Fp-ctz" firstAttribute="top" secondItem="dcS-bg-IKd" secondAttribute="top" id="4hg-YN-oeF"/>
<constraint firstItem="Rkp-p5-5Uv" firstAttribute="top" secondItem="dcS-bg-IKd" secondAttribute="top" constant="2" id="A3g-VH-HBw"/>
<constraint firstItem="m7z-Fp-ctz" firstAttribute="leading" secondItem="Rkp-p5-5Uv" secondAttribute="trailing" constant="8" symbolic="YES" id="Apx-oF-RD9"/>
<constraint firstAttribute="bottom" secondItem="m7z-Fp-ctz" secondAttribute="bottom" id="GVa-xd-2ok"/>
<constraint firstItem="Rkp-p5-5Uv" firstAttribute="centerY" secondItem="dcS-bg-IKd" secondAttribute="centerY" id="TYY-wj-XSb"/>
<constraint firstItem="Rkp-p5-5Uv" firstAttribute="leading" secondItem="dcS-bg-IKd" secondAttribute="leading" id="UMy-Lv-yml"/>
<constraint firstAttribute="trailing" secondItem="m7z-Fp-ctz" secondAttribute="trailing" id="ayK-9c-uAf"/>
</constraints>
</customView>
</subviews>
<constraints>
<constraint firstItem="dcS-bg-IKd" firstAttribute="width" secondItem="YUR-mA-R4I" secondAttribute="width" id="w2c-SA-paf"/>
</constraints>
<visibilityPriorities>
<integer value="1000"/>
</visibilityPriorities>
<customSpacing>
<real value="3.4028234663852886e+38"/>
</customSpacing>
</stackView>
</subviews>
<constraints>
<constraint firstAttribute="trailing" secondItem="YUR-mA-R4I" secondAttribute="trailing" constant="20" symbolic="YES" id="EP4-0L-rGF"/>
<constraint firstItem="YUR-mA-R4I" firstAttribute="leading" secondItem="kkS-1K-s09" secondAttribute="leading" constant="20" symbolic="YES" id="Mu1-FA-Yiq"/>
<constraint firstItem="YUR-mA-R4I" firstAttribute="top" secondItem="kkS-1K-s09" secondAttribute="top" constant="20" symbolic="YES" id="fZT-zg-hlg"/>
<constraint firstAttribute="bottom" secondItem="YUR-mA-R4I" secondAttribute="bottom" constant="20" symbolic="YES" id="jLW-ke-l9N"/>
</constraints>
</view>
</box>
<box borderType="line" titlePosition="noTitle" translatesAutoresizingMaskIntoConstraints="NO" id="hnq-VC-kO5">
<rect key="frame" x="-3" y="-4" width="438" height="209"/>
<view key="contentView" id="Xgo-Uz-aYp">
@ -353,7 +416,7 @@
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
<size key="minSize" width="375" height="100"/>
<size key="maxSize" width="375" height="10000000"/>
<size key="maxSize" width="450" height="10000000"/>
<color key="insertionPointColor" name="textColor" catalog="System" colorSpace="catalog"/>
</textView>
</subviews>
@ -404,18 +467,21 @@
<constraint firstItem="hnq-VC-kO5" firstAttribute="width" secondItem="VYa-DX-JOe" secondAttribute="width" id="kL7-uE-2XA"/>
<constraint firstItem="bcR-rG-52F" firstAttribute="leading" secondItem="VYa-DX-JOe" secondAttribute="leading" id="mWO-be-OEN"/>
<constraint firstItem="F94-On-Zm0" firstAttribute="width" secondItem="VYa-DX-JOe" secondAttribute="width" id="o3u-Hw-yEA"/>
<constraint firstItem="BeT-cl-vgr" firstAttribute="width" secondItem="VYa-DX-JOe" secondAttribute="width" id="qIv-re-P3W"/>
</constraints>
<visibilityPriorities>
<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"/>
<real value="3.4028234663852886e+38"/>
</customSpacing>
</stackView>
</subviews>
@ -435,13 +501,14 @@
<outlet property="launchAtLoginButton" destination="jsq-3u-CRd" id="RnH-Va-nCX"/>
<outlet property="proxyPortTextField" destination="mBx-6u-i5v" id="7Af-XU-9Xn"/>
<outlet property="reduceNotificationsButton" destination="6V3-wn-WSa" id="VtV-aI-dQi"/>
<outlet property="speedTestUrlField" destination="m7z-Fp-ctz" id="gOD-IL-hEV"/>
<outlet property="ssidSuspendTextField" destination="sjz-uN-XpL" id="jLA-M4-s5t"/>
<outlet property="useiCloudButton" destination="UGu-wD-xUs" id="VSD-og-kEv"/>
</connections>
</viewController>
<customObject id="Co2-xv-pHW" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1546" y="1028.5"/>
<point key="canvasLocation" x="1546" y="1152"/>
</scene>
<!--Application-->
<scene sceneID="JPo-4y-FX3">
@ -613,13 +680,11 @@
<outlet property="allowFromLanMenuItem" destination="Vz8-7n-vx6" id="Fzz-EG-huC"/>
<outlet property="apiPortMenuItem" destination="hwG-qf-DeZ" id="d6K-i7-yCo"/>
<outlet property="autoStartMenuItem" destination="B1J-XB-BiZ" id="xaS-h5-qd0"/>
<outlet property="buildApiModeMenuitem" destination="xG5-B4-mlw" id="1Fy-UQ-jFs"/>
<outlet property="checkForUpdateMenuItem" destination="p0T-J8-Emx" id="9BN-2j-QNB"/>
<outlet property="configSeparatorLine" destination="WzG-og-OyZ" id="hhn-AP-zKJ"/>
<outlet property="copyExportCommandExternalMenuItem" destination="7wl-vK-5JO" id="1Lu-Tu-FJy"/>
<outlet property="copyExportCommandMenuItem" destination="Jmb-PK-rMW" id="tiF-vV-Sqh"/>
<outlet property="dashboardMenuItem" destination="XG6-2M-PNi" id="hzn-77-3Uc"/>
<outlet property="experimentalMenu" destination="sbS-Fj-gxn" id="m2U-Zq-cKD"/>
<outlet property="externalControlSeparator" destination="tXn-AQ-OT3" id="ddo-u2-wUb"/>
<outlet property="httpPortMenuItem" destination="WNw-8Y-VFw" id="ldW-Gw-Q9L"/>
<outlet property="ipMenuItem" destination="D2R-eG-cms" id="ugc-iD-j9T"/>
@ -633,7 +698,6 @@
<outlet property="separatorLineTop" destination="1fM-p6-bHd" id="NFb-qS-TKR"/>
<outlet property="sepatatorLineEndProxySelect" destination="n67-fU-hLx" id="Vgv-N6-SOH"/>
<outlet property="showNetSpeedIndicatorMenuItem" destination="YIO-Vj-64f" id="9a5-3N-Ylk"/>
<outlet property="showProxyGroupCurrentMenuItem" destination="j9o-36-NTd" id="5jc-iE-bou"/>
<outlet property="socksPortMenuItem" destination="Uy1-g8-r6Q" id="NiI-Gy-9Sa"/>
<outlet property="statusMenu" destination="Afa-lD-EbR" id="cov-E9-WrO"/>
</connections>
@ -728,13 +792,6 @@
<action selector="actionUpdateConfig:" target="Voe-Tx-rLC" id="oW5-Ll-SY8"/>
</connections>
</menuItem>
<menuItem title="Settings" id="krh-QF-pqZ">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="actionUpdateConfig:" target="Voe-Tx-rLC" id="L8c-KG-g8D"/>
<segue destination="LAj-p8-9gd" kind="show" id="BTv-JW-0Fb"/>
</connections>
</menuItem>
<menuItem title="Remote config" id="h1C-R6-Y9w">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Remote config" id="az2-wz-yyy">
@ -764,45 +821,27 @@
</items>
</menu>
</menuItem>
<menuItem title="Experimental" id="OLP-Uv-at6">
<menuItem title="Remote Controller" id="BRR-WK-aeP">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Experimental" id="sbS-Fj-gxn">
<menu key="submenu" title="Remote Controller" id="1He-Eq-fSy">
<items>
<menuItem title="Remote Controller" id="BRR-WK-aeP">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Remote Controller" id="1He-Eq-fSy">
<items>
<menuItem isSeparatorItem="YES" id="tXn-AQ-OT3"/>
<menuItem title=" Manage" id="hlb-KQ-Fdr">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<segue destination="s6y-wL-pnr" kind="show" id="YYz-MS-98Q"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Show current proxy in menu" id="j9o-36-NTd">
<menuItem isSeparatorItem="YES" id="tXn-AQ-OT3"/>
<menuItem title=" Manage" id="hlb-KQ-Fdr">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="actionUpdateProxyGroupMenu:" target="Voe-Tx-rLC" id="XsH-da-e3b"/>
</connections>
</menuItem>
<menuItem title="Use built in api" id="xG5-B4-mlw">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="actionSetUseApiMode:" target="Voe-Tx-rLC" id="00l-6K-2IL"/>
</connections>
</menuItem>
<menuItem title="Set benchmark url" id="rls-O1-mpQ">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="actionSetBenchmarkUrl:" target="Voe-Tx-rLC" id="uok-Pz-Uuz"/>
<segue destination="s6y-wL-pnr" kind="show" id="YYz-MS-98Q"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Settings" id="krh-QF-pqZ">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="actionUpdateConfig:" target="Voe-Tx-rLC" id="L8c-KG-g8D"/>
<segue destination="LAj-p8-9gd" kind="show" id="BTv-JW-0Fb"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
@ -1566,27 +1605,47 @@
<objects>
<viewController title="Debug" showSeguePresentationStyle="single" id="kdV-Em-qBi" customClass="DebugSettingViewController" customModule="ClashX" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" id="mud-rj-Isy">
<rect key="frame" x="0.0" y="0.0" width="416" height="197"/>
<rect key="frame" x="0.0" y="0.0" width="416" height="429"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<box title="Debug Setting" translatesAutoresizingMaskIntoConstraints="NO" id="NLT-FZ-48V">
<rect key="frame" x="17" y="21" width="382" height="156"/>
<rect key="frame" x="17" y="21" width="382" height="388"/>
<view key="contentView" id="JPj-NU-Cwp">
<rect key="frame" x="4" y="5" width="374" height="136"/>
<rect key="frame" x="4" y="5" width="374" height="368"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<stackView distribution="fillProportionally" orientation="vertical" alignment="leading" spacing="20" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="1000" horizontalHuggingPriority="1000" verticalHuggingPriority="1000" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="6bh-Rg-qaG">
<rect key="frame" x="20" y="20" width="334" height="96"/>
<rect key="frame" x="20" y="20" width="334" height="328"/>
<subviews>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="CUS-EE-bqd">
<rect key="frame" x="-2" y="79" width="336" height="18"/>
<rect key="frame" x="-2" y="311" width="336" height="18"/>
<buttonCell key="cell" type="check" title="Use SwiftUI to render status bar icon. (MacOS 13+)" bezelStyle="regularSquare" imagePosition="left" inset="2" id="eY9-1i-i7P">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="5WY-QP-cCq">
<rect key="frame" x="-2" y="275" width="154" height="18"/>
<buttonCell key="cell" type="check" title="Use Built-in clash api" bezelStyle="regularSquare" imagePosition="left" inset="2" id="IET-Bf-hGj">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="actionSetUseApiMode:" target="kdV-Em-qBi" id="QUU-wn-t1t"/>
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="2Ch-iR-H6t">
<rect key="frame" x="-2" y="239" width="284" height="18"/>
<buttonCell key="cell" type="check" title="Revert to previous proxy on proxy disabled" bezelStyle="regularSquare" imagePosition="left" inset="2" id="JOF-yU-YHc">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="actionRevertProxy:" target="kdV-Em-qBi" id="QGZ-HF-w66"/>
</connections>
</button>
<stackView distribution="fill" orientation="horizontal" alignment="top" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" verticalHuggingPriority="1000" verticalCompressionResistancePriority="1000" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="BPB-SW-GgH">
<rect key="frame" x="0.0" y="80" width="240" height="20"/>
<rect key="frame" x="0.0" y="200" width="240" height="20"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="1000" translatesAutoresizingMaskIntoConstraints="NO" id="FdV-ph-XP8">
<rect key="frame" x="-2" y="4" width="82" height="16"/>
@ -1616,8 +1675,39 @@
<real value="3.4028234663852886e+38"/>
</customSpacing>
</stackView>
<stackView distribution="fill" orientation="horizontal" alignment="top" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" verticalHuggingPriority="1000" verticalCompressionResistancePriority="1000" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Ham-Zt-d4M">
<rect key="frame" x="0.0" y="160" width="177" height="20"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="1000" translatesAutoresizingMaskIntoConstraints="NO" id="cnH-Yz-lOz">
<rect key="frame" x="-2" y="4" width="108" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Geo-IP Datebase" id="OMy-zu-iho">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button verticalHuggingPriority="1000" translatesAutoresizingMaskIntoConstraints="NO" id="tHw-or-Djh">
<rect key="frame" x="105" y="-7" width="79" height="32"/>
<buttonCell key="cell" type="push" title="Update" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="pHl-C4-fNt">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
<connections>
<action selector="actionUpdateGeoipDb:" target="kdV-Em-qBi" id="C3o-iS-C96"/>
</connections>
</buttonCell>
</button>
</subviews>
<visibilityPriorities>
<integer value="1000"/>
<integer value="1000"/>
</visibilityPriorities>
<customSpacing>
<real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
</customSpacing>
</stackView>
<stackView distribution="fill" orientation="horizontal" alignment="top" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" verticalHuggingPriority="1000" verticalCompressionResistancePriority="1000" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="pyT-RY-vER">
<rect key="frame" x="0.0" y="40" width="152" height="20"/>
<rect key="frame" x="0.0" y="120" width="152" height="20"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="1000" translatesAutoresizingMaskIntoConstraints="NO" id="7Zc-tX-dnG">
<rect key="frame" x="-2" y="4" width="27" height="16"/>
@ -1648,7 +1738,7 @@
</customSpacing>
</stackView>
<stackView distribution="fill" orientation="horizontal" alignment="top" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" verticalHuggingPriority="1000" verticalCompressionResistancePriority="1000" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="pbl-Xp-HwK">
<rect key="frame" x="0.0" y="0.0" width="210" height="20"/>
<rect key="frame" x="0.0" y="80" width="210" height="20"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="1000" translatesAutoresizingMaskIntoConstraints="NO" id="iZQ-h9-mnr">
<rect key="frame" x="-2" y="4" width="86" height="16"/>
@ -1691,7 +1781,7 @@
</customSpacing>
</stackView>
<stackView distribution="fill" orientation="horizontal" alignment="top" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" verticalHuggingPriority="1000" verticalCompressionResistancePriority="1000" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="tMJ-Gy-hdv">
<rect key="frame" x="0.0" y="0.0" width="135" height="20"/>
<rect key="frame" x="0.0" y="40" width="135" height="20"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="1000" translatesAutoresizingMaskIntoConstraints="NO" id="8T9-iX-5fG" userLabel="UserDefaults">
<rect key="frame" x="-2" y="4" width="76" height="16"/>
@ -1721,9 +1811,38 @@
<real value="3.4028234663852886e+38"/>
</customSpacing>
</stackView>
<stackView distribution="fill" orientation="horizontal" alignment="top" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" verticalHuggingPriority="1000" verticalCompressionResistancePriority="1000" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="7D6-a4-oYf">
<rect key="frame" x="0.0" y="0.0" width="138" height="20"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="1000" translatesAutoresizingMaskIntoConstraints="NO" id="65R-3y-PGM" userLabel="UserDefaults">
<rect key="frame" x="-2" y="4" width="102" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Update Channel" id="NLt-OM-k6i">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="gjb-nb-14I">
<rect key="frame" x="103" y="-4" width="39" height="25"/>
<popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="qZF-t6-s4q">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="XPC-Mb-vvl"/>
</popUpButtonCell>
</popUpButton>
</subviews>
<visibilityPriorities>
<integer value="1000"/>
<integer value="1000"/>
</visibilityPriorities>
<customSpacing>
<real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
</customSpacing>
</stackView>
</subviews>
<constraints>
<constraint firstAttribute="height" constant="176" id="4UX-uR-trK"/>
<constraint firstAttribute="height" constant="328" id="SVh-ry-aEc"/>
</constraints>
<visibilityPriorities>
<integer value="1000"/>
@ -1731,6 +1850,10 @@
<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"/>
@ -1738,6 +1861,10 @@
<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>
</stackView>
</subviews>
@ -1758,7 +1885,10 @@
</constraints>
</view>
<connections>
<outlet property="revertProxyButton" destination="2Ch-iR-H6t" id="jlF-TH-7VZ"/>
<outlet property="swiftuiMenuBarButton" destination="CUS-EE-bqd" id="BTF-Gy-b56"/>
<outlet property="updateChannelPopButton" destination="gjb-nb-14I" id="N0w-Tq-jTZ"/>
<outlet property="useBuiltinApiButton" destination="5WY-QP-cCq" id="Z8u-x9-TWV"/>
</connections>
</viewController>
<customObject id="1kx-60-xza" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>

View File

@ -77,7 +77,7 @@ class ApiRequest {
if ConfigManager.shared.overrideApiURL != nil {
return false
}
return ConfigManager.builtInApiMode
return Settings.builtInApiMode
}
static func requestConfig(completeHandler: @escaping ((ClashConfig) -> Void)) {
@ -262,7 +262,7 @@ class ApiRequest {
static func getProxyDelay(proxyName: String, callback: @escaping ((Int) -> Void)) {
req("/proxies/\(proxyName.encoded)/delay",
method: .get,
parameters: ["timeout": 5000, "url": ConfigManager.shared.benchMarkUrl])
parameters: ["timeout": 5000, "url": Settings.benchMarkUrl])
.responseData { res in
switch res.result {
case let .success(value):

View File

@ -23,17 +23,6 @@ class AutoUpgardeManager: NSObject {
}
}
private lazy var menuItems: [Channel: NSMenuItem] = {
var items = [Channel: NSMenuItem]()
for channel in Channel.allCases {
let item = NSMenuItem(title: channel.title, action: #selector(didSelectUpgradeChannel(_:)), keyEquivalent: "")
item.target = self
item.tag = channel.rawValue
items[channel] = item
}
return items
}()
private var allowSelectChannel: Bool {
return Bundle.main.object(forInfoDictionaryKey: "SUDisallowSelectChannel") as? Bool != true
}
@ -49,31 +38,19 @@ class AutoUpgardeManager: NSObject {
checkForUpdatesMenuItem?.action = #selector(SPUStandardUpdaterController.checkForUpdates(_:))
}
func addChanelMenuItem(_ menu: inout NSMenu) {
guard WebPortalManager.hasWebProtal == false, allowSelectChannel else { return }
let upgradeMenu = NSMenu(title: NSLocalizedString("Upgrade Channel", comment: ""))
for (_, item) in menuItems {
upgradeMenu.addItem(item)
func addChannelMenuItem(_ button: NSPopUpButton) {
for channel in Channel.allCases {
button.addItem(withTitle: channel.title)
button.lastItem?.tag = channel.rawValue
}
let upgradeMenuItem = NSMenuItem(title: NSLocalizedString("Upgrade Channel", comment: ""), action: nil, keyEquivalent: "")
upgradeMenuItem.submenu = upgradeMenu
menu.addItem(upgradeMenuItem)
updateDisplayStatus()
button.target = self
button.action = #selector(didselectChannel(sender:))
button.selectItem(withTag: current.rawValue)
}
}
extension AutoUpgardeManager {
@objc private func didSelectUpgradeChannel(_ menuItem: NSMenuItem) {
guard let channel = Channel(rawValue: menuItem.tag) else { return }
@objc func didselectChannel(sender: NSPopUpButton) {
guard let tag = sender.selectedItem?.tag, let channel = Channel(rawValue: tag) else { return }
current = channel
updateDisplayStatus()
}
private func updateDisplayStatus() {
for (channel, menuItem) in menuItems {
menuItem.state = channel == current ? .on : .off
}
}
}

View File

@ -62,13 +62,8 @@ class ClashResourceManager {
}
extension ClashResourceManager {
static func addUpdateMMDBMenuItem(_ menu: inout NSMenu) {
let item = NSMenuItem(title: NSLocalizedString("Update GEOIP Database", comment: ""), action: #selector(updateGeoIP), keyEquivalent: "")
item.target = self
menu.addItem(item)
}
@objc private static func updateGeoIP() {
static func updateGeoIP() {
guard let url = showCustomAlert() else { return }
AF.download(url, to: { (_, _) in
let path = kConfigFolderPath.appending("/Country.mmdb")
@ -98,8 +93,12 @@ extension ClashResourceManager {
let alert = NSAlert()
alert.messageText = NSLocalizedString("Custom your GEOIP MMDB download address.", comment: "")
let inputView = NSTextField(frame: NSRect(x: 0, y: 0, width: 250, height: 24))
inputView.placeholderString = "https://github.com/Dreamacro/maxmind-geoip/releases/latest/download/Country.mmdb"
inputView.stringValue = Settings.mmdbDownloadUrl
inputView.placeholderString = Settings.defaultMmdbDownloadUrl
if Settings.mmdbDownloadUrl.count > 0 {
inputView.stringValue = Settings.mmdbDownloadUrl
} else {
inputView.stringValue = Settings.defaultMmdbDownloadUrl
}
alert.accessoryView = inputView
alert.addButton(withTitle: NSLocalizedString("OK", comment: ""))
alert.addButton(withTitle: NSLocalizedString("Cancel", comment: ""))

View File

@ -94,12 +94,6 @@ class ConfigManager {
let showNetSpeedIndicatorObservable = UserDefaults.standard.rx.observe(Bool.self, "showNetSpeedIndicator")
var benchMarkUrl: String = UserDefaults.standard.string(forKey: "benchMarkUrl") ?? "http://cp.cloudflare.com/generate_204" {
didSet {
UserDefaults.standard.set(benchMarkUrl, forKey: "benchMarkUrl")
}
}
static var apiUrl: String {
if let override = shared.overrideApiURL {
return override.absoluteString
@ -151,18 +145,6 @@ class ConfigManager {
UserDefaults.standard.set(newValue.rawValue, forKey: "selectLoggingApiLevel")
}
}
static var builtInApiMode = (UserDefaults.standard.object(forKey: "kBuiltInApiMode") as? Bool) ?? true {
didSet {
UserDefaults.standard.set(builtInApiMode, forKey: "kBuiltInApiMode")
}
}
var disableShowCurrentProxyInMenu: Bool = UserDefaults.standard.object(forKey: "kSDisableShowCurrentProxyInMenu") as? Bool ?? !AppDelegate.isAboveMacOS14 {
didSet {
UserDefaults.standard.set(disableShowCurrentProxyInMenu, forKey: "kSDisableShowCurrentProxyInMenu")
}
}
}
extension ConfigManager {

View File

@ -8,25 +8,8 @@
import Cocoa
class ConnectionManager {
static var enableAutoClose = UserDefaults.standard.object(forKey: "ConnectionManager.enableAutoClose") as? Bool ?? true {
didSet {
UserDefaults.standard.set(enableAutoClose, forKey: "ConnectionManager.enableAutoClose")
}
}
private static var closeMenuItem: NSMenuItem?
static func addCloseOptionMenuItem(_ menu: inout NSMenu) {
let item = NSMenuItem(title: NSLocalizedString("Auto Close Connection", comment: ""), action: #selector(optionMenuItemTap(sender:)), keyEquivalent: "")
item.target = ConnectionManager.self
menu.addItem(item)
closeMenuItem = item
updateMenuItemStatus(item)
}
enum ConnectionManager {
static func closeConnection(for group: String) {
guard enableAutoClose else { return }
ApiRequest.getConnections { conns in
for conn in conns where conn.chains.contains(group) {
ApiRequest.closeConnection(conn)
@ -38,14 +21,3 @@ class ConnectionManager {
ApiRequest.closeAllConnection()
}
}
extension ConnectionManager {
static func updateMenuItemStatus(_ item: NSMenuItem? = closeMenuItem) {
item?.state = enableAutoClose ? .on : .off
}
@objc static func optionMenuItemTap(sender: NSMenuItem) {
enableAutoClose = !enableAutoClose
updateMenuItemStatus(sender)
}
}

View File

@ -13,11 +13,7 @@ import SwiftyJSON
class MenuItemFactory {
private static var cachedProxyData: ClashProxyResp?
static var useViewToRenderProxy: Bool = UserDefaults.standard.object(forKey: "useViewToRenderProxy") as? Bool ?? AppDelegate.isAboveMacOS152 {
didSet {
UserDefaults.standard.set(useViewToRenderProxy, forKey: "useViewToRenderProxy")
}
}
static let useViewToRenderProxy: Bool = AppDelegate.isAboveMacOS152
// MARK: - Public
@ -123,7 +119,7 @@ class MenuItemFactory {
let menu = NSMenuItem(title: proxyGroup.name, action: nil, keyEquivalent: "")
let selectedName = proxyGroup.now ?? ""
if !ConfigManager.shared.disableShowCurrentProxyInMenu {
if !Settings.disableShowCurrentProxyInMenu {
menu.view = ProxyGroupMenuItemView(group: proxyGroup.name, targetProxy: selectedName, hasLeftPadding: leftPadding)
}
let submenu = ProxyGroupMenu(title: proxyGroup.name)
@ -153,7 +149,7 @@ class MenuItemFactory {
let proxyMap = proxyInfo.proxiesMap
let selectedName = proxyGroup.now ?? ""
let menu = NSMenuItem(title: proxyGroup.name, action: nil, keyEquivalent: "")
if !ConfigManager.shared.disableShowCurrentProxyInMenu {
if !Settings.disableShowCurrentProxyInMenu {
menu.view = ProxyGroupMenuItemView(group: proxyGroup.name, targetProxy: selectedName, hasLeftPadding: leftPadding)
}
let submenu = NSMenu(title: proxyGroup.name)
@ -188,7 +184,7 @@ class MenuItemFactory {
let proxyMap = proxyInfo.proxiesMap
let menu = NSMenuItem(title: proxyGroup.name, action: nil, keyEquivalent: "")
if !ConfigManager.shared.disableShowCurrentProxyInMenu {
if !Settings.disableShowCurrentProxyInMenu {
menu.view = ProxyGroupMenuItemView(group: proxyGroup.name, targetProxy: NSLocalizedString("Load Balance", comment: ""), hasLeftPadding: leftPadding, observeUpdate: false)
}
let submenu = ProxyGroupMenu(title: proxyGroup.name)
@ -231,27 +227,6 @@ class MenuItemFactory {
}
}
// MARK: - Experimental
extension MenuItemFactory {
static func addExperimentalMenuItem(_ menu: inout NSMenu) {
let useViewRender = NSMenuItem(title: NSLocalizedString("Enhance proxy list render", comment: ""), action: #selector(optionUseViewRenderMenuItemTap(sender:)), keyEquivalent: "")
useViewRender.target = self
menu.addItem(useViewRender)
updateUseViewRenderMenuItem(useViewRender)
}
static func updateUseViewRenderMenuItem(_ item: NSMenuItem) {
item.state = useViewToRenderProxy ? .on : .off
}
@objc static func optionUseViewRenderMenuItemTap(sender: NSMenuItem) {
useViewToRenderProxy = !useViewToRenderProxy
updateUseViewRenderMenuItem(sender)
recreateProxyMenuItems()
}
}
// MARK: - Action
extension MenuItemFactory {

View File

@ -8,7 +8,8 @@
import Foundation
enum Settings {
@UserDefault("mmdbDownloadUrl", defaultValue: "")
static let defaultMmdbDownloadUrl = "https://github.com/Dreamacro/maxmind-geoip/releases/latest/download/Country.mmdb"
@UserDefault("mmdbDownloadUrl", defaultValue: defaultMmdbDownloadUrl)
static var mmdbDownloadUrl: String
@UserDefault("filterInterface", defaultValue: true)
@ -64,4 +65,23 @@ enum Settings {
@UserDefault("overrideConfigSecret", defaultValue: false)
static var overrideConfigSecret: Bool
@UserDefault("kBuiltInApiMode", defaultValue: true)
static var builtInApiMode: Bool
static let disableShowCurrentProxyInMenu = !AppDelegate.isAboveMacOS14
static let defaultBenchmarkUrl = "http://cp.cloudflare.com/generate_204"
@UserDefault("benchMarkUrl", defaultValue: defaultBenchmarkUrl)
static var benchMarkUrl: String {
didSet {
if benchMarkUrl.count == 0 {
benchMarkUrl = defaultBenchmarkUrl
}
}
}
@UserDefault("kDisableRestoreProxy", defaultValue: false)
static var disableRestoreProxy: Bool
}

View File

@ -21,21 +21,12 @@ class SystemProxyManager: NSObject {
}
}
private var disableRestoreProxy: Bool {
get {
return UserDefaults.standard.bool(forKey: "kDisableRestoreProxy")
}
set {
UserDefaults.standard.set(newValue, forKey: "kDisableRestoreProxy")
}
}
private var helper: ProxyConfigRemoteProcessProtocol? {
PrivilegedHelperManager.shared.helper()
}
func saveProxy() {
guard !disableRestoreProxy else { return }
guard !Settings.disableRestoreProxy else { return }
Logger.log("saveProxy", level: .debug)
helper?.getCurrentProxySetting({ [weak self] info in
Logger.log("saveProxy done", level: .debug)
@ -82,7 +73,7 @@ class SystemProxyManager: NSObject {
func disableProxy(port: Int, socksPort: Int, forceDisable: Bool = false, complete: (() -> Void)? = nil) {
Logger.log("disableProxy", level: .debug)
if disableRestoreProxy || forceDisable {
if Settings.disableRestoreProxy || forceDisable {
helper?.disableProxy(withFilterInterface: Settings.filterInterface) { error in
if let error = error {
Logger.log("disableProxy \(error)", level: .error)
@ -99,22 +90,4 @@ class SystemProxyManager: NSObject {
complete?()
})
}
// MARK: - Expriment Menu Items
func addDisableRestoreProxyMenuItem(_ menu: inout NSMenu) {
let item = NSMenuItem(title: NSLocalizedString("Disable Restore Proxy Setting", comment: ""), action: #selector(optionMenuItemTap(sender:)), keyEquivalent: "")
item.target = self
menu.addItem(item)
updateMenuItemStatus(item)
}
func updateMenuItemStatus(_ item: NSMenuItem) {
item.state = disableRestoreProxy ? .on : .off
}
@objc func optionMenuItemTap(sender: NSMenuItem) {
disableRestoreProxy = !disableRestoreProxy
updateMenuItemStatus(sender)
}
}

View File

@ -48,20 +48,6 @@ class JsBridgeUtil {
}
}
bridge.registerHandler("getBreakConnections") { _, responseCallback in
responseCallback?(ConnectionManager.enableAutoClose)
}
bridge.registerHandler("setBreakConnections") { anydata, responseCallback in
if let enable = anydata as? Bool {
ConnectionManager.enableAutoClose = enable
ConnectionManager.updateMenuItemStatus()
responseCallback?(true)
} else {
responseCallback?(false)
}
}
bridge.registerHandler("speedTest") { anydata, responseCallback in
if let proxyName = anydata as? String {
ApiRequest.getProxyDelay(proxyName: proxyName) { delay in

View File

@ -7,9 +7,6 @@
/* No comment provided by engineer. */
"Apply and Quit" = "Apply and Quit";
/* No comment provided by engineer. */
"Auto Close Connection" = "Auto Close Connection";
/* No comment provided by engineer. */
"Benchmark" = "Benchmark";
@ -64,24 +61,15 @@
/* No comment provided by engineer. */
"Direct Mode" = "Direct Mode";
/* No comment provided by engineer. */
"Disable Restore Proxy Setting" = "Disable Restore Proxy Setting";
/* No comment provided by engineer. */
"Download fail" = "Download fail";
/* No comment provided by engineer. */
"Enhance proxy list render" = "Enhance proxy list render";
/* No comment provided by engineer. */
"fail" = "fail";
/* No comment provided by engineer. */
"Fail:" = "Fail:";
/* No comment provided by engineer. */
"fails: %@" = "fails: %@";
/* No comment provided by engineer. */
"Global" = "Global";
@ -109,8 +97,6 @@
/* No comment provided by engineer. */
"Load Balance" = "Load Balance";
"Mode" = "Mode";
/* No comment provided by engineer. */
"Need to Restart the ClashX to Take effect, Please start clashX manually" = "Need to Restart the ClashX to Take effect, Please start clashX manually";
@ -180,18 +166,9 @@
/* No comment provided by engineer. */
"Rule Mode" = "Rule Mode";
/* No comment provided by engineer. */
"Script" = "Script";
/* No comment provided by engineer. */
"Script Mode" = "Script Mode";
/* No comment provided by engineer. */
"Should be a least 1 hour" = "Should be a least 1 hour";
/* No comment provided by engineer. */
"Show speedTest at top" = "Show speedTest at top";
/* No comment provided by engineer. */
"Stable" = "Stable";
@ -234,14 +211,5 @@
/* No comment provided by engineer. */
"Updating" = "Updating";
/* No comment provided by engineer. */
"Upgrade Channel" = "Upgrade Channel";
/* No comment provided by engineer. */
"URL is not valid" = "URL is not valid";
/* No comment provided by engineer. */
"Use iCloud" = "Use iCloud";
/* No comment provided by engineer. */
"Use reload config to try reconnect." = "Use reload config to try reconnect.";

View File

@ -7,9 +7,6 @@
/* No comment provided by engineer. */
"Apply and Quit" = "应用并退出";
/* No comment provided by engineer. */
"Auto Close Connection" = "切换代理时中断连接";
/* No comment provided by engineer. */
"Benchmark" = "延迟测速";
@ -64,24 +61,15 @@
/* No comment provided by engineer. */
"Direct Mode" = "直接连接";
/* No comment provided by engineer. */
"Disable Restore Proxy Setting" = "关闭自动还原之前代理";
/* No comment provided by engineer. */
"Download fail" = "下载失败";
/* No comment provided by engineer. */
"Enhance proxy list render" = "增强渲染代理列表";
/* No comment provided by engineer. */
"fail" = "失败";
/* No comment provided by engineer. */
"Fail:" = "失败:";
/* No comment provided by engineer. */
"fails: %@" = "失败: %@";
/* No comment provided by engineer. */
"Global" = "全局";
@ -109,8 +97,6 @@
/* No comment provided by engineer. */
"Load Balance" = "负载均衡";
"Mode" = "模式";
/* No comment provided by engineer. */
"Need to Restart the ClashX to Take effect, Please start clashX manually" = "需要重启ClashX生效请手动启动ClashX";
@ -180,18 +166,9 @@
/* No comment provided by engineer. */
"Rule Mode" = "规则判断";
/* No comment provided by engineer. */
"Script" = "脚本";
/* No comment provided by engineer. */
"Script Mode" = "脚本模式";
/* No comment provided by engineer. */
"Should be a least 1 hour" = "至少需要1小时间隔";
/* No comment provided by engineer. */
"Show speedTest at top" = "顶端显示测速按钮";
/* No comment provided by engineer. */
"Stable" = "Stable";
@ -234,14 +211,5 @@
/* No comment provided by engineer. */
"Updating" = "更新中";
/* No comment provided by engineer. */
"Upgrade Channel" = "更新通道";
/* No comment provided by engineer. */
"URL is not valid" = "链接不合法";
/* No comment provided by engineer. */
"Use iCloud" = "使用iCloud";
/* No comment provided by engineer. */
"Use reload config to try reconnect." = "使用重载配置文件按钮尝试重新连接";

View File

@ -7,9 +7,6 @@
/* No comment provided by engineer. */
"Apply and Quit" = "應用並退出";
/* No comment provided by engineer. */
"Auto Close Connection" = "切換代理時中斷連接";
/* No comment provided by engineer. */
"Benchmark" = "延遲測速";
@ -64,24 +61,15 @@
/* No comment provided by engineer. */
"Direct Mode" = "直接連接";
/* No comment provided by engineer. */
"Disable Restore Proxy Setting" = "關閉自動還原之前代理";
/* No comment provided by engineer. */
"Download fail" = "下載失敗";
/* No comment provided by engineer. */
"Enhance proxy list render" = "增強渲染代理列表";
/* No comment provided by engineer. */
"fail" = "失敗";
/* No comment provided by engineer. */
"Fail:" = "失敗:";
/* No comment provided by engineer. */
"fails: %@" = "失敗: %@";
/* No comment provided by engineer. */
"Global" = "全局";
@ -109,8 +97,6 @@
/* No comment provided by engineer. */
"Load Balance" = "負載均衡";
"Mode" = "模式";
/* No comment provided by engineer. */
"Need to Restart the ClashX to Take effect, Please start clashX manually" = "需要重啟ClashX生效請手動啟動ClashX";
@ -180,18 +166,9 @@
/* No comment provided by engineer. */
"Rule Mode" = "規則模式";
/* No comment provided by engineer. */
"Script" = "腳本";
/* No comment provided by engineer. */
"Script Mode" = "腳本模式";
/* No comment provided by engineer. */
"Should be a least 1 hour" = "應該至少 1 小時";
/* No comment provided by engineer. */
"Show speedTest at top" = "在頂部顯示 SpeedTest";
/* No comment provided by engineer. */
"Stable" = "穩定";
@ -234,14 +211,5 @@
/* No comment provided by engineer. */
"Updating" = "更新中";
/* No comment provided by engineer. */
"Upgrade Channel" = "升級通道";
/* No comment provided by engineer. */
"URL is not valid" = "網址無效";
/* No comment provided by engineer. */
"Use iCloud" = "使用 iCloud";
/* No comment provided by engineer. */
"Use reload config to try reconnect." = "使用重新加載配置嘗試重新連接";

View File

@ -11,6 +11,9 @@ import RxSwift
class DebugSettingViewController: NSViewController {
@IBOutlet weak var swiftuiMenuBarButton: NSButton!
@IBOutlet weak var useBuiltinApiButton: NSButton!
@IBOutlet weak var revertProxyButton: NSButton!
@IBOutlet weak var updateChannelPopButton: NSPopUpButton!
var disposeBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
@ -18,6 +21,9 @@ class DebugSettingViewController: NSViewController {
swiftuiMenuBarButton.rx.state.bind { state in
Settings.useSwiftUiMenuBar = state == .on
}.disposed(by: disposeBag)
useBuiltinApiButton.state = Settings.builtInApiMode ? .on:.off
revertProxyButton.state = Settings.disableRestoreProxy ? .off : .on
AutoUpgardeManager.shared.addChannelMenuItem(updateChannelPopButton)
}
@IBAction func actionUnInstallProxyHelper(_ sender: Any) {
PrivilegedHelperManager.shared.removeInstallHelper()
@ -49,4 +55,26 @@ class DebugSettingViewController: NSViewController {
UserDefaults.standard.synchronize()
NSApplication.shared.terminate(self)
}
@IBAction func actionSetUseApiMode(_ sender: Any) {
let alert = NSAlert()
alert.informativeText = NSLocalizedString("Need to Restart the ClashX to Take effect, Please start clashX manually", comment: "")
alert.addButton(withTitle: NSLocalizedString("Apply and Quit", comment: ""))
alert.addButton(withTitle: NSLocalizedString("Cancel", comment: ""))
if alert.runModal() == .alertFirstButtonReturn {
Settings.builtInApiMode = !Settings.builtInApiMode
NSApp.terminate(nil)
} else {
useBuiltinApiButton.state = Settings.builtInApiMode ? .on:.off
}
}
@IBAction func actionUpdateGeoipDb(_ sender: Any) {
ClashResourceManager.updateGeoIP()
}
@IBAction func actionRevertProxy(_ sender: Any) {
Settings.disableRestoreProxy.toggle()
revertProxyButton.state = Settings.disableRestoreProxy ? .off : .on
}
}

View File

@ -25,9 +25,13 @@ class GeneralSettingViewController: NSViewController {
@IBOutlet weak var apiSecretOverrideButton: NSButton!
@IBOutlet weak var speedTestUrlField: NSTextField!
var disposeBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
speedTestUrlField.stringValue = Settings.benchMarkUrl
speedTestUrlField.placeholderString = Settings.defaultBenchmarkUrl
ignoreListTextView.string = Settings.proxyIgnoreList.joined(separator: ",")
ignoreListTextView.rx
.string.debounce(.milliseconds(500), scheduler: MainScheduler.instance)
@ -111,6 +115,14 @@ class GeneralSettingViewController: NSViewController {
view.window?.makeFirstResponder(nil)
}
override func viewWillDisappear() {
super.viewWillDisappear()
let url = speedTestUrlField.stringValue
if url.isUrlVaild() || url.count == 0 {
Settings.benchMarkUrl = url
}
}
@IBAction func actionResetIgnoreList(_ sender: Any) {
ignoreListTextView.string = Settings.proxyIgnoreListDefaultValue.joined(separator: ",")
Settings.proxyIgnoreList = Settings.proxyIgnoreListDefaultValue

View File

@ -1,30 +1,63 @@
/* Class = "NSMenuItem"; title = "ERROR"; ObjectID = "0iu-lB-eZN"; */
"0iu-lB-eZN.title" = "ERROR";
/* Class = "NSBox"; title = "Mode"; ObjectID = "1d5-NL-UsJ"; */
"1d5-NL-UsJ.title" = "代理模式";
/* Class = "NSMenu"; title = "Remote Controller"; ObjectID = "1He-Eq-fSy"; */
"1He-Eq-fSy.title" = "远程控制器";
/* Class = "NSButtonCell"; title = "Update"; ObjectID = "2Rx-ih-aGW"; */
"2Rx-ih-aGW.title" = "更新";
/* Class = "NSMenuItem"; title = "Log level"; ObjectID = "3Da-fL-Mzr"; */
"3Da-fL-Mzr.title" = "日志等级";
/* Class = "NSTabViewItem"; label = "Debug"; ObjectID = "3Om-yT-A83"; */
"3Om-yT-A83.label" = "调试";
/* Class = "NSButtonCell"; title = "Add"; ObjectID = "51K-nB-xLS"; */
"51K-nB-xLS.title" = "添加";
/* Class = "NSTableColumn"; headerCell.title = "Api Secret"; ObjectID = "5hn-k8-CWe"; */
"5hn-k8-CWe.headerCell.title" = "Api Secret";
/* Class = "NSButtonCell"; title = "Reset"; ObjectID = "5ws-55-f1g"; */
"5ws-55-f1g.title" = "重置";
/* Class = "NSViewController"; title = "Remote Configs"; ObjectID = "6WI-Hi-v9j"; */
"6WI-Hi-v9j.title" = "托管的配置文件";
/* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "7G6-oO-vNs"; */
"7G6-oO-vNs.title" = "Text Cell";
/* Class = "NSMenuItem"; title = "Copy shell command (External IP)"; ObjectID = "7wl-vK-5JO"; */
"7wl-vK-5JO.title" = "复制终端代理命令(外部IP)";
/* Class = "NSMenuItem"; title = "Rule"; ObjectID = "89n-bD-JHk"; */
"89n-bD-JHk.title" = "规则判断";
/* Class = "NSMenuItem"; title = "Set as system proxy"; ObjectID = "8se-yr-wmp"; */
"8se-yr-wmp.title" = "设置为系统代理";
/* Class = "NSTextFieldCell"; title = "External Controls"; ObjectID = "9gE-NX-2wJ"; */
"9gE-NX-2wJ.title" = "远程控制器";
/* Class = "NSMenuItem"; title = "Ports"; ObjectID = "9i0-LH-x04"; */
"9i0-LH-x04.title" = "端口";
/* Class = "NSButtonCell"; title = "Open Log Folder"; ObjectID = "afj-4G-usr"; */
"afj-4G-usr.title" = "打开日志文件夹";
/* Class = "NSBox"; title = "Other"; ObjectID = "AMT-oc-r8A"; */
"AMT-oc-r8A.title" = "其他";
/* Class = "NSTextFieldCell"; title = "Proxy Helper"; ObjectID = "aSG-9A-eeG"; */
"aSG-9A-eeG.title" = "助手程序";
/* Class = "NSButtonCell"; title = "Uninstall Proxy Helper"; ObjectID = "AY0-nP-cGT"; */
"AY0-nP-cGT.title" = "移除助手程序";
/* Class = "NSMenu"; title = "Main Menu"; ObjectID = "AYu-sK-qS6"; */
"AYu-sK-qS6.title" = "Main Menu";
@ -34,9 +67,27 @@
/* Class = "NSMenuItem"; title = "Start at login"; ObjectID = "B1J-XB-BiZ"; */
"B1J-XB-BiZ.title" = "开机启动";
/* Class = "NSButtonCell"; title = "Delete"; ObjectID = "B2w-4r-5Kh"; */
"B2w-4r-5Kh.title" = "删除";
/* Class = "NSBox"; title = "Port Settings (restart app to take effect)"; ObjectID = "bcR-rG-52F"; */
"bcR-rG-52F.title" = "端口设置(重启应用生效)";
/* Class = "NSBox"; title = "Proxy"; ObjectID = "BFE-Qq-B2H"; */
"BFE-Qq-B2H.title" = "代理设置";
/* Class = "NSMenuItem"; title = "Remote Controller"; ObjectID = "BRR-WK-aeP"; */
"BRR-WK-aeP.title" = "远程控制器";
/* Class = "NSTextFieldCell"; title = "Log"; ObjectID = "c01-0L-1SQ"; */
"c01-0L-1SQ.title" = "日志";
/* Class = "NSTableColumn"; headerCell.title = "Url"; ObjectID = "C79-J5-30z"; */
"C79-J5-30z.headerCell.title" = "链接";
/* Class = "NSTextFieldCell"; title = "Api Secret:"; ObjectID = "ckH-Er-PfX"; */
"ckH-Er-PfX.title" = "Api秘钥";
/* Class = "NSMenuItem"; title = "Benchmark"; ObjectID = "COu-UX-bww"; */
"COu-UX-bww.title" = "延迟测速";
@ -46,6 +97,9 @@
/* Class = "NSMenuItem"; title = "Help"; ObjectID = "Dd9-2F-FVY"; */
"Dd9-2F-FVY.title" = "帮助";
/* Class = "NSButtonCell"; title = "Launch at login"; ObjectID = "dV6-4Z-2SO"; */
"dV6-4Z-2SO.title" = "开机启动";
/* Class = "NSMenuItem"; title = "SILENT"; ObjectID = "dVr-Xp-C0C"; */
"dVr-Xp-C0C.title" = "SILENT";
@ -55,9 +109,33 @@
/* Class = "NSMenuItem"; title = "Manage"; ObjectID = "Dwg-Qb-2AU"; */
"Dwg-Qb-2AU.title" = "管理";
/* Class = "NSTextFieldCell"; title = "Proxy Benchmark Url:"; ObjectID = "e0M-xf-ovR"; */
"e0M-xf-ovR.title" = "代理延迟测速链接";
/* Class = "NSButtonCell"; title = "Allow control from lan"; ObjectID = "E8B-e5-K0A"; */
"E8B-e5-K0A.title" = "允许局域网控制(不推荐)";
/* Class = "NSButtonCell"; title = "Use SwiftUI to render status bar icon. (MacOS 13+)"; ObjectID = "eY9-1i-i7P"; */
"eY9-1i-i7P.title" = "使用 SwiftUI 进行菜单栏图标渲染 (MacOS 13+)";
/* Class = "NSTextFieldCell"; title = "SSID Suspend"; ObjectID = "F1s-SF-dqX"; */
"F1s-SF-dqX.title" = "在特定 WiFi SSID 下自动暂停";
/* Class = "NSTextFieldCell"; title = "Please ensure to address any potential shortcut conflicts. Global shortcuts take precedence over regular shortcuts."; ObjectID = "GGx-F2-7kE"; */
"GGx-F2-7kE.title" = "请务必注意处理可能存在的快捷键冲突,全局快捷键将优先于普通快捷键。";
/* Class = "NSBox"; title = "Box"; ObjectID = "Gnh-m8-PAz"; */
"Gnh-m8-PAz.title" = "Box";
/* Class = "NSMenuItem"; title = "Remote config"; ObjectID = "h1C-R6-Y9w"; */
"h1C-R6-Y9w.title" = "托管配置";
/* Class = "NSMenuItem"; title = "Set update interval"; ObjectID = "h1H-7k-9HS"; */
"h1H-7k-9HS.title" = "设置更新间隔";
/* Class = "NSMenuItem"; title = " Manage"; ObjectID = "hlb-KQ-Fdr"; */
"hlb-KQ-Fdr.title" = "管理";
/* Class = "NSMenuItem"; title = "About"; ObjectID = "hUb-k9-TEf"; */
"hUb-k9-TEf.title" = "关于";
@ -67,8 +145,8 @@
/* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "id7-f0-u56"; */
"id7-f0-u56.title" = "Text Cell";
/* Class = "NSMenuItem"; title = "Show current proxy in menu"; ObjectID = "j9o-36-NTd"; */
"j9o-36-NTd.title" = "快捷展示策略组策略";
/* Class = "NSButtonCell"; title = "Use Built-in clash api"; ObjectID = "IET-Bf-hGj"; */
"IET-Bf-hGj.title" = "使用内置Clash接口";
/* Class = "NSMenuItem"; title = "API Connect Error"; ObjectID = "jGT-1M-xJu"; */
"jGT-1M-xJu.title" = "API Connect Error";
@ -79,27 +157,72 @@
/* Class = "NSMenuItem"; title = "Config"; ObjectID = "JMV-Dy-CI0"; */
"JMV-Dy-CI0.title" = "配置";
/* Class = "NSButtonCell"; title = "Revert to previous proxy on proxy disabled"; ObjectID = "JOF-yU-YHc"; */
"JOF-yU-YHc.title" = "关闭代理时还原先前系统代理设置";
/* Class = "NSButtonCell"; title = "Reduce notifications"; ObjectID = "jsL-HC-6ne"; */
"jsL-HC-6ne.title" = "减少通知";
/* Class = "NSViewController"; title = "Debug"; ObjectID = "kdV-Em-qBi"; */
"kdV-Em-qBi.title" = "调试";
/* Class = "NSViewController"; title = "General"; ObjectID = "kma-mp-ncL"; */
"kma-mp-ncL.title" = "通用";
/* Class = "NSMenuItem"; title = "WARNING"; ObjectID = "ko2-Ir-DxA"; */
"ko2-Ir-DxA.title" = "WARNING";
/* Class = "NSMenuItem"; title = "Settings"; ObjectID = "krh-QF-pqZ"; */
"krh-QF-pqZ.title" = "更多设置";
/* Class = "NSTabViewController"; title = "Settings"; ObjectID = "LAj-p8-9gd"; */
"LAj-p8-9gd.title" = "ClashX 设置";
/* Class = "NSTableColumn"; headerCell.title = "Config Name"; ObjectID = "lRE-Xa-euB"; */
"lRE-Xa-euB.headerCell.title" = "配置文件名称";
/* Class = "NSTabViewItem"; label = "General"; ObjectID = "Ltt-Vq-Hh1"; */
"Ltt-Vq-Hh1.label" = "通用";
/* Class = "NSButtonCell"; title = "Override Config Setting"; ObjectID = "LW4-cA-3bB"; */
"LW4-cA-3bB.title" = "覆盖配置文件设置";
/* Class = "NSTextFieldCell"; title = "Api Port:"; ObjectID = "mbn-tK-UQa"; */
"mbn-tK-UQa.title" = "Api 端口";
/* Class = "NSBox"; title = "Debug Setting"; ObjectID = "NLT-FZ-48V"; */
"NLT-FZ-48V.title" = "调试设置";
/* Class = "NSTextFieldCell"; title = "Update Channel"; ObjectID = "NLt-OM-k6i"; */
"NLt-OM-k6i.title" = "更新通道";
/* Class = "NSMenuItem"; title = "Direct"; ObjectID = "Np6-Pm-Lo3"; */
"Np6-Pm-Lo3.title" = "直接连接";
/* Class = "NSTextFieldCell"; title = "Bypass proxy settings for these Hosts & Domains"; ObjectID = "NPu-V9-f3r"; */
"NPu-V9-f3r.title" = "忽略这些主机与域的代理设置";
/* Class = "NSMenuItem"; title = "Quit"; ObjectID = "NXU-86-Eem"; */
"NXU-86-Eem.title" = "退出";
/* Class = "NSMenu"; title = "Help"; ObjectID = "ogW-pn-jeR"; */
"ogW-pn-jeR.title" = "帮助";
/* Class = "NSMenuItem"; title = "Experimental"; ObjectID = "OLP-Uv-at6"; */
"OLP-Uv-at6.title" = "试验性功能";
/* Class = "NSTextFieldCell"; title = "Geo-IP Datebase"; ObjectID = "OMy-zu-iho"; */
"OMy-zu-iho.title" = "Geo-IP数据库";
/* Class = "NSMenuItem"; title = "Check Update"; ObjectID = "p0T-J8-Emx"; */
"p0T-J8-Emx.title" = "检查更新";
/* Class = "NSButtonCell"; title = "Use iCloud to store config files"; ObjectID = "p7q-KN-kIv"; */
"p7q-KN-kIv.title" = "将配置文件存储在iCloud中";
/* Class = "NSTextFieldCell"; title = "App Setting"; ObjectID = "PF0-Gd-XbR"; */
"PF0-Gd-XbR.title" = "应用配置";
/* Class = "NSButtonCell"; title = "Update"; ObjectID = "pHl-C4-fNt"; */
"pHl-C4-fNt.title" = "更新";
/* Class = "NSMenuItem"; title = "Reload config"; ObjectID = "q3G-VH-eyy"; */
"q3G-VH-eyy.title" = "重载配置文件";
@ -109,11 +232,11 @@
/* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "RCv-zz-HKW"; */
"RCv-zz-HKW.title" = "Text Cell";
/* Class = "NSMenuItem"; title = "Set benchmark url"; ObjectID = "rls-O1-mpQ"; */
"rls-O1-mpQ.title" = "设置延迟测速链接";
/* Class = "NSViewController"; title = "External Manager"; ObjectID = "s6y-wL-pnr"; */
"s6y-wL-pnr.title" = "远程控制器";
/* Class = "NSMenu"; title = "Experimental"; ObjectID = "sbS-Fj-gxn"; */
"sbS-Fj-gxn.title" = "试验性功能";
/* Class = "NSTextFieldCell"; title = "Separated by commas(,)"; ObjectID = "sfe-wu-UXp"; */
"sfe-wu-UXp.title" = "使用英文逗号(,)分隔";
/* Class = "NSMenu"; title = "Config"; ObjectID = "tck-zU-JKQ"; */
"tck-zU-JKQ.title" = "配置";
@ -121,30 +244,45 @@
/* Class = "NSTextFieldCell"; title = "Configs"; ObjectID = "tL1-bl-LXd"; */
"tL1-bl-LXd.title" = "托管的配置文件:";
/* Class = "NSButtonCell"; title = "iCloud"; ObjectID = "URV-fZ-bJf"; */
"URV-fZ-bJf.title" = "iCloud";
/* Class = "NSMenu"; title = "API Connect Error"; ObjectID = "UU2-uE-YB4"; */
"UU2-uE-YB4.title" = "API Connect Error";
/* Class = "NSTextFieldCell"; title = "Proxy Port:"; ObjectID = "uUA-LS-Hu8"; */
"uUA-LS-Hu8.title" = "代理端口";
/* Class = "NSMenuItem"; title = "Allow connect from Lan"; ObjectID = "Vz8-7n-vx6"; */
"Vz8-7n-vx6.title" = "允许局域网连接";
/* Class = "NSTextFieldCell"; title = "This allows you to control the clash core running in the different machine"; ObjectID = "WkL-aX-66E"; */
"WkL-aX-66E.title" = "远程控制器允许你控制其他设备上的 Clash 状态。";
/* Class = "NSViewController"; title = "Global ShortCut"; ObjectID = "wKZ-TE-sf8"; */
"wKZ-TE-sf8.title" = "全局快捷键";
/* Class = "NSMenu"; title = "Log level"; ObjectID = "wqo-3T-4qO"; */
"wqo-3T-4qO.title" = "日志等级";
/* Class = "NSMenuItem"; title = "Use built in api"; ObjectID = "xG5-B4-mlw"; */
"xG5-B4-mlw.title" = "使用内置接口";
/* Class = "NSMenuItem"; title = "Dashboard"; ObjectID = "XG6-2M-PNi"; */
"XG6-2M-PNi.title" = "控制台";
/* Class = "NSMenuItem"; title = "DEBUG"; ObjectID = "XIR-Go-fWA"; */
"XIR-Go-fWA.title" = "DEBUG";
/* Class = "NSTextFieldCell"; title = "Separated by commas(,)"; ObjectID = "xnL-ma-vFo"; */
"xnL-ma-vFo.title" = "使用英文逗号(,)分隔";
/* Class = "NSTableColumn"; headerCell.title = "Update Time"; ObjectID = "xoc-hs-9qa"; */
"xoc-hs-9qa.headerCell.title" = "更新时间";
/* Class = "NSMenuItem"; title = "Show Log"; ObjectID = "xxZ-9l-69m"; */
"xxZ-9l-69m.title" = "显示日志";
/* Class = "NSButtonCell"; title = "Local"; ObjectID = "YF4-uZ-A0M"; */
"YF4-uZ-A0M.title" = "本地";
/* Class = "NSButtonCell"; title = "Delete"; ObjectID = "yGD-AG-oYU"; */
"yGD-AG-oYU.title" = "删除";
@ -154,152 +292,17 @@
/* Class = "NSMenuItem"; title = "Show network indicator"; ObjectID = "YIO-Vj-64f"; */
"YIO-Vj-64f.title" = "显示实时速率";
/* Class = "NSTextFieldCell"; title = "Core Version"; ObjectID = "zwo-q5-k5N"; */
"zwo-q5-k5N.title" = "内核版本";
/* Class = "NSMenuItem"; title = "Copy shell command (External IP)"; ObjectID = "7wl-vK-5JO"; */
"7wl-vK-5JO.title" = "复制终端代理命令(外部IP)";
/* Class = "NSTableColumn"; headerCell.title = "Api Secret"; ObjectID = "5hn-k8-CWe"; */
"5hn-k8-CWe.headerCell.title" = "Api Secret";
/* Class = "NSTextFieldCell"; title = "External Controls"; ObjectID = "9gE-NX-2wJ"; */
"9gE-NX-2wJ.title" = "远程控制器";
/* Class = "NSButtonCell"; title = "Delete"; ObjectID = "B2w-4r-5Kh"; */
"B2w-4r-5Kh.title" = "删除";
/* Class = "NSButtonCell"; title = "Add"; ObjectID = "ZcF-10-jsl"; */
"ZcF-10-jsl.title" = "添加";
/* Class = "NSViewController"; title = "External Manager"; ObjectID = "s6y-wL-pnr"; */
"s6y-wL-pnr.title" = "远程控制器";
/* Class = "NSTableColumn"; headerCell.title = "Api Url"; ObjectID = "yO6-uZ-IRv"; */
"yO6-uZ-IRv.headerCell.title" = "Api Url";
/* Class = "NSMenu"; title = "Remote Controller"; ObjectID = "1He-Eq-fSy"; */
"1He-Eq-fSy.title" = "远程控制器";
/* Class = "NSMenuItem"; title = "Remote Controller"; ObjectID = "BRR-WK-aeP"; */
"BRR-WK-aeP.title" = "远程控制器";
/* Class = "NSMenuItem"; title = " Manage"; ObjectID = "hlb-KQ-Fdr"; */
"hlb-KQ-Fdr.title" = "管理";
/* Class = "NSTextFieldCell"; title = "This allows you to control the clash core running in the different machine"; ObjectID = "WkL-aX-66E"; */
"WkL-aX-66E.title" = "远程控制器允许你控制其他设备上的 Clash 状态。";
/* Class = "NSMenuItem"; title = "Set update interval"; ObjectID = "h1H-7k-9HS"; */
"h1H-7k-9HS.title" = "设置更新间隔";
/* Class = "NSTabViewController"; title = "Settings"; ObjectID = "LAj-p8-9gd"; */
"LAj-p8-9gd.title" = "ClashX 设置";
/* Class = "NSTabViewItem"; label = "General"; ObjectID = "Ltt-Vq-Hh1"; */
"Ltt-Vq-Hh1.label" = "通用";
/* Class = "NSTextFieldCell"; title = "Bypass proxy settings for these Hosts & Domains"; ObjectID = "NPu-V9-f3r"; */
"NPu-V9-f3r.title" = "忽略这些主机与域的代理设置";
/* Class = "NSButtonCell"; title = "Launch at login"; ObjectID = "dV6-4Z-2SO"; */
"dV6-4Z-2SO.title" = "开机启动";
/* Class = "NSViewController"; title = "General"; ObjectID = "kma-mp-ncL"; */
"kma-mp-ncL.title" = "通用";
/* Class = "NSMenuItem"; title = "Settings"; ObjectID = "krh-QF-pqZ"; */
"krh-QF-pqZ.title" = "更多设置";
/* Class = "NSButtonCell"; title = "Use iCloud to store config files"; ObjectID = "p7q-KN-kIv"; */
"p7q-KN-kIv.title" = "将配置文件存储在iCloud中";
/* Class = "NSButtonCell"; title = "Reduce notifications"; ObjectID = "jsL-HC-6ne"; */
"jsL-HC-6ne.title" = "减少通知";
/* Class = "NSTextFieldCell"; title = "Separated by commas(,)"; ObjectID = "sfe-wu-UXp"; */
"sfe-wu-UXp.title" = "使用英文逗号(,)分隔";
/* Class = "NSButtonCell"; title = "Allow control from lan"; ObjectID = "E8B-e5-K0A"; */
"E8B-e5-K0A.title" = "允许局域网控制(不推荐)";
/* Class = "NSBox"; title = "Port Settings (restart app to take effect)"; ObjectID = "bcR-rG-52F"; */
"bcR-rG-52F.title" = "端口设置(重启应用生效)";
/* Class = "NSTextFieldCell"; title = "Api Port:"; ObjectID = "mbn-tK-UQa"; */
"mbn-tK-UQa.title" = "Api 端口";
/* Class = "NSTextFieldCell"; title = "Proxy Port:"; ObjectID = "uUA-LS-Hu8"; */
"uUA-LS-Hu8.title" = "代理端口";
/* Class = "NSButtonCell"; title = "Reset"; ObjectID = "yXh-2Y-aTS"; */
"yXh-2Y-aTS.title" = "重置";
/* Class = "NSBox"; title = "Box"; ObjectID = "Gnh-m8-PAz"; */
"Gnh-m8-PAz.title" = "Box";
/* Class = "NSTextFieldCell"; title = "SSID Suspend"; ObjectID = "F1s-SF-dqX"; */
"F1s-SF-dqX.title" = "在特定 WiFi SSID 下自动暂停";
/* Class = "NSTextFieldCell"; title = "Separated by commas(,)"; ObjectID = "xnL-ma-vFo"; */
"xnL-ma-vFo.title" = "使用英文逗号(,)分隔";
/* Class = "NSTabViewItem"; label = "Debug"; ObjectID = "3Om-yT-A83"; */
"3Om-yT-A83.label" = "调试";
/* Class = "NSBox"; title = "Debug Setting"; ObjectID = "NLT-FZ-48V"; */
"NLT-FZ-48V.title" = "调试设置";
/* Class = "NSButtonCell"; title = "Use SwiftUI to render status bar icon. (MacOS 13+)"; ObjectID = "eY9-1i-i7P"; */
"eY9-1i-i7P.title" = "使用 SwiftUI 进行菜单栏图标渲染 (MacOS 13+)";
/* Class = "NSViewController"; title = "Debug"; ObjectID = "kdV-Em-qBi"; */
"kdV-Em-qBi.title" = "调试";
/* Class = "NSBox"; title = "Mode"; ObjectID = "1d5-NL-UsJ"; */
"1d5-NL-UsJ.title" = "代理模式";
/* Class = "NSBox"; title = "Other"; ObjectID = "AMT-oc-r8A"; */
"AMT-oc-r8A.title" = "其他";
/* Class = "NSBox"; title = "Proxy"; ObjectID = "BFE-Qq-B2H"; */
"BFE-Qq-B2H.title" = "代理设置";
/* Class = "NSViewController"; title = "Global ShortCut"; ObjectID = "wKZ-TE-sf8"; */
"wKZ-TE-sf8.title" = "全局快捷键";
/* Class = "NSTextFieldCell"; title = "Please ensure to address any potential shortcut conflicts. Global shortcuts take precedence over regular shortcuts."; ObjectID = "GGx-F2-7kE"; */
"GGx-F2-7kE.title" = "请务必注意处理可能存在的快捷键冲突,全局快捷键将优先于普通快捷键。";
/* Class = "NSButtonCell"; title = "Uninstall Proxy Helper"; ObjectID = "AY0-nP-cGT"; */
"AY0-nP-cGT.title" = "移除助手程序";
/* Class = "NSTextFieldCell"; title = "Proxy Helper"; ObjectID = "aSG-9A-eeG"; */
"aSG-9A-eeG.title" = "助手程序";
/* Class = "NSButtonCell"; title = "Open Log Folder"; ObjectID = "afj-4G-usr"; */
"afj-4G-usr.title" = "打开日志文件夹";
/* Class = "NSTextFieldCell"; title = "Log"; ObjectID = "c01-0L-1SQ"; */
"c01-0L-1SQ.title" = "日志";
/* Class = "NSButtonCell"; title = "Override Config Setting"; ObjectID = "LW4-cA-3bB"; */
"LW4-cA-3bB.title" = "覆盖配置文件设置";
/* Class = "NSTextFieldCell"; title = "Api Secret:"; ObjectID = "ckH-Er-PfX"; */
"ckH-Er-PfX.title" = "Api秘钥";
/* Class = "NSButtonCell"; title = "iCloud"; ObjectID = "URV-fZ-bJf"; */
"URV-fZ-bJf.title" = "iCloud";
/* Class = "NSButtonCell"; title = "Local"; ObjectID = "YF4-uZ-A0M"; */
"YF4-uZ-A0M.title" = "本地";
/* Class = "NSTextFieldCell"; title = "Config Folder"; ObjectID = "ZA9-qc-wi4"; */
"ZA9-qc-wi4.title" = "配置文件夹";
/* Class = "NSButtonCell"; title = "Reset"; ObjectID = "5ws-55-f1g"; */
"5ws-55-f1g.title" = "重置";
/* Class = "NSButtonCell"; title = "Add"; ObjectID = "ZcF-10-jsl"; */
"ZcF-10-jsl.title" = "添加";
/* Class = "NSTextFieldCell"; title = "App Setting"; ObjectID = "PF0-Gd-XbR"; */
"PF0-Gd-XbR.title" = "应用配置";
/* Class = "NSTextFieldCell"; title = "Core Version"; ObjectID = "zwo-q5-k5N"; */
"zwo-q5-k5N.title" = "内核版本";

View File

@ -1,54 +1,63 @@
/* Class = "NSMenu"; title = "Experimental"; ObjectID = "sbS-Fj-gxn"; */
"sbS-Fj-gxn.title" = "試驗性功能";
/* Class = "NSMenu"; title = "Config"; ObjectID = "tck-zU-JKQ"; */
"tck-zU-JKQ.title" = "配置";
/* Class = "NSTextFieldCell"; title = "Configs"; ObjectID = "tL1-bl-LXd"; */
"tL1-bl-LXd.title" = "託管的配置文件:";
/* Class = "NSMenu"; title = "API Connect Error"; ObjectID = "UU2-uE-YB4"; */
"UU2-uE-YB4.title" = "API Connect Error";
/* Class = "NSMenuItem"; title = "Allow connect from Lan"; ObjectID = "Vz8-7n-vx6"; */
"Vz8-7n-vx6.title" = "允許局域網連接";
/* Class = "NSMenu"; title = "Log level"; ObjectID = "wqo-3T-4qO"; */
"wqo-3T-4qO.title" = "日誌等級";
/* Class = "NSMenuItem"; title = "Use built in api"; ObjectID = "xG5-B4-mlw"; */
"xG5-B4-mlw.title" = "使用內置接口";
/* Class = "NSMenuItem"; title = "Dashboard"; ObjectID = "XG6-2M-PNi"; */
"XG6-2M-PNi.title" = "控制台";
/* Class = "NSMenuItem"; title = "ERROR"; ObjectID = "0iu-lB-eZN"; */
"0iu-lB-eZN.title" = "錯誤";
/* Class = "NSBox"; title = "Mode"; ObjectID = "1d5-NL-UsJ"; */
"1d5-NL-UsJ.title" = "模式";
/* Class = "NSMenu"; title = "Remote Controller"; ObjectID = "1He-Eq-fSy"; */
"1He-Eq-fSy.title" = "遙控";
/* Class = "NSButtonCell"; title = "Update"; ObjectID = "2Rx-ih-aGW"; */
"2Rx-ih-aGW.title" = "更新";
/* Class = "NSMenuItem"; title = "Log level"; ObjectID = "3Da-fL-Mzr"; */
"3Da-fL-Mzr.title" = "日誌等級";
/* Class = "NSTabViewItem"; label = "Debug"; ObjectID = "3Om-yT-A83"; */
"3Om-yT-A83.label" = "調試";
/* Class = "NSButtonCell"; title = "Add"; ObjectID = "51K-nB-xLS"; */
"51K-nB-xLS.title" = "添加";
/* Class = "NSTableColumn"; headerCell.title = "Api Secret"; ObjectID = "5hn-k8-CWe"; */
"5hn-k8-CWe.headerCell.title" = "Api Secret";
/* Class = "NSButtonCell"; title = "Reset"; ObjectID = "5ws-55-f1g"; */
"5ws-55-f1g.title" = "重置";
/* Class = "NSViewController"; title = "Remote Configs"; ObjectID = "6WI-Hi-v9j"; */
"6WI-Hi-v9j.title" = "託管的配置文件";
/* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "7G6-oO-vNs"; */
"7G6-oO-vNs.title" = "文本單元格";
/* Class = "NSMenuItem"; title = "Copy shell command (External IP)"; ObjectID = "7wl-vK-5JO"; */
"7wl-vK-5JO.title" = "複製shell命令外網IP)";
/* Class = "NSMenuItem"; title = "Rule"; ObjectID = "89n-bD-JHk"; */
"89n-bD-JHk.title" = "規則判斷";
/* Class = "NSMenuItem"; title = "Set as system proxy"; ObjectID = "8se-yr-wmp"; */
"8se-yr-wmp.title" = "設定為系統代理";
/* Class = "NSTextFieldCell"; title = "External Controls"; ObjectID = "9gE-NX-2wJ"; */
"9gE-NX-2wJ.title" = "外部控制";
/* Class = "NSMenuItem"; title = "Ports"; ObjectID = "9i0-LH-x04"; */
"9i0-LH-x04.title" = "端口";
/* Class = "NSButtonCell"; title = "Open Log Folder"; ObjectID = "afj-4G-usr"; */
"afj-4G-usr.title" = "打開日誌文件夾";
/* Class = "NSBox"; title = "Other"; ObjectID = "AMT-oc-r8A"; */
"AMT-oc-r8A.title" = "其他";
/* Class = "NSTextFieldCell"; title = "Proxy Helper"; ObjectID = "aSG-9A-eeG"; */
"aSG-9A-eeG.title" = "代理助手";
/* Class = "NSButtonCell"; title = "Uninstall Proxy Helper"; ObjectID = "AY0-nP-cGT"; */
"AY0-nP-cGT.title" = "卸載代理程式";
/* Class = "NSMenu"; title = "Main Menu"; ObjectID = "AYu-sK-qS6"; */
"AYu-sK-qS6.title" = "主菜單";
@ -58,9 +67,27 @@
/* Class = "NSMenuItem"; title = "Start at login"; ObjectID = "B1J-XB-BiZ"; */
"B1J-XB-BiZ.title" = "開機啟動";
/* Class = "NSButtonCell"; title = "Delete"; ObjectID = "B2w-4r-5Kh"; */
"B2w-4r-5Kh.title" = "刪除";
/* Class = "NSBox"; title = "Port Settings (restart app to take effect)"; ObjectID = "bcR-rG-52F"; */
"bcR-rG-52F.title" = "端口設定";
/* Class = "NSBox"; title = "Proxy"; ObjectID = "BFE-Qq-B2H"; */
"BFE-Qq-B2H.title" = "代理";
/* Class = "NSMenuItem"; title = "Remote Controller"; ObjectID = "BRR-WK-aeP"; */
"BRR-WK-aeP.title" = "遙控";
/* Class = "NSTextFieldCell"; title = "Log"; ObjectID = "c01-0L-1SQ"; */
"c01-0L-1SQ.title" = "日誌";
/* Class = "NSTableColumn"; headerCell.title = "Url"; ObjectID = "C79-J5-30z"; */
"C79-J5-30z.headerCell.title" = "鏈接";
/* Class = "NSTextFieldCell"; title = "Api Secret:"; ObjectID = "ckH-Er-PfX"; */
"ckH-Er-PfX.title" = "API 秘鑰";
/* Class = "NSMenuItem"; title = "Benchmark"; ObjectID = "COu-UX-bww"; */
"COu-UX-bww.title" = "延遲測速";
@ -70,6 +97,9 @@
/* Class = "NSMenuItem"; title = "Help"; ObjectID = "Dd9-2F-FVY"; */
"Dd9-2F-FVY.title" = "幫助";
/* Class = "NSButtonCell"; title = "Launch at login"; ObjectID = "dV6-4Z-2SO"; */
"dV6-4Z-2SO.title" = "登錄時啟動";
/* Class = "NSMenuItem"; title = "SILENT"; ObjectID = "dVr-Xp-C0C"; */
"dVr-Xp-C0C.title" = "SILENT";
@ -79,99 +109,15 @@
/* Class = "NSMenuItem"; title = "Manage"; ObjectID = "Dwg-Qb-2AU"; */
"Dwg-Qb-2AU.title" = "管理";
/* Class = "NSMenuItem"; title = "Remote config"; ObjectID = "h1C-R6-Y9w"; */
"h1C-R6-Y9w.title" = "託管配置";
/* Class = "NSMenuItem"; title = "About"; ObjectID = "hUb-k9-TEf"; */
"hUb-k9-TEf.title" = "關於";
/* Class = "NSMenuItem"; title = "Update"; ObjectID = "I2P-Wd-Ns7"; */
"I2P-Wd-Ns7.title" = "更新";
/* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "id7-f0-u56"; */
"id7-f0-u56.title" = "Text Cell";
/* Class = "NSMenuItem"; title = "Show current proxy in menu"; ObjectID = "j9o-36-NTd"; */
"j9o-36-NTd.title" = "快捷展示策略組策略";
/* Class = "NSMenuItem"; title = "API Connect Error"; ObjectID = "jGT-1M-xJu"; */
"jGT-1M-xJu.title" = "API Connect Error";
/* Class = "NSMenuItem"; title = "Copy shell command"; ObjectID = "Jmb-PK-rMW"; */
"Jmb-PK-rMW.title" = "複製終端代理命令";
/* Class = "NSMenuItem"; title = "Config"; ObjectID = "JMV-Dy-CI0"; */
"JMV-Dy-CI0.title" = "配置";
/* Class = "NSMenuItem"; title = "WARNING"; ObjectID = "ko2-Ir-DxA"; */
"ko2-Ir-DxA.title" = "WARNING";
/* Class = "NSTableColumn"; headerCell.title = "Config Name"; ObjectID = "lRE-Xa-euB"; */
"lRE-Xa-euB.headerCell.title" = "配置文件名稱";
/* Class = "NSMenuItem"; title = "Direct"; ObjectID = "Np6-Pm-Lo3"; */
"Np6-Pm-Lo3.title" = "直接連接";
/* Class = "NSMenuItem"; title = "Quit"; ObjectID = "NXU-86-Eem"; */
"NXU-86-Eem.title" = "退出";
/* Class = "NSMenu"; title = "Help"; ObjectID = "ogW-pn-jeR"; */
"ogW-pn-jeR.title" = "幫助";
/* Class = "NSMenuItem"; title = "Experimental"; ObjectID = "OLP-Uv-at6"; */
"OLP-Uv-at6.title" = "試驗性功能";
/* Class = "NSMenuItem"; title = "Check Update"; ObjectID = "p0T-J8-Emx"; */
"p0T-J8-Emx.title" = "檢查更新";
/* Class = "NSMenuItem"; title = "Reload config"; ObjectID = "q3G-VH-eyy"; */
"q3G-VH-eyy.title" = "重載配置文件";
/* Class = "NSMenuItem"; title = "Auto Update"; ObjectID = "r8s-OI-tgf"; */
"r8s-OI-tgf.title" = "自動更新";
/* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "RCv-zz-HKW"; */
"RCv-zz-HKW.title" = "Text Cell";
/* Class = "NSMenuItem"; title = "Set benchmark url"; ObjectID = "rls-O1-mpQ"; */
"rls-O1-mpQ.title" = "設定延遲測速鏈接";
/* Class = "NSMenu"; title = "Remote Controller"; ObjectID = "1He-Eq-fSy"; */
"1He-Eq-fSy.title" = "遙控";
/* Class = "NSBox"; title = "Mode"; ObjectID = "1d5-NL-UsJ"; */
"1d5-NL-UsJ.title" = "模式";
/* Class = "NSTabViewItem"; label = "Debug"; ObjectID = "3Om-yT-A83"; */
"3Om-yT-A83.label" = "調試";
/* Class = "NSTableColumn"; headerCell.title = "Api Secret"; ObjectID = "5hn-k8-CWe"; */
"5hn-k8-CWe.headerCell.title" = "Api Secret";
/* Class = "NSMenuItem"; title = "Copy shell command (External IP)"; ObjectID = "7wl-vK-5JO"; */
"7wl-vK-5JO.title" = "複製shell命令外網IP)";
/* Class = "NSTextFieldCell"; title = "External Controls"; ObjectID = "9gE-NX-2wJ"; */
"9gE-NX-2wJ.title" = "外部控制";
/* Class = "NSBox"; title = "Other"; ObjectID = "AMT-oc-r8A"; */
"AMT-oc-r8A.title" = "其他";
/* Class = "NSButtonCell"; title = "Uninstall Proxy Helper"; ObjectID = "AY0-nP-cGT"; */
"AY0-nP-cGT.title" = "卸載代理程式";
/* Class = "NSButtonCell"; title = "Delete"; ObjectID = "B2w-4r-5Kh"; */
"B2w-4r-5Kh.title" = "刪除";
/* Class = "NSBox"; title = "Proxy"; ObjectID = "BFE-Qq-B2H"; */
"BFE-Qq-B2H.title" = "代理";
/* Class = "NSMenuItem"; title = "Remote Controller"; ObjectID = "BRR-WK-aeP"; */
"BRR-WK-aeP.title" = "遙控";
/* Class = "NSTextFieldCell"; title = "Proxy Benchmark Url:"; ObjectID = "e0M-xf-ovR"; */
"e0M-xf-ovR.title" = "代理延遲測速連結";
/* Class = "NSButtonCell"; title = "Allow control from lan"; ObjectID = "E8B-e5-K0A"; */
"E8B-e5-K0A.title" = "允許局域網設備";
/* Class = "NSButtonCell"; title = "Use SwiftUI to render status bar icon. (MacOS 13+)"; ObjectID = "eY9-1i-i7P"; */
"eY9-1i-i7P.title" = "使用 SwiftUI 渲染狀態欄圖標";
/* Class = "NSTextFieldCell"; title = "SSID Suspend"; ObjectID = "F1s-SF-dqX"; */
"F1s-SF-dqX.title" = "SSID 掛起";
@ -181,47 +127,8 @@
/* Class = "NSBox"; title = "Box"; ObjectID = "Gnh-m8-PAz"; */
"Gnh-m8-PAz.title" = "盒子";
/* Class = "NSTabViewController"; title = "Settings"; ObjectID = "LAj-p8-9gd"; */
"LAj-p8-9gd.title" = "設定";
/* Class = "NSTabViewItem"; label = "General"; ObjectID = "Ltt-Vq-Hh1"; */
"Ltt-Vq-Hh1.label" = "一般設定";
/* Class = "NSBox"; title = "Debug Setting"; ObjectID = "NLT-FZ-48V"; */
"NLT-FZ-48V.title" = "調試設定";
/* Class = "NSTextFieldCell"; title = "Bypass proxy settings for these Hosts & Domains"; ObjectID = "NPu-V9-f3r"; */
"NPu-V9-f3r.title" = "繞過這些主機和域的代理設定";
/* Class = "NSTextFieldCell"; title = "This allows you to control the clash core running in the different machine"; ObjectID = "WkL-aX-66E"; */
"WkL-aX-66E.title" = "這允許你控制在不同機器上運行的衝突核心";
/* Class = "NSMenuItem"; title = "DEBUG"; ObjectID = "XIR-Go-fWA"; */
"XIR-Go-fWA.title" = "調試";
/* Class = "NSMenuItem"; title = "Show network indicator"; ObjectID = "YIO-Vj-64f"; */
"YIO-Vj-64f.title" = "顯示網絡指示器";
/* Class = "NSButtonCell"; title = "Add"; ObjectID = "ZcF-10-jsl"; */
"ZcF-10-jsl.title" = "添加";
/* Class = "NSTextFieldCell"; title = "Proxy Helper"; ObjectID = "aSG-9A-eeG"; */
"aSG-9A-eeG.title" = "代理助手";
/* Class = "NSButtonCell"; title = "Open Log Folder"; ObjectID = "afj-4G-usr"; */
"afj-4G-usr.title" = "打開日誌文件夾";
/* Class = "NSBox"; title = "Port Settings (restart app to take effect)"; ObjectID = "bcR-rG-52F"; */
"bcR-rG-52F.title" = "端口設定";
/* Class = "NSTextFieldCell"; title = "Log"; ObjectID = "c01-0L-1SQ"; */
"c01-0L-1SQ.title" = "日誌";
/* Class = "NSButtonCell"; title = "Launch at login"; ObjectID = "dV6-4Z-2SO"; */
"dV6-4Z-2SO.title" = "登錄時啟動";
/* Class = "NSButtonCell"; title = "Use SwiftUI to render status bar icon. (MacOS 13+)"; ObjectID = "eY9-1i-i7P"; */
"eY9-1i-i7P.title" = "使用 SwiftUI 渲染狀態欄圖標";
/* Class = "NSMenuItem"; title = "Remote config"; ObjectID = "h1C-R6-Y9w"; */
"h1C-R6-Y9w.title" = "託管配置";
/* Class = "NSMenuItem"; title = "Set update interval"; ObjectID = "h1H-7k-9HS"; */
"h1H-7k-9HS.title" = "設定更新間隔";
@ -229,6 +136,30 @@
/* Class = "NSMenuItem"; title = " Manage"; ObjectID = "hlb-KQ-Fdr"; */
"hlb-KQ-Fdr.title" = "管理";
/* Class = "NSMenuItem"; title = "About"; ObjectID = "hUb-k9-TEf"; */
"hUb-k9-TEf.title" = "關於";
/* Class = "NSMenuItem"; title = "Update"; ObjectID = "I2P-Wd-Ns7"; */
"I2P-Wd-Ns7.title" = "更新";
/* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "id7-f0-u56"; */
"id7-f0-u56.title" = "Text Cell";
/* Class = "NSButtonCell"; title = "Use Built-in clash api"; ObjectID = "IET-Bf-hGj"; */
"IET-Bf-hGj.title" = "使用內建Clash接口";
/* Class = "NSMenuItem"; title = "API Connect Error"; ObjectID = "jGT-1M-xJu"; */
"jGT-1M-xJu.title" = "API Connect Error";
/* Class = "NSMenuItem"; title = "Copy shell command"; ObjectID = "Jmb-PK-rMW"; */
"Jmb-PK-rMW.title" = "複製終端代理命令";
/* Class = "NSMenuItem"; title = "Config"; ObjectID = "JMV-Dy-CI0"; */
"JMV-Dy-CI0.title" = "配置";
/* Class = "NSButtonCell"; title = "Revert to previous proxy on proxy disabled"; ObjectID = "JOF-yU-YHc"; */
"JOF-yU-YHc.title" = "關閉代理時還原先前系統代理設置";
/* Class = "NSButtonCell"; title = "Reduce notifications"; ObjectID = "jsL-HC-6ne"; */
"jsL-HC-6ne.title" = "減少通知";
@ -238,27 +169,108 @@
/* Class = "NSViewController"; title = "General"; ObjectID = "kma-mp-ncL"; */
"kma-mp-ncL.title" = "一般設定";
/* Class = "NSMenuItem"; title = "WARNING"; ObjectID = "ko2-Ir-DxA"; */
"ko2-Ir-DxA.title" = "WARNING";
/* Class = "NSMenuItem"; title = "Settings"; ObjectID = "krh-QF-pqZ"; */
"krh-QF-pqZ.title" = "設定";
/* Class = "NSTabViewController"; title = "Settings"; ObjectID = "LAj-p8-9gd"; */
"LAj-p8-9gd.title" = "設定";
/* Class = "NSTableColumn"; headerCell.title = "Config Name"; ObjectID = "lRE-Xa-euB"; */
"lRE-Xa-euB.headerCell.title" = "配置文件名稱";
/* Class = "NSTabViewItem"; label = "General"; ObjectID = "Ltt-Vq-Hh1"; */
"Ltt-Vq-Hh1.label" = "一般設定";
/* Class = "NSButtonCell"; title = "Override Config Setting"; ObjectID = "LW4-cA-3bB"; */
"LW4-cA-3bB.title" = "覆蓋配置文件設置";
/* Class = "NSTextFieldCell"; title = "Api Port:"; ObjectID = "mbn-tK-UQa"; */
"mbn-tK-UQa.title" = "API 端口";
/* Class = "NSBox"; title = "Debug Setting"; ObjectID = "NLT-FZ-48V"; */
"NLT-FZ-48V.title" = "調試設定";
/* Class = "NSTextFieldCell"; title = "Update Channel"; ObjectID = "NLt-OM-k6i"; */
"NLt-OM-k6i.title" = "更新通道";
/* Class = "NSMenuItem"; title = "Direct"; ObjectID = "Np6-Pm-Lo3"; */
"Np6-Pm-Lo3.title" = "直接連接";
/* Class = "NSTextFieldCell"; title = "Bypass proxy settings for these Hosts & Domains"; ObjectID = "NPu-V9-f3r"; */
"NPu-V9-f3r.title" = "繞過這些主機和域的代理設定";
/* Class = "NSMenuItem"; title = "Quit"; ObjectID = "NXU-86-Eem"; */
"NXU-86-Eem.title" = "退出";
/* Class = "NSMenu"; title = "Help"; ObjectID = "ogW-pn-jeR"; */
"ogW-pn-jeR.title" = "幫助";
/* Class = "NSTextFieldCell"; title = "Geo-IP Datebase"; ObjectID = "OMy-zu-iho"; */
"OMy-zu-iho.title" = "Geo-IP資料庫";
/* Class = "NSMenuItem"; title = "Check Update"; ObjectID = "p0T-J8-Emx"; */
"p0T-J8-Emx.title" = "檢查更新";
/* Class = "NSButtonCell"; title = "Use iCloud to store config files"; ObjectID = "p7q-KN-kIv"; */
"p7q-KN-kIv.title" = "使用iCloud 存儲配置文件";
/* Class = "NSTextFieldCell"; title = "App Setting"; ObjectID = "PF0-Gd-XbR"; */
"PF0-Gd-XbR.title" = "應用配置";
/* Class = "NSButtonCell"; title = "Update"; ObjectID = "pHl-C4-fNt"; */
"pHl-C4-fNt.title" = "更新";
/* Class = "NSMenuItem"; title = "Reload config"; ObjectID = "q3G-VH-eyy"; */
"q3G-VH-eyy.title" = "重載配置文件";
/* Class = "NSMenuItem"; title = "Auto Update"; ObjectID = "r8s-OI-tgf"; */
"r8s-OI-tgf.title" = "自動更新";
/* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "RCv-zz-HKW"; */
"RCv-zz-HKW.title" = "Text Cell";
/* Class = "NSViewController"; title = "External Manager"; ObjectID = "s6y-wL-pnr"; */
"s6y-wL-pnr.title" = "外部管理";
/* Class = "NSTextFieldCell"; title = "Separated by commas(,)"; ObjectID = "sfe-wu-UXp"; */
"sfe-wu-UXp.title" = "以逗號(,)分隔";
/* Class = "NSMenu"; title = "Config"; ObjectID = "tck-zU-JKQ"; */
"tck-zU-JKQ.title" = "配置";
/* Class = "NSTextFieldCell"; title = "Configs"; ObjectID = "tL1-bl-LXd"; */
"tL1-bl-LXd.title" = "託管的配置文件:";
/* Class = "NSButtonCell"; title = "iCloud"; ObjectID = "URV-fZ-bJf"; */
"URV-fZ-bJf.title" = "iCloud";
/* Class = "NSMenu"; title = "API Connect Error"; ObjectID = "UU2-uE-YB4"; */
"UU2-uE-YB4.title" = "API Connect Error";
/* Class = "NSTextFieldCell"; title = "Proxy Port:"; ObjectID = "uUA-LS-Hu8"; */
"uUA-LS-Hu8.title" = "代理端口";
/* Class = "NSMenuItem"; title = "Allow connect from Lan"; ObjectID = "Vz8-7n-vx6"; */
"Vz8-7n-vx6.title" = "允許局域網連接";
/* Class = "NSTextFieldCell"; title = "This allows you to control the clash core running in the different machine"; ObjectID = "WkL-aX-66E"; */
"WkL-aX-66E.title" = "這允許你控制在不同機器上運行的衝突核心";
/* Class = "NSViewController"; title = "Global ShortCut"; ObjectID = "wKZ-TE-sf8"; */
"wKZ-TE-sf8.title" = "全局快捷方式";
/* Class = "NSMenu"; title = "Log level"; ObjectID = "wqo-3T-4qO"; */
"wqo-3T-4qO.title" = "日誌等級";
/* Class = "NSMenuItem"; title = "Dashboard"; ObjectID = "XG6-2M-PNi"; */
"XG6-2M-PNi.title" = "控制台";
/* Class = "NSMenuItem"; title = "DEBUG"; ObjectID = "XIR-Go-fWA"; */
"XIR-Go-fWA.title" = "調試";
/* Class = "NSTextFieldCell"; title = "Separated by commas(,)"; ObjectID = "xnL-ma-vFo"; */
"xnL-ma-vFo.title" = "以逗號(,)分隔";
@ -268,38 +280,29 @@
/* Class = "NSMenuItem"; title = "Show Log"; ObjectID = "xxZ-9l-69m"; */
"xxZ-9l-69m.title" = "顯示日誌";
/* Class = "NSButtonCell"; title = "Local"; ObjectID = "YF4-uZ-A0M"; */
"YF4-uZ-A0M.title" = "本地";
/* Class = "NSButtonCell"; title = "Delete"; ObjectID = "yGD-AG-oYU"; */
"yGD-AG-oYU.title" = "刪除";
/* Class = "NSMenuItem"; title = "Global"; ObjectID = "yiM-U4-MNg"; */
"yiM-U4-MNg.title" = "全局";
/* Class = "NSMenuItem"; title = "Show network indicator"; ObjectID = "YIO-Vj-64f"; */
"YIO-Vj-64f.title" = "顯示網絡指示器";
/* Class = "NSTableColumn"; headerCell.title = "Api Url"; ObjectID = "yO6-uZ-IRv"; */
"yO6-uZ-IRv.headerCell.title" = "API 網址";
/* Class = "NSButtonCell"; title = "Reset"; ObjectID = "yXh-2Y-aTS"; */
"yXh-2Y-aTS.title" = "重置";
/* Class = "NSMenuItem"; title = "Global"; ObjectID = "yiM-U4-MNg"; */
"yiM-U4-MNg.title" = "全局";
/* Class = "NSTextFieldCell"; title = "Core Version"; ObjectID = "zwo-q5-k5N"; */
"zwo-q5-k5N.title" = "核心版本";
/* Class = "NSButtonCell"; title = "Override Config Setting"; ObjectID = "LW4-cA-3bB"; */
"LW4-cA-3bB.title" = "覆蓋配置文件設置";
/* Class = "NSTextFieldCell"; title = "Api Secret:"; ObjectID = "ckH-Er-PfX"; */
"ckH-Er-PfX.title" = "API 秘鑰";
/* Class = "NSButtonCell"; title = "iCloud"; ObjectID = "URV-fZ-bJf"; */
"URV-fZ-bJf.title" = "iCloud";
/* Class = "NSButtonCell"; title = "Local"; ObjectID = "YF4-uZ-A0M"; */
"YF4-uZ-A0M.title" = "本地";
/* Class = "NSTextFieldCell"; title = "Config Folder"; ObjectID = "ZA9-qc-wi4"; */
"ZA9-qc-wi4.title" = "配置文件夾";
/* Class = "NSButtonCell"; title = "Reset"; ObjectID = "5ws-55-f1g"; */
"5ws-55-f1g.title" = "重置";
/* Class = "NSButtonCell"; title = "Add"; ObjectID = "ZcF-10-jsl"; */
"ZcF-10-jsl.title" = "新增";
/* Class = "NSTextFieldCell"; title = "App Setting"; ObjectID = "PF0-Gd-XbR"; */
"PF0-Gd-XbR.title" = "應用配置";
/* Class = "NSTextFieldCell"; title = "Core Version"; ObjectID = "zwo-q5-k5N"; */
"zwo-q5-k5N.title" = "核心版本";