起因

在某些情况下,有将从某种类型的语言翻译成另一种类型语言的需求。比如在生成实体时,可能需要将中文名称转换成英文。于是利用CEFSharp山寨了一个翻译器。效果图如下:

CEF简介

CEF全称为Chromium Emmbed Framework,是一个开源项目。用于嵌入基于 Google Chromium 项目的 Web 浏览器控件。

CEF在.NET中的应用

CEF是由C++所写,无法直接应用到.NET中。需要通过某种形式进行包装。常见的有Xilium.CefGlue和CEFSharp。我个人比较熟悉CEFSharp一些。

在CEFSharp的众多功能中,我最喜欢CEF执行JS代码、注册本地对象这两项功能,结合上述两项功能,可以作出很多有意思的效果出来。

由于CEFSharp的WPF版本在Win10会出现无法输入中文的问题,所以我一般都使用CEFSharp的WinForm版本,在WPF中,也是通过WindowsFormsHost来进行包装。

山寨翻译器的原理

山寨翻译器就是在界面上放了一个CEFSharp的浏览器,浏览器访问必应翻译。当在界面上输入中文时,利用JS代码将必应翻译页面的待翻译句子设为界面上的中文,然后利用JS代码模拟点击翻译按钮,当必应翻译获得结果时,利用JS调用本地代码将界面结果设置为必应翻译的结果。

此时,有人会提出疑问了。CEFSharp的浏览器在哪?我怎么没在界面上看到?其实这里用了一个小Trick,将浏览器的宽度和高度都设成了1像素,当然看不到了。

一些细节

延时触发翻译

当输入要翻译的中文较快时,如果每次输入一变化,就调用一次前文所说的翻译过程,这样效率比较低。而且还存在交互性问题,如果不阻塞用户的输入,这样在网络不稳定的情况下,先前的翻译结果可能最后才到,这样翻译结果就不准确了。如果阻塞的话,网络快还好说,网络慢输一下卡一下,体验极其不好。

所以我基于Blend的Interactivity新建了ThrottleInvokeCommandAction,可以在无操作后一定的时间调用命令。

翻译完成通知

由于我们不知道什么时候翻译完成了,此时可以监听DOMNodeInserted事件以得到通知。当事件发生时,会自动调用注册的本地对象的方法,不过在js中的方法名称和C#方法名称是不一样的,需要使用首字母小写的形式。

启用开发者工具

在CEF中,可以启用开发者工具,这样会方便我们的调试。在我的代码中,监听了CEF的键盘事件,当按下F12时,就显示开发者工具。

进阶

上述只是一个简单的翻译,在必应翻译页面上还有其他翻译可选项,可将其整合到山寨翻译器中。比如多个候选项的选择,或是将翻译过程整合到实体生成中。

代码下载

博客园:Translator

注意事项

  • 下载的源代码中缺少引用 的DLL,相关DLL见截图

获取cefsharp39可通过nuget,命令如下:Install-Package CefSharp.WinForms -Version 39.0.0

获取Prism可通过nuget,命令如下:Install-Package Prism -Version 4.1.0

  • 运行前请将cefsharp39相关引用文件复制到生成目录中。
  • 在工程属性的生成标签页上,请将目标平台设为x86。

利用CEF山寨一个翻译器的更多相关文章

  1. 利用ANTLR4实现一个简单的四则运算计算器

    利用ANTLR4实现一个简单的四则运算计算器 ANTLR4介绍 ANTLR能够自动地帮助你完成词法分析和语法分析的工作, 免去了手写去写词法分析器和语法分析器的麻烦 它是基于LL(k)的, 以递归下降 ...

  2. 学了C语言,如何利用cURL写一个程序验证某个网址的有效性?

    在<C程序设计伴侣>以及这几篇关于cURL的文章中,我们介绍了如何利用cURL写一个下载程序,从网络下载文件.可是当我们在用这个程序下载文件时,又遇到了新问题:如果这个网址是无效的,那么我 ...

  3. 学了C语言,如何利用CURL写一个下载程序?—用nmake编译CURL并安装

    在这一系列的前一篇文章学了C语言,如何为下载狂人写一个磁盘剩余容量监控程序?中,我们为下载狂人写了一个程序来监视磁盘的剩余容量,防止下载的东西撑爆了硬盘.可是,这两天,他又抱怨他的下载程序不好用,让我 ...

  4. 利用Matlab生成一个网格化的三维球面(生成直角坐标)

    利用Matlab生成一个网格化的三维球面,分别对径向方向.经度方向和纬度方向进行网格化,代码如下: %生成一个笛卡尔坐标系下球面网格的x,y,z坐标 %r为球面距离 %nJingdu,nWeidu分别 ...

  5. 利用Python实现一个感知机学习算法

    本文主要参考英文教材Python Machine Learning第二章.pdf文档下载链接: https://pan.baidu.com/s/1nuS07Qp 密码: gcb9. 本文主要内容包括利 ...

  6. 利用 vue-cli 构建一个 Vue 项目

    一.项目初始构建 现在如果要构建一个 Vue 的项目,最方便的方式,莫过于使用官方的 vue-cli . 首先,咱们先来全局安装 vue-cli ,打开命令行工具,输入以下命令: $ npm inst ...

  7. python基础一 ------利用生成器生成一个可迭代对象

    #利用生成器生成一个可迭代对象#需求:生成可迭代对象,输出指定范围内的素数,利用生成器产生一个可迭代对象#生成器:本身是可迭代的,只是 yield 好比return返回,yield返回后函数冻结状态, ...

  8. 利用Dockerfile构建一个基于CentOS 7镜像

    利用Dockerfile构建一个基于CentOS 7,包括java 8, tomcat 7,php ,mysql+mycat的镜像. Dockerfile内容如下: FROM centosMAINTA ...

  9. 10分钟,利用canvas画一个小的loading界面

    首先利用定义下canvas得样式 <canvas width="1024" height="720" id="canvas" styl ...

随机推荐

  1. sql-省市区

    insert into Area (codeid,parentid,cityName) values(11,0,'北京');insert into Area (codeid,parentid,city ...

  2. Unity获取object所有属性的一个方法,一些界面上没有开放的属性可以用该方法编辑

    static void PrintProperty () { if(Selection.activeObject == null) return; SerializedObject so = new ...

  3. s11 day Linux 和nginx 部署

      https://www.cnblogs.com/pyyu/p/9481344.html ,开机初始化的配置 iptables -F 清空防火墙 /etc/init.d/iptables stop ...

  4. OSX - libc++究竟是啥?

    libc++是什么?  libc++是C++标准库的实现! libc++ is an implementation of the C++ standard library, targeting C++ ...

  5. iOS method swizz

    1: 防止按钮在一定时间内重复响应默认1秒 // // UIButton+AvoidDoubleClick.h // 51WaywardShop // // Created by jisa on 20 ...

  6. iOS 卡顿

    1 使用 dispatch_async,也可能会出现卡顿. 由于mac系统允许overcommit,而iOS系统不允许overcommit 故要控制GCD队列的数量并且最好设置target queue ...

  7. Python 断言 assert 的用法

    assert 后边接的表达式的返回值必须是布尔值 assert expression, "对错误的描述信息" 如果expression表达式返回的是True, 程序正常执行, 如果 ...

  8. 在Load average 高的情况下如何鉴别系统瓶颈

    在Load average 高的情况下如何鉴别系统瓶颈.是CPU不足,还是io不够快造成? 或是内存不足? 一:查看系统负载vmstat procs -----------memory-------- ...

  9. PHP之旅4 php 超全局变量

    预定义数组: 自动全局变量---超全局数组 1.包含了来自web服务器,客户端,运行环境和用户输入的数据 2.这些数组比较特别 3.全局范围内自动生效,都可以直接使用这些数组 4.用户不能自定义这些数 ...

  10. 逆向工程生成的Mapper.xml以及*Example.java详解

    逆向工程生成的接口中的方法详解 在我上一篇的博客中讲解了如何使用Mybayis逆向工程针对单表自动生成mapper.java.mapper.xml.实体类,今天我们先针对mapper.java接口中的 ...