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
0
投稿
猜你喜欢
- kafka-console-consumer.sh解读kafka-console-consumer.sh 脚本是一个简易的消费者控制台。该
- INotifyPropertyChanged:该接口包含一个事件, 针对属性发生变更时, 执行该事件发生。// /
- 描述说明:public class TryCatchStu { /*try catch:自己处理异常 *t
- volatile 变量提供了线程的可见性,并不能保证线程安全性和原子性。什么是线程的可见性:锁提供了两种主要特性:互斥(mutual exc
- 这篇文章主要介绍了dotnet core链接mongodb代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价
- 前几天网上突然出现流言:某东发生数据泄露12G,最终某东在一篇声明中没有否认,还算是勉强承认了吧,这件事对于一般人有什么影响、应该怎么做已经
- 基于这段时间折腾redis遇到了各种问题,想着整理一下。本文主要介绍基于Spring+Mybatis以注解的形式整合Redis。废话少说,进
- 在java项目开发过程中,使用properties文件作为配置基本上是必不可少的,很多如系统配置信息,文件上传配置信息等等都是以这种方式进行
- 本文实例为大家分享了Java使用poi操作excel的具体代码,供大家参考,具体内容如下依赖poi的jar包,pom.xml配置如下:<
- Java中,只有8种基本类型不是对象,例如:4种整形类型(byte, short, int,long),2种浮点类型(flout, doub
- 如何将ResultSet结果集遍历到List中今天在使用jstl标签展示查询结果时遇到一个小问题,即如何将ResultSet对象传递给前台页
- Java阻塞队列阻塞队列和普通队列主要区别在阻塞二字:阻塞添加:队列已满时,添加元素线程会阻塞,直到队列不满时才唤醒线程执行添加操作阻塞删除
- 一般,我们的web应用都是只有在用户登录之后才允许操作的,也就是说我们不允许非登录认证的用户直接访问某些页面或功能菜单项。我还记得很久以前我
- 原文地址:http://www.javayihao.top/detail/84一:概述由于springboot项目,不管是java工程还是w
- 问题描述:在windows系统下,idea中,操作terminal控制台,使用git log查看日志时,出现如下乱码为什么参考网上很多的gi
- 先来看看效果:一、添加依赖库的步骤1.项目的gradle文件内的做以下改动allprojects { repositories
- 重点重点重点,不然会报错连接数据库url后面加个参数allowMultiQueries=true用习惯了 insertList 怎么能没有
- 如下所示:package com.unionx.wanxue; import java.util.Map; import java.util
- 利用java8流的特性,我们可以实现list中多个元素的 属性求和 并返回。案例:有一个借款待还信息列表,其中每一个借款合同包括:本金、手续
- maven没有打包xml文件的问题最近使用maven带管理项目,采用SSM的技术栈,在配置好一些配置文件,打包部署到tomcat上,出现没有