feat: reduce exp menu item
This commit is contained in:
parent
bb896b79dd
commit
860c1f82b8
@ -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
|
||||
|
@ -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"/>
|
||||
|
@ -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):
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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: ""))
|
||||
|
@ -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 {
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -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
|
||||
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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.";
|
||||
|
@ -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." = "使用重载配置文件按钮尝试重新连接";
|
||||
|
@ -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." = "使用重新加載配置嘗試重新連接";
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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" = "内核版本";
|
||||
|
@ -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" = "核心版本";
|
||||
|
Loading…
Reference in New Issue
Block a user