From ec49f42844497ed62bd292ce958fcf9c09e1d4e6 Mon Sep 17 00:00:00 2001 From: celeron533 Date: Sun, 7 Jun 2015 15:58:00 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=84=E8=8C=83=E5=A4=9A=E8=AF=AD=E8=A8=80?= =?UTF-8?q?=E7=89=B9=E6=80=A7=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shadowsocks-csharp/Controller/I18N.cs | 31 +++++---- shadowsocks-csharp/Controller/Listener.cs | 2 +- .../Controller/ShadowsocksController.cs | 2 +- shadowsocks-csharp/Controller/SystemProxy.cs | 2 +- shadowsocks-csharp/Data/cn.txt | 74 -------------------- shadowsocks-csharp/Data/en.txt | 74 ++++++++++++++++++++ shadowsocks-csharp/Data/zh_cn.txt | 74 ++++++++++++++++++++ shadowsocks-csharp/Model/Configuration.cs | 8 +-- shadowsocks-csharp/Model/Server.cs | 2 +- .../Properties/Resources.Designer.cs | 79 ++++++++++++++-------- shadowsocks-csharp/Properties/Resources.resx | 9 ++- shadowsocks-csharp/View/ConfigForm.cs | 28 ++++---- shadowsocks-csharp/View/MenuViewController.cs | 68 +++++++++---------- shadowsocks-csharp/View/QRCodeForm.cs | 2 +- shadowsocks-csharp/shadowsocks-csharp.csproj | 3 +- 15 files changed, 282 insertions(+), 176 deletions(-) delete mode 100644 shadowsocks-csharp/Data/cn.txt create mode 100644 shadowsocks-csharp/Data/en.txt create mode 100644 shadowsocks-csharp/Data/zh_cn.txt diff --git a/shadowsocks-csharp/Controller/I18N.cs b/shadowsocks-csharp/Controller/I18N.cs index 76c51749..24f1ebec 100755 --- a/shadowsocks-csharp/Controller/I18N.cs +++ b/shadowsocks-csharp/Controller/I18N.cs @@ -12,21 +12,28 @@ namespace Shadowsocks.Controller static I18N() { Strings = new Dictionary(); - + string languageString = null; + if (System.Globalization.CultureInfo.CurrentCulture.IetfLanguageTag.ToLowerInvariant().StartsWith("zh")) { - string[] lines = Regex.Split(Resources.cn, "\r\n|\r|\n"); - foreach (string line in lines) + languageString = Resources.zh_cn; + } + else + { + languageString = Resources.en; + } + + string[] lines = Regex.Split(languageString, "\r\n|\r|\n"); + foreach (string line in lines) + { + if (line.StartsWith("#")) + { + continue; + } + string[] kv = Regex.Split(line, "="); + if (kv.Length == 2) { - if (line.StartsWith("#")) - { - continue; - } - string[] kv = Regex.Split(line, "="); - if (kv.Length == 2) - { - Strings[kv[0]] = kv[1]; - } + Strings[kv[0]] = kv[1]; } } } diff --git a/shadowsocks-csharp/Controller/Listener.cs b/shadowsocks-csharp/Controller/Listener.cs index 9943e536..24433f4f 100755 --- a/shadowsocks-csharp/Controller/Listener.cs +++ b/shadowsocks-csharp/Controller/Listener.cs @@ -46,7 +46,7 @@ namespace Shadowsocks.Controller this._shareOverLAN = config.shareOverLan; if (CheckIfPortInUse(_config.localPort)) - throw new Exception(I18N.GetString("Port already in use")); + throw new Exception(I18N.GetString("Message.PortAlreadyInUse")); try { diff --git a/shadowsocks-csharp/Controller/ShadowsocksController.cs b/shadowsocks-csharp/Controller/ShadowsocksController.cs index 734f27d1..d919a767 100755 --- a/shadowsocks-csharp/Controller/ShadowsocksController.cs +++ b/shadowsocks-csharp/Controller/ShadowsocksController.cs @@ -267,7 +267,7 @@ namespace Shadowsocks.Controller SocketException se = (SocketException)e; if (se.SocketErrorCode == SocketError.AccessDenied) { - e = new Exception(I18N.GetString("Port already in use"), e); + e = new Exception(I18N.GetString("Message.PortAlreadyInUse"), e); } } Logging.LogUsefulException(e); diff --git a/shadowsocks-csharp/Controller/SystemProxy.cs b/shadowsocks-csharp/Controller/SystemProxy.cs index 5fe8a244..8a2eeb3e 100755 --- a/shadowsocks-csharp/Controller/SystemProxy.cs +++ b/shadowsocks-csharp/Controller/SystemProxy.cs @@ -73,7 +73,7 @@ namespace Shadowsocks.Controller { Logging.LogUsefulException(e); // TODO this should be moved into views - MessageBox.Show(I18N.GetString("Failed to update registry")); + MessageBox.Show(I18N.GetString("Message.FailedToUpdateRegistry")); } } diff --git a/shadowsocks-csharp/Data/cn.txt b/shadowsocks-csharp/Data/cn.txt deleted file mode 100644 index e092575c..00000000 --- a/shadowsocks-csharp/Data/cn.txt +++ /dev/null @@ -1,74 +0,0 @@ -# translation for Simplified Chinese - -Shadowsocks=Shadowsocks - -# Menu items - -Enable System Proxy=启用系统代理 -Mode=系统代理模式 -PAC=PAC 模式 -Global=全局模式 -Servers=服务器 -Edit Servers...=编辑服务器... -Start on Boot=开机启动 -Allow Clients from LAN=允许来自局域网的连接 -Local PAC=使用本地 PAC -Online PAC=使用在线 PAC -Edit Local PAC File...=编辑本地 PAC 文件... -Update Local PAC from GFWList=从 GFWList 更新本地 PAC -Edit User Rule for GFWList...=编辑 GFWList 的用户规则... -Show QRCode...=显示二维码... -Scan QRCode from Screen...=扫描屏幕上的二维码... -Show Logs...=显示日志... -About...=关于... -Quit=退出 -Edit Servers=编辑服务器 - -# Config Form - -&Add=添加(&A) -&Delete=删除(&D) -Server=服务器 -Server IP=服务器 IP -Server Port=服务器端口 -Password=密码 -Encryption=加密 -Proxy Port=代理端口 -Remarks=备注 -OK=确定 -Cancel=取消 -New server=未配置的服务器 - -# QRCode Form - -QRCode=二维码 - -# PAC Url Form - -Edit Online PAC URL=编辑在线 PAC 网址 -Edit Online PAC URL...=编辑在线 PAC 网址... -Please input PAC Url=请输入 PAC 网址 - -# Messages - -Shadowsocks Error: {0}=Shadowsocks 错误: {0} -Port already in use=端口已被占用 -Illegal port number format=非法端口格式 -Please add at least one server=请添加至少一个服务器 -Server IP can not be blank=服务器 IP 不能为空 -Password can not be blank=密码不能为空 -Port out of range=端口超出范围 -Shadowsocks {0} Update Found=Shadowsocks {0} 更新 -Click here to download=点击这里下载 -Shadowsocks is here=Shadowsocks 在这里 -You can turn on/off Shadowsocks in the context menu=可以在右键菜单中开关 Shadowsocks -System Proxy Enabled=系统代理已启用 -System Proxy Disabled=系统代理未启用 -Failed to update PAC file =更新 PAC 文件失败 -PAC updated=更新 PAC 成功 -No updates found. Please report to GFWList if you have problems with it.=未发现更新。如有问题请提交给 GFWList。 -No QRCode found. Try to zoom in or move it to the center of the screen.=未发现二维码,尝试把它放大或移动到靠近屏幕中间的位置 -Failed to decode QRCode=无法解析二维码 -Failed to update registry=无法修改注册表 -System Proxy On: =系统代理已启用: -Running: Port {0}=正在运行:端口 {0} \ No newline at end of file diff --git a/shadowsocks-csharp/Data/en.txt b/shadowsocks-csharp/Data/en.txt new file mode 100644 index 00000000..4da5444c --- /dev/null +++ b/shadowsocks-csharp/Data/en.txt @@ -0,0 +1,74 @@ +# translation for English + +Main.Shadowsocks=Shadowsocks + +# Menu items + +Menu.EnableSystemProxy=Enable System Proxy +Menu.Mode=Mode +Menu.PAC=PAC +Menu.Global=Global +Menu.Servers=Servers +Menu.EditServers2=Edit Servers... +Menu.StartOnBoot=Start on Boot +Menu.AllowClientsFromLAN=Allow Clients from LAN +Menu.LocalPAC=Local PAC +Menu.OnlinePAC=Online PAC +Menu.EditLocalPACFile=Edit Local PAC File... +Menu.UpdatePACFromGFWList=Update Local PAC from GFWList +Menu.EditUserRuleForGFWList=Edit User Rule for GFWList... +Menu.ShowQRCode=Show QRCode... +Menu.ScanQRCodeFromScreen=Scan QRCode from Screen... +Menu.ShowLogs=Show Logs... +Menu.About=About... +Menu.Quit=Quit +Menu.EditServers=Edit Servers + +# Config Form + +Config.Add=&Add +Config.Delete=&Delete +Config.Server=Server +Config.ServerIP=Server IP +Config.ServerPort=Server Port +Config.Password=Password +Config.Encryption=Encryption +Config.ProxyPort=Proxy Port +Config.Remarks=Remarks +Config.OK=OK +Config.Cancel=Cancel +Config.NewServer=New server + +# QRCode Form + +QRCode.QRCode=QRCode + +# PAC Url Form + +PAC.EditOnlinePACURL=Edit Online PAC URL +PAC.EditOnlinePACURL2=Edit Online PAC URL... +PAC.InputPACUrl=Please input PAC Url + +# Messages + +Message.ShadowsocksError=Shadowsocks Error: {0} +Message.PortAlreadyInUse=Port already in use +Message.IllegalPortNumberFormat=Illegal port number format +Message.AddAtLeastOneServer=Please add at least one server +Message.ServerIPCanNotBlank=Server IP can not be blank +Message.PasswordCanNotBlank=Password can not be blank +Message.PortOutOfRange=Port out of range +Message.ShadowsocksUpdateFound=Shadowsocks {0} Update Found +Message.ClickHereToDownload=Click here to download +Message.ShadowsocksIsHere=Shadowsocks is here +Message.TurnOnOffShadowsocksInContextMenu=You can turn on/off Shadowsocks in the context menu +Message.SystemProxyEnabled=System Proxy Enabled +Message.SystemProxyDisabled=System Proxy Disabled +Message.FailedToUpdatePACFile=Failed to update PAC file +Message.PACUpdated=PAC updated +Message.NoUpdatesFound=No updates found. Please report to GFWList if you have problems with it. +Message.NoQRCodeFound=No QRCode found. Try to zoom in or move it to the center of the screen. +Message.FailedToDecodeQRCode=Failed to decode QRCode +Message.FailedToUpdateRegistry=Failed to update registry +Message.SystemProxyOn=System Proxy On: +Message.RunningPort=Running: Port {0} \ No newline at end of file diff --git a/shadowsocks-csharp/Data/zh_cn.txt b/shadowsocks-csharp/Data/zh_cn.txt new file mode 100644 index 00000000..e518c27e --- /dev/null +++ b/shadowsocks-csharp/Data/zh_cn.txt @@ -0,0 +1,74 @@ +# translation for Simplified Chinese + +Main.Shadowsocks=Shadowsocks + +# Menu items + +Menu.EnableSystemProxy=启用系统代理 +Menu.Mode=系统代理模式 +Menu.PAC=PAC 模式 +Menu.Global=全局模式 +Menu.Servers=服务器 +Menu.EditServers2=编辑服务器... +Menu.StartOnBoot=开机启动 +Menu.AllowClientsFromLAN=允许来自局域网的连接 +Menu.LocalPAC=使用本地 PAC +Menu.OnlinePAC=使用在线 PAC +Menu.EditLocalPACFile=编辑本地 PAC 文件... +Menu.UpdatePACFromGFWList=从 GFWList 更新本地 PAC +Menu.EditUserRuleForGFWList=编辑 GFWList 的用户规则... +Menu.ShowQRCode=显示二维码... +Menu.ScanQRCodeFromScreen=扫描屏幕上的二维码... +Menu.ShowLogs=显示日志... +Menu.About=关于... +Menu.Quit=退出 +Menu.EditServers=编辑服务器 + +# Config Form + +Config.Add=添加(&A) +Config.Delete=删除(&D) +Config.Server=服务器 +Config.ServerIP=服务器 IP +Config.ServerPort=服务器端口 +Config.Password=密码 +Config.Encryption=加密 +Config.ProxyPort=代理端口 +Config.Remarks=备注 +Config.OK=确定 +Config.Cancel=取消 +Config.NewServer=未配置的服务器 + +# QRCode Form + +QRCode.QRCode=二维码 + +# PAC Url Form + +PAC.EditOnlinePACURL=编辑在线 PAC 网址 +PAC.EditOnlinePACURL2=编辑在线 PAC 网址... +PAC.InputPACUrl=请输入 PAC 网址 + +# Messages + +Message.ShadowsocksError=Shadowsocks 错误: {0} +Message.PortAlreadyInUse=端口已被占用 +Message.IllegalPortNumberFormat=非法端口格式 +Message.AddAtLeastOneServer=请添加至少一个服务器 +Message.ServerIPCanNotBlank=服务器 IP 不能为空 +Message.PasswordCanNotBlank=密码不能为空 +Message.PortOutOfRange=端口超出范围 +Message.ShadowsocksUpdateFound=Shadowsocks {0} 更新 +Message.ClickHereToDownload=点击这里下载 +Message.ShadowsocksIsHere=Shadowsocks 在这里 +Message.TurnOnOffShadowsocksInContextMenu=可以在右键菜单中开关 Shadowsocks +Message.SystemProxyEnabled=系统代理已启用 +Message.SystemProxyDisabled=系统代理未启用 +Message.FailedToUpdatePACFile=更新 PAC 文件失败 +Message.PACUpdated=更新 PAC 成功 +Message.NoUpdatesFound=未发现更新。如有问题请提交给 GFWList。 +Message.NoQRCodeFound=未发现二维码,尝试把它放大或移动到靠近屏幕中间的位置 +Message.FailedToDecodeQRCode=无法解析二维码 +Message.FailedToUpdateRegistry=无法修改注册表 +Message.SystemProxyOn=系统代理已启用: +Message.RunningPort=正在运行:端口 {0} \ No newline at end of file diff --git a/shadowsocks-csharp/Model/Configuration.cs b/shadowsocks-csharp/Model/Configuration.cs index b78358e8..b6005c4c 100755 --- a/shadowsocks-csharp/Model/Configuration.cs +++ b/shadowsocks-csharp/Model/Configuration.cs @@ -108,7 +108,7 @@ namespace Shadowsocks.Model { if (!condition) { - throw new Exception(I18N.GetString("assertion failure")); + throw new Exception("assertion failure"); } } @@ -116,7 +116,7 @@ namespace Shadowsocks.Model { if (port <= 0 || port > 65535) { - throw new ArgumentException(I18N.GetString("Port out of range")); + throw new ArgumentException(I18N.GetString("Message.PortOutOfRange")); } } @@ -124,7 +124,7 @@ namespace Shadowsocks.Model { if (string.IsNullOrEmpty(password)) { - throw new ArgumentException(I18N.GetString("Password can not be blank")); + throw new ArgumentException(I18N.GetString("Message.PasswordCanNotBlank")); } } @@ -132,7 +132,7 @@ namespace Shadowsocks.Model { if (string.IsNullOrEmpty(server)) { - throw new ArgumentException(I18N.GetString("Server IP can not be blank")); + throw new ArgumentException(I18N.GetString("Message.ServerIPCanNotBlank")); } } diff --git a/shadowsocks-csharp/Model/Server.cs b/shadowsocks-csharp/Model/Server.cs index 4acc3a0e..5384f48b 100755 --- a/shadowsocks-csharp/Model/Server.cs +++ b/shadowsocks-csharp/Model/Server.cs @@ -22,7 +22,7 @@ namespace Shadowsocks.Model { if (string.IsNullOrEmpty(server)) { - return I18N.GetString("New server"); + return I18N.GetString("Config.NewServer"); } if (string.IsNullOrEmpty(remarks)) { diff --git a/shadowsocks-csharp/Properties/Resources.Designer.cs b/shadowsocks-csharp/Properties/Resources.Designer.cs index a5d9c107..7bc1a66d 100755 --- a/shadowsocks-csharp/Properties/Resources.Designer.cs +++ b/shadowsocks-csharp/Properties/Resources.Designer.cs @@ -71,37 +71,29 @@ namespace Shadowsocks.Properties { } /// - /// Looks up a localized string similar to Shadowsocks=Shadowsocks - ///Enable System Proxy=启用系统代理 - ///Mode=系统代理模式 - ///PAC=PAC 模式 - ///Global=全局模式 - ///Servers=服务器 - ///Edit Servers...=编辑服务器... - ///Start on Boot=开机启动 - ///Allow Clients from LAN=允许来自局域网的连接 - ///Edit PAC File...=编辑 PAC 文件... - ///Edit User Rule for GFWList...=编辑 GFWList 的用户规则... - ///Show QRCode...=显示二维码... - ///Scan QRCode from Screen...=扫描屏幕上的二维码... - ///Show Logs...=显示日志... - ///About...=关于... - ///Quit=退出 - ///Edit Servers=编辑服务器 - ///&Add=添加(&A) - ///&Delete=删除(&D) - ///Server=服务器 - ///Server IP=服务器 IP - ///Server Port=服务器端口 - ///Password=密码 - ///Encryption=加密 - ///Proxy Port=代理端口 - ///Remarks=备注 - ///OK= [rest of string was truncated]";. + /// Looks up a localized string similar to # translation for English + /// + ///Main.Shadowsocks=Shadowsocks + /// + ///# Menu items + /// + ///Menu.EnableSystemProxy=Enable System Proxy + ///Menu.Mode=Mode + ///Menu.PAC=PAC + ///Menu.Global=Global + ///Menu.Servers=Servers + ///Menu.EditServers2=Edit Servers... + ///Menu.StartOnBoot=Start on Boot + ///Menu.AllowClientsFromLAN=Allow Clients from LAN + ///Menu.LocalPAC=Local PAC + ///Menu.OnlinePAC=Online PAC + ///Menu.EditLocalPACFile=Edit Local PAC File... + ///Menu.UpdatePACFromGFWList=Update Local PAC from GFWList + ///Menu.EditUserRuleForGFWList=Edit User Rule [rest of string was truncated]";. /// - internal static string cn { + internal static string en { get { - return ResourceManager.GetString("cn", resourceCulture); + return ResourceManager.GetString("en", resourceCulture); } } @@ -203,5 +195,34 @@ namespace Shadowsocks.Properties { return ResourceManager.GetString("user_rule", resourceCulture); } } + + /// + /// Looks up a localized string similar to # translation for Simplified Chinese + /// + ///Main.Shadowsocks=Shadowsocks + /// + ///# Menu items + /// + ///Menu.EnableSystemProxy=启用系统代理 + ///Menu.Mode=系统代理模式 + ///Menu.PAC=PAC 模式 + ///Menu.Global=全局模式 + ///Menu.Servers=服务器 + ///Menu.EditServers2=编辑服务器... + ///Menu.StartOnBoot=开机启动 + ///Menu.AllowClientsFromLAN=允许来自局域网的连接 + ///Menu.LocalPAC=使用本地 PAC + ///Menu.OnlinePAC=使用在线 PAC + ///Menu.EditLocalPACFile=编辑本地 PAC 文件... + ///Menu.UpdatePACFromGFWList=从 GFWList 更新本地 PAC + ///Menu.EditUserRuleForGFWList=编辑 GFWList 的用户规则... + ///Menu.ShowQRCode=显示二维码... + ///Menu.ScanQRCodeFromScreen= [rest of string was truncated]";. + /// + internal static string zh_cn { + get { + return ResourceManager.GetString("zh_cn", resourceCulture); + } + } } } diff --git a/shadowsocks-csharp/Properties/Resources.resx b/shadowsocks-csharp/Properties/Resources.resx index aa851e6b..13ebecd5 100755 --- a/shadowsocks-csharp/Properties/Resources.resx +++ b/shadowsocks-csharp/Properties/Resources.resx @@ -121,9 +121,6 @@ ..\Data\abp.js.gz;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - ..\data\cn.txt;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 - ..\data\libsscrypto.dll.gz;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -151,4 +148,10 @@ ..\data\user-rule.txt;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 + + ..\data\zh_cn.txt;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 + + + ..\data\en.txt;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 + \ No newline at end of file diff --git a/shadowsocks-csharp/View/ConfigForm.cs b/shadowsocks-csharp/View/ConfigForm.cs index 574fafd5..6e12b9ed 100755 --- a/shadowsocks-csharp/View/ConfigForm.cs +++ b/shadowsocks-csharp/View/ConfigForm.cs @@ -40,18 +40,18 @@ namespace Shadowsocks.View private void UpdateTexts() { - AddButton.Text = I18N.GetString("&Add"); - DeleteButton.Text = I18N.GetString("&Delete"); - IPLabel.Text = I18N.GetString("Server IP"); - ServerPortLabel.Text = I18N.GetString("Server Port"); - PasswordLabel.Text = I18N.GetString("Password"); - EncryptionLabel.Text = I18N.GetString("Encryption"); - ProxyPortLabel.Text = I18N.GetString("Proxy Port"); - RemarksLabel.Text = I18N.GetString("Remarks"); - ServerGroupBox.Text = I18N.GetString("Server"); - OKButton.Text = I18N.GetString("OK"); - MyCancelButton.Text = I18N.GetString("Cancel"); - this.Text = I18N.GetString("Edit Servers"); + AddButton.Text = I18N.GetString("Config.Add"); + DeleteButton.Text = I18N.GetString("Config.Delete"); + IPLabel.Text = I18N.GetString("Config.ServerIP"); + ServerPortLabel.Text = I18N.GetString("Config.ServerPort"); + PasswordLabel.Text = I18N.GetString("Config.Password"); + EncryptionLabel.Text = I18N.GetString("Config.Encryption"); + ProxyPortLabel.Text = I18N.GetString("Config.ProxyPort"); + RemarksLabel.Text = I18N.GetString("Config.Remarks"); + ServerGroupBox.Text = I18N.GetString("Config.Server"); + OKButton.Text = I18N.GetString("Config.OK"); + MyCancelButton.Text = I18N.GetString("Config.Cancel"); + this.Text = I18N.GetString("Menu.EditServers"); } private void controller_ConfigChanged(object sender, EventArgs e) @@ -92,7 +92,7 @@ namespace Shadowsocks.View } catch (FormatException) { - MessageBox.Show(I18N.GetString("Illegal port number format")); + MessageBox.Show(I18N.GetString("Message.IllegalPortNumberFormat")); } catch (Exception ex) { @@ -201,7 +201,7 @@ namespace Shadowsocks.View } if (_modifiedConfiguration.configs.Count == 0) { - MessageBox.Show(I18N.GetString("Please add at least one server")); + MessageBox.Show(I18N.GetString("Message.AddAtLeastOneServer")); return; } controller.SaveServers(_modifiedConfiguration.configs, _modifiedConfiguration.localPort); diff --git a/shadowsocks-csharp/View/MenuViewController.cs b/shadowsocks-csharp/View/MenuViewController.cs index ff5a018c..4d8b97dd 100755 --- a/shadowsocks-csharp/View/MenuViewController.cs +++ b/shadowsocks-csharp/View/MenuViewController.cs @@ -82,7 +82,7 @@ namespace Shadowsocks.View void controller_Errored(object sender, System.IO.ErrorEventArgs e) { - MessageBox.Show(e.GetException().ToString(), String.Format(I18N.GetString("Shadowsocks Error: {0}"), e.GetException().Message)); + MessageBox.Show(e.GetException().ToString(), String.Format(I18N.GetString("Message.ShadowsocksError"), e.GetException().Message)); } private void UpdateTrayIcon() @@ -125,10 +125,10 @@ namespace Shadowsocks.View _notifyIcon.Icon = Icon.FromHandle(icon.GetHicon()); // we want to show more details but notify icon title is limited to 63 characters - string text = I18N.GetString("Shadowsocks") + " " + UpdateChecker.Version + "\n" + + string text = I18N.GetString("Main.Shadowsocks") + " " + UpdateChecker.Version + "\n" + (enabled ? - I18N.GetString("System Proxy On: ") + (global ? I18N.GetString("Global") : I18N.GetString("PAC")) : - String.Format(I18N.GetString("Running: Port {0}"), config.localPort)) // this feedback is very important because they need to know Shadowsocks is running + I18N.GetString("Message.SystemProxyOn") + (global ? I18N.GetString("Menu.Global") : I18N.GetString("Menu.PAC")) : + String.Format(I18N.GetString("Message.RunningPort"), config.localPort)) // this feedback is very important because they need to know Shadowsocks is running + "\n" + config.GetCurrentServer().FriendlyName(); _notifyIcon.Text = text.Substring(0, Math.Min(63, text.Length)); } @@ -146,34 +146,34 @@ namespace Shadowsocks.View private void LoadMenu() { this.contextMenu1 = new ContextMenu(new MenuItem[] { - this.enableItem = CreateMenuItem("Enable System Proxy", new EventHandler(this.EnableItem_Click)), - this.modeItem = CreateMenuGroup("Mode", new MenuItem[] { - this.PACModeItem = CreateMenuItem("PAC", new EventHandler(this.PACModeItem_Click)), - this.globalModeItem = CreateMenuItem("Global", new EventHandler(this.GlobalModeItem_Click)) + this.enableItem = CreateMenuItem("Menu.EnableSystemProxy", new EventHandler(this.EnableItem_Click)), + this.modeItem = CreateMenuGroup("Menu.Mode", new MenuItem[] { + this.PACModeItem = CreateMenuItem("Menu.PAC", new EventHandler(this.PACModeItem_Click)), + this.globalModeItem = CreateMenuItem("Menu.Global", new EventHandler(this.GlobalModeItem_Click)) }), - this.ServersItem = CreateMenuGroup("Servers", new MenuItem[] { + this.ServersItem = CreateMenuGroup("Menu.Servers", new MenuItem[] { this.SeperatorItem = new MenuItem("-"), - this.ConfigItem = CreateMenuItem("Edit Servers...", new EventHandler(this.Config_Click)), - CreateMenuItem("Show QRCode...", new EventHandler(this.QRCodeItem_Click)), - CreateMenuItem("Scan QRCode from Screen...", new EventHandler(this.ScanQRCodeItem_Click)) + this.ConfigItem = CreateMenuItem("Menu.EditServers2", new EventHandler(this.Config_Click)), + CreateMenuItem("Menu.ShowQRCode", new EventHandler(this.QRCodeItem_Click)), + CreateMenuItem("Menu.ScanQRCodeFromScreen", new EventHandler(this.ScanQRCodeItem_Click)) }), CreateMenuGroup("PAC ", new MenuItem[] { - this.localPACItem = CreateMenuItem("Local PAC", new EventHandler(this.LocalPACItem_Click)), - this.onlinePACItem = CreateMenuItem("Online PAC", new EventHandler(this.OnlinePACItem_Click)), + this.localPACItem = CreateMenuItem("Menu.LocalPAC", new EventHandler(this.LocalPACItem_Click)), + this.onlinePACItem = CreateMenuItem("Menu.OnlinePAC", new EventHandler(this.OnlinePACItem_Click)), new MenuItem("-"), - this.editLocalPACItem = CreateMenuItem("Edit Local PAC File...", new EventHandler(this.EditPACFileItem_Click)), - this.updateFromGFWListItem = CreateMenuItem("Update Local PAC from GFWList", new EventHandler(this.UpdatePACFromGFWListItem_Click)), - this.editGFWUserRuleItem = CreateMenuItem("Edit User Rule for GFWList...", new EventHandler(this.EditUserRuleFileForGFWListItem_Click)), - this.editOnlinePACItem = CreateMenuItem("Edit Online PAC URL...", new EventHandler(this.UpdateOnlinePACURLItem_Click)), + this.editLocalPACItem = CreateMenuItem("Menu.EditLocalPACFile", new EventHandler(this.EditPACFileItem_Click)), + this.updateFromGFWListItem = CreateMenuItem("Menu.UpdatePACFromGFWList", new EventHandler(this.UpdatePACFromGFWListItem_Click)), + this.editGFWUserRuleItem = CreateMenuItem("Menu.EditUserRuleForGFWList", new EventHandler(this.EditUserRuleFileForGFWListItem_Click)), + this.editOnlinePACItem = CreateMenuItem("PAC.EditOnlinePACURL2", new EventHandler(this.UpdateOnlinePACURLItem_Click)), }), new MenuItem("-"), - this.AutoStartupItem = CreateMenuItem("Start on Boot", new EventHandler(this.AutoStartupItem_Click)), - this.ShareOverLANItem = CreateMenuItem("Allow Clients from LAN", new EventHandler(this.ShareOverLANItem_Click)), + this.AutoStartupItem = CreateMenuItem("Menu.StartOnBoot", new EventHandler(this.AutoStartupItem_Click)), + this.ShareOverLANItem = CreateMenuItem("Menu.AllowClientsFromLAN", new EventHandler(this.ShareOverLANItem_Click)), new MenuItem("-"), - CreateMenuItem("Show Logs...", new EventHandler(this.ShowLogItem_Click)), - CreateMenuItem("About...", new EventHandler(this.AboutItem_Click)), + CreateMenuItem("Menu.ShowLogs", new EventHandler(this.ShowLogItem_Click)), + CreateMenuItem("Menu.About", new EventHandler(this.AboutItem_Click)), new MenuItem("-"), - CreateMenuItem("Quit", new EventHandler(this.Quit_Click)) + CreateMenuItem("Menu.Quit", new EventHandler(this.Quit_Click)) }); } @@ -217,19 +217,19 @@ namespace Shadowsocks.View void controller_UpdatePACFromGFWListError(object sender, System.IO.ErrorEventArgs e) { - ShowBalloonTip(I18N.GetString("Failed to update PAC file"), e.GetException().Message, ToolTipIcon.Error, 5000); + ShowBalloonTip(I18N.GetString("Message.FailedToUpdatePACFile"), e.GetException().Message, ToolTipIcon.Error, 5000); Logging.LogUsefulException(e.GetException()); } void controller_UpdatePACFromGFWListCompleted(object sender, GFWListUpdater.ResultEventArgs e) { - string result = e.Success ? I18N.GetString("PAC updated") : I18N.GetString("No updates found. Please report to GFWList if you have problems with it."); - ShowBalloonTip(I18N.GetString("Shadowsocks"), result, ToolTipIcon.Info, 1000); + string result = e.Success ? I18N.GetString("Message.PACUpdated") : I18N.GetString("Message.NoUpdatesFound"); + ShowBalloonTip(I18N.GetString("Main.Shadowsocks"), result, ToolTipIcon.Info, 1000); } void updateChecker_NewVersionFound(object sender, EventArgs e) { - ShowBalloonTip(String.Format(I18N.GetString("Shadowsocks {0} Update Found"), updateChecker.LatestVersionNumber), I18N.GetString("Click here to download"), ToolTipIcon.Info, 5000); + ShowBalloonTip(String.Format(I18N.GetString("Message.ShadowsocksUpdateFound"), updateChecker.LatestVersionNumber), I18N.GetString("Message.ClickHereToDownload"), ToolTipIcon.Info, 5000); _notifyIcon.BalloonTipClicked += notifyIcon1_BalloonTipClicked; _isFirstRun = false; } @@ -317,8 +317,8 @@ namespace Shadowsocks.View { if (_isFirstRun) { - _notifyIcon.BalloonTipTitle = I18N.GetString("Shadowsocks is here"); - _notifyIcon.BalloonTipText = I18N.GetString("You can turn on/off Shadowsocks in the context menu"); + _notifyIcon.BalloonTipTitle = I18N.GetString("Message.ShadowsocksIsHere"); + _notifyIcon.BalloonTipText = I18N.GetString("Message.TurnOnOffShadowsocksInContextMenu"); _notifyIcon.BalloonTipIcon = ToolTipIcon.Info; _notifyIcon.ShowBalloonTip(0); _isFirstRun = false; @@ -444,7 +444,7 @@ namespace Shadowsocks.View } else { - MessageBox.Show(I18N.GetString("Failed to decode QRCode")); + MessageBox.Show(I18N.GetString("Message.FailedToDecodeQRCode")); return; } double minX = Int32.MaxValue, minY = Int32.MaxValue, maxX = 0, maxY = 0; @@ -476,7 +476,7 @@ namespace Shadowsocks.View } } } - MessageBox.Show(I18N.GetString("No QRCode found. Try to zoom in or move it to the center of the screen.")); + MessageBox.Show(I18N.GetString("Message.NoQRCodeFound")); } void splash_FormClosed(object sender, FormClosedEventArgs e) @@ -492,7 +492,7 @@ namespace Shadowsocks.View private void AutoStartupItem_Click(object sender, EventArgs e) { AutoStartupItem.Checked = !AutoStartupItem.Checked; if (!AutoStartup.Set(AutoStartupItem.Checked)) { - MessageBox.Show(I18N.GetString("Failed to update registry")); + MessageBox.Show(I18N.GetString("Message.FailedToUpdateRegistry")); } } @@ -529,8 +529,8 @@ namespace Shadowsocks.View { string origPacUrl = controller.GetConfiguration().pacUrl; string pacUrl = Microsoft.VisualBasic.Interaction.InputBox( - I18N.GetString("Please input PAC Url"), - I18N.GetString("Edit Online PAC URL"), + I18N.GetString("PAC.InputPACUrl"), + I18N.GetString("PAC.EditOnlinePACURL"), origPacUrl, -1, -1); if (!string.IsNullOrEmpty(pacUrl) && pacUrl != origPacUrl) { diff --git a/shadowsocks-csharp/View/QRCodeForm.cs b/shadowsocks-csharp/View/QRCodeForm.cs index 2741d4ff..8e7b5dcc 100755 --- a/shadowsocks-csharp/View/QRCodeForm.cs +++ b/shadowsocks-csharp/View/QRCodeForm.cs @@ -22,7 +22,7 @@ namespace Shadowsocks.View this.code = code; InitializeComponent(); this.Icon = Icon.FromHandle(Resources.ssw128.GetHicon()); - this.Text = I18N.GetString("QRCode"); + this.Text = I18N.GetString("QRCode.QRCode"); } private void GenQR(string ssconfig) diff --git a/shadowsocks-csharp/shadowsocks-csharp.csproj b/shadowsocks-csharp/shadowsocks-csharp.csproj index aa2c9000..fc6d021f 100755 --- a/shadowsocks-csharp/shadowsocks-csharp.csproj +++ b/shadowsocks-csharp/shadowsocks-csharp.csproj @@ -198,8 +198,9 @@ - + +