起因

在某些情况下,有将从某种类型的语言翻译成另一种类型语言的需求。比如在生成实体时,可能需要将中文名称转换成英文。于是利用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. 浅谈java classloader

    本文由作者张远道授权网易云社区发布. 类加载器三杰 jvm有三类classloader,分别是bootstrap classloader,extended classloader以及system cl ...

  2. leetcode 75. 颜色分类 JAVA

    题目: 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 0. 1 和 2 分别表示红色.白色和 ...

  3. hdoj1180 诡异的楼梯(bfs+奇偶判断)

    手癌!日常手癌!被自己气死! #include<iostream> #include<cstring> #include<queue> #include<al ...

  4. 解决ie9以下浏览器对html5新增标签的不识别,并导致CSS不起作用的问题

    https://www.cnblogs.com/yangjie-space/p/4816279.html html5shiv.js和respond.min.js 做页面常用的东西,写这里用的时候省点去 ...

  5. webpack快速入门——配置文件:入口和出口,多入口、多出口配置

    1.在根目录新建一个webpack.config.js文件,然后开始配置: const path = require('path'); module.exports={ //入口文件的配置项 entr ...

  6. day 41 数据库初学习

    前情提要: 数据库初识别 一:数据库的介绍 https://github.com/Endless-Clould/homework/blob/master/student_system.sql 数据再这 ...

  7. pythonweb框架Flask学习笔记04-模板继承

    # -*- coding:utf-8 -*- from flask import render_template,Flask app=Flask(__name__) @app.route('/hell ...

  8. Unity 使用有限状态机 完美还原 王者荣耀 虚拟摇杆

    Unity 使用有限状态机 完美还原 王者荣耀 虚拟摇杆 效果如图所示 摇杆的UI组成 如图所示 简单的可以认为摇杆由1.2.3贴图组成 为摇杆的底座 为摇杆的杆 为摇杆的指向 可以理解这就是街机上的 ...

  9. php 实现繁体转简体代码效率对比

    第一份代码: <?php Header("Content-Type:text/html;charset=utf-8"); function microtime_float() ...

  10. Android中的各种访问权限Permission含义

    android.permission.EXPAND_STATUS_BAR 允许一个程序扩展收缩在状态栏,android开发网提示应该是一个类似Windows Mobile中的托盘程序 android. ...