Feature: normalize translates

This commit is contained in:
yichengchen 2019-07-28 12:39:49 +08:00
parent 5549dd8196
commit 49fadd4826
11 changed files with 255 additions and 186 deletions

32
.bartycrouch.toml Normal file
View File

@ -0,0 +1,32 @@
[update]
tasks = ["interfaces", "code", "normalize"]
[update.interfaces]
path = "./ClashX"
defaultToBase = false
ignoreEmptyStrings = false
unstripped = false
[update.code]
defaultToKeys = false
additive = false
unstripped = false
[update.transform]
codePath = "./ClashX"
localizablePath = "./ClashX"
transformer = "foundation"
supportedLanguageEnumPath = "./ClashX"
typeName = "BartyCrouch"
translateMethodName = "translate"
[update.normalize]
path = "./ClashX"
sourceLocale = "zh-Hans"
harmonizeWithSource = true
sortByKeys = true
[lint]
path = "./ClashX"
duplicateKeys = true
emptyValues = true

View File

@ -34,7 +34,6 @@
49761DA721C9497000AE13EF /* dashboard in Resources */ = {isa = PBXBuildFile; fileRef = 49761DA621C9497000AE13EF /* dashboard */; };
497F0DF320DE2FE50077AD41 /* Icon.icns in Resources */ = {isa = PBXBuildFile; fileRef = 497F0DF220DE2FE50077AD41 /* Icon.icns */; };
4981C88B216BAE4A008CC14A /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 4981C88D216BAE4A008CC14A /* Localizable.strings */; };
4981C890216BAF0C008CC14A /* String+Localized.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4981C88F216BAF0C008CC14A /* String+Localized.swift */; };
49862FA0218418C600A1D5EC /* ClashRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49862F9F218418C600A1D5EC /* ClashRule.swift */; };
4989F98420D02D200001E564 /* Country.mmdb in Resources */ = {isa = PBXBuildFile; fileRef = 4989F98320D02D200001E564 /* Country.mmdb */; };
4989F98E20D0AE990001E564 /* sampleConfig.yaml in Resources */ = {isa = PBXBuildFile; fileRef = 4989F98D20D0AE990001E564 /* sampleConfig.yaml */; };
@ -130,7 +129,6 @@
4981C888216BAB8A008CC14A /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = "zh-Hans"; path = "../zh-Hans.lproj/Main.storyboard"; sourceTree = "<group>"; };
4981C88C216BAE4A008CC14A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
4981C88E216BAE4D008CC14A /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = "<group>"; };
4981C88F216BAF0C008CC14A /* String+Localized.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Localized.swift"; sourceTree = "<group>"; };
49862F9F218418C600A1D5EC /* ClashRule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClashRule.swift; sourceTree = "<group>"; };
4989F98320D02D200001E564 /* Country.mmdb */ = {isa = PBXFileReference; lastKnownFileType = file; path = Country.mmdb; sourceTree = "<group>"; };
4989F98D20D0AE990001E564 /* sampleConfig.yaml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = sampleConfig.yaml; sourceTree = "<group>"; };
@ -303,7 +301,6 @@
4966E9E5211824F300A391FB /* NSImage+extension.swift */,
496BDEDF21196F1E00C5207F /* Logger.swift */,
49B10869216A356D0064FFCE /* String+Extension.swift */,
4981C88F216BAF0C008CC14A /* String+Localized.swift */,
);
path = Basic;
sourceTree = "<group>";
@ -628,7 +625,6 @@
4952C3BF2115C7CA004A4FA8 /* MenuItemFactory.swift in Sources */,
4966E9E32118153A00A391FB /* NSUserNotificationCenter+Extension.swift in Sources */,
499976C821359F0400E7BF83 /* ClashWebViewContoller.swift in Sources */,
4981C890216BAF0C008CC14A /* String+Localized.swift in Sources */,
4966E9E6211824F300A391FB /* NSImage+extension.swift in Sources */,
49B1086A216A356D0064FFCE /* String+Extension.swift in Sources */,
4960A6DB2136529200B940C9 /* JSBridgeHandler.swift in Sources */,

View File

@ -148,7 +148,8 @@ class AppDelegate: NSObject, NSApplicationDelegate {
case .rule:self.proxyModeRuleMenuItem.state = .on
}
self.allowFromLanMenuItem.state = config.allowLan ? .on : .off
self.proxyModeMenuItem.title = "\("Proxy Mode".localized()) (\(config.mode.rawValue.localized()))"
self.proxyModeMenuItem.title = "\(NSLocalizedString("Proxy Mode", comment: "")) (\(config.mode.name))"
self.updateProxyList()

View File

@ -1,17 +0,0 @@
//
// String+Localized.swift
// ClashX
//
// Created by on 2018/10/8.
// Copyright © 2018 west2online. All rights reserved.
//
import Foundation
// to use english as showing language
// defaults write com.west2online.ClashX AppleLanguages '("en-US")'
extension String {
func localized(bundle: Bundle = .main, tableName: String = "Localizable") -> String {
return NSLocalizedString(self, tableName: tableName, value: "\(self)", comment: "")
}
}

View File

@ -21,41 +21,42 @@ extension NSUserNotificationCenter {
}
func postGenerateSimpleConfigNotice() {
self.post(title: "No External-controller specified in config file!", info: "We have replace current config with a simple config with external-controller specified!")
self.post(title: NSLocalizedString("Sample Config File Created!", comment: ""),
info: NSLocalizedString("We have created or replaced your current config with a simple config with external-controller specified!",comment: ""))
}
func postConfigFileChangeDetectionNotice() {
self.post(title: "Config file have been changed", info: "Tap to reload config",identifier:"postConfigFileChangeDetectionNotice")
self.post(title: NSLocalizedString("Config file have been changed", comment: ""),
info: NSLocalizedString("Tap to reload config", comment: ""),
identifier:"postConfigFileChangeDetectionNotice")
}
func postStreamApiConnectFail(api:String) {
self.post(title: "\(api) api connect error!", info: "Use reload config to try reconnect.")
self.post(title: "\(api) api connect error!",
info: NSLocalizedString("Use reload config to try reconnect.", comment: ""))
}
func postConfigErrorNotice(msg:String) {
let message = "\(ConfigManager.selectConfigName).ymal: \(msg)"
self.post(title: "Config loading Fail!", info: message)
let configName = ConfigManager.selectConfigName.count > 0 ? "\(ConfigManager.selectConfigName).yaml" : ""
let message = "\(configName): \(msg)"
self.post(title: NSLocalizedString("Config loading Fail!", comment: ""), info: message)
}
func postImportConfigFromUrlFailNotice(urlStr:String) {
self.post(title: "Import config from url fail", info: "Unrecongized Url:\(urlStr)")
}
func postProxyRemarkDupNotice(name:String) {
self.post(title: "Proxy Remark duplicated", info: "Name:\(name)")
}
func postSpeedTestBeginNotice() {
self.post(title: "SpeedTest".localized(), info: "SpeedTest has begun, please wait.".localized())
self.post(title: NSLocalizedString("SpeedTest", comment: ""),
info: NSLocalizedString("SpeedTest has begun, please wait.", comment: ""))
}
func postSpeedTestingNotice() {
self.post(title: "SpeedTest".localized(), info: "SpeedTest is processing, please wait.".localized())
self.post(title: NSLocalizedString("SpeedTest", comment: ""),
info: NSLocalizedString("SpeedTest is processing, please wait.", comment: ""))
}
func postSpeedTestFinishNotice() {
self.post(title: "SpeedTest".localized(), info: "SpeedTest Finished!".localized())
self.post(title: NSLocalizedString("SpeedTest", comment: ""),
info: NSLocalizedString("SpeedTest Finished!", comment: ""))
}
}

View File

@ -117,14 +117,10 @@ extension ConfigFileManager {
extension ConfigFileManager {
static func showReplacingConfigFileAlert() -> Bool{
let alert = NSAlert()
alert.messageText = """
Can't recognize your config file. We will backup and replace your config file in your config folder.
Otherwise the functions of ClashX will not work properly. You may need to restart ClashX or reload Config manually.
"""
alert.messageText = NSLocalizedString("Can't recognize your config file. We will backup and replace your config file in your config folder.\n\nOtherwise the functions of ClashX will not work properly. You may need to restart ClashX or reload Config manually.", comment: "")
alert.alertStyle = .warning
alert.addButton(withTitle: "Replace")
alert.addButton(withTitle: "Cancel")
alert.addButton(withTitle: NSLocalizedString("Replace", comment: ""))
alert.addButton(withTitle: NSLocalizedString("Cancel", comment: ""))
return alert.runModal() == .alertFirstButtonReturn
}
@ -132,11 +128,7 @@ extension ConfigFileManager {
static func showNoFinalRuleAlert() {
let alert = NSAlert()
alert.messageText = """
No FINAL rule were found in clash configs,This might caused by incorrect upgradation during earily version of clashX or error setting of FINAL rule.Please check your config file.
NO FINAL rule would cause traffic send to DIRECT which no match any rules.
""".localized()
alert.messageText = NSLocalizedString("No FINAL rule were found in clash configs,This might caused by incorrect upgradation during earily version of clashX or error setting of FINAL rule.Please check your config file.\n\nNO FINAL rule would cause traffic send to DIRECT which no match any rules.", comment: "")
alert.alertStyle = .warning
alert.addButton(withTitle: "OK")
alert.runModal()

View File

@ -156,24 +156,18 @@ class ProxyConfigHelperManager {
static func showInstallHelperAlert() -> Bool{
let alert = NSAlert()
alert.messageText = """
ClashX needs to install a small tool to ~/.config/clash with administrator privileges to set system proxy quickly.
Otherwise you need to type in the administrator password every time you change system proxy through ClashX.
""".localized()
alert.messageText = NSLocalizedString("ClashX needs to install a small tool to ~/.config/clash with administrator privileges to set system proxy quickly.\n\nOtherwise you need to type in the administrator password every time you change system proxy through ClashX.", comment: "")
alert.alertStyle = .warning
alert.addButton(withTitle: "Install".localized())
alert.addButton(withTitle: "Quit".localized())
alert.addButton(withTitle: NSLocalizedString("Install", comment: ""))
alert.addButton(withTitle: NSLocalizedString("Quit", comment: ""))
return alert.runModal() == .alertFirstButtonReturn
}
static func showCreateConfigDirFailAlert() {
let alert = NSAlert()
alert.messageText = """
ClashX fail to create ~/.config/clash folder. Please check privileges or manually create folder and restart ClashX.
""".localized()
alert.messageText = NSLocalizedString("ClashX fail to create ~/.config/clash folder. Please check privileges or manually create folder and restart ClashX.", comment: "")
alert.alertStyle = .warning
alert.addButton(withTitle: "Quit".localized())
alert.addButton(withTitle: NSLocalizedString("Quit", comment: ""))
alert.runModal()
NSApplication.shared.terminate(nil)
}

View File

@ -13,6 +13,16 @@ enum ClashProxyMode: String,Codable {
case direct = "Direct"
}
extension ClashProxyMode {
var name: String {
switch self {
case .rule: return NSLocalizedString("Rule", comment: "")
case .global: return NSLocalizedString("Global", comment: "")
case .direct: return NSLocalizedString("Direct", comment: "")
}
}
}
enum ClashLogLevel:String,Codable {
case info = "info"
case warning = "warning"

View File

@ -1,7 +1,66 @@
/*
Localizable.strings
ClashX
Created by 称一称 on 2018/10/8.
Copyright © 2018年 west2online. All rights reserved.
*/
/* No comment provided by engineer. */
"Can't recognize your config file. We will backup and replace your config file in your config folder.\n\nOtherwise the functions of ClashX will not work properly. You may need to restart ClashX or reload Config manually." = "Can't recognize your config file. We will backup and replace your config file in your config folder.\n\nOtherwise the functions of ClashX will not work properly. You may need to restart ClashX or reload Config manually.";
/* No comment provided by engineer. */
"Cancel" = "Cancel";
/* No comment provided by engineer. */
"ClashX fail to create ~/.config/clash folder. Please check privileges or manually create folder and restart ClashX." = "ClashX fail to create ~/.config/clash folder. Please check privileges or manually create folder and restart ClashX.";
/* No comment provided by engineer. */
"ClashX needs to install a small tool to ~/.config/clash with administrator privileges to set system proxy quickly.\n\nOtherwise you need to type in the administrator password every time you change system proxy through ClashX." = "ClashX needs to install a small tool to ~/.config/clash with administrator privileges to set system proxy quickly.\n\nOtherwise you need to type in the administrator password every time you change system proxy through ClashX.";
/* No comment provided by engineer. */
"Config file have been changed" = "Config file have been changed";
/* No comment provided by engineer. */
"Config loading Fail!" = "Config loading Fail!";
/* No comment provided by engineer. */
"Direct" = "Direct";
/* No comment provided by engineer. */
"Global" = "Global";
/* No comment provided by engineer. */
"Install" = "Install";
/* No comment provided by engineer. */
"No FINAL rule were found in clash configs,This might caused by incorrect upgradation during earily version of clashX or error setting of FINAL rule.Please check your config file.\n\nNO FINAL rule would cause traffic send to DIRECT which no match any rules." = "No FINAL rule were found in clash configs,This might caused by incorrect upgradation during earily version of clashX or error setting of FINAL rule.Please check your config file.\n\nNO FINAL rule would cause traffic send to DIRECT which no match any rules.";
/* No comment provided by engineer. */
"Proxy Mode" = "Proxy Mode";
/* No comment provided by engineer. */
"Quit" = "Quit";
/* No comment provided by engineer. */
"Replace" = "Replace";
/* No comment provided by engineer. */
"Rule" = "Rule";
/* No comment provided by engineer. */
"Sample Config File Created!" = "Sample Config File Created!";
/* No comment provided by engineer. */
"SpeedTest" = "SpeedTest";
/* No comment provided by engineer. */
"SpeedTest Finished!" = "SpeedTest Finished!";
/* No comment provided by engineer. */
"SpeedTest has begun, please wait." = "SpeedTest has begun, please wait.";
/* No comment provided by engineer. */
"SpeedTest is processing, please wait." = "SpeedTest is processing, please wait.";
/* No comment provided by engineer. */
"Tap to reload config" = "Tap to reload config";
/* No comment provided by engineer. */
"Use reload config to try reconnect." = "Use reload config to try reconnect.";
/* No comment provided by engineer. */
"We have created or replaced your current config with a simple config with external-controller specified!" = "We have created or replaced your current config with a simple config with external-controller specified!";

View File

@ -1,28 +1,66 @@
/*
Localizable.strings
ClashX
Created by 称一称 on 2018/10/8.
Copyright © 2018年 west2online. All rights reserved.
*/
/* No comment provided by engineer. */
"Can't recognize your config file. We will backup and replace your config file in your config folder.\n\nOtherwise the functions of ClashX will not work properly. You may need to restart ClashX or reload Config manually." = "无法识别您的配置文件ClashX将备份并替换您的配置文件否则ClashX将无法正常工作。您可能需要重启或者重载配置文件";
"Proxy Mode" = "出站模式";
/* No comment provided by engineer. */
"Cancel" = "取消";
"Global" = "全局";
"Rule" = "规则";
/* No comment provided by engineer. */
"ClashX fail to create ~/.config/clash folder. Please check privileges or manually create folder and restart ClashX." = "ClashX 创建 ~/.config/clash 文件夹失败,请检查权限设置或者手动创建文件夹后重启 ClashX";
/* No comment provided by engineer. */
"ClashX needs to install a small tool to ~/.config/clash with administrator privileges to set system proxy quickly.\n\nOtherwise you need to type in the administrator password every time you change system proxy through ClashX." = "ClashX 需要使用管理员权限安装一个小工具到 ~/.config/clash/ 来帮助设置系统代理。\n否则你需要在每次ClashX设置系统代理时输入管理员密码。";
/* No comment provided by engineer. */
"Config file have been changed" = "配置文件已被修改";
/* No comment provided by engineer. */
"Config loading Fail!" = "配置文件加载失败";
/* No comment provided by engineer. */
"Direct" = "直连";
"No FINAL rule were found in clash configs,This might caused by incorrect upgradation during earily version of clashX or error setting of FINAL rule.Please check your config file.\n\nNO FINAL rule would cause traffic send to DIRECT which no match any rules." = "Clash规则配置文件中没有找到FINAL/MATCH规则这可能是由于之前版本ClashX的错误ini到yml的转换引起的也可能因为对FINAL/MATCH进行了错误的配置如声明的出口不在Proxy或Proxy Group中等。请再次检查配置文件。\n\n缺失FINAL/MATCH规则将导致无命中任何规则的流量使用DIRECT出口。";
"ClashX needs to install a small tool to ~/.config/clash with administrator privileges to set system proxy quickly.\n\nOtherwise you need to type in the administrator password every time you change system proxy through ClashX." = "ClashX需要使用管理员权限安装一个小工具到~/.config/clash 从而快捷设置系统代理。\n\n否则你需要在每次设置系统代理的时候进行管理员授权。";
/* No comment provided by engineer. */
"Global" = "全局";
/* No comment provided by engineer. */
"Install" = "安装";
/* No comment provided by engineer. */
"No FINAL rule were found in clash configs,This might caused by incorrect upgradation during earily version of clashX or error setting of FINAL rule.Please check your config file.\n\nNO FINAL rule would cause traffic send to DIRECT which no match any rules." = "Clash规则配置文件中没有找到FINAL/MATCH规则这可能是由于之前版本ClashX的错误ini到yml的转换引起的也可能因为对FINAL/MATCH进行了错误的配置如声明的出口不在Proxy或Proxy Group中等。请再次检查配置文件。\n\n缺失FINAL/MATCH规则将导致无命中任何规则的流量使用DIRECT出口。";
/* No comment provided by engineer. */
"Proxy Mode" = "出站模式";
/* No comment provided by engineer. */
"Quit" = "退出";
/* No comment provided by engineer. */
"Replace" = "替换";
/* No comment provided by engineer. */
"Rule" = "规则";
/* No comment provided by engineer. */
"Sample Config File Created!" = "样例配置文件已创建!";
/* No comment provided by engineer. */
"SpeedTest" = "测速";
/* No comment provided by engineer. */
"SpeedTest Finished!" = "测速完成!";
/* No comment provided by engineer. */
"SpeedTest has begun, please wait." = "测速开始,请稍候。";
/* No comment provided by engineer. */
"SpeedTest is processing, please wait." = "测速正在进行中,请稍候。";
/* No comment provided by engineer. */
"Tap to reload config" = "点击重载配置文件";
/* No comment provided by engineer. */
"Use reload config to try reconnect." = "使用重载配置文件按钮尝试重新连接";
/* No comment provided by engineer. */
"We have created or replaced your current config with a simple config with external-controller specified!" = "ClashX 已创建样例配置文件或者替换您当前没有设置 external-controller 的配置文件";

View File

@ -5,30 +5,12 @@
/* Class = "NSMenuItem"; title = "Log level"; ObjectID = "3Da-fL-Mzr"; */
"3Da-fL-Mzr.title" = "日志等级";
/* Class = "NSMenuItem"; title = "Generate config"; ObjectID = "5Ab-VJ-iIm"; */
"5Ab-VJ-iIm.title" = "生成配置";
/* Class = "NSMenuItem"; title = "Speed test"; ObjectID = "5Mz-Qv-9Yc"; */
"5Mz-Qv-9Yc.title" = "测速";
/* Class = "NSMenuItem"; title = "QR Code from screen"; ObjectID = "89G-Oc-S3l"; */
"89G-Oc-S3l.title" = "扫描屏幕二维码";
/* Class = "NSTextFieldCell"; title = "GitHub for ClashX:"; ObjectID = "89f-5u-Eo0"; */
"89f-5u-Eo0.title" = "GitHub for ClashX:";
/* Class = "NSMenuItem"; title = "Rule"; ObjectID = "89n-bD-JHk"; */
"89n-bD-JHk.title" = "规则判断";
/* Class = "NSMenuItem"; title = "Remote config"; ObjectID = "h1C-R6-Y9w"; */
"h1C-R6-Y9w.title" = "托管配置";
/* Class = "NSMenuItem"; title = "Set url"; ObjectID = "k1Z-jQ-kAy"; */
"k1Z-jQ-kAy.title" = "设置地址";
/* Class = "NSMenuItem"; title = "Update"; ObjectID = "I2P-Wd-Ns7"; */
"I2P-Wd-Ns7.title" = "更新";
/* Class = "NSMenuItem"; title = "Set as system proxy"; ObjectID = "8se-yr-wmp"; */
"8se-yr-wmp.title" = "设置为系统代理";
@ -38,17 +20,29 @@
/* Class = "NSTextFieldCell"; title = "https://github.com/yichengchen/clashX"; ObjectID = "9ox-Fc-Wk3"; */
"9ox-Fc-Wk3.title" = "https://github.com/yichengchen/clashX";
/* Class = "NSTextFieldCell"; title = "2018-08-19"; ObjectID = "aib-YP-mvk"; */
"aib-YP-mvk.title" = "2018-08-19";
/* Class = "NSMenu"; title = "Main Menu"; ObjectID = "AYu-sK-qS6"; */
"AYu-sK-qS6.title" = "Main Menu";
/* Class = "NSMenu"; title = "Remote Config"; ObjectID = "az2-wz-yyy"; */
"az2-wz-yyy.title" = "托管配置";
/* Class = "NSMenuItem"; title = "Start at login"; ObjectID = "B1J-XB-BiZ"; */
"B1J-XB-BiZ.title" = "开机启动";
/* Class = "NSTextFieldCell"; title = "https://github.com/Dreamacro/clash"; ObjectID = "Bej-j7-KKV"; */
"Bej-j7-KKV.title" = "https://github.com/Dreamacro/clash";
/* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "DIu-9t-BTE"; */
"DIu-9t-BTE.title" = "Text Cell";
/* Class = "NSMenuItem"; title = "SpeedTest"; ObjectID = "COu-UX-bww"; */
"COu-UX-bww.title" = "测速";
/* Class = "NSMenuItem"; title = "INFO"; ObjectID = "d8V-h0-0zF"; */
"d8V-h0-0zF.title" = "INFO";
/* Class = "NSMenu"; title = "Switch Configs"; ObjectID = "dcz-b4-hVy"; */
"dcz-b4-hVy.title" = "切换配置";
/* Class = "NSMenuItem"; title = "Help"; ObjectID = "Dd9-2F-FVY"; */
"Dd9-2F-FVY.title" = "帮助";
@ -56,80 +50,8 @@
/* Class = "NSMenuItem"; title = "Open config Folder"; ObjectID = "DwE-WX-ETZ"; */
"DwE-WX-ETZ.title" = "打开配置文件夹";
/* Class = "NSMenuItem"; title = "Import bunch json file"; ObjectID = "GRE-Ra-Pkx"; */
"GRE-Ra-Pkx.title" = "导入批量Json文件";
/* Class = "NSTextFieldCell"; title = "Proxy"; ObjectID = "Gh1-x5-fnZ"; */
"Gh1-x5-fnZ.title" = "Proxy";
/* Class = "NSMenu"; title = "Generate Config"; ObjectID = "IeJ-1Q-UaF"; */
"IeJ-1Q-UaF.title" = "Generate Config";
/* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "JK9-7d-hkq"; */
"JK9-7d-hkq.title" = "Text Cell";
/* Class = "NSMenuItem"; title = "Config"; ObjectID = "JMV-Dy-CI0"; */
"JMV-Dy-CI0.title" = "配置";
/* Class = "NSMenuItem"; title = "Copy export command"; ObjectID = "Jmb-PK-rMW"; */
"Jmb-PK-rMW.title" = "复制终端代理命令";
/* Class = "NSTextFieldCell"; title = "ClashX"; ObjectID = "MzG-sW-3g7"; */
"MzG-sW-3g7.title" = "ClashX";
/* Class = "NSMenuItem"; title = "Quit"; ObjectID = "NXU-86-Eem"; */
"NXU-86-Eem.title" = "退出";
/* Class = "NSMenu"; title = "Ports"; ObjectID = "Ng4-Ia-KSz"; */
"Ng4-Ia-KSz.title" = "Ports";
/* Class = "NSMenuItem"; title = "Direct"; ObjectID = "Np6-Pm-Lo3"; */
"Np6-Pm-Lo3.title" = "直接连接";
/* Class = "NSMenuItem"; title = "SSURL from pasteboard"; ObjectID = "QX2-2U-3Ad"; */
"QX2-2U-3Ad.title" = "从剪贴板导入SSURL";
/* Class = "NSTextFieldCell"; title = "100"; ObjectID = "TLq-Oj-0EH"; */
"TLq-Oj-0EH.title" = "100";
/* Class = "NSMenu"; title = "Proxy mode (Global)"; ObjectID = "UU2-uE-YB4"; */
"UU2-uE-YB4.title" = "Proxy mode (Global)";
/* Class = "NSMenuItem"; title = "socks port:"; ObjectID = "Uy1-g8-r6Q"; */
"Uy1-g8-r6Q.title" = "socks port:";
/* Class = "NSMenuItem"; title = "Allow connect from Lan"; ObjectID = "Vz8-7n-vx6"; */
"Vz8-7n-vx6.title" = "允许局域网连接";
/* Class = "NSMenuItem"; title = "http port:"; ObjectID = "WNw-8Y-VFw"; */
"WNw-8Y-VFw.title" = "http port:";
/* Class = "NSTableColumn"; headerCell.title = "Proxies"; ObjectID = "WQk-kX-Jr8"; */
"WQk-kX-Jr8.headerCell.title" = "代理";
/* Class = "NSMenuItem"; title = "Dashboard (dev)"; ObjectID = "XG6-2M-PNi"; */
"XG6-2M-PNi.title" = "控制台";
/* Class = "NSMenuItem"; title = "DEBUG"; ObjectID = "XIR-Go-fWA"; */
"XIR-Go-fWA.title" = "DEBUG";
/* Class = "NSMenuItem"; title = "Show network indicator"; ObjectID = "YIO-Vj-64f"; */
"YIO-Vj-64f.title" = "显示实时速率";
/* Class = "NSMenuItem"; title = "Generate Config"; ObjectID = "a4G-S3-jxT"; */
"a4G-S3-jxT.title" = "生成配置文件";
/* Class = "NSTextFieldCell"; title = "2018-08-19"; ObjectID = "aib-YP-mvk"; */
"aib-YP-mvk.title" = "2018-08-19";
/* Class = "NSMenuItem"; title = "INFO"; ObjectID = "d8V-h0-0zF"; */
"d8V-h0-0zF.title" = "INFO";
/* Class = "NSTableColumn"; headerCell.title = "Delay(ms)"; ObjectID = "gNv-c4-4xR"; */
"gNv-c4-4xR.headerCell.title" = "延迟(毫秒)";
/* Class = "NSViewController"; title = "SpeedTest"; ObjectID = "gtD-dn-7Dy"; */
"gtD-dn-7Dy.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" = "关于";
@ -137,8 +59,26 @@
/* Class = "NSMenuItem"; title = "api port:"; ObjectID = "hwG-qf-DeZ"; */
"hwG-qf-DeZ.title" = "api port:";
/* Class = "NSMenuItem"; title = "Proxy mode (Global)"; ObjectID = "jGT-1M-xJu"; */
"jGT-1M-xJu.title" = "Proxy mode (Global)";
/* Class = "NSMenuItem"; title = "Update"; ObjectID = "I2P-Wd-Ns7"; */
"I2P-Wd-Ns7.title" = "更新";
/* Class = "NSMenuItem"; title = "Show current proxy in menu"; ObjectID = "j9o-36-NTd"; */
"j9o-36-NTd.title" = "快捷展示策略组策略";
/* Class = "NSMenuItem"; title = "Switch Configs"; ObjectID = "jdX-Cx-5pe"; */
"jdX-Cx-5pe.title" = "切换配置文件";
/* Class = "NSMenuItem"; title = "API Connect Error"; ObjectID = "jGT-1M-xJu"; */
"jGT-1M-xJu.title" = "API Connect Error";
/* Class = "NSMenuItem"; title = "Copy export command"; ObjectID = "Jmb-PK-rMW"; */
"Jmb-PK-rMW.title" = "复制终端代理命令";
/* Class = "NSMenuItem"; title = "Config"; ObjectID = "JMV-Dy-CI0"; */
"JMV-Dy-CI0.title" = "配置";
/* Class = "NSMenuItem"; title = "Set Url"; ObjectID = "k1Z-jQ-kAy"; */
"k1Z-jQ-kAy.title" = "设置地址";
/* Class = "NSMenuItem"; title = "WARNING"; ObjectID = "ko2-Ir-DxA"; */
"ko2-Ir-DxA.title" = "WARNING";
@ -146,6 +86,18 @@
/* Class = "NSTextFieldCell"; title = "GitHub for Clash:"; ObjectID = "lsq-AW-K0M"; */
"lsq-AW-K0M.title" = "GitHub for Clash:";
/* Class = "NSTextFieldCell"; title = "ClashX"; ObjectID = "MzG-sW-3g7"; */
"MzG-sW-3g7.title" = "ClashX";
/* Class = "NSMenu"; title = "Ports"; ObjectID = "Ng4-Ia-KSz"; */
"Ng4-Ia-KSz.title" = "Ports";
/* 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" = "帮助";
@ -158,27 +110,38 @@
/* 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 = "NSMenu"; title = "Config"; ObjectID = "tck-zU-JKQ"; */
"tck-zU-JKQ.title" = "配置";
/* Class = "NSMenu"; title = "API Connect Error"; ObjectID = "UU2-uE-YB4"; */
"UU2-uE-YB4.title" = "API Connect Error";
/* Class = "NSMenuItem"; title = "socks port:"; ObjectID = "Uy1-g8-r6Q"; */
"Uy1-g8-r6Q.title" = "socks port:";
/* Class = "NSMenuItem"; title = "Allow connect from Lan"; ObjectID = "Vz8-7n-vx6"; */
"Vz8-7n-vx6.title" = "允许局域网连接";
/* Class = "NSMenuItem"; title = "http port:"; ObjectID = "WNw-8Y-VFw"; */
"WNw-8Y-VFw.title" = "http port:";
/* 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" = "DEBUG";
/* Class = "NSMenuItem"; title = "Show Log"; ObjectID = "xxZ-9l-69m"; */
"xxZ-9l-69m.title" = "显示日志";
/* Class = "NSMenuItem"; title = "Global"; ObjectID = "yiM-U4-MNg"; */
"yiM-U4-MNg.title" = "全局连接";
/* Class = "NSMenu"; title = "Log level"; ObjectID = "dcz-b4-hVy"; */
"jdX-Cx-5pe.title" = "切换配置文件";
/* Class = "NSMenuItem"; title = "SpeedTest"; ObjectID = "COu-UX-bww"; */
"COu-UX-bww.title" = "测速";
"r8s-OI-tgf.title" = "自动更新";
"j9o-36-NTd.title" = "快捷展示策略组策略";
/* Class = "NSMenuItem"; title = "Show network indicator"; ObjectID = "YIO-Vj-64f"; */
"YIO-Vj-64f.title" = "显示实时速率";