WPF中,对单词拼写错误,textbox有相应的附加属性可以设置。

<TextBox SpellCheck.IsEnabled="True" />

但是此属性只在WPF 4,即.netFramework 4.0,才有效。

并且只支持English、Spanish、French 和German

LanguageTool

单词纠错,有一个第三方开源资源可以使用。

1. 官方纠错页面:https://www.languagetool.org/

2. LanguageTool API 接口

3. LanguageTool Github源码

如何使用LanguageTool

准备环境

1. 下载最新版本(桌面离线版

2.  解压后,点击languagetool-server.jar,启动服务器模式

启动前提:java环境  下载JavaSetup链接

如需要静默安装java环境,可以使用以下bat命令行:

 @echo off
cls set jdkPath=JavaSetup8u211.exe
rem 设置jdk安装路径,jre安装路径
set commonPath=C:\Program Files (x86)
set jreinstallPath="%commonPath%\jre1.8.0_211" echo.
echo 正在安装jre,需要二、三分钟,请不要执行其他操作
echo.
start /w %jdkPath% /L "%commonPath%\installjava.log" /s
ADDLOCAL="ToolsFeature,SourceFeature,PublicjreFeature"
INSTALLDIR=%jreinstallPath%
WEB_JAVA=0 AUTO_UPDATE=0
echo 安装完成,%jreinstallPath% pause

启动服务模式的方式:以命令行的方式启动

java -cp languagetool-server.jar org.languagetool.server.HTTPServer --port 8081

如果需要静默启动,可以新建一个bat文件,放在languageTool离线包文件的外面,使用以下bat脚本:

 @echo off

 echo.
echo 正在启动language-tool-server...
cd LanguageTool-4.5
echo java -cp languagetool-server.jar org.languagetool.server.HTTPServer --port 8081
java -cp languagetool-server.jar org.languagetool.server.HTTPServer --port 8081 pause

英语纠错

1. 调用纠错API

拼接访问地址

访问的端口,是上面环境准备时设置的,也可以使用其它的端口。

接口必填参数:语言、请求文本

请求文本,需要转换为Url编码字符串。

     private static string GetRequestUrl(string queryText, string language = "en-US")
{
var requestUrl = "http://localhost:8081/v2/check?" +
$"language={language}&text={WebUtility.UrlEncode(queryText)}"; return requestUrl;
}

请求Api,返回纠错结果。(返回结果,相对应的,也需要将Url编码字符串,转换回文本字符串)

     public static async Task<CheckEnglishSentenceResponse> CheckEnglishSentenceAsync(string queryText)
{
var requestUrl = GetRequestUrl(queryText);
var result = await RequestUrlAsync(requestUrl); var response = JsonConvert.DeserializeObject<CheckEnglishSentenceResponse>(result);
return response;
}

辅助方法:

     protected static async Task<string> RequestUrlAsync(string requestUrl)
{
if (string.IsNullOrWhiteSpace(requestUrl))
{
return string.Empty;
} try
{
return await RequestDataAsync(requestUrl);
}
catch (Exception e)
{
if (e.Message.Contains(""))
{
try
{
await Task.Delay(TimeSpan.FromSeconds());
return await RequestUrlAsync(requestUrl);
}
catch (Exception exception)
{
}
}
return string.Empty;
}
} private static async Task<string> RequestDataAsync(string requestUrl)
{
WebRequest translationWebRequest = WebRequest.Create(requestUrl); var response = await translationWebRequest.GetResponseAsync(); using (Stream stream = response.GetResponseStream())
{
using (StreamReader reader = new StreamReader(stream ?? throw new InvalidOperationException(),
Encoding.GetEncoding("utf-8")))
{
string result = reader.ReadToEnd();
var decodeResult = Unicode2String(result);
return decodeResult;
}
}
} /// <summary>
/// Unicode转字符串
/// </summary>
/// <param name="source">经过Unicode编码的字符串</param>
/// <returns>正常字符串</returns>
protected static string Unicode2String(string source)
{
return new Regex(@"\\u([0-9A-F]{4})", RegexOptions.IgnoreCase | RegexOptions.Compiled).Replace(
source, x => string.Empty + Convert.ToChar(Convert.ToUInt16(x.Result("$1"), )));
}

2. 解析纠错结果

数据类:

     [DataContract]
public class CheckEnglishSentenceResponse
{
[DataMember(Name = "matches")]
public List<EnglishSentenceCheckMatchInfo> MatchInfos { get; set; }
}
[DataContract]
public class EnglishSentenceCheckMatchInfo
{
[DataMember(Name = "message")]
public string Message { get; set; }
[DataMember(Name = "shortMessage")]
public string ShortMessage { get; set; } [DataMember(Name = "context")]
public CheckMatchContext CheckMatchContext { get; set; } [DataMember(Name = "replacements")]
public List<CheckMatchReplacement> Replacements { get; set; }
}
[DataContract]
public class CheckMatchContext
{
[DataMember(Name = "offset")]
public int StartIndex { get; set; }
[DataMember(Name = "length")]
public int Length { get; set; }
[DataMember(Name = "text")]
public string Text { get; set; }
} [DataContract]
public class CheckMatchReplacement
{
[DataMember(Name = "value")]
public string Replacement { get; set; }
}

纠错展示:

     string matchString = string.Empty;
int index = ;
if (MatchInfos != null)
{
foreach (var checkMatchInfo in MatchInfos)
{
var context = checkMatchInfo.CheckMatchContext;
var message = string.IsNullOrEmpty(checkMatchInfo.ShortMessage)? checkMatchInfo.Message: checkMatchInfo.ShortMessage;
matchString += $"{index++}. " + message + " : " + context.Text.Substring(context.StartIndex, context.Length) + "\r\n";
if (checkMatchInfo.Replacements != null && checkMatchInfo.Replacements.Count > )
{
matchString += "Suggest : " + checkMatchInfo.Replacements[].Replacement + "\r\n\r\n";
}
}
} return matchString;

以下是案例:

请求本地的后台接口时,会有访问记录:

此案例的源代码,可参考Github-ErrorCorrection

使用指导

安装Java环境

进入文件夹LanguageTool,点击打开InstallJavaEnvironment.bat安装Java

启动本地服务LanguageTool

进入文件夹LanguageTool,点击打开StartLanguageToolServer.bat,启动本地离线英语纠错服务。
访问方式:http://localhost:8081/v2/check?language=en-Us&text=buttton

C# 英语纠错 LanguageTool的更多相关文章

  1. 一名IT从业者的英语口语能力成长路径

    一名IT从业者的英语口语能力成长路径 来源: 微信公众号  发布时间: 2014-03-12 22:53  阅读: 6134 次  推荐: 24   原文链接   [收藏]   这篇文章是我最近十天口 ...

  2. 纠错式教学法对比鼓励式教学法 -----Lily、贝乐、英孚,乐加乐、剑桥国际、优学汇、北外青少

    一.关于两种英语教学法的争议 在英语教学方面,主要有纠错式教学法(目前主要对应国内听说读写四位一体的教学法)和鼓励式教学法(目前对应国内听说为主的教学法),这两种教学方法其实是各有千秋,各有利弊的. ...

  3. 你也可以手绘二维码(二)纠错码字算法:数论基础及伽罗瓦域GF(2^8)

    摘要:本文讲解二维码纠错码字生成使用到的数学数论基础知识,伽罗瓦域(Galois Field)GF(2^8),这是手绘二维码填格子理论基础,不想深究可以直接跳过.同时数论基础也是 Hash 算法,RS ...

  4. 课堂笔记&总结与遇错纠错篇

    一.课堂笔记 二.个人总结 在学习和工作JDK是必不可少的程序员必备工具,遇到问题可以在帮助文档寻找答案! 接受能力不足,老师讲的知识点过去了,我经常还在想上一个知识点.希望老师有时候重点可以讲慢点哈 ...

  5. 语法检查程序LanguageTool学习和使用笔记

    这是LanguageTool的官方语法规则说明,一定要仔细研究,学会这个语法,就可以自己编写语法检查规则了,这篇文档上说,编写这份语法检查文档,你甚至都不需要是一名程序员: http://wiki.l ...

  6. 《学技术练英语》PPT分享

    之前做的一个PPT,分享给博客园的同学. 下载地址: 学技术练英语.pdf 技术是靠自己去学的,学技术不能仅仅是看书看博客,最好是有实践,不管是做实验去验证,还是写各种代码去玩各种特性,还是造轮子都是 ...

  7. [下载]北京新版小学英语五年级上册mp3点读APP

    义务教育教科书小学英语五年级上册点读软件.根据2014年北京教改版教材编写,发音标准.实现点读功能.点到哪里读到哪里.哪里不会点哪里!北京教育科学研究院编写,北京出版社出版.ISBN:97872001 ...

  8. [Android下载]北京新版小学英语三年级上册点读手机软件

    小学英语三年级上册点读软件.根据2014年北京教改版教材编写,发音标准.实现点读功能.点到哪里读到哪里.哪里不会点哪里!北京教育科学研究院编写,北京出版社出版.ISBN:9787200108781   ...

  9. github 相关英语

    github 相关英语 repository n. 仓库 A repository contains all the files for your project, including the rev ...

随机推荐

  1. 《Java基础知识》Java接口和抽象类的区别

    抽象类 抽象类必须用 abstract 修饰,子类必须实现抽象类中的抽象方法,如果有未实现的,那么子类也必须用 abstract 修饰.抽象类默认的权限修饰符为 public,可以定义为 public ...

  2. tune kubernetes eviction parameter

    Highlight 本文会介绍kubernetes中关于集群驱逐的相关参数, 合理设置驱逐速率的考虑因素, 但是不会涉及node层面资源的驱逐阈值的设置. Basic 在kubernetes中, 如果 ...

  3. Winform项目常用配置方法

    在我们做项目的时候经常遇到需要动态配置系统的情况,比如说10台电脑装了同一个软件,需要识别唯一码,这时候我们会用到配置方法. 具体方法如下: 1) Config文件 里面增加你需要的变量,具体用法如下 ...

  4. 剑指offer笔记面试题2----实现Singleton模式

    题目:设计一个类,我们只能生成该类的一个实例. 解法一:单线程解法 //缺点:多线程情况下,每个线程可能创建出不同的的Singleton实例 #include <iostream> usi ...

  5. SSM框架整合之练习篇

    SSM的练习 : 1开发环境 数据库:mysql5.5以上版本. Jdk:1.7 开发环境:Eclipse mars2 Spring:4.2.4 Mybatis:3.2.7 Tomcat:7 2数据库 ...

  6. 开源Odoo13更新的模块功能信息(译文)

    本文来源江苏欧度软件:www.odooyun.com 本次Odoo13已于10月初发布,更新的模块有:Odoo会计模块.Odoo活动项目模块.Odoo13审批模块.Odoo评价.客户关系管理(CRM) ...

  7. Redis中几个简单的概念:缓存穿透/击穿/雪崩,别再被吓唬了

    Redis中几个“看似”高大上的概念,经常有人提到,某些好事者喜欢死扣概念,实战没多少,嘴巴里冒出来的全是高大上的名词,个人一向鄙视概念党,呵呵! 其实这几个概念:缓存穿透/缓存击穿/缓存雪崩,有一个 ...

  8. Bash脚本编程之脚本基础和bash配置文件

    脚本基础 参考资料:Shell Scripts (Bash Reference Manual) 不严谨地说,编程语言根据代码运行的方式,可以分为两种方式: 编译运行:需要先将人类可识别的代码文件编译成 ...

  9. CodeForces - 5C(思维+括号匹配)

    题意 https://vjudge.net/problem/CodeForces-5C 给出一个括号序列,求出最长合法子串和它的数量. 合法的定义:这个序列中左右括号匹配. 思路 这个题和普通的括号匹 ...

  10. react中使用prop-types检测props数据类型

    一.为什么使用prop-types 在多人开发时,当被人使用自己定义的组件时,有可能出现类型传错的情况,而在自己的组件上加上prop-types,他可以对父组件传来的props进行检查,加入父组件中想 ...