• 为什么要用百度翻译?

从前是百度粉,现在我是百度黑,百度要完!

但是(真香),在各种翻译App中,我真的觉得百度的翻译最准确~~

不过也可能是个人喜好吧,勿喷。

  • 为啥要搞PC版?

因为英语能力有限,经常看外文的资料确实需要一个翻译软件,另一个,我记得以前是有PC端的百度翻译的,但是不知道为啥没有了。现在在用有道的,但是经常有比较智障。

所以,不如自己搞一个吧,先实现最简单的需求就好。

1、获取百度翻译API接口

网址:http://api.fanyi.baidu.com/api/trans/product/index

“通用”版本的功能基本够用,主要 免费!

注册个账号,然后你会得到属于你的 “AppID”和“密钥”

并且可以在“文档与支持”中找到Demo示例,有各种语言的。

2、创建程序并设计界面

简单点,搞一个WinForm程序

上下两个文本框,为了实现随着窗口大小自动变化,并且上下比例能随意拖动,是放在一个【SplitContainer】中的

3、翻译功能的实现

先贴代码,后面说明

using System;
using System.Text;
using System.Net;
using System.IO;
using System.Security.Cryptography;
using System.Web;
using Newtonsoft.Json.Linq;
using System.Collections.Generic;
using System.Linq;namespace Transink
{//用于解析返回的Json数据public class TransResult{public string src { get; set; }public string dst { get; set; }}public class BDTrans{//错误代码private KeyValuePair<string, string>[] ErroCodes;private string appId; //AppIDprivate string secretKey;  //密钥private string apiAdd;  //Api地址public BDTrans(){appId = "20191016000342007";secretKey = "uva6gEvgtMGAHHIhh0zK";apiAdd = "https://fanyi-api.baidu.com/api/trans/vip/translate?";InitErroCode();//把错误代码对应的信息加载一下}//src=原文本 from=原语言  to=目标语言//将接受的返回以字符串返回public string Translate(string src, string from, string to){string url = apiAdd;Random rd = new Random();string salt = rd.Next(100000).ToString();string sign = EncryptString(appId + src + salt + secretKey);url += "q=" + HttpUtility.UrlEncode(src);url += "&from=" + from;url += "&to=" + to;url += "&appid=" + appId;url += "&salt=" + salt;url += "&sign=" + sign;HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);request.Method = "GET";request.ContentType = "text/html;charset=UTF-8";request.UserAgent = null;request.Timeout = 6000;HttpWebResponse response = (HttpWebResponse)request.GetResponse();Stream myResponseStream = response.GetResponseStream();StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));string retString = myStreamReader.ReadToEnd();return ParseResponse(retString);}//解析反馈private string ParseResponse(string resStr){JObject retJson = JObject.Parse(resStr);List<JToken> tokens = new List<JToken>();List<TransResult> transResults = new List<TransResult>();string res = "";//如果有结果if (resStr.Contains("trans_result")){tokens = retJson["trans_result"].Children().ToList();foreach (JToken token in tokens){transResults.Add(token.ToObject<TransResult>());res += token.ToObject<TransResult>().dst +"\r\n";}}//如果错误if (resStr.Contains("error_code")){JToken token = retJson["error_code"];string erroCode = token.ToObject<string>();//根据错误代码查询对应信息var ErroStauts = ErroCodes.Where<KeyValuePair<string, string>>(x => x.Key == erroCode);if (ErroStauts.Count() == 0){res = "Unknown Error";}else{res = "Error: " + ErroStauts.ToList()[0].Value;}}return res;}//进行MD5加密public static string EncryptString(string str){MD5 md5 = MD5.Create();// 将字符串转换成字节数组byte[] byteOld = Encoding.UTF8.GetBytes(str);// 调用加密方法byte[] byteNew = md5.ComputeHash(byteOld);// 将加密结果转换为字符串StringBuilder sb = new StringBuilder();foreach (byte b in byteNew){// 将字节转换成16进制表示的字符串,sb.Append(b.ToString("x2"));}// 返回加密的字符串return sb.ToString();}//初始化错误代码映射字典private void InitErroCode(){ErroCodes = new KeyValuePair<string, string>[]{new KeyValuePair<string, string>("52001", "请求超时"),new KeyValuePair<string, string>("52002", "系统错误"),new KeyValuePair<string, string>("52003", "未授权用户"),new KeyValuePair<string, string>("54000", "必填参数为空 "),new KeyValuePair<string, string>("54001", "签名错误"),new KeyValuePair<string, string>("54003", "访问频率受限"),new KeyValuePair<string, string>("54004", "账户余额不足"),new KeyValuePair<string, string>("54005", "长query请求频繁"),new KeyValuePair<string, string>("58000", "客户端IP非法 "),new KeyValuePair<string, string>("58001", "译文语言方向不支持"),new KeyValuePair<string, string>("58002", "服务当前已关闭"),new KeyValuePair<string, string>("90107", "认证未通过或未生效")};}//根据字符判断所属语言,只实现中(2)英(1)文,其他的的统一为一类(0)private int detectLanguageChar(char c){int index = Convert.ToInt32(c);if (index > 13312 && index < 40895){return 2;}else if (index > 65 && index < 122){return 1;}else{return 0;}}//判断原文本可能是什么语言(那种语言的字符占的多)public string detectLanguage(string str){byte[] bytes = Encoding.UTF8.GetBytes(str);char[] chars = Encoding.UTF8.GetChars(bytes);int[] langP = new int[3] { 0, 0, 0 };for (int i = 0; i < chars.Length; i++){langP[detectLanguageChar(chars[i])] += 1;}int lang = -1;int max = 0;for (int i = 0; i < langP.Length; i++){if (langP[i] > max){max = langP[i];lang = i;}}switch (lang){case 1:return "en";case 2:return "zh";default:return "auto";}}}
}

首先

【Translate】方法: 就是执行翻译的主方法,进行url拼接、加密、发送请求,接收反馈,最后以字符串形式返回。具体可参考官方的文档。

【ParseResponse】方法: 就是解析反馈的内容,反馈是Json格式,使用了【Newtonsoft.Json】第三方包来解析Json字符串

【detectLanguage】方法: 检测当前输入的是什么语言,本来希望能识别出所有语言,但是发现貌似没那么简单,另外,我的需求也只是要自动识别中英文,把不是中文的翻译成中文,把中文自动翻译成英文,如果有需要,再指定语言就好。

具体怎么识别呢,调用【detectLanguageChar】方法,通过字符的UTF-8编码,中文大概是u4E00-u9FA5 和0x3400, 0x4DB5,取个大概,转换成10进制 (13312~40895)吧,英文26个大小写字母在41~5A和61~7A,取个大概,转换成10进制(65~122),然后根据输入的文本中,哪种字符占比多进行判断。

4、完成整个程序

也就是Form1.cs中的代码

4.1、窗口初始化和支持的语言列表

BDTrans trans;//支持的语言映射列表
List<KeyValuePair<string, string>> LangList;public Form1()
{InitializeComponent();//初始化语言列表InitLangs();trans = new BDTrans();
}//初始化并给两个ComboBox添加
public void InitLangs()
{LangList = new List<KeyValuePair<string, string>>();KeyValuePair<string, string>[] langs = new KeyValuePair<string, string>[]{new KeyValuePair<string,string>("auto","自动检测"),new KeyValuePair<string,string>("zh","中文"),new KeyValuePair<string,string>("en","英语"),new KeyValuePair<string,string>("yue","粤语"),new KeyValuePair<string,string>("wyw","文言文"),new KeyValuePair<string,string>("jp","日语"),new KeyValuePair<string,string>("kor","韩语"),new KeyValuePair<string,string>("fra","法语"),new KeyValuePair<string,string>("spa","西班牙语"),new KeyValuePair<string,string>("th","泰语"),new KeyValuePair<string,string>("ara","阿拉伯语"),new KeyValuePair<string,string>("ru","俄语"),new KeyValuePair<string,string>("pt","葡萄牙语"),new KeyValuePair<string,string>("de","德语"),new KeyValuePair<string,string>("it","意大利语"),new KeyValuePair<string,string>("el","希腊语"),new KeyValuePair<string,string>("nl","荷兰语"),new KeyValuePair<string,string>("pl","波兰语"),new KeyValuePair<string,string>("bul","保加利亚语"),new KeyValuePair<string,string>("est","爱沙尼亚语"),new KeyValuePair<string,string>("dan","丹麦语"),new KeyValuePair<string,string>("fin","芬兰语"),new KeyValuePair<string,string>("cs","捷克语"),new KeyValuePair<string,string>("rom","罗马尼亚语"),new KeyValuePair<string,string>("slo","斯洛文尼亚语"),new KeyValuePair<string,string>("swe","瑞典语"),new KeyValuePair<string,string>("hu","匈牙利语"),new KeyValuePair<string,string>("cht","繁体中文"),new KeyValuePair<string,string>("vie","越南语")};for (int i = 0; i < langs.Length; i++){LangList.Add(langs[i]);coBox_SrcLang.Items.Add(langs[i].Value);coBox_DstLang.Items.Add(langs[i].Value);}coBox_SrcLang.SelectedIndex = 0;coBox_DstLang.SelectedIndex = 1;
}

4.2、 自动翻译

给【tBox_Src】编辑框添加【TextChanged】事件

//中英文自动翻译
private void tBox_Src_TextChanged(object sender, EventArgs e)
{string src = tBox_Src.Text;string from = "en";string to = "zh";if (src != ""){///判断原语言from = trans.detectLanguage(tBox_Src.Text);if (from == "zh"){ to = "en"; }//根据检测到的语言 更新一下 comBox_SrcLang和comBox_DstLangcoBox_SrcLang.SelectedItem = LangList.Where<KeyValuePair<string, string>>(x => x.Key == from).ToList()[0].Value;coBox_DstLang.SelectedItem = LangList.Where<KeyValuePair<string, string>>(x => x.Key == to).ToList()[0].Value;string dst = trans.Translate(src, from, to);tBox_Dst.Text = dst;}else{tBox_Dst.Text = "";}}

4.3、 手动指定语言翻译

给【btn_Trans】按钮添加click事件:

private void btn_Trans_Click(object sender, EventArgs e)
{string from = LangList[coBox_SrcLang.SelectedIndex].Key;string to = LangList[coBox_DstLang.SelectedIndex].Key;string src = tBox_Src.Text;if (src != ""){                string dst = trans.Translate(src, from, to);tBox_Dst.Text = dst;}else{tBox_Dst.Text = "";}
}

4.4、让程序常驻

不能翻译两句,一不小心点关闭,又得重新开,

所以上一篇就用上了,让程序点关闭时,缩小到右下角通知栏

5、大功告成

翻译一下看看~

「桌面」怎样写一个自己的PC版百度翻译软件相关推荐

  1. 【Rust日报】 2019-06-04:「心得」如何改进一个棘手的并发接口

    「官方」Rust治理工作组即将公开 #official Rust的治理工作组(The Governance WG)即将公开,可以在其工作仓库中看到详细的工作章程. 简单来说,治理工作组是「其他团队」, ...

  2. 新浪微博桌面客户端 v3.0.5.35466 官方PC版

    新浪微博桌面客户端 v3.0.5.35466 官方PC版 软件大小:16.9MB 软件语言:简体中文 软件性质:常用软件 软件授权:官方版 更新时间:2014-04-29 应用平台:/WinXP/|W ...

  3. 「傻瓜」才能写出好代码!

    作者 | Esteban Gabriel 译者 | 弯月 责编 | 仲培艺 出品 | CSDN(ID:CSDNnews) 我觉得自己没有想象中那么聪明,而且还是一个健忘的人.正因如此,我写的代码才能一 ...

  4. 米家扫地机器人扫到一半停了_有了这个更智能的米家扫地机器人 1S,我终于「进化」成了一个废物...

    对于需要经常清理家里地面的人来说,买一个扫地机器人是个不错的选择.它相当于一个自动吸尘器,可以帮你完成繁琐重复的地面清洁工作.米家在 2016 年推出了第一款「米家扫地机器人」,时隔三年之后,它的升级 ...

  5. html怎么写分享代码,怎么写一个文件分享网页?百度一键分享按钮HTML代码

    怎么写一个文件分享网页?首先一个基本的网页包含主要的哪些就不说了,下面直接上关键的代码即可,把他放到需要的地方即可.下面一起来看看吧. 百度一键分享按钮HTML代码 下面是需要加分享按钮的css代码 ...

  6. 努比亚手机浏览器 安全证书失效_「前沿」小米10安卓11尝鲜版来了 | 倪飞出任中兴手机总经理...

    小白有品618钜惠活 日前,谷歌正式发布了Android 11 Beta 1版,相比Android 10其在很多方面都进行了升级,随后OPPO.小米.一加.vivo.realme等厂商陆续官宣将第一时 ...

  7. 「杂谈」如何写好R语言apply家族函数

    感觉好久没发有关R语言的博客了.这一年来,我着手开发了两个R包,但基本没怎么发博客. 原因也很简单,可能是我个人的私心吧,或者说是典型的"理论研究者"的"通病" ...

  8. Matlab中pickic_法语「野餐」怎么写?不是picnic哦

    沪江法语君按:用正确的单词约小伙伴去野餐吧. 法语中野餐究竟怎么写,Pique nique,Pique-nique,还是Picnic或者Pic nic? 在口语中,这个问题肯定没什么难的.它们的发音都 ...

  9. idea gui插件_「Java」 - 自写IntelliJ IDEA插件

    SDK项目基本上测试完成,剩下些边边角角的,因为涉及内网一些资源,没法完整发到Github上备份,拆分在这里记录一下. 基于TestNG框架每个测试人员都编写自己的Test类及相关case,通过IDE ...

最新文章

  1. MFC:多窗口函数、变量调用
  2. dedecms调用某一顶级栏目下二级标签
  3. 3.Java 面试题整理(线程篇)
  4. 语音识别介绍(下篇)
  5. mysql 中文 phpmyadmin_mysql中文乱码问题,phpmyadmin操作解决方法
  6. Java 中如何实现保留两位小数 — DecimalFormat
  7. split函数python_python有split函数吗
  8. 【TSP】基于matlab改进的人工鱼群算法求解旅行商问题【含Matlab源码 1479期】
  9. 数据库(SQL)面试题,基础知识(超全面)
  10. kali攻击139端口_入侵445端口-永恒之蓝漏洞利用-Metasploit
  11. 太原市山大附中2021年高考成绩查询,太原40所高中高考喜报汇总!
  12. 用命令启动java我的世界_我的世界Minecraft Mod开发学习笔记 - 实现一个简单的命令Mod...
  13. 欧美风相册PPT模板
  14. 199 c 通过函数名字符串调用函数
  15. Python之yaml与excel互相转换
  16. forEach、for…in、 for…of 的区别
  17. 人脸论文解读系列——三维人脸重建(一)
  18. 最近运气不好,愿乌云渐渐散去
  19. Github上找好东西的方法
  20. 关于移植MT7601Uusb无线网卡(小度wifi,360随身WIFI 2代)的后续

热门文章

  1. 物联网人工智能常用算法
  2. oracle 根节点函数,详解Oracle分析函数
  3. 冷热分离之OTS表格存储实战
  4. 将对象序列化存到redis缓存中
  5. 2022-10-07 数据结构和算法概述 --韩顺平
  6. vim教程:vimtutor
  7. i7 1260p和酷睿i7 12700h选哪个好?区别对比评测
  8. CSS学习(第四天)(浮动,常见网页布局,清除浮动,PS切图)
  9. 20221216:sigmastar系列1-222D硬件DIVP加速接口使用
  10. Android仿微信下拉