最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

环球即时看!C# || 批量翻译工具 || 百度翻译api || 读取.cs文件内容 || 正则表达式筛选文件

来源:博客园


【资料图】

背景:

我们项目一开始的所有提示都是中文,后来要做国际化。发现项目中的带双引号的中文居然有2.3 w多条!!!简直让人欲哭无泪...

如果使用人工改的话,首先不说正确率了。光是效率都是难难难。所以发挥了自己的才能写了一个自动化工具。

思路:

  1. 首选读取项目文件夹下的所有文件路径
  2. 筛选路径文件后缀.只对.cs或自定义的文件操作读取
  3. 使用正则表达式进行查询并处理为数组
  4. 调用免费的百度翻译api进行任意类型的翻译
  5. 使用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(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(response.Content);            return result.access_token.ToString();        }    }}

结语:

在每次编码中成长,提升自己的思想。这只是一个很简陋的代码工具,如有好的建议也可以评论区讨论。感谢观看。

关键词: