From d7dbf124fe387afeb8b268bd757a8e5cd2b47ad8 Mon Sep 17 00:00:00 2001 From: ProxySU Date: Fri, 28 Aug 2020 15:32:46 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=8B=B1=E6=96=87=E7=95=8C?= =?UTF-8?q?=E9=9D=A202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ProxySU/MainWindow.xaml | 4 +- ProxySU/MainWindow.xaml.cs | 827 ++++++++++++------------ ProxySU/Translations/ProxySU.zh-CN.xaml | 95 ++- ProxySU/bin/Beta/Beta.zip | Bin 505312 -> 509138 bytes 4 files changed, 515 insertions(+), 411 deletions(-) diff --git a/ProxySU/MainWindow.xaml b/ProxySU/MainWindow.xaml index ba714a7..aadc1c5 100644 --- a/ProxySU/MainWindow.xaml +++ b/ProxySU/MainWindow.xaml @@ -177,7 +177,7 @@ - + @@ -196,7 +196,7 @@ - + diff --git a/ProxySU/MainWindow.xaml.cs b/ProxySU/MainWindow.xaml.cs index 4114859..13a6fe5 100644 --- a/ProxySU/MainWindow.xaml.cs +++ b/ProxySU/MainWindow.xaml.cs @@ -362,6 +362,50 @@ namespace ProxySU return connectionInfo; } + //登录主机过程中出现的异常处理 + private void ProcessException(string exceptionMessage) + { + //下面代码需要保留,以备将来启用 + //if (exceptionMessage.Contains("连接尝试失败") == true) + //{ + // //****** "请检查主机地址及端口是否正确,如果通过代理,请检查代理是否正常工作!" ****** + // MessageBox.Show($"{exceptionMessage}\n" + + // Application.Current.FindResource("MessageBoxShow_ErrorLoginHostOrPort").ToString()); + //} + + //else if (exceptionMessage.Contains("denied (password)") == true) + //{ + // //****** "密码错误或用户名错误" ****** + // MessageBox.Show($"{exceptionMessage}\n" + + // Application.Current.FindResource("MessageBoxShow_ErrorLoginUserOrPassword").ToString()); + //} + //else if (exceptionMessage.Contains("Invalid private key file") == true) + //{ + // //****** "所选密钥文件错误或者格式不对!" ****** + // MessageBox.Show($"{exceptionMessage}\n" + + // Application.Current.FindResource("MessageBoxShow_ErrorLoginKey").ToString()); + //} + //else if (exceptionMessage.Contains("denied (publickey)") == true) + //{ + // //****** "使用密钥登录,密钥文件错误或用户名错误" ****** + // MessageBox.Show($"{exceptionMessage}\n" + + // Application.Current.FindResource("MessageBoxShow_ErrorLoginKeyOrUser").ToString()); + //} + //else if (exceptionMessage.Contains("目标计算机积极拒绝") == true) + //{ + // //****** "主机地址错误,如果使用了代理,也可能是连接代理的端口错误" ****** + // MessageBox.Show($"{exceptionMessage}\n" + + // Application.Current.FindResource("MessageBoxShow_ErrorLoginHostOrProxyPort").ToString()); + //} + //else + //{ + //****** "发生错误" ****** + MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorLoginOccurred").ToString()); + MessageBox.Show(exceptionMessage); + //} + + } + #region V2Ray相关 //打开v2ray模板设置窗口 @@ -384,7 +428,8 @@ namespace ProxySU ConnectionInfo connectionInfo = GenerateConnectionInfo(); if(connectionInfo==null) { - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorHostConnection").ToString()); //远程主机连接信息有误,请检查 + //****** "远程主机连接信息有误,请检查!" ****** + MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorHostConnection").ToString()); return; } @@ -402,7 +447,7 @@ namespace ProxySU //选择模板 if (String.IsNullOrEmpty(ReceiveConfigurationParameters[0]) == true) { - //"请先选择配置模板!" + //******"请先选择配置模板!"****** MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ChooseTemplate").ToString()); return; } @@ -507,7 +552,7 @@ namespace ProxySU private void StartSetUpV2ray(ConnectionInfo connectionInfo,TextBlock textBlockName, ProgressBar progressBar, string serverConfig,string clientConfig,string upLoadPath) { - //"正在登录远程主机......" + //******"正在登录远程主机......"****** string currentStatus = Application.Current.FindResource("DisplayInstallInfo_Login").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; @@ -548,7 +593,7 @@ namespace ProxySU client.Connect(); if (client.IsConnected == true) { - //"主机登录成功" + //******"主机登录成功"****** currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginSuccessful").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; @@ -556,7 +601,7 @@ namespace ProxySU Thread.Sleep(1000); } - //"检测是否运行在root权限下..." + //******"检测是否运行在root权限下..."****** currentStatus = Application.Current.FindResource("DisplayInstallInfo_DetectionRootPermission").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; @@ -570,14 +615,14 @@ namespace ProxySU string testRootAuthority = currentShellCommandResult; if (testRootAuthority.Equals("0\n") == false) { - //"请使用具有root权限的账户登录主机!!" + //******"请使用具有root权限的账户登录主机!!"****** MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorRootPermission").ToString()); client.Disconnect(); return; } else { - //"检测结果:OK!" + //******"检测结果:OK!"****** currentStatus = Application.Current.FindResource("DisplayInstallInfo_DetectionRoot_OK").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; @@ -585,8 +630,8 @@ namespace ProxySU } - //"检测系统是否已经安装V2ray......" - currentStatus = Application.Current.FindResource("DisplayInstallInfo_TestExistV2Ray").ToString(); + //******"检测系统是否已经安装V2ray......"****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_TestExistSoft").ToString() + "V2ray......"; textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -601,11 +646,14 @@ namespace ProxySU string resultCmdTestV2rayInstalled = currentShellCommandResult; if (resultCmdTestV2rayInstalled.Contains("/usr/bin/v2ray") == true || resultCmdTestV2rayInstalled.Contains("/usr/local/bin/v2ray") == true) { - //"远程主机已安装V2ray,是否强制重新安装?" - MessageBoxResult messageBoxResult = MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ExistedV2Ray").ToString(), "", MessageBoxButton.YesNo, MessageBoxImage.Question); + //******"远程主机已安装V2ray,是否强制重新安装?"****** + string messageShow = Application.Current.FindResource("MessageBoxShow_ExistedSoft").ToString() + + "V2Ray" + + Application.Current.FindResource("MessageBoxShow_ForceInstallSoft").ToString(); + MessageBoxResult messageBoxResult = MessageBox.Show(messageShow, "", MessageBoxButton.YesNo, MessageBoxImage.Question); if (messageBoxResult==MessageBoxResult.No) { - //"安装取消,退出" + //******"安装取消,退出"****** currentStatus = Application.Current.FindResource("DisplayInstallInfo_InstallationCanceledExit").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; @@ -617,8 +665,8 @@ namespace ProxySU } else { - //"已选择强制安装V2Ray!" - currentStatus = Application.Current.FindResource("DisplayInstallInfo_ForceInstallV2Ray").ToString(); + //******"已选择强制安装V2Ray!"****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_ForceInstallSoft").ToString() + "V2Ray!"; textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -627,15 +675,15 @@ namespace ProxySU } else { - //"检测结果:未安装V2Ray!" - currentStatus = Application.Current.FindResource("DisplayInstallInfo_NoInstalledV2Ray").ToString(); + //******"检测结果:未安装V2Ray!"****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_NoInstalledSoft").ToString() + "V2Ray!"; textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 } - //"检测系统是否符合安装要求......" + //******"检测系统是否符合安装要求......"****** currentStatus = Application.Current.FindResource("DisplayInstallInfo_CheckSystemRequirements").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; @@ -653,13 +701,13 @@ namespace ProxySU bool detectResult = DetectKernelVersion(linuxKernelVerStr[0]); if (detectResult == false) { - //$"当前系统内核版本为{linuxKernelVerStr[0]},V2ray要求内核为2.6.23及以上。请升级内核再安装!" + //******$"当前系统内核版本为{linuxKernelVerStr[0]},V2ray要求内核为2.6.23及以上。请升级内核再安装!"****** MessageBox.Show( - Application.Current.FindResource("MessageBoxShow_CurrentKernelVersion").ToString() - + $"{linuxKernelVerStr[0]}" - + Application.Current.FindResource("MessageBoxShow_RequiredKernelVersionExplain").ToString() + Application.Current.FindResource("MessageBoxShow_CurrentKernelVersion").ToString() + + $"{linuxKernelVerStr[0]}" + + Application.Current.FindResource("MessageBoxShow_RequiredKernelVersionExplain").ToString() ); - //"系统内核版本不符合要求,安装失败!!" + //******"系统内核版本不符合要求,安装失败!!"****** currentStatus = Application.Current.FindResource("DisplayInstallInfo_KernelVersionNotMatch").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; @@ -712,10 +760,10 @@ namespace ProxySU //也就是apt ,dnf\yum, zypper必须安装其中之一,且必须安装Systemd的系统才能安装。 if ((getApt && getDnf && getYum && getZypper) || getSystemd) { - //"系统缺乏必要的安装组件如:apt||dnf||yum||zypper||Syetemd,主机系统推荐使用:CentOS 7/8,Debian 8/9/10,Ubuntu 16.04及以上版本" + //******"系统缺乏必要的安装组件如:apt||dnf||yum||zypper||Syetemd,主机系统推荐使用:CentOS 7/8,Debian 8/9/10,Ubuntu 16.04及以上版本"****** MessageBox.Show(Application.Current.FindResource("MessageBoxShow_MissingSystemComponents").ToString()); - //"系统环境不满足要求,安装失败!!" + //******"系统环境不满足要求,安装失败!!"****** currentStatus = Application.Current.FindResource("DisplayInstallInfo_MissingSystemComponents").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; @@ -727,7 +775,7 @@ namespace ProxySU } else { - //"检测结果:OK!" + //******"检测结果:OK!"****** currentStatus = Application.Current.FindResource("DisplayInstallInfo_SystemRequirementsOK").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; @@ -769,7 +817,7 @@ namespace ProxySU if (testSELinux.Contains("Enforcing") == true) { - //"检测到系统启用SELinux,且工作在严格模式下,需改为宽松模式!修改中......" + //******"检测到系统启用SELinux,且工作在严格模式下,需改为宽松模式!修改中......"****** currentStatus = Application.Current.FindResource("DisplayInstallInfo_EnableSELinux").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; @@ -784,7 +832,7 @@ namespace ProxySU TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 currentShellCommandResult = client.RunCommand(sshShellCommand).Result; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 - //"修改完毕!" + //******"修改完毕!"****** currentStatus = Application.Current.FindResource("DisplayInstallInfo_SELinuxModifyOK").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; @@ -808,7 +856,7 @@ namespace ProxySU } - //"校对时间......" + //******"校对时间......"****** currentStatus = Application.Current.FindResource("DisplayInstallInfo_ProofreadingTime").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; @@ -823,7 +871,7 @@ namespace ProxySU long timeStampLocal = Convert.ToInt64(ts.TotalSeconds); if (Math.Abs(timeStampLocal - timeStampVPS) >= 90) { - //"本地时间与远程主机时间相差超过限制(90秒),请先用 '系统工具-->时间校对' 校对时间后再设置" + //******"本地时间与远程主机时间相差超过限制(90秒),请先用 '系统工具-->时间校对' 校对时间后再设置"****** MessageBox.Show(Application.Current.FindResource("MessageBoxShow_TimeError").ToString()); //"时间较对失败......" currentStatus = Application.Current.FindResource("DisplayInstallInfo_TimeError").ToString(); @@ -835,7 +883,7 @@ namespace ProxySU client.Disconnect(); return; } - //"时间差符合要求,OK!" + //******"时间差符合要求,OK!"****** currentStatus = Application.Current.FindResource("DisplayInstallInfo_TimeOK").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; @@ -845,7 +893,8 @@ namespace ProxySU //如果使用是WebSocket + TLS + Web/http2/Http2Web/tcp_TLS/WebSocket_TLS模式,需要检测域名解析是否正确 if (testDomain == true) { - currentStatus = "正在检测域名是否解析到当前VPS的IP上......"; + //****** "正在检测域名是否解析到当前VPS的IP上......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_TestDomainResolve").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -866,7 +915,8 @@ namespace ProxySU if (String.Equals(nativeIp, resultTestDomainCmd) == true) { - currentStatus = "解析正确!"; + //****** "解析正确!OK!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_DomainResolveOK").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -875,13 +925,15 @@ namespace ProxySU } else { - currentStatus = "域名未能正确解析到当前VPS的IP上!安装失败!"; + //****** "域名未能正确解析到当前VPS的IP上!安装失败!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_ErrorDomainResolve").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 Thread.Sleep(1000); - MessageBox.Show("域名未能正确解析到当前VPS的IP上,请检查!若解析设置正确,请等待生效后再重试安装。如果域名使用了CDN,请先关闭!"); + //****** "域名未能正确解析到当前VPS的IP上,请检查!若解析设置正确,请等待生效后再重试安装。如果域名使用了CDN,请先关闭!" ****** + MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorDomainResolve").ToString()); client.Disconnect(); return; } @@ -900,7 +952,8 @@ namespace ProxySU TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 } - currentStatus = "正在检测端口占用情况......"; + //****** "检测端口占用情况......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_TestPortUsed").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -922,10 +975,12 @@ namespace ProxySU if (String.IsNullOrEmpty(testPort80) == false || String.IsNullOrEmpty(testPort443) == false) { - MessageBoxResult dialogResult = MessageBox.Show("80/443端口之一,或全部被占用,将强制停止占用80/443端口的程序?", "Stop application", MessageBoxButton.YesNo); + //****** "80/443端口之一,或全部被占用,将强制停止占用80/443端口的程序?" ****** + MessageBoxResult dialogResult = MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorPortUsed").ToString(), "Stop application", MessageBoxButton.YesNo); if (dialogResult == MessageBoxResult.No) { - currentStatus = "端口被占用,安装失败......"; + //****** "端口被占用,安装失败......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_ErrorPortUsedFail").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -934,8 +989,8 @@ namespace ProxySU client.Disconnect(); return; } - - currentStatus = "正在释放80/443端口......"; + //****** "正在释放80/443端口......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_ReleasePort").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -981,7 +1036,8 @@ namespace ProxySU TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 } - currentStatus = "80/443端口释放完毕!"; + //****** "80/443端口释放完毕!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_ReleasePortOK").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -990,7 +1046,8 @@ namespace ProxySU } else { - currentStatus = "检测结果:未被占用!"; + //****** "检测结果:未被占用!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_PortNotUsed").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -998,15 +1055,16 @@ namespace ProxySU } } - currentStatus = "系统环境检测完毕,符合安装要求,开始布署......"; + //****** "系统环境检测完毕,符合安装要求,开始布署......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartInstalling").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 Thread.Sleep(1000); - //打开防火墙端口 - currentStatus = "开启防火墙相应端口......"; + //****** "开启防火墙相应端口......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_OpenFireWallPort").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -1091,7 +1149,8 @@ namespace ProxySU } //下载官方安装脚本安装 - currentStatus = "正在安装V2Ray......"; + //****** "正在安装V2Ray......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartInstallSoft").ToString() + "V2Ray......"; textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -1117,9 +1176,10 @@ namespace ProxySU if (!installResult.Contains("/usr/local/bin/v2ray")) { - MessageBox.Show("安装V2ray失败(官方脚本运行出错!"); - - currentStatus = "安装V2ray失败(官方脚本运行出错!"; + //****** "安装失败,官方脚本运行出错!" ****** + MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorInstallSoftFail").ToString()); + //****** "安装失败,官方脚本运行出错!" ****** + currentStatus = Application.Current.FindResource("MessageBoxShow_ErrorInstallSoftFail").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -1129,7 +1189,8 @@ namespace ProxySU } else { - currentStatus = "V2ray安装成功!"; + //****** "V2ray安装成功!" ****** + currentStatus = "V2ray" + Application.Current.FindResource("DisplayInstallInfo_SoftInstallSuccess").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -1148,8 +1209,8 @@ namespace ProxySU currentShellCommandResult = client.RunCommand(sshShellCommand).Result; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 - //上传配置文件 - currentStatus = "上传V2ray配置文件......"; + //****** "上传配置文件......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_UploadSoftConfig").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -1220,7 +1281,8 @@ namespace ProxySU //如果使用http2/WebSocketTLS/tcpTLS/VlessTcpTlsWeb模式,先要安装acme.sh,申请证书 if (String.Equals(ReceiveConfigurationParameters[0], "Http2") == true || String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLS") == true || String.Equals(ReceiveConfigurationParameters[0], "tcpTLS") == true || String.Equals(ReceiveConfigurationParameters[0], "VlessTcpTlsWeb") == true) { - currentStatus = "正在安装acme.sh......"; + //****** "正在安装acme.sh......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartInstallAcmeSh").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -1246,7 +1308,8 @@ namespace ProxySU if (currentShellCommandResult.Contains("Install success") == true) { - currentStatus = "acme.sh安装成功!"; + //****** "acme.sh安装成功!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_AcmeShInstallSuccess").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -1255,7 +1318,8 @@ namespace ProxySU } else { - currentStatus = "acme.sh安装失败!原因未知,请向开发者提问!"; + //****** "acme.sh安装失败!原因未知,请向开发者提问!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_ErrorAcmeShInstallFail").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -1273,8 +1337,8 @@ namespace ProxySU currentShellCommandResult = client.RunCommand(sshShellCommand).Result; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 - - currentStatus = "申请域名证书......"; + //****** "申请域名证书......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartApplyCert").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -1288,7 +1352,8 @@ namespace ProxySU if (currentShellCommandResult.Contains("Cert success") == true) { - currentStatus = "证书申请成功!"; + //****** "证书申请成功!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_ApplyCertSuccess").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -1297,15 +1362,16 @@ namespace ProxySU } else { - currentStatus = "证书申请失败!原因未知,请向开发者提问!"; + //****** "证书申请失败!原因未知,请向开发者提问!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_ApplyCertFail").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 return; } - - currentStatus = "安装证书到V2ray......"; + //****** "安装证书到V2ray......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_IntallCertToSoft").ToString() + "V2ray......"; textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -1329,7 +1395,8 @@ namespace ProxySU if (currentShellCommandResult.Contains("1") == true) { - currentStatus = "证书安装到V2ray,成功!"; + //****** "证书成功安装到V2ray!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_IntallCertToSoftOK").ToString() + "V2Ray!"; textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -1337,7 +1404,8 @@ namespace ProxySU } else { - currentStatus = "证书安装到V2ray失败,原因未知,可以向开发者提问!"; + //****** "证书安装到V2ray失败,原因未知,可以向开发者提问!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_IntallCertToV2RayFail").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -1355,7 +1423,8 @@ namespace ProxySU //如果是WebSocket+TLS+Web/http2Web/vlessTcpTlsWeb模式,需要安装Caddy if (ReceiveConfigurationParameters[0].Contains("WebSocketTLS2Web") ==true || ReceiveConfigurationParameters[0].Contains("http2Web") == true || ReceiveConfigurationParameters[0].Contains("VlessTcpTlsWeb") == true) { - currentStatus = "正在安装Caddy......"; + //****** "安装Caddy......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartInstallCaddy").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -1447,9 +1516,10 @@ namespace ProxySU if (!installResult.Contains("/usr/bin/caddy")) { - MessageBox.Show("安装Caddy失败!"); - - currentStatus = "安装Caddy失败!"; + //****** "安装Caddy失败!" ****** + MessageBox.Show(Application.Current.FindResource("DisplayInstallInfo_ErrorInstallCaddyFail").ToString()); + //****** "安装Caddy失败!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_ErrorInstallCaddyFail").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -1457,8 +1527,8 @@ namespace ProxySU client.Disconnect(); return; } - - currentStatus = "Caddy安装成功!"; + //****** "Caddy安装成功!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_InstalledCaddyOK").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -1473,7 +1543,8 @@ namespace ProxySU //在Caddy 2还未推出2.2.0的正式版之前,先用测试版替代 if (String.Equals(ReceiveConfigurationParameters[0], "http2Web")) { - currentStatus = "正在为Http2Web模式升级Caddy v2.2.0测试版!"; + //****** "正在为Http2Web模式升级Caddy v2.2.0测试版!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_UpgradeCaddy").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -1506,8 +1577,8 @@ namespace ProxySU TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 } - - currentStatus = "上传Caddy配置文件......"; + //****** "上传Caddy配置文件......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_UploadCaddyConfig").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -1559,7 +1630,8 @@ namespace ProxySU TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 } - currentStatus = "Caddy配置文件上传成功,OK!"; + //****** "Caddy配置文件上传成功,OK!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_UploadCaddyConfigOK").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -1567,8 +1639,8 @@ namespace ProxySU Thread.Sleep(1000); //启动Caddy服务 - - currentStatus = "正在启动Caddy......"; + //****** "正在启动Caddy......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartCaddyService").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -1588,8 +1660,8 @@ namespace ProxySU if (currentShellCommandResult.Contains("/usr/bin/caddy") == true) { - //运行成功 - currentStatus = "Caddy启动成功!"; + //****** "Caddy启动成功!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartCaddyServiceOK").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -1598,13 +1670,14 @@ namespace ProxySU } else { - //运行失败 - currentStatus = "Caddy启动失败!"; + //****** "Caddy启动失败!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartCaddyServiceFail").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 Thread.Sleep(1000); - currentStatus = "正在启动Caddy(第二次尝试)!"; + //****** "正在启动Caddy(第二次尝试)!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartCaddyServiceSecond").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -1622,7 +1695,8 @@ namespace ProxySU TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 if (currentShellCommandResult.Contains("/usr/bin/caddy") == true) { - currentStatus = "Caddy启动成功!"; + //****** "Caddy启动成功!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartCaddyServiceOK").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -1631,19 +1705,21 @@ namespace ProxySU } else { - currentStatus = "Caddy启动失败(第二次)!退出安装!"; + //****** "Caddy启动失败(第二次)!退出安装!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartCaddyServiceSecondFail").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 Thread.Sleep(1000); - MessageBox.Show("Caddy启动失败,原因未知!请向开发者问询!"); + //****** "Caddy启动失败,原因未知!请向开发者问询!" ****** + MessageBox.Show(Application.Current.FindResource("DisplayInstallInfo_CaddyServiceFailedExit").ToString()); return; } } } - - currentStatus = "正在启动V2ray......"; + //****** "正在启动V2ray......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartV2Ray").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -1664,8 +1740,8 @@ namespace ProxySU if (currentShellCommandResult.Contains("/usr/local/bin/v2ray") == true) { - //运行成功 - currentStatus = "V2ray启动成功!"; + //****** "V2ray启动成功!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartV2RayOK").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -1674,13 +1750,14 @@ namespace ProxySU } else { - //运行失败 - currentStatus = "V2ray启动失败!"; + //****** "V2ray启动失败!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartV2RayFail").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 Thread.Sleep(3000); - currentStatus = "正在启动V2ray(第二次尝试)!"; + //****** "正在启动V2ray(第二次尝试)!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartV2RaySecond").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -1698,7 +1775,8 @@ namespace ProxySU TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 if (currentShellCommandResult.Contains("/usr/local/bin/v2ray") == true) { - currentStatus = "V2ray启动成功!"; + //****** "V2ray启动成功!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartV2RayOK").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -1707,19 +1785,22 @@ namespace ProxySU } else { - currentStatus = "V2ray启动失败(第二次)!退出安装!"; + //****** "V2ray启动失败(第二次)!退出安装!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartV2RaySecondFail").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 Thread.Sleep(1000); - MessageBox.Show("V2Ray启动失败,原因未知!请向开发者问询!"); + //****** "V2Ray启动失败,原因未知!请向开发者问询!" ****** + MessageBox.Show(Application.Current.FindResource("DisplayInstallInfo_StartV2RayFailedExit").ToString()); return; } } - + //测试BBR条件,若满足提示是否启用 - currentStatus = "BBR测试......"; + //****** "BBR测试......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_TestBBR").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -1743,7 +1824,8 @@ namespace ProxySU //如果内核满足大于等于4.9,且还未启用BBR,则启用BBR if (detectResultBBR == true && resultCmdTestBBR.Contains("bbr") == false) { - currentStatus = "正在启用BBR......"; + //****** "正在启用BBR......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_EnableBBR").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -1768,7 +1850,8 @@ namespace ProxySU } else if (resultCmdTestBBR.Contains("bbr") == true) { - currentStatus = "BBR已经启用了!"; + //****** "BBR已经启用了!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_BBRisEnabled").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -1776,16 +1859,17 @@ namespace ProxySU } else { - currentStatus = "系统不满足启用BBR的条件,启用失败!"; + //****** "系统不满足启用BBR的条件,启用失败!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_BBRFailed").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 } client.Disconnect();//断开服务器ssh连接 - - //生成客户端配置 - currentStatus = "生成客户端配置......"; + + //****** "生成客户端配置......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_GenerateClientConfig").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -1838,8 +1922,8 @@ namespace ProxySU sw.Write(clientJson.ToString()); } } - - currentStatus = "V2Ray安装成功,祝你玩的愉快!!"; + //****** "V2Ray安装成功,祝你玩的愉快!!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_V2RayProxyInstalledOK").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -1856,34 +1940,51 @@ namespace ProxySU catch (Exception ex1)//例外处理 #region 例外处理 { - //MessageBox.Show(ex1.Message); - if (ex1.Message.Contains("连接尝试失败") == true) - { - MessageBox.Show($"{ex1.Message}\n请检查主机地址及端口是否正确,如果通过代理,请检查代理是否正常工作"); - } + ProcessException(ex1.Message); - else if (ex1.Message.Contains("denied (password)") == true) - { - MessageBox.Show($"{ex1.Message}\n密码错误或用户名错误"); - } - else if (ex1.Message.Contains("Invalid private key file") == true) - { - MessageBox.Show($"{ex1.Message}\n所选密钥文件错误或者格式不对"); - } - else if (ex1.Message.Contains("denied (publickey)") == true) - { - MessageBox.Show($"{ex1.Message}\n使用密钥登录,密钥文件错误或用户名错误"); - } - else if (ex1.Message.Contains("目标计算机积极拒绝") == true) - { - MessageBox.Show($"{ex1.Message}\n主机地址错误,如果使用了代理,也可能是连接代理的端口错误"); - } - else - { - MessageBox.Show("发生错误"); - MessageBox.Show(ex1.Message); - } - currentStatus = "主机登录失败"; + #region 旧代码 + //string exceptionMessage = ex1.Message; + //if (exceptionMessage.Contains("连接尝试失败") == true) + //{ + // //****** "请检查主机地址及端口是否正确,如果通过代理,请检查代理是否正常工作!" ****** + // MessageBox.Show($"{exceptionMessage}\n" + + // Application.Current.FindResource("MessageBoxShow_ErrorLoginHostOrPort").ToString()); + //} + + //else if (exceptionMessage.Contains("denied (password)") == true) + //{ + // //****** "密码错误或用户名错误" ****** + // MessageBox.Show($"{exceptionMessage}\n" + + // Application.Current.FindResource("MessageBoxShow_ErrorLoginUserOrPassword").ToString()); + //} + //else if (exceptionMessage.Contains("Invalid private key file") == true) + //{ + // //****** "所选密钥文件错误或者格式不对!" ****** + // MessageBox.Show($"{exceptionMessage}\n" + + // Application.Current.FindResource("MessageBoxShow_ErrorLoginKey").ToString()); + //} + //else if (exceptionMessage.Contains("denied (publickey)") == true) + //{ + // //****** "使用密钥登录,密钥文件错误或用户名错误" ****** + // MessageBox.Show($"{exceptionMessage}\n" + + // Application.Current.FindResource("MessageBoxShow_ErrorLoginKeyOrUser").ToString()); + //} + //else if (exceptionMessage.Contains("目标计算机积极拒绝") == true) + //{ + // //****** "主机地址错误,如果使用了代理,也可能是连接代理的端口错误" ****** + // MessageBox.Show($"{exceptionMessage}\n" + + // Application.Current.FindResource("MessageBoxShow_ErrorLoginHostOrProxyPort").ToString()); + //} + //else + //{ + // //****** "发生错误" ****** + // MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorLoginOccurred").ToString()); + // MessageBox.Show(exceptionMessage); + //} + #endregion + + //****** "主机登录失败!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginFailed").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -1892,13 +1993,15 @@ namespace ProxySU #endregion } + //检测升级远程主机端的V2Ray版本 private void ButtonUpdateV2ray_Click(object sender, RoutedEventArgs e) { ConnectionInfo connectionInfo = GenerateConnectionInfo(); if (connectionInfo == null) { - MessageBox.Show("远程主机连接信息有误,请检查"); + //****** "远程主机连接信息有误,请检查!" ****** + MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorHostConnection").ToString()); return; } @@ -1910,8 +2013,8 @@ namespace ProxySU //升级V2ray主程序 private void UpdateV2ray(ConnectionInfo connectionInfo, TextBlock textBlockName, ProgressBar progressBar) { - string currentStatus = "正在登录远程主机......"; - //Action updateAction = new Action(UpdateTextBlock); + //******"正在登录远程主机......"****** + string currentStatus = Application.Current.FindResource("DisplayInstallInfo_Login").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -1951,15 +2054,18 @@ namespace ProxySU client.Connect(); if (client.IsConnected == true) { - currentStatus = "主机登录成功"; + //******"主机登录成功"****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginSuccessful").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果在监视窗口 Thread.Sleep(1000); } - //检测是否运行在root权限下 - currentShellCommandResult = "检测是否运行在root权限下..."; + //******"检测是否运行在root权限下..."****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_DetectionRootPermission").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 sshShellCommand = @"id -u"; @@ -1970,25 +2076,23 @@ namespace ProxySU string testRootAuthority = currentShellCommandResult; if (testRootAuthority.Equals("0\n") == false) { - MessageBox.Show("请使用具有root权限的账户登录主机!!"); + //******"请使用具有root权限的账户登录主机!!"****** + MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorRootPermission").ToString()); client.Disconnect(); return; } else { - currentShellCommandResult = "检测结果:OK!"; + //******"检测结果:OK!"****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_DetectionRoot_OK").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 } - //string testRootAuthority = client.RunCommand(@"id -u").Result; - //if (testRootAuthority.Equals("0\n") == false) - //{ - // MessageBox.Show("请使用具有root权限的账户登录主机!!"); - // client.Disconnect(); - // return; - //} - //检测远程主机V2ray版本 - currentStatus = "检测远程主机V2ray版本......"; + + //******"检测系统是否已经安装V2ray......"****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_TestExistV2Ray").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -2004,9 +2108,10 @@ namespace ProxySU if (resultCmdTestV2rayInstalled.Contains("/usr/bin/v2ray") == false && resultCmdTestV2rayInstalled.Contains("/usr/local/bin/v2ray") == false) { - MessageBoxResult messageBoxResult = MessageBox.Show("远程主机未安装V2ray!"); + //******"远程主机未安装V2ray,退出!"****** + MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorUpgradeV2RayNotInstall").ToString()); - currentStatus = "未安装V2ray,退出"; + currentStatus = Application.Current.FindResource("MessageBoxShow_ErrorUpgradeV2RayNotInstall").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -2018,15 +2123,18 @@ namespace ProxySU } else if (resultCmdTestV2rayInstalled.Contains("/usr/bin/v2ray") == true) { - currentStatus = "检测到使用旧安装脚本的V2Ray......"; + //****** "检测到使用旧安装脚本的V2Ray......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_OldScriptInstalledV2Ray").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 - MessageBoxResult messageBoxResult = MessageBox.Show("检测到使用旧安装脚本的V2Ray,是否卸载旧版本并使用新安装脚本重新安装?", "", MessageBoxButton.YesNo, MessageBoxImage.Question); + //****** "检测到使用旧安装脚本的V2Ray,是否卸载旧版本并使用新安装脚本重新安装?" ****** + MessageBoxResult messageBoxResult = MessageBox.Show(Application.Current.FindResource("MessageBoxShow_OldScriptInstalledV2Ray").ToString(), "", MessageBoxButton.YesNo, MessageBoxImage.Question); if (messageBoxResult == MessageBoxResult.No) { - currentStatus = "安装取消,退出"; + //******"安装取消,退出"****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_InstallationCanceledExit").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -2037,17 +2145,14 @@ namespace ProxySU } else { - currentStatus = "正在卸载旧版本......"; + //****** "正在卸载旧版本......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_RemoveOldScriptInstalledV2Ray").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 Thread.Sleep(1000); } - - - //client.RunCommand("curl -o /tmp/go.sh https://raw.githubusercontent.com/proxysu/shellscript/master/v2ray/go.sh"); - //client.RunCommand("yes | bash /tmp/go.sh --remove"); - + sshShellCommand = @"curl -o /tmp/go.sh https://raw.githubusercontent.com/proxysu/shellscript/master/v2ray/go.sh"; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 currentShellCommandResult = client.RunCommand(sshShellCommand).Result; @@ -2067,23 +2172,22 @@ namespace ProxySU if (!installResult.Contains("/usr/bin/v2ray")) { - currentStatus = "卸载旧版本,OK"; + //****** "卸载旧版本,OK!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_RemoveOldVersionOK").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 Thread.Sleep(1000); } - currentStatus = "安装新版本......"; + //****** "安装新版本......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_InstallNewVersion").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 Thread.Sleep(1000); - //client.RunCommand("curl -o /tmp/go.sh https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh"); - //client.RunCommand("yes | bash /tmp/go.sh -f"); - //installResult = client.RunCommand("find / -name v2ray").Result.ToString(); sshShellCommand = @"curl -o /tmp/go.sh https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh"; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 currentShellCommandResult = client.RunCommand(sshShellCommand).Result; @@ -2102,9 +2206,10 @@ namespace ProxySU installResult = currentShellCommandResult; if (!installResult.Contains("/usr/local/bin/v2ray")) { - MessageBox.Show("安装V2ray失败(官方脚本运行出错!"); - - currentStatus = "安装V2ray失败(官方脚本运行出错!"; + //****** "安装V2ray失败,官方脚本运行出错!" ****** + MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorInstallV2RayFail").ToString()); + //****** "安装V2ray失败,官方脚本运行出错!" ****** + currentStatus = Application.Current.FindResource("MessageBoxShow_ErrorInstallV2RayFail").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = client.RunCommand(sshShellCommand).Result; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -2112,14 +2217,28 @@ namespace ProxySU client.Disconnect(); return; } + else + { + //****** "V2ray安装成功!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_V2RayInstallSuccess").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 - currentStatus = "迁移原配置文件。"; + Thread.Sleep(1000); + + sshShellCommand = @"systemctl enable v2ray"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + } + //****** "迁移原配置文件。" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_MoveOriginalConfig").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 - //client.RunCommand(@"mv /etc/v2ray/config.json /usr/local/etc/v2ray/"); - //client.RunCommand(@"systemctl restart v2ray"); sshShellCommand = @"mv /etc/v2ray/config.json /usr/local/etc/v2ray/"; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 currentShellCommandResult = client.RunCommand(sshShellCommand).Result; @@ -2130,7 +2249,8 @@ namespace ProxySU currentShellCommandResult = client.RunCommand(sshShellCommand).Result; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 - currentStatus = "已更新到最新版本。"; + //****** "已更新到最新版本。" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_UpgradedNewVersion").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -2157,10 +2277,19 @@ namespace ProxySU if (v2rayNewVersion.Contains(v2rayCurrentVersion) == false) { - MessageBoxResult messageBoxResult = MessageBox.Show($"远程主机当前版本为:v{v2rayCurrentVersion}\n最新版本为:{v2rayNewVersion}\n是否升级为最新版本?", "", MessageBoxButton.YesNo, MessageBoxImage.Question); + MessageBoxResult messageBoxResult = MessageBox.Show( + //****** "远程主机当前版本为:v" ****** + Application.Current.FindResource("DisplayInstallInfo_CurrentVersion").ToString() + + $"{v2rayCurrentVersion}\n" + + //****** "最新版本为:" ****** + Application.Current.FindResource("DisplayInstallInfo_NewVersion").ToString() + + $"{v2rayNewVersion}\n" + + //****** "是否升级为最新版本?" ****** + Application.Current.FindResource("DisplayInstallInfo_IsOrNoUpgradeNewVersion").ToString(), "", MessageBoxButton.YesNo, MessageBoxImage.Question); if (messageBoxResult == MessageBoxResult.Yes) { - currentStatus = "正在升级V2ray到最新版本......"; + //****** "正在升级到最新版本......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartUpgradeNewVersion").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -2182,8 +2311,10 @@ namespace ProxySU v2rayCurrentVersion = currentShellCommandResult;//不含字母v if (v2rayNewVersion.Contains(v2rayCurrentVersion) == true) { - MessageBox.Show($"升级成功!!\n当前版本为:v{v2rayCurrentVersion}\n最新版本为:{v2rayNewVersion}"); - currentStatus = "升级成功!当前已是最新版本!"; + //****** "升级成功!当前已是最新版本!" ****** + MessageBox.Show(Application.Current.FindResource("DisplayInstallInfo_UpgradeNewVersionOK").ToString()); + //****** "升级成功!当前已是最新版本!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_UpgradeNewVersionOK").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -2192,8 +2323,10 @@ namespace ProxySU } else { - MessageBox.Show("升级失败,原因未知,请向开发者提问,以寻求支持!"); - currentStatus = "升级失败!"; + //****** "升级失败,原因未知,请向开发者提问!" ****** + MessageBox.Show(Application.Current.FindResource("DisplayInstallInfo_UpgradeNewVersionFail").ToString()); + //****** "升级失败,原因未知,请向开发者提问!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_UpgradeNewVersionFail").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -2203,7 +2336,8 @@ namespace ProxySU } else { - currentStatus = "升级取消,退出"; + //****** "升级取消,退出!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_UpgradeVersionCancel").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -2215,8 +2349,12 @@ namespace ProxySU } else { - MessageBox.Show($"远程主机当前已是最新版本:{v2rayNewVersion}\n无需升级!"); - currentStatus = "已是最新版本,无需升级,退出"; + //****** "远程主机当前已是最新版本:" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_IsNewVersion").ToString() + + $"{v2rayNewVersion}\n" + + //****** "无需升级!退出!" ****** + Application.Current.FindResource("DisplayInstallInfo_NotUpgradeVersion").ToString(); + MessageBox.Show(currentStatus); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -2231,34 +2369,10 @@ namespace ProxySU catch (Exception ex1)//例外处理 #region 例外处理 { - //MessageBox.Show(ex1.Message); - if (ex1.Message.Contains("连接尝试失败") == true) - { - MessageBox.Show($"{ex1.Message}\n请检查主机地址及端口是否正确,如果通过代理,请检查代理是否正常工作"); - } - - else if (ex1.Message.Contains("denied (password)") == true) - { - MessageBox.Show($"{ex1.Message}\n密码错误或用户名错误"); - } - else if (ex1.Message.Contains("Invalid private key file") == true) - { - MessageBox.Show($"{ex1.Message}\n所选密钥文件错误或者格式不对"); - } - else if (ex1.Message.Contains("denied (publickey)") == true) - { - MessageBox.Show($"{ex1.Message}\n使用密钥登录,密钥文件错误或用户名错误"); - } - else if (ex1.Message.Contains("目标计算机积极拒绝") == true) - { - MessageBox.Show($"{ex1.Message}\n主机地址错误,如果使用了代理,也可能是连接代理的端口错误"); - } - else - { - MessageBox.Show("发生错误"); - MessageBox.Show(ex1.Message); - } - currentStatus = "主机登录失败"; + ProcessException(ex1.Message); + + //****** "主机登录失败!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginFailed").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -2289,7 +2403,8 @@ namespace ProxySU ConnectionInfo connectionInfo = GenerateConnectionInfo(); if (connectionInfo == null) { - MessageBox.Show("远程主机连接信息有误,请检查"); + //****** "远程主机连接信息有误,请检查!" ****** + MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorHostConnection").ToString()); return; } string serverConfig = "TemplateConfg\\trojan-go_all_config.json"; //服务端配置文件 @@ -2299,12 +2414,14 @@ namespace ProxySU if (String.IsNullOrEmpty(ReceiveConfigurationParameters[0]) == true) { - MessageBox.Show("未选择配置模板或模板选择错误!"); + //******"请先选择配置模板!"****** + MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ChooseTemplate").ToString()); return; } if (String.IsNullOrEmpty(ReceiveConfigurationParameters[4]) == true) { - MessageBox.Show("空域名,请检查相关参数设置!"); + //****** "空域名,请检查相关参数设置!" ****** + MessageBox.Show(Application.Current.FindResource("MessageBoxShow_DomainNotEmpty").ToString()); return; } @@ -2316,8 +2433,8 @@ namespace ProxySU //登录远程主机布署Trojan-Go程序 private void StartSetUpTrojanGo(ConnectionInfo connectionInfo, TextBlock textBlockName, ProgressBar progressBar, string serverConfig, string clientConfig, string upLoadPath) { - string currentStatus = "正在登录远程主机......"; - //Action updateAction = new Action(UpdateTextBlock); + //******"正在登录远程主机......"****** + string currentStatus = Application.Current.FindResource("DisplayInstallInfo_Login").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -2357,7 +2474,8 @@ namespace ProxySU client.Connect(); if (client.IsConnected == true) { - currentStatus = "主机登录成功"; + //******"主机登录成功"****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginSuccessful").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果在监视窗口 @@ -2365,8 +2483,8 @@ namespace ProxySU Thread.Sleep(1000); } - //检测是否运行在root权限下 - currentStatus = "检测是否运行在root权限下..."; + //******"检测是否运行在root权限下..."****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_DetectionRootPermission").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -2379,20 +2497,22 @@ namespace ProxySU string testRootAuthority = currentShellCommandResult; if (testRootAuthority.Equals("0\n") == false) { - MessageBox.Show("请使用具有root权限的账户登录主机!!"); + //******"请使用具有root权限的账户登录主机!!"****** + MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorRootPermission").ToString()); client.Disconnect(); return; } else { - currentStatus = "检测结果:OK!"; + //******"检测结果:OK!"****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_DetectionRoot_OK").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 } - //检测是否安装有Trojan-Go - currentStatus = "检测系统是否已经安装Trojan-Go......"; + //******"检测系统是否已经安装Trojan-go......"****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_TestExistSoft").ToString() + "Trojan-go......"; textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -2408,10 +2528,15 @@ namespace ProxySU if (resultCmdTestTrojanInstalled.Contains("/usr/local/bin/trojan-go") == true) { - MessageBoxResult messageBoxResult = MessageBox.Show("远程主机已安装Trojan,是否强制重新安装?", "", MessageBoxButton.YesNo, MessageBoxImage.Question); + //******"远程主机已安装Trojan-go,是否强制重新安装?"****** + string messageShow = Application.Current.FindResource("MessageBoxShow_ExistedSoft").ToString() + + "Trojan-go" + + Application.Current.FindResource("MessageBoxShow_ForceInstallSoft").ToString(); + MessageBoxResult messageBoxResult = MessageBox.Show(messageShow, "", MessageBoxButton.YesNo, MessageBoxImage.Question); if (messageBoxResult == MessageBoxResult.No) { - currentStatus = "安装取消,退出"; + //******"安装取消,退出"****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_InstallationCanceledExit").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -2422,7 +2547,8 @@ namespace ProxySU } else { - currentStatus = "已选择强制安装Trojan-go!"; + //******"已选择强制安装Trojan-go!"****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_ForceInstallSoft").ToString() + "Trojan-go!"; textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -2433,15 +2559,16 @@ namespace ProxySU } else { - currentStatus = "检测结果:未安装Trojan-go!"; + //******"检测结果:未安装V2Ray!"****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_NoInstalledSoft").ToString() + "Trojan-go!"; textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus);//显示命令执行的结果 currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 } - //检测远程主机系统环境是否符合要求 - currentStatus = "检测系统是否符合安装要求......"; + //******"检测系统是否符合安装要求......"****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_CheckSystemRequirements").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -2498,8 +2625,11 @@ namespace ProxySU //也就是apt ,dnf\yum, zypper必须安装其中之一,且必须安装Systemd的系统才能安装。 if ((getApt && getDnf && getYum && getZypper) || getSystemd) { - MessageBox.Show($"系统缺乏必要的安装组件如:apt||dnf||yum||zypper||Syetemd,主机系统推荐使用:CentOS 7/8,Debian 8/9/10,Ubuntu 16.04及以上版本"); - currentStatus = "系统环境不满足要求,安装失败!!"; + //******"系统缺乏必要的安装组件如:apt||dnf||yum||zypper||Syetemd,主机系统推荐使用:CentOS 7/8,Debian 8/9/10,Ubuntu 16.04及以上版本"****** + MessageBox.Show(Application.Current.FindResource("MessageBoxShow_MissingSystemComponents").ToString()); + + //******"系统环境不满足要求,安装失败!!"****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_MissingSystemComponents").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -2510,7 +2640,8 @@ namespace ProxySU } else { - currentStatus = "检测结果:OK!"; + //******"检测结果:OK!"****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_SystemRequirementsOK").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -2552,7 +2683,8 @@ namespace ProxySU if (testSELinux.Contains("Enforcing") == true) { - currentStatus = "检测到系统启用SELinux,且工作在严格模式下,需改为宽松模式!修改中..."; + //******"检测到系统启用SELinux,且工作在严格模式下,需改为宽松模式!修改中......"****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_EnableSELinux").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -2566,7 +2698,8 @@ namespace ProxySU currentShellCommandResult = client.RunCommand(sshShellCommand).Result; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 - currentStatus = "修改完毕!"; + //******"修改完毕!"****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_SELinuxModifyOK").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -2575,9 +2708,8 @@ namespace ProxySU } - //检测域名解析是否正确 - - currentStatus = "正在检测域名是否解析到当前VPS的IP上......"; + //****** "正在检测域名是否解析到当前VPS的IP上......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_TestDomainResolve").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -2615,7 +2747,8 @@ namespace ProxySU if (String.Equals(nativeIp, resultTestDomainCmd) == true) { - currentStatus = "解析正确!"; + //****** "解析正确!OK!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_DomainResolveOK").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -2624,13 +2757,15 @@ namespace ProxySU } else { - currentStatus = "域名未能正确解析到当前VPS的IP上!安装失败!"; + //****** "域名未能正确解析到当前VPS的IP上!安装失败!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_ErrorDomainResolve").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 Thread.Sleep(1000); - MessageBox.Show("域名未能正确解析到当前VPS的IP上,请检查!若解析设置正确,请等待生效后再重试安装。如果域名使用了CDN,请先关闭!"); + //****** "域名未能正确解析到当前VPS的IP上,请检查!若解析设置正确,请等待生效后再重试安装。如果域名使用了CDN,请先关闭!" ****** + MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorDomainResolve").ToString()); client.Disconnect(); return; } @@ -2650,7 +2785,8 @@ namespace ProxySU } - currentStatus = "正在检测端口占用情况......"; + //****** "检测端口占用情况......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_TestPortUsed").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -2671,10 +2807,12 @@ namespace ProxySU if (String.IsNullOrEmpty(testPort80) == false || String.IsNullOrEmpty(testPort443) == false) { - MessageBoxResult dialogResult = MessageBox.Show("80/443端口之一,或全部被占用,将强制停止占用80/443端口的程序?", "Stop application", MessageBoxButton.YesNo); + //****** "80/443端口之一,或全部被占用,将强制停止占用80/443端口的程序?" ****** + MessageBoxResult dialogResult = MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorPortUsed").ToString(), "Stop application", MessageBoxButton.YesNo); if (dialogResult == MessageBoxResult.No) { - currentStatus = "端口被占用,安装失败......"; + //****** "端口被占用,安装失败......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_ErrorPortUsedFail").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -2684,7 +2822,8 @@ namespace ProxySU return; } - currentStatus = "正在释放80/443端口......"; + //****** "正在释放80/443端口......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_ReleasePort").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -2733,7 +2872,8 @@ namespace ProxySU TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 } - currentStatus = "80/443端口释放完毕!"; + //****** "80/443端口释放完毕!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_ReleasePortOK").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -2742,22 +2882,24 @@ namespace ProxySU } else { - currentStatus = "检测结果:未被占用!"; + //****** "检测结果:未被占用!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_PortNotUsed").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 } - currentStatus = "系统环境检测完毕,符合安装要求,开始布署......"; + //****** "系统环境检测完毕,符合安装要求,开始布署......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartInstalling").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 Thread.Sleep(1000); - //打开防火墙端口 - currentStatus = "开启防火墙相应端口......"; + //****** "开启防火墙相应端口......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_OpenFireWallPort").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -2802,7 +2944,8 @@ namespace ProxySU } //下载安装脚本安装 - currentStatus = "正在安装Trojan-go......"; + //****** "正在安装Trojan-go......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartInstallSoft").ToString() + "Trojan-go......"; textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -2828,9 +2971,10 @@ namespace ProxySU if (!installResult.Contains("/usr/local/bin/trojan-go")) { - MessageBox.Show("安装Trojan-Go失败(安装脚本运行出错!"); - - currentStatus = "安装Trojan-Go失败(安装脚本运行出错!"; + //****** "安装失败,官方脚本运行出错!" ****** + MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorInstallSoftFail").ToString()); + //****** "安装失败,官方脚本运行出错!" ****** + currentStatus = Application.Current.FindResource("MessageBoxShow_ErrorInstallSoftFail").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -2840,7 +2984,8 @@ namespace ProxySU } else { - currentStatus = "Trojan-Go安装成功!"; + //****** "Trojan-go安装成功!" ****** + currentStatus = "Trojan-go" + Application.Current.FindResource("DisplayInstallInfo_SoftInstallSuccess").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -2859,9 +3004,8 @@ namespace ProxySU currentShellCommandResult = client.RunCommand(sshShellCommand).Result; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 - - //上传配置文件 - currentStatus = "Trojan-Go程序安装完毕,配置文件上传中......"; + //****** "上传配置文件......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_UploadSoftConfig").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -2900,8 +3044,8 @@ namespace ProxySU File.Delete(@"config.json"); - //安装acme.sh - currentStatus = "正在安装acme.sh......"; + //****** "正在安装acme.sh......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartInstallAcmeSh").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -2926,7 +3070,8 @@ namespace ProxySU if (currentShellCommandResult.Contains("Install success") == true) { - currentStatus = "acme.sh安装成功!"; + //****** "acme.sh安装成功!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_AcmeShInstallSuccess").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -2935,7 +3080,8 @@ namespace ProxySU } else { - currentStatus = "acme.sh安装失败!原因未知,请向开发者提问!"; + //****** "acme.sh安装失败!原因未知,请向开发者提问!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_ErrorAcmeShInstallFail").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -2954,7 +3100,8 @@ namespace ProxySU TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 - currentStatus = "申请域名证书......"; + //****** "申请域名证书......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartApplyCert").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -2968,7 +3115,8 @@ namespace ProxySU if (currentShellCommandResult.Contains("Cert success") == true) { - currentStatus = "证书申请成功!"; + //****** "证书申请成功!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_ApplyCertSuccess").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -2977,16 +3125,16 @@ namespace ProxySU } else { - currentStatus = "证书申请失败!原因未知,请向开发者提问!"; + //****** "证书申请失败!原因未知,请向开发者提问!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_ApplyCertFail").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 return; } - - - currentStatus = "安装证书到Trojan-Go......"; + //****** "安装证书到Trojan-go......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_IntallCertToSoft").ToString() + "Trojan-go......"; textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -3004,7 +3152,8 @@ namespace ProxySU if (currentShellCommandResult.Contains("1") == true) { - currentStatus = "证书安装到Trojan-go,成功!"; + //****** "证书成功安装到Trojan-go!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_IntallCertToSoftOK").ToString() + "Trojan-go!"; textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -3454,34 +3603,10 @@ namespace ProxySU catch (Exception ex1)//例外处理 #region 例外处理 { + ProcessException(ex1.Message); - if (ex1.Message.Contains("连接尝试失败") == true) - { - MessageBox.Show($"{ex1.Message}\n请检查主机地址及端口是否正确,如果通过代理,请检查代理是否正常工作"); - } - - else if (ex1.Message.Contains("denied (password)") == true) - { - MessageBox.Show($"{ex1.Message}\n密码错误或用户名错误"); - } - else if (ex1.Message.Contains("Invalid private key file") == true) - { - MessageBox.Show($"{ex1.Message}\n所选密钥文件错误或者格式不对"); - } - else if (ex1.Message.Contains("denied (publickey)") == true) - { - MessageBox.Show($"{ex1.Message}\n使用密钥登录,密钥文件错误或用户名错误"); - } - else if (ex1.Message.Contains("目标计算机积极拒绝") == true) - { - MessageBox.Show($"{ex1.Message}\n主机地址错误,如果使用了代理,也可能是连接代理的端口错误"); - } - else - { - MessageBox.Show("发生错误"); - MessageBox.Show(ex1.Message); - } - currentStatus = "主机登录失败"; + //****** "主机登录失败!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginFailed").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -3729,34 +3854,10 @@ namespace ProxySU catch (Exception ex1)//例外处理 #region 例外处理 { - //MessageBox.Show(ex1.Message); - if (ex1.Message.Contains("连接尝试失败") == true) - { - MessageBox.Show($"{ex1.Message}\n请检查主机地址及端口是否正确,如果通过代理,请检查代理是否正常工作"); - } + ProcessException(ex1.Message); - else if (ex1.Message.Contains("denied (password)") == true) - { - MessageBox.Show($"{ex1.Message}\n密码错误或用户名错误"); - } - else if (ex1.Message.Contains("Invalid private key file") == true) - { - MessageBox.Show($"{ex1.Message}\n所选密钥文件错误或者格式不对"); - } - else if (ex1.Message.Contains("denied (publickey)") == true) - { - MessageBox.Show($"{ex1.Message}\n使用密钥登录,密钥文件错误或用户名错误"); - } - else if (ex1.Message.Contains("目标计算机积极拒绝") == true) - { - MessageBox.Show($"{ex1.Message}\n主机地址错误,如果使用了代理,也可能是连接代理的端口错误"); - } - else - { - MessageBox.Show("发生错误"); - MessageBox.Show(ex1.Message); - } - currentStatus = "主机登录失败"; + //****** "主机登录失败!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginFailed").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -4971,34 +5072,10 @@ namespace ProxySU catch (Exception ex1)//例外处理 #region 例外处理 { + ProcessException(ex1.Message); - if (ex1.Message.Contains("连接尝试失败") == true) - { - MessageBox.Show($"{ex1.Message}\n请检查主机地址及端口是否正确,如果通过代理,请检查代理是否正常工作"); - } - - else if (ex1.Message.Contains("denied (password)") == true) - { - MessageBox.Show($"{ex1.Message}\n密码错误或用户名错误"); - } - else if (ex1.Message.Contains("Invalid private key file") == true) - { - MessageBox.Show($"{ex1.Message}\n所选密钥文件错误或者格式不对"); - } - else if (ex1.Message.Contains("denied (publickey)") == true) - { - MessageBox.Show($"{ex1.Message}\n使用密钥登录,密钥文件错误或用户名错误"); - } - else if (ex1.Message.Contains("目标计算机积极拒绝") == true) - { - MessageBox.Show($"{ex1.Message}\n主机地址错误,如果使用了代理,也可能是连接代理的端口错误"); - } - else - { - MessageBox.Show("发生错误"); - MessageBox.Show(ex1.Message); - } - currentStatus = "主机登录失败"; + //****** "主机登录失败!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginFailed").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -5272,34 +5349,9 @@ namespace ProxySU catch (Exception ex1)//例外处理 #region 例外处理 { - //MessageBox.Show(ex1.Message); - if (ex1.Message.Contains("连接尝试失败") == true) - { - MessageBox.Show($"{ex1.Message}\n请检查主机地址及端口是否正确,如果通过代理,请检查代理是否正常工作"); - } - - else if (ex1.Message.Contains("denied (password)") == true) - { - MessageBox.Show($"{ex1.Message}\n密码错误或用户名错误"); - } - else if (ex1.Message.Contains("Invalid private key file") == true) - { - MessageBox.Show($"{ex1.Message}\n所选密钥文件错误或者格式不对"); - } - else if (ex1.Message.Contains("denied (publickey)") == true) - { - MessageBox.Show($"{ex1.Message}\n使用密钥登录,密钥文件错误或用户名错误"); - } - else if (ex1.Message.Contains("目标计算机积极拒绝") == true) - { - MessageBox.Show($"{ex1.Message}\n主机地址错误,如果使用了代理,也可能是连接代理的端口错误"); - } - else - { - MessageBox.Show("发生错误"); - MessageBox.Show(ex1.Message); - } - currentStatus = "主机登录失败"; + ProcessException(ex1.Message); + //****** "主机登录失败!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginFailed").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -6356,34 +6408,9 @@ namespace ProxySU catch (Exception ex1)//例外处理 #region 例外处理 { - //MessageBox.Show(ex1.Message); - if (ex1.Message.Contains("连接尝试失败") == true) - { - MessageBox.Show($"{ex1.Message}\n请检查主机地址及端口是否正确,如果通过代理,请检查代理是否正常工作"); - } - - else if (ex1.Message.Contains("denied (password)") == true) - { - MessageBox.Show($"{ex1.Message}\n密码错误或用户名错误"); - } - else if (ex1.Message.Contains("Invalid private key file") == true) - { - MessageBox.Show($"{ex1.Message}\n所选密钥文件错误或者格式不对"); - } - else if (ex1.Message.Contains("denied (publickey)") == true) - { - MessageBox.Show($"{ex1.Message}\n使用密钥登录,密钥文件错误或用户名错误"); - } - else if (ex1.Message.Contains("目标计算机积极拒绝") == true) - { - MessageBox.Show($"{ex1.Message}\n主机地址错误,如果使用了代理,也可能是连接代理的端口错误"); - } - else - { - MessageBox.Show("发生错误"); - MessageBox.Show(ex1.Message); - } - currentStatus = "主机登录失败"; + ProcessException(ex1.Message); + //****** "主机登录失败!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginFailed").ToString(); textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 diff --git a/ProxySU/Translations/ProxySU.zh-CN.xaml b/ProxySU/Translations/ProxySU.zh-CN.xaml index 4d53401..c07ab48 100644 --- a/ProxySU/Translations/ProxySU.zh-CN.xaml +++ b/ProxySU/Translations/ProxySU.zh-CN.xaml @@ -21,7 +21,7 @@ 取消 参数设置 模式:Trojan+TLS+Caddy - 服务器地址(域名): + 服务器地址(域名): 端口:443 域名不可为空 密码: @@ -107,7 +107,6 @@ 密钥文件为必填项,不能为空!! 如果选择了代理,则代理地址与端口不能为空! 如果代理需要登录,则代理登录的用户名与密码不能为空! - 远程主机连接信息有误,请检查! 请先选择配置模板! 正在登录远程主机...... @@ -115,11 +114,12 @@ 检测是否运行在root权限下... 请使用具有root权限的账户登录主机!! 检测结果:OK! - 检测系统是否已经安装V2ray...... - 远程主机已安装V2ray,是否强制重新安装? + 检测系统是否已经安装 + 远程主机已安装 + ,是否强制重新安装? 安装取消,退出 - 已选择强制安装V2Ray! - 检测结果:未安装V2Ray! + 已选择强制安装 + 检测结果:未安装 检测系统是否符合安装要求...... 当前系统内核版本为 ,V2ray要求内核为2.6.23及以上。请升级内核再安装! @@ -133,9 +133,86 @@ 本地时间与远程主机时间相差超过限制(90秒),请先用 '系统工具-->时间校对' 校对时间后再设置 时间较对失败...... 时间差符合要求,OK! + 正在检测域名是否解析到当前VPS的IP上...... + 解析正确!OK! + 域名未能正确解析到当前VPS的IP上!安装失败! + 域名未能正确解析到当前VPS的IP上,请检查!若解析设置正确,请等待生效后再重试安装。如果域名使用了CDN,请先关闭! + 检测端口占用情况...... + 80/443端口之一,或全部被占用,将强制停止占用80/443端口的程序? + 端口被占用,安装失败...... + 正在释放80/443端口...... + 80/443端口释放完毕! + 检测结果:未被占用! + 系统环境检测完毕,符合安装要求,开始布署...... + 开启防火墙相应端口...... + 正在安装 + 安装失败,官方脚本运行出错! + 安装成功! + 上传配置文件...... + 正在安装acme.sh...... + acme.sh安装成功! + acme.sh安装失败!原因未知,请向开发者提问! + 申请域名证书...... + 证书申请成功! + 证书申请失败!原因未知,请向开发者提问! + 安装证书到 + 证书成功安装到 + 证书安装到V2ray失败,原因未知,可以向开发者提问! + 安装Caddy...... + 安装Caddy失败! + Caddy安装成功! + 正在为Http2Web模式升级Caddy v2.2.0测试版! + 上传Caddy配置文件...... + Caddy配置文件上传成功,OK! + 正在启动Caddy...... + Caddy启动成功! + Caddy启动失败! + 正在启动Caddy(第二次尝试)! + Caddy启动失败(第二次)!退出安装! + Caddy启动失败,原因未知!请向开发者问询! + 正在启动V2ray...... + V2ray启动成功! + V2ray启动失败! + 正在启动V2ray(第二次尝试)! + V2ray启动失败(第二次)!退出安装! + V2Ray启动失败,原因未知!请向开发者问询! + BBR测试...... + 正在启用BBR...... + BBR已经启用了! + 系统不满足启用BBR的条件,启用失败! + 生成客户端配置...... + V2Ray安装成功,祝你玩的愉快!! + 主机登录失败! + 发生错误! + 密码错误或用户名错误! + 请检查主机地址及端口是否正确,如果通过代理,请检查代理是否正常工作 + 所选密钥文件错误或者格式不对! + 使用密钥登录,密钥文件错误或用户名错误! + 主机地址错误,如果使用了代理,也可能是连接代理的端口错误! + 远程主机未安装V2ray,退出! + 检测到使用旧安装脚本的V2Ray...... + 检测到使用旧安装脚本的V2Ray,是否卸载旧版本并使用新安装脚本重新安装? + 正在卸载旧版本...... + 卸载旧版本,OK! + 安装新版本...... + 迁移原配置文件。 + 已更新到最新版本。 + 远程主机当前版本为:v + 最新版本为: + 是否升级为最新版本? + 正在升级到最新版本 + 升级成功!当前已是最新版本! + 升级失败,原因未知,请向开发者提问! + 升级取消,退出! + 远程主机当前已是最新版本: + 无需升级!退出! + 空域名,请检查相关参数设置! - - - Tel + + Name + Gender + Dept + Email + Tel Now \ No newline at end of file diff --git a/ProxySU/bin/Beta/Beta.zip b/ProxySU/bin/Beta/Beta.zip index 2e0365f78547953b85f6d337b0bdc5a616928920..4c66ad2db19c2d909240b780d3626a7da1ffb81a 100644 GIT binary patch delta 61113 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

D0m3I>rSE>GDE*dhaLghI@nvpOZO$v3CI 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