#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; }
}
}
}