圣诞节到了,于是在某个邮件列表上收到了这样一封信,“五种语言的圣诞快乐”:

  • 汉语版:圣诞快乐!
  • 英语版:麦瑞克瑞死没死!
  • 俄语版:买个萝卜切吧切吧炖了吧!
  • 韩语版:空起哇撒起哇, 米死搭!
  • 日语版:锅你得洗哇,碗你得洗哇,盆你得洗哇,锅碗盆你都得洗了哇!

后来有人贴了个更全的,于是有人猜测“这不是使用Google翻译做的吧?”哗,有意思的,我心想。以前也用过一个别人封装好的程序集,可以调用在线的Google Translate服务进行翻译。那么,我们现在自己来试试看吧。

使用Google Translate

Google Translate是一个在线工具,可以翻译五十多种语言。可惜的是,Google Translate并没有像Bing翻译那样直接提供RESTful和SOAP形式的API,不过这也给了我们一些探索的乐趣。目前Google Translate只提供一个脚本,您可以把它嵌入到网页中,这样便可以使用其翻译功能了。例如,您可以在页面上放置这样的内容:

<div id="google_translate_element">圣诞快乐</div><script>function googleTranslateElementInit() {new google.translate.TranslateElement({pageLanguage: 'zh-CN'}, 'google_translate_element');}
</script><script src="http://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script>

于是乎:

以上是我选择将其翻译为英语后的结果——当然Google Translate可以让你选择五十多种目标语言。

获取语言信息

使用Fiddler抓包后便可以发现,在页面加载时Google Translate的脚本首先会去加载所有它支持的语言:

GET /translate_a/l?client=te&hl=en&cb=_callbacks_._0g3matv3f HTTP/1.1
Accept: */*
Referer: http://localhost:46714/translate.html
Accept-Language: en-us
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E; OfficeLiveConnector.1.3; OfficeLivePatch.0.0)
Accept-Encoding: gzip, deflate
Host: translate.googleapis.com
Connection: Keep-Alive

这样便会得到这样的结果:

_callbacks_._0g3matv3f({'sl':{'auto':'Detect language','af':'Afrikaans','sq':'Albanian','ar':'Arabic','be':'Belarusian','bg':'Bulgarian','ca':'Catalan','zh-CN':'Chinese','hr':'Croatian','cs':'Czech','da':'Danish','nl':'Dutch','en':'English','et':'Estonian','tl':'Filipino','fi':'Finnish','fr':'French','gl':'Galician','de':'German','el':'Greek','iw':'Hebrew','hi':'Hindi','hu':'Hungarian','is':'Icelandic','id':'Indonesian','ga':'Irish','it':'Italian','ja':'Japanese','ko':'Korean','lv':'Latvian','lt':'Lithuanian','mk':'Macedonian','ms':'Malay','mt':'Maltese','no':'Norwegian','fa':'Persian','pl':'Polish','pt':'Portuguese','ro':'Romanian','ru':'Russian','sr':'Serbian','sk':'Slovak','sl':'Slovenian','es':'Spanish','sw':'Swahili','sv':'Swedish','th':'Thai','tr':'Turkish','uk':'Ukrainian','vi':'Vietnamese','cy':'Welsh','yi':'Yiddish'},'tl':{'af':'Afrikaans','sq':'Albanian','ar':'Arabic','be':'Belarusian','bg':'Bulgarian','ca':'Catalan','zh-CN':'Chinese (Simplified)','zh-TW':'Chinese (Traditional)','hr':'Croatian','cs':'Czech','da':'Danish','nl':'Dutch','en':'English','et':'Estonian','tl':'Filipino','fi':'Finnish','fr':'French','gl':'Galician','de':'German','el':'Greek','iw':'Hebrew','hi':'Hindi','hu':'Hungarian','is':'Icelandic','id':'Indonesian','ga':'Irish','it':'Italian','ja':'Japanese','ko':'Korean','lv':'Latvian','lt':'Lithuanian','mk':'Macedonian','ms':'Malay','mt':'Maltese','no':'Norwegian','fa':'Persian','pl':'Polish','pt':'Portuguese','ro':'Romanian','ru':'Russian','sr':'Serbian','sk':'Slovak','sl':'Slovenian','es':'Spanish','sw':'Swahili','sv':'Swedish','th':'Thai','tr':'Turkish','uk':'Ukrainian','vi':'Vietnamese','cy':'Welsh','yi':'Yiddish'}})

不过,您一定发现了,这些数据为什么是英文的呢?根据经验,这是由浏览器的语言首选项决定的。因此,我将zh-CN加入语言列表中的最上方,在IE里可以在Tools – Internet Options的General标签中设置Languages:

此时再次刷新页面,就会发现界面变成了中文,而Google Translate也会使用另外的地址来加载语言信息:

GET /translate_a/l?client=te&hl=zh-CN&cb=_callbacks_._0g3mb650r HTTP/1.1
Accept: */*
Referer: http://localhost:46714/translate.html
Accept-Language: zh-CN,en-US;q=0.5
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E; OfficeLiveConnector.1.3; OfficeLivePatch.0.0)
Accept-Encoding: gzip, deflate
Host: translate.googleapis.com
Connection: Keep-Alive

其得到的结果是:

_callbacks_._0g3mb650r({'sl':{'auto':'检测语言','sq':'阿尔巴尼亚语','ar':'阿拉伯语','ga':'爱尔兰语','et':'爱沙尼亚语','be':'白俄罗斯语','bg':'保加利亚语','is':'冰岛语','pl':'波兰语','fa':'波斯语','af':'布尔文(南非荷兰语)','da':'丹麦语','de':'德语','ru':'俄语','fr':'法语','tl':'菲律宾语','fi':'芬兰语','ko':'韩语','nl':'荷兰语','gl':'加利西亚语','ca':'加泰罗尼亚语','cs':'捷克语','hr':'克罗地亚语','lv':'拉脱维亚语','lt':'立陶宛语','ro':'罗马尼亚语','mt':'马耳他语','ms':'马来语','mk':'马其顿语','no':'挪威语','pt':'葡萄牙语','ja':'日语','sv':'瑞典语','sr':'塞尔维亚语','sk':'斯洛伐克语','sl':'斯洛文尼亚语','sw':'斯瓦希里语','th':'泰语','tr':'土耳其语','cy':'威尔士语','uk':'乌克兰语','es':'西班牙语','iw':'希伯来语','el':'希腊语','hu':'匈牙利语','it':'意大利语','yi':'意第绪语','hi':'印地语','id':'印尼语','en':'英语','vi':'越南语','zh-CN':'中文'},'tl':{'sq':'阿尔巴尼亚语','ar':'阿拉伯语','ga':'爱尔兰语','et':'爱沙尼亚语','be':'白俄罗斯语','bg':'保加利亚语','is':'冰岛语','pl':'波兰语','fa':'波斯语','af':'布尔文(南非荷兰语)','da':'丹麦语','de':'德语','ru':'俄语','fr':'法语','tl':'菲律宾语','fi':'芬兰语','ko':'韩语','nl':'荷兰语','gl':'加利西亚语','ca':'加泰罗尼亚语','cs':'捷克语','hr':'克罗地亚语','lv':'拉脱维亚语','lt':'立陶宛语','ro':'罗马尼亚语','mt':'马耳他语','ms':'马来语','mk':'马其顿语','no':'挪威语','pt':'葡萄牙语','ja':'日语','sv':'瑞典语','sr':'塞尔维亚语','sk':'斯洛伐克语','sl':'斯洛文尼亚语','sw':'斯瓦希里语','th':'泰语','tr':'土耳其语','cy':'威尔士语','uk':'乌克兰语','es':'西班牙语','iw':'希伯来语','el':'希腊语','hu':'匈牙利语','it':'意大利语','yi':'意第绪语','hi':'印地语','id':'印尼语','en':'英语','vi':'越南语','zh-TW':'中文(繁体)','zh-CN':'中文(简体)'}})

而其中标红的部分,便是tl(我猜测是Target Language的意思)所对应的JSON格式,我们可以使用以下代码来获取所有的语言信息:

private static Dictionary<string, string> GetLanguages()
{var url ="http://translate.googleapis.com" +"/translate_a/l?client=te&hl=zh-CN&cb=_callbacks_._0g3mb650r";var webClient = new WebClient();var script = webClient.DownloadString(url);var json = Regex.Match(script, @"'tl':({.+})}\)").Groups[1].Value;var serializer = new JavaScriptSerializer();return serializer.Deserialize<Dictionary<string, string>>(json);
}

进行翻译

点击页面上的下拉列表可以进行翻译。例如我们选择“英语”之后,Fiddler便会捕获到一个POST请求:

POST /translate_a/t?client=te&format=html&v=1.0 HTTP/1.1
Accept: */*
Accept-Language: zh-CN
Referer: http://translate.googleapis.com/translate_static/js/element/hrs.swf
x-flash-version: 10,0,32,18
Content-Type: application/x-www-form-urlencoded
Google-Translate-Referer: http://localhost:46714/translate.html
Content-Length: 58
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E; OfficeLiveConnector.1.3; OfficeLivePatch.0.0)
Host: translate.googleapis.com
Connection: Keep-Alive
Pragma: no-cacheq=%E5%9C%A3%E8%AF%9E%E5%BF%AB%E4%B9%90&sl=zh-CN&tl=en&tc=1

可以看到,需要翻译的文字将作为q被传输到服务器端。这个请求会得到翻译后的结果:

"Merry Christmas"

于是代码也就很容易写出了:

private static string Translate(string source, string sl, string tl)
{var url ="https://translate.googleapis.com" +"/translate_a/t?client=te&format=html&v=1.0";var data = String.Format("q={0}&sl={1}&tl={2}&tc=1",HttpUtility.UrlEncode(source), sl, tl);var webClient = new WebClient();webClient.Encoding = Encoding.UTF8;webClient.Headers.Add(HttpRequestHeader.UserAgent,"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0;)");var json = webClient.UploadString(url, data);var serializer = new JavaScriptSerializer();return serializer.Deserialize<string>(json);
}

在试验过程中,您可以使用Fiddler的Request Builder功能来发起一些测试请求,这样便可以得知怎么样的Header信息可以获得正确的结果。例如在这里,我发现如果不添加User Agent信息,Google Translate便会返回一些非常奇怪的内容。

组合

既然有了以上两个方法,输出翻译结果也再简单不过了:

var languages = GetLanguages();var targetLanguages = languages.Select(p => String.Format("{0}: {1}",p.Value,Translate("圣诞快乐", "zh-CN", p.Key)));File.WriteAllLines("output.txt", targetLanguages.ToArray());

由于语言非常古怪,因此无法在Console上输出,我只能将其直接写到UTF-8的文件中去——最后的结果还是相当有趣的。

  • 阿尔巴尼亚语:Gëzuar Krishtlindjet
  • 阿拉伯语:عيد ميلاد مجيد
  • 爱尔兰语:Nollaig Shona
  • 爱沙尼亚语:Häid jõule
  • 白俄罗斯语:З Калядамі
  • 保加利亚语:Весела Коледа
  • 冰岛语:Gleðlieg jól
  • 波兰语:Wesołych Świąt
  • 波斯语:کریسمس مبارک
  • 布尔文(南非荷兰语):Geseënde Kersfees
  • 丹麦语:Glædelig jul
  • 德语:Frohe Weihnachten
  • 俄语:С Рождеством
  • 法语:Joyeux Noël
  • 菲律宾语:Maligayang Pasko
  • 芬兰语:Hyvää joulua
  • 韩语:즐거운 성탄절 되세요
  • 荷兰语:Vrolijk kerstfeest
  • 加利西亚语:Feliz Nadal
  • 加泰罗尼亚语:Bon Nadal
  • 捷克语:Veselé vánoce
  • 克罗地亚语:Sretan Božić
  • 拉脱维亚语:Priecīgus Ziemassvētkus
  • 立陶宛语:Linksmų Kalėdų
  • 罗马尼亚语:Crăciun fericit
  • 马耳他语:li-Mliied it-Tajjeb
  • 马来语:Selamat Hari Krismas
  • 马其顿语:Среќен Божиќ
  • 挪威语:God jul
  • 葡萄牙语:Feliz Natal
  • 日语:メリークリスマス
  • 瑞典语:God jul
  • 塞尔维亚语:Срећан Божић
  • 斯洛伐克语:Veselé vánoce
  • 斯洛文尼亚语:Vesel božič
  • 斯瓦希里语:Krisimasi Njema
  • 泰语:สุขสันต์วันคริสต์มาส
  • 土耳其语:Mutlu Noeller
  • 威尔士语:Nadolig Llawen
  • 乌克兰语:З Різдвом
  • 西班牙语:Feliz Navidad
  • 希伯来语:חג מולד שמח
  • 希腊语:Καλά Χριστούγεννα
  • 匈牙利语:Boldog Karácsonyt
  • 意大利语:Buon Natale
  • 意第绪语:לעבעדיק ניטל
  • 印地语:क्रिसमस की शुभकामनाएँ
  • 印尼语:Selamat Hari Natal
  • 英语:Merry Christmas
  • 越南语:Giáng sinh Vui vẻ
  • 中文(繁体):聖誕快樂
  • 中文(简体):圣诞快乐

完整代码

相关文章

  • 五十种语言的“圣诞快乐”(上):分析与实现
  • 五十种语言的“圣诞快乐”(下):F#实现

转载于:https://my.oschina.net/abcijkxyz/blog/721549

五十种语言的“圣诞快乐”(上):分析与实现相关推荐

  1. 50种语言的圣诞快乐

    中文(简体):圣诞快乐 中文(繁体):聖誕快樂 阿尔巴尼亚语:Gëzuar Krishtlindjet 阿拉伯语:عيد ميلاد مجيد 爱尔兰语:Nollaig Shona 爱沙尼亚语:Häi ...

  2. 20种语言说圣诞快乐

      China(中国) - Sheng Tan Kuai Le Italy(意大利) - Bion Natale Belgium(比利时) - Zalige Kertfeest Mexico(墨西哥) ...

  3. C语言笔记 第三十五课 数组参数和指针参数分析

    第三十五课 数组参数和指针参数分析 思考:为什么C语言中的数组参数会退化为指针? 退化的意义 C语言中只会以值拷贝的方式传输参数 当向函数传递数组时:(错误的,设计当初的思路) 将整个数组拷贝一份传入 ...

  4. 五十种巧妙优化SQL Server数据库

    五十种巧妙优化SQL Server数据库的方法:出现性能问题的原因- 没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷). I/O吞吐量小,形成了瓶颈效应. 没有创建计算列导致查询不 ...

  5. 圣诞快乐 | 盘点2017最受欢迎的原创文章

    2017 圣诞来了!祝大家圣诞快乐,也祝愿大家有过一个充满快乐回忆和收获满满的 2017 ! 在昨天 ACOUG 的年终活动上,云和恩墨的优化专家罗海雄,分享了一个主题,他说为了让大家放松一下,度过一 ...

  6. python语言的实验心得体会_爱的五种语言——“好妈妈”培训班家教情商课课堂纪实!...

    12月26日晚,荷地镇"七群体七服务"专题培训暨首届"好妈妈"培训班第五节课开课.讲师团成员.东坪村村委会副主任吴丽云以<爱的五种语言>为题为培训班 ...

  7. C语言对于轴对称图形输出的分析

    开发环境:Turbo C 2.0    *   *** ***** ******* *****   ***    * 题目很简单就是输出如图所示的图形,图形用你喜欢的图形输出即可:*,~,-,+等. ...

  8. html圣诞快乐英文,圣诞快乐英语,圣诞快乐英语简写?

    [圣诞快乐]用外语怎么说? 圣诞节快乐:Merry Christmas.圣诞老人的原型在历史上确有真人.他是生活在公元4世纪米拉城(今土耳其境内)的主教圣尼古拉斯.在公元四世纪的时候,尼古拉斯出. 圣 ...

  9. 【圣诞树代码】送她六棵圣诞树,祝她圣诞快乐~(送女朋友必备!)

    " 六棵圣诞树,满足她圣诞愿望 " 距离25号圣诞节只有几天了,程序员有属于程序员的浪漫,这不来了~ 如果一颗圣诞树不够,那就送她六棵,祝她圣诞快乐~ 直接上效果图-- 01 02 ...

最新文章

  1. MySQL server PID file could not be found!
  2. 06年做的一个配置,从net130转过来的
  3. 【程序员轶事】程序员的1927年12月31日午夜一秒谜案
  4. 演练3-1:留言管理系统的制作
  5. 2021 第三封拒信 来自牛津大学自主智能机器和系统 Autonomous Intelligent Machines and Systems
  6. ducker桌面版更改安装位置_Ubuntu 16.04 安装 Docker和默认存储路径修改
  7. python网络爬虫面试题,搞定这套Python爬虫面试题(面试会so easy)
  8. 使用C#发送Http 请求实现模拟登陆(以博客园为例)
  9. c语言出勤率随机,c
  10. html跨页面提取表单,HTML页面提取参数如何通过表单传递?
  11. 测试环境搭建流程_软件测试流程
  12. c语言中文件的四种读取方法
  13. js表格实现行、列冻结
  14. 20年ICPC澳门站L - Random Permutation
  15. Python3 获取法定节假日
  16. java电商网站建设教程_java开发电商系统实战开发视频教程
  17. CentOS ping本机ip,能ping通,外网ping不通
  18. Intel汇编-无符号整数除法
  19. JSON解析基础使用知识-Java
  20. Marioの《计算机程序设计艺术》读书笔记:数学归纳法

热门文章

  1. cf-666 div2: E Monster Invaders (动态规划)
  2. c语言中可以输入中文标点符号,SCIM中 输入中文标点符号的方法
  3. 兄弟连教育python培训
  4. (蓝桥杯)Sine之舞
  5. 一文入门Go静态单赋值(SSA)
  6. mysql及格率70以上_五个 SQL 查询性能测试题,只有 40% 及格率,你敢来挑战吗?| 原力计划...
  7. 毕业设计 Arduino智能灌溉系统 - 嵌入式 单片机 物联网
  8. 开源许可协议:GPL、LGPL、AGPL、MPL和BSD、MIT、Apache
  9. 基于自杀领域个性化知识图谱的社交媒体自杀意念检测
  10. spring boot通过微信扫码登录