#region using System; using System.IO; using System.Net; using System.Security.Cryptography; using System.Text; using System.Threading; using System.Web; using System.Windows.Forms; using CSFrameworkV5.Core; using Newtonsoft.Json; #endregion namespace CSFrameworkV5.Language { /// /// 百度翻译 /// public class BaiduTrans { private string _appKey; private string _secretKey; private int _TryCount; /// /// 屏蔽默认构造器 /// private BaiduTrans() { } public BaiduTrans(string appKey, string secretKey) { _appKey = appKey; _secretKey = secretKey; } //付费接口 public bool IsNoMoney { get; set; } //使用免费翻译 public bool IsUseFreeAPI { get; set; } /// /// 百度翻译免费账号 /// /// public static BaiduTrans CreateDefault() { //国鹏免费账号 var tran = new BaiduTrans("20210427000804053", "5ZkKRBKxYyndy7_VhhLS"); tran.IsUseFreeAPI = true; return tran; } // 计算MD5值 public static string EncryptString(string str) { var md5 = MD5.Create(); // 将字符串转换成字节数组 var byteOld = Encoding.UTF8.GetBytes(str); // 调用加密方法 var byteNew = md5.ComputeHash(byteOld); // 将加密结果转换为字符串 var sb = new StringBuilder(); foreach (var b in byteNew) // 将字节转换成16进制表示的字符串, sb.Append(b.ToString("x2")); // 返回加密的字符串 return sb.ToStringEx(); } /// /// 还原特殊符号 /// /// 原始内容 /// 翻译后内容 /// private static string GetResult(string content, string baiduTrans) { if (string.IsNullOrWhiteSpace(baiduTrans)) return baiduTrans; //下滑线,check_time=检查\u时间 if (baiduTrans.ToLower().IndexOf(@"\u") > 0) baiduTrans = baiduTrans.Replace(@"\u", "_").Replace(@"\U", "_"); if (baiduTrans.ToLower().IndexOf(@"\ u") > 0 && content.IndexOf("_") > 0) baiduTrans = baiduTrans.Replace(@"\ u", "_") .Replace(@"\ U", "_"); if (baiduTrans.ToLower().IndexOf(@"\ ") > 0 && content.IndexOf("_") > 0) baiduTrans = baiduTrans.Replace(@"\ ", "_"); if (baiduTrans.ToLower().IndexOf(@"\") > 0 && content.IndexOf("_") > 0) baiduTrans = baiduTrans.Replace(@"\", "_"); //VCHAR39==>VCHAR39公司 if (baiduTrans.LastIndexOf("公司") > 0) { //尾部是公司 var ss = baiduTrans.Substring(baiduTrans.LastIndexOf("公司"), 2); if (ss == "公司" && (baiduTrans.ToLower().IndexOf("company") < 0 || baiduTrans.ToLower().IndexOf("corporation") < 0 || baiduTrans.ToLower().IndexOf("corp") < 0)) baiduTrans = baiduTrans.Replace("公司", ""); } //';单引号,转换为全局单引号 if (baiduTrans.LastIndexOf("'") > 0) baiduTrans = baiduTrans.Replace("';", "‘") .Replace("'", "‘").Replace("'", "‘"); return baiduTrans.Trim(); } /// /// 翻译内容 /// /// 内容 /// 源语言 /// 目标语言 /// public string Tran(string content, string from = "zh", string to = "eng") { if (string.IsNullOrWhiteSpace(content)) return string.Empty; //截取左右空格空白字符 content = content.Trim(); //如果使用免费翻译API,访问频率受限1s翻译一次 if (IsUseFreeAPI) { Application.DoEvents(); Thread.Sleep(1000); } //余额不足,不翻译 if (IsNoMoney) return content; var q = content; // 原文 var rd = new Random(); var salt = rd.Next(100000).ToStringEx(); var appId = _appKey; // 改成您的APP ID var secretKey = _secretKey; // 改成您的密钥 //MD5 var sign = EncryptString(appId + q + salt + secretKey); var url = "http://api.fanyi.baidu.com/api/trans/vip/translate?"; url += "q=" + HttpUtility.UrlEncode(q); url += "&from=" + from; url += "&to=" + to; url += "&appid=" + appId; url += "&salt=" + salt; url += "&sign=" + sign; var request = (HttpWebRequest)WebRequest.Create(url); request.Method = "GET"; request.ContentType = "text/html;charset=UTF-8"; request.UserAgent = null; request.Timeout = 6000; var response = (HttpWebResponse)request.GetResponse(); var myResponseStream = response.GetResponseStream(); var myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8")); var retString = myStreamReader.ReadToEnd(); myStreamReader.Close(); myResponseStream.Close(); var data = JsonConvert.DeserializeObject(retString); //翻译成功 if (data != null && data.trans_result != null && data.trans_result.Count > 0) { var str = data.trans_result[0].dst; //HTML转译 str = HttpUtility.HtmlDecode(str); var result = GetResult(content, str); //特殊处理 _TryCount = 0; //翻译成功,计算器重置 return result; } if (data.error_code == "54004") { //{"error_code":"54004","error_msg":"Please recharge"} IsNoMoney = true; //SetFreeAccount(); } else if (data.error_code == "54003") { //54003,Invalid Access Limit //SetFreeAccount1(); //流量限制,尝试最多翻译3次 _TryCount++; if (_TryCount < 5) return Tran(content); } else if (!string.IsNullOrEmpty(data.error_msg)) { throw new Exception( $"调用百度翻译API发生错误:{data.error_code},{data.error_msg}"); } _TryCount = 0; return content; } public class BaiduTransKey { public string ApiKey { get; set; } public string SecureKey { get; set; } } } }