C#实现文件筛选读取并翻译的自动化工具
作者:CoolDog; 发布时间:2021-11-07 18:49:46
标签:C#,文件,筛选,读取,翻译
背景
我们项目一开始的所有提示都是中文,后来要做国际化。发现项目中的带双引号的中文居然有 2.3 w 多条!!!简直让人欲哭无泪...
如果使用人工改的话,首先不说正确率了。光是效率都是难难难。所以发挥了自己的才能写了一个自动化工具。
思路
首选读取项目文件夹下的所有文件路径
筛选路径文件后缀.只对.cs或自定义的文件操作读取
使用正则表达式进行查询并处理为数组
调用免费的百度翻译api进行任意类型的翻译
使用replace进行替换字符串,并保存
准备工作
1,百度智能云领取免费的api接口
2,创建应用
3,调试api
代码实现
以上准备工作就绪后,代码就比较容易实现了,完整控制台代码如下:
Program.cs
using Batch_translation;
using System.Text.RegularExpressions;
Console.WriteLine("请按下任意键进行批量翻译!");
Console.ReadLine();
string strFolderPath = "you FolderPath";//你的项目文件夹路径
string[] files = Directory.GetFiles(strFolderPath, "*", SearchOption.AllDirectories); // 获取文件夹下所有文件路径,包括子文件夹
string[] subFolders = Directory.GetDirectories(strFolderPath, "*", SearchOption.AllDirectories); // 获取所有子文件夹路径
foreach (var filePath in files)
{
//业务逻辑
if (filePath.EndsWith(".cs"))
{
BatchTran(filePath);//获取文件内容并进行转换操作
}
}
foreach (var folder in subFolders)
{
foreach (var filePath in Directory.GetFiles(folder))
{
//业务逻辑
if (filePath.EndsWith(".cs"))
{
BatchTran(filePath);//获取文件内容并进行转换操作
}
}
}
Console.WriteLine("转化完成");
void BatchTran(string filePath)
{
/* 核心逻辑:
首选读取项目文件夹下的所有文件路径
筛选路径文件后缀.只对.cs或自定义的文件操作读取
使用正则表达式进行查询并处理为数组
调用免费的百度翻译api进行任意类型的翻译
使用replace进行替换字符串,并保存
*/
BaiDuApi baiDuApi = new BaiDuApi("you apikey", "you secretKey");//百度api 初始化
string content = File.ReadAllText(filePath);//读取文本
string pattern = @"("".*[\u4E00-\u9FA5]+.*[\u4E00-\u9FA5]+.*"")";//定义所需要的正则表达式(ps:此正则表示查询英文双引号下的中文)
Regex myRegex = new Regex(pattern);
MatchCollection collection = myRegex.Matches(content);
foreach (Match match in collection)
{
var oldStr = "";
oldStr = match.Value;//.Substring(0, match.Value.Length - 1)
var newStr = baiDuApi.Translate(oldStr);
if (!string.IsNullOrEmpty(newStr))
content = content.Replace(oldStr, newStr);
}
if (collection.Count > 0)
// 将修改后的内容写入到文件中
File.WriteAllText(filePath, content);
}
BaiDuApi.cs
using System;
using System.IO;
using Newtonsoft.Json;
using RestSharp;
namespace Batch_translation
{
public class BaiDuApi
{
private readonly string apiKey;
private readonly string secretKey;
public BaiDuApi(string apiKey, string secretKey)
{
this.apiKey = apiKey;
this.secretKey = secretKey;
}
public string Translate(string sourceText)
{
var token = GetAccessToken(apiKey, secretKey);
if (token == "")
return "";
var client = new RestClient($"https://aip.baidubce.com/rpc/2.0/mt/texttrans/v1?access_token={token}");
var request = new RestRequest("", Method.Post);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Accept", "application/json");
// 定义一个匿名类型对象
var data = new { from = "zh", to = "en", q = sourceText };
// 将对象序列化成 JSON 字符串
string body = JsonConvert.SerializeObject(data);
request.AddParameter("application/json", body, ParameterType.RequestBody);
var response = client.Execute(request);
if (response.Content == null)
{
return "";
}
var dataResult = JsonConvert.DeserializeObject<BaiDuMode>(response.Content);
if (dataResult.result != null)
{
if (dataResult.result.trans_result != null && dataResult.result.trans_result.Count > 0)
{
return dataResult.result.trans_result[0].dst;
}
}
return sourceText;
}
/**
* 使用 AK,SK 生成鉴权签名(Access Token)
* @return 鉴权签名信息(Access Token)
*/
static string GetAccessToken(string API_KEY, string SECRET_KEY)
{
var client = new RestClient($"https://aip.baidubce.com/oauth/2.0/token");
var request = new RestRequest("", Method.Post);
request.AddParameter("grant_type", "client_credentials");
request.AddParameter("client_id", API_KEY);
request.AddParameter("client_secret", SECRET_KEY);
var response = client.Execute(request);
Console.WriteLine(response.Content);
if (response.Content == null)
return "";
var result = JsonConvert.DeserializeObject<dynamic>(response.Content);
return result.access_token.ToString();
}
}
}
来源:https://www.cnblogs.com/BFMC/p/17217831.html


猜你喜欢
- LinkedBlockingDeque介绍LinkedBlockingDeque是双向链表实现的双向并发阻塞队列。该阻塞队列同时支持FIFO
- 本文实例讲述了Java实现的两个线程同时运行。分享给大家供大家参考,具体如下:/** * 两个案例同时运行案例 * 1:这个两个线程并不是有
- 本文实例主要实现了网页照相机程序的功能。C#实现将网页保存成图片格式,简单实现网页拍照,主要是基于ActiveX 组件的网页快照类,Acit
- 废话不多说,先看效果,如果大家感觉不错,请参考实现代码这个功能我是用Fragmentdialog里面做的,也遇到不少坑第一,就是设置背景的d
- 抽象方法与虚方法的区别先说两者最大的区别:抽象方法是需要子类去实现的。虚方法是已经实现了的,可以被子类覆盖,也可以不覆盖,取决于需求。因为抽
- Spring-Context的作用spring-context提供应用程序上下文,这是Spring的依赖注入容器,它可能总是在以某种方式使用
- 1.先在build.gradle(Module)下添加引用viewPager2的库implementation 'androidx.
- 简述mysq5.7之后新增了json类型,但是在使用的过程中,Json数组中的值小于Integer.MAX_VALUE,则反序列化时会转成L
- C#的FileInfo类提供了与File类相同的功能,不同的是FileInfo提供的都是成员方法,使用示例如下所示:1、读文件://创建只读
- 1基本输入输出 static void main(string[] args) { cons
- 本文实例为大家分享了toolabar结合drawlayout使用方法,供大家参考,具体内容如下package alice.bw.com.da
- 一、项目概述之前有不少粉丝私信我说,能不能用Android原生的语言开发一款在手机上运行的游戏呢?说实话,使用java语言直接开发游戏这个需
- Eclipse提供了一个可扩展插件的开发系统。这就使得Eclipse在运行系统之上可以实现各种功能。这些插件也不同于其他的应用(插件的功能是
- 引用开源框架通过AsyncHttpClient进行文件上传,具体内容如下一、步骤:1.添加权限(访问网络权限和读写权限)2.获取上传文件路径
- MyBatis简介MyBatis前身是iBatis,是一个基于Java的数据持久层/对象关系映射(ORM)框架.MyBatis是对JDBC的
- 一、导入相关jar包,pom依赖如下: <dependency> <groupId>org
- 简介TreeMap使用红黑树存储元素,可以保证元素按key值的大小进行遍历。继承体系TreeMap实现了Map、SortedMap、Navi
- ionic App 解决android端在真机上 tab处于顶部的Bug在app.js 页面中添加以下代码.config(function(
- Android里有两个类android.view.GestureDetectorandroid.view.GestureDetector.S
- 后台管理页面往往需要登录才可以进行操作,这时就需要Seession来记录登录状态要实现起来也是非常简单,只需要自定义一个HandlerInt