翼度科技»论坛 编程开发 .net 查看内容

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

2

主题

2

帖子

6

积分

新手上路

Rank: 1

积分
6
背景:

我们项目一开始的所有提示都是中文,后来要做国际化。发现项目中的带双引号的中文居然有 2.3 w 多条!!!简直让人欲哭无泪...
如果使用人工改的话,首先不说正确率了。光是效率都是难难难。所以发挥了自己的才能写了一个自动化工具。
思路:


  • 首选读取项目文件夹下的所有文件路径
  • 筛选路径文件后缀.只对.cs或自定义的文件操作读取
  • 使用正则表达式进行查询并处理为数组
  • 调用免费的百度翻译api进行任意类型的翻译
  • 使用replace进行替换字符串,并保存
准备工作:

1,百度智能云领取免费的api接口


 
 
 
2,创建应用


 
 
3,调试api


 
 
 
代码实现:

以上准备工作就绪后,代码就比较容易实现了,完整控制台代码如下:
Program.cs
 
  1. using Batch_translation;
  2. using System.Text.RegularExpressions;
  3. Console.WriteLine("请按下任意键进行批量翻译!");
  4. Console.ReadLine();
  5. string strFolderPath = "you FolderPath";//你的项目文件夹路径
  6. string[] files = Directory.GetFiles(strFolderPath, "*", SearchOption.AllDirectories); // 获取文件夹下所有文件路径,包括子文件夹
  7. string[] subFolders = Directory.GetDirectories(strFolderPath, "*", SearchOption.AllDirectories); // 获取所有子文件夹路径
  8. foreach (var filePath in files)
  9. {
  10.     //业务逻辑
  11.     if (filePath.EndsWith(".cs"))
  12.     {
  13.         BatchTran(filePath);//获取文件内容并进行转换操作
  14.     }
  15. }
  16. foreach (var folder in subFolders)
  17. {
  18.     foreach (var filePath in Directory.GetFiles(folder))
  19.     {
  20.         //业务逻辑
  21.         if (filePath.EndsWith(".cs"))
  22.         {
  23.             BatchTran(filePath);//获取文件内容并进行转换操作
  24.         }
  25.     }
  26. }
  27. Console.WriteLine("转化完成");
  28. void BatchTran(string filePath)
  29. {
  30.     /* 核心逻辑:
  31.     首选读取项目文件夹下的所有文件路径
  32.     筛选路径文件后缀.只对.cs或自定义的文件操作读取
  33.     使用正则表达式进行查询并处理为数组
  34.     调用免费的百度翻译api进行任意类型的翻译
  35.     使用replace进行替换字符串,并保存
  36.      */
  37.     BaiDuApi baiDuApi = new BaiDuApi("you apikey", "you secretKey");//百度api 初始化
  38.     string content = File.ReadAllText(filePath);//读取文本
  39.     string pattern = @"("".*[\u4E00-\u9FA5]+.*[\u4E00-\u9FA5]+.*"")";//定义所需要的正则表达式(ps:此正则表示查询英文双引号下的中文)
  40.     Regex myRegex = new Regex(pattern);
  41.     MatchCollection collection = myRegex.Matches(content);
  42.     foreach (Match match in collection)
  43.     {
  44.         var oldStr = "";
  45.         oldStr = match.Value;//.Substring(0, match.Value.Length - 1)
  46.         var newStr = baiDuApi.Translate(oldStr);
  47.         if (!string.IsNullOrEmpty(newStr))
  48.             content = content.Replace(oldStr, newStr);
  49.     }
  50.     if (collection.Count > 0)
  51.         // 将修改后的内容写入到文件中
  52.         File.WriteAllText(filePath, content);
  53. }
复制代码
 
BaiDuApi.cs
  1. using System;
  2. using System.IO;
  3. using Newtonsoft.Json;
  4. using RestSharp;
  5. namespace Batch_translation
  6. {
  7.     public class BaiDuApi
  8.     {
  9.         private readonly string apiKey;
  10.         private readonly string secretKey;
  11.         public BaiDuApi(string apiKey, string secretKey)
  12.         {
  13.             this.apiKey = apiKey;
  14.             this.secretKey = secretKey;
  15.         }
  16.         public string Translate(string sourceText)
  17.         {
  18.             var token = GetAccessToken(apiKey, secretKey);
  19.             if (token == "")
  20.                 return "";
  21.             var client = new RestClient($"https://aip.baidubce.com/rpc/2.0/mt/texttrans/v1?access_token={token}");
  22.             var request = new RestRequest("", Method.Post);
  23.             request.AddHeader("Content-Type", "application/json");
  24.             request.AddHeader("Accept", "application/json");
  25.             // 定义一个匿名类型对象
  26.             var data = new { from = "zh", to = "en", q = sourceText };
  27.             // 将对象序列化成 JSON 字符串
  28.             string body = JsonConvert.SerializeObject(data);
  29.             request.AddParameter("application/json", body, ParameterType.RequestBody);
  30.             var response = client.Execute(request);
  31.             if (response.Content == null)
  32.             {
  33.                 return "";
  34.             }
  35.             var dataResult = JsonConvert.DeserializeObject<BaiDuMode>(response.Content);
  36.             if (dataResult.result != null)
  37.             {
  38.                 if (dataResult.result.trans_result != null && dataResult.result.trans_result.Count > 0)
  39.                 {
  40.                     return dataResult.result.trans_result[0].dst;
  41.                 }
  42.             }
  43.             return sourceText;
  44.         }
  45.         /**
  46.         * 使用 AK,SK 生成鉴权签名(Access Token)
  47.         * @return 鉴权签名信息(Access Token)
  48.         */
  49.         static string GetAccessToken(string API_KEY, string SECRET_KEY)
  50.         {
  51.             var client = new RestClient($"https://aip.baidubce.com/oauth/2.0/token");
  52.             var request = new RestRequest("", Method.Post);
  53.             request.AddParameter("grant_type", "client_credentials");
  54.             request.AddParameter("client_id", API_KEY);
  55.             request.AddParameter("client_secret", SECRET_KEY);
  56.             var response = client.Execute(request);
  57.             Console.WriteLine(response.Content);
  58.             if (response.Content == null)
  59.                 return "";
  60.             var result = JsonConvert.DeserializeObject<dynamic>(response.Content);
  61.             return result.access_token.ToString();
  62.         }
  63.     }
  64. }
复制代码
结语:

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

来源:https://www.cnblogs.com/BFMC/archive/2023/03/15/17217831.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具