1 LSGO软件技术团队
贡献人:马燕鹏
如果喜欢这里的内容,你能够给我最大的帮助就是转发,告诉你的朋友,鼓励他们一起来学习。
If you like the content here, the greatest help you can give me is forwarding, so tell your friends and encourage them to learn together.
这段时间除了做系里领导安排的电力公司的项目,就是准备下个学期的课程了,上课是个良心活,上好真的不容易。在备课的过程中需要查一些英文资料,而自己的英文 烂得跟狗屎 一样。于是想逼自己一下,把部分课程内容用英文来做。
上面是我在 MAC 上用 Markdown 做的 幻灯片,感觉还不错吧!有关Markdown的内容可以参见图文:使用有道云笔记的三个技巧 。如果有人对 用 Markdown 做幻灯片 感兴趣,我后面可以写一篇图文介绍一下。
由于自己的英文烂,又想做个上进的中老年,(有人管这种现象叫装逼),不得不借助于 Baidu翻译 这样的工具,但喜欢 DIY 的自己,用别人造好的轮子,总感觉不爽。于是,就有了做个 桌面版Baidu翻译 的念头。
说干就干,最直接的想法就是看看百度为开发者提供了哪些有关于翻译的 API 函数,于是我在 Baidu翻译开放平台 上进行了注册,网址如下:
http://api.fanyi.baidu.com/api/trans/product/index
网站截图如下:
从 通用翻译API技术文档 中,可以发现使用 POST 请求,传递的参数有:
其中,参数 sign
需要 appid
、salt
、query
和 密钥混合生成,不实在!!!
可能 百度 为了安全性,防止他人高频请求,占用它的带宽资源吧!我就是偶尔查查单词,对这玩意儿很是反感,于是在网上查,看看有没有不用 token 方式就可以调用 百度翻译API 接口的方法。
说来也巧,在这个网站中发现了用 Java 写的对 百度翻译API 的封装:
https://www.pocketdigi.com/20130626/1123.html
我采用这篇图文提供的 POST 参数配置方式(只需要 from
、to
、query
三个参数),并用 Postman 尝试做了请求:
有关 Postman 的使用方法可以参见图文:使用 PostMan 进行自动化测试
非常完美,得到了我们想要的 Json 结果!
from
表示翻译源语言;
to
表示译文语言;
src
表示原文
dst
表示译文
有了 Json 我们可以借助 Json.net 这套开源代码,来实现 Json 数据的反序列化,从而得到翻译之后的结果。Json.net 源码下载地址如下:
https://www.newtonsoft.com/json
至此,做 桌面版百度翻译 的技术路线就全部走通了,即:
通过 POST 请求得到返回的 Json 结果;
对 Json 结果进行反序列化,显示得到的结果;
下面让我们来写几个核心的函数,第一个 GetParam
,这个函数的作用是根据 text
、fromlang
和 tolang
来配置 POST 请求的参数,其中 fromlang
可以是 "auto" 百度会自动检测翻译原文的语言语种。
常见的语种有:
zh - 中文
en - 英文
jp - 日语
kor - 韩语
……
public string GetParam(string text, string fromlang, string tolang)
{
string urlEncode = Uri.EscapeDataString(text);
return "from=" + fromlang + "&to=" + tolang + "&query=" + urlEncode;
}
第二个函数 GetBaiduJson
得到返回的 Json 数据:
public string GetBaiduJson(string url, string param)
{
HttpWebRequest webRequest = WebRequest.Create(url) as HttpWebRequest;
if (webRequest == null)
return string.Empty;
webRequest.Method = "POST";
webRequest.ContentType = "application/x-www-form-urlencoded; charset=utf-8";
byte[] conLenByte = Encoding.UTF8.GetBytes(param);
webRequest.ContentLength = conLenByte.Length;
try
{
using (Stream requsetSteam = webRequest.GetRequestStream())
{
requsetSteam.Write(conLenByte, 0, conLenByte.Length);
requsetSteam.Close();
}
string json;
using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse())
{
Stream st = webResponse.GetResponseStream();
if (st == null)
return string.Empty;
if (webResponse.ContentEncoding.ToLower().Contains("gzip"))
st = new GZipStream(st, CompressionMode.Decompress);
using (StreamReader reader = new StreamReader(st, Encoding.UTF8))
{
json = reader.ReadToEnd();
reader.Close();
webResponse.Close();
}
}
return json;
}
catch
{
return string.Empty;
}
}
在介绍第三个函数之前,我们先定义 Json 反序列化之后,进行接收的类。
TransObj
类用来存储翻译之后的结果,From
为源语言,To
为目标语言,Data
为翻译之后的数据,由于翻译之后的数据可能为多条,所以此处是 List<TransResult>
链表。
[Serializable]
public class TransObj
{
public string From { get; set; }
public string To { get; set; }
public List<TransResult> Data { get; set; }
}
TransResult
类用来存储翻译之后的数据原型,Src
为翻译前的文本,Dst
为翻译后的文本。
[Serializable]
public class TransResult
{
public string Src { get; set; }
public string Dst { get; set; }
}
第三个 BaiduTranslate
函数用来得到百度翻译的结果。
public string BaiduTranslate(string text, string fromLanguage, string toLanguage)
{
string baiduTransUrl = "http://fanyi.baidu.com/transapi";
string param = GetParam(text, fromLanguage, toLanguage);
string resultHtml = GetBaiduHtml(baiduTransUrl, param);
try
{
StringReader sr = new StringReader(resultHtml);
JsonTextReader jsonReader = new JsonTextReader(sr);
JsonSerializer serializer = new JsonSerializer();
TransObj r = serializer.Deserialize<TransObj>(jsonReader);
string result = string.Empty;
for (int i = 0; i < r.Data.Count; i++)
{
result += r.Data[i].Dst + "\r\n";
}
return result.Remove(result.Length - 2, 2);
}
catch
{
return "待翻译内容是否为空?\r\n返回结果错误,请重试。";
}
}
核心代码全部写完之后,就要做个客户端程序来调用 BaiduTranslate
函数,从而实现当初所希望的结果啦!我做的 Demo 如下:
最后总结一下,通过做这个 桌面版百度翻译 小软件,大家是不是看到了 输出倒逼输入的威力! 有想法,就要去学,就要去践行。把知识内化,相信知识也有复利效应,随着时间的累积就会看到它的成效!好了,今天就到这里,See You!
经过8年多的发展,LSGO软件技术团队在地理信息系统、数据统计分析、计算机视觉领域积累了丰富的研发经验,也建立了人才培养的完备体系。
欢迎对算法设计与实现感兴趣的同学加入,与我们共同成长进步。
本微信公众平台长期系统化提供有关机器学习、软件研发、教育及学习方法、数学建模的知识,并将以上知识转化为实践。拒绝知识碎片化、耐心打磨技能、解决实际问题是我们的宗旨和追求。
欢迎关注,请扫描二维码: