Skip to content

Commit d8b0ba5

Browse files
author
coolbyte
committed
添加对要翻译的内容中的{token} 变量替换功能,有些语言会翻译{}中的内容,该块内容实际上为国际化字符串中的变量,不应该进行翻译
1 parent 94e000a commit d8b0ba5

File tree

3 files changed

+45
-5
lines changed

3 files changed

+45
-5
lines changed

.gitignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -462,4 +462,3 @@ Icon
462462
Network Trash Folder
463463
Temporary Items
464464
.apdisk
465-

I18nResourceTranslator.sln

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
Microsoft Visual Studio Solution File, Format Version 12.00
33
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "I18nResourceTranslator", "I18nResourceTranslator\I18nResourceTranslator.csproj", "{81A11F63-8530-4F03-891B-C7AE9A477836}"
44
EndProject
5+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestProject", "TestProject\TestProject.csproj", "{E8DAB70F-C09B-4692-BB48-DEF853316F01}"
6+
EndProject
57
Global
68
GlobalSection(SolutionConfigurationPlatforms) = preSolution
79
Debug|Any CPU = Debug|Any CPU
@@ -12,5 +14,9 @@ Global
1214
{81A11F63-8530-4F03-891B-C7AE9A477836}.Debug|Any CPU.Build.0 = Debug|Any CPU
1315
{81A11F63-8530-4F03-891B-C7AE9A477836}.Release|Any CPU.ActiveCfg = Release|Any CPU
1416
{81A11F63-8530-4F03-891B-C7AE9A477836}.Release|Any CPU.Build.0 = Release|Any CPU
17+
{E8DAB70F-C09B-4692-BB48-DEF853316F01}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
18+
{E8DAB70F-C09B-4692-BB48-DEF853316F01}.Debug|Any CPU.Build.0 = Debug|Any CPU
19+
{E8DAB70F-C09B-4692-BB48-DEF853316F01}.Release|Any CPU.ActiveCfg = Release|Any CPU
20+
{E8DAB70F-C09B-4692-BB48-DEF853316F01}.Release|Any CPU.Build.0 = Release|Any CPU
1521
EndGlobalSection
1622
EndGlobal

I18nResourceTranslator/Translator.cs

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System.Collections.Concurrent;
22
using System.Text.Json;
33
using System.Text.Json.Nodes;
4+
using System.Text.RegularExpressions;
45
using System.Web;
56

67
namespace I18nResourceTranslator;
@@ -12,6 +13,7 @@ public class Translator
1213
private List<Task> editTasks = new();
1314
private IDictionary<string, string> translatorCache = new ConcurrentDictionary<string, string>();
1415
private readonly string cachePath;
16+
private static readonly Regex tokensRegex = new Regex(@"\{[\w\-_\+\d]+\}");
1517

1618
public Translator(string from, string to)
1719
{
@@ -26,7 +28,8 @@ public async Task StartEditJsonAndTranslation(JsonNode doc)
2628
{
2729
Console.WriteLine("加载已翻译的缓存内容...");
2830
var cachedJson = await File.ReadAllTextAsync(cachePath);
29-
translatorCache = JsonSerializer.Deserialize<ConcurrentDictionary<string, string>>(cachedJson) ?? translatorCache;
31+
translatorCache = JsonSerializer.Deserialize<ConcurrentDictionary<string, string>>(cachedJson) ??
32+
translatorCache;
3033
Console.WriteLine("已翻译缓存已加载");
3134
}
3235

@@ -40,13 +43,15 @@ public async Task StartEditJsonAndTranslation(JsonNode doc)
4043
Console.WriteLine("重试翻译任务: {0}", task.Id);
4144
task.Start();
4245
}
46+
4347
Task.WaitAll(failedTasks.ToArray());
4448
}
4549
catch (Exception e)
4650
{
4751
Console.WriteLine("翻译失败");
4852
Console.WriteLine(e);
4953
}
54+
5055
Console.WriteLine("翻译已完成");
5156
await File.WriteAllTextAsync(cachePath, JsonSerializer.Serialize(translatorCache));
5257
Console.WriteLine("翻译缓存已保存");
@@ -66,11 +71,11 @@ private async Task EditJson(JsonNode doc)
6671
editTasks.Add(EditJson(pro.Value));
6772
break;
6873
case JsonValue value:
69-
dic.Add(pro.Key,JsonValue.Create(await Translate(value.GetValue<string>()))!);
74+
dic.Add(pro.Key, JsonValue.Create(await Translate(value.GetValue<string>()))!);
7075
break;
7176
}
7277
}
73-
78+
7479
foreach (var node in dic)
7580
{
7681
json[node.Key] = node.Value;
@@ -83,6 +88,7 @@ private async Task<string> Translate(string toTrans)
8388
{
8489
return translatorCache[toTrans];
8590
}
91+
8692
var httpClient = new HttpClient();
8793
var url =
8894
$"http://translate.google.cn/translate_a/single?client=gtx&dt=t&dj=1&ie=UTF-8&sl={from}&tl={to}&q={HttpUtility.UrlEncode(toTrans)}";
@@ -105,7 +111,36 @@ private async Task<string> Translate(string toTrans)
105111
// }
106112
// }
107113
var jsonObj = JsonNode.Parse(json);
108-
var tran = jsonObj!["sentences"]!.AsArray().Select(node => node!["trans"]!.GetValue<string>()).Aggregate((s, s1) => s + s1);
114+
var tran = jsonObj!["sentences"]!.AsArray().Select(node => node!["trans"]!.GetValue<string>())
115+
.Aggregate((s, s1) => s + s1);
116+
var toTransTokens = tokensRegex.Matches(toTrans);
117+
var tranTokens = tokensRegex.Matches(tran);
118+
if (toTransTokens.Count != tranTokens.Count)
119+
{
120+
var bgC = Console.BackgroundColor;
121+
Console.BackgroundColor = ConsoleColor.Magenta;
122+
Console.WriteLine("原Token与译文中的Token数目不一致,请比对");
123+
Console.WriteLine("\t{0} | {1}", toTransTokens.Count,
124+
toTransTokens.Any() ? toTransTokens.Select(m => m.Value).Aggregate((s, s1) => s + " " + s1) : "-");
125+
Console.WriteLine("\t{0} | {1}", tranTokens.Count,
126+
tranTokens.Any() ? tranTokens.Select(m => m.Value).Aggregate((s, s1) => s + " " + s1) : "-");
127+
Console.BackgroundColor = bgC;
128+
}
129+
else
130+
{
131+
for (var i = 0; i < toTransTokens.Count; i++)
132+
{
133+
var t = toTransTokens[i];
134+
var t1 = tranTokens[i];
135+
if (t.Value == t1.Value)
136+
{
137+
continue;
138+
}
139+
140+
tran = tran.Replace(t1.Value, t.Value);
141+
}
142+
}
143+
109144
translatorCache[toTrans] = tran;
110145
Console.WriteLine("已翻译:");
111146
Console.WriteLine($"\t{url}");

0 commit comments

Comments
 (0)