#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
|
{
|
/// <summary>
|
/// 百度翻译
|
/// </summary>
|
public class BaiduTrans
|
{
|
private string _appKey;
|
private string _secretKey;
|
|
private int _TryCount;
|
|
/// <summary>
|
/// 屏蔽默认构造器
|
/// </summary>
|
private BaiduTrans()
|
{
|
}
|
|
public BaiduTrans(string appKey, string secretKey)
|
{
|
_appKey = appKey;
|
_secretKey = secretKey;
|
}
|
|
//付费接口
|
public bool IsNoMoney { get; set; }
|
|
//使用免费翻译
|
public bool IsUseFreeAPI { get; set; }
|
|
/// <summary>
|
/// 百度翻译免费账号
|
/// </summary>
|
/// <returns></returns>
|
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();
|
}
|
|
/// <summary>
|
/// 还原特殊符号
|
/// </summary>
|
/// <param name="content">原始内容</param>
|
/// <param name="baiduTrans">翻译后内容</param>
|
/// <returns></returns>
|
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();
|
}
|
|
/// <summary>
|
/// 翻译内容
|
/// </summary>
|
/// <param name="content">内容</param>
|
/// <param name="from">源语言</param>
|
/// <param name="to">目标语言</param>
|
/// <returns></returns>
|
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<BaiduTransResult>(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; }
|
}
|
}
|
}
|