-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathTranslatorText.cs
More file actions
93 lines (77 loc) · 3.48 KB
/
TranslatorText.cs
File metadata and controls
93 lines (77 loc) · 3.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
using GTranslatorAPI;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AssistAnt
{
public class TranslatorText
{
private string SourceLanguage { get; set; }
private string TargetLanguage { get; set; }
private Translator TranslatorAPI { get; set; }
private static Dictionary<string, string> Cache = new Dictionary<string, string>();
private string LiteConvertLanguage(string language)
{
return language
.Replace("eng", "en")
.Replace("rus", "ru");
}
public TranslatorText(string sourceLanguage, string targetLanguage)
{
SourceLanguage = LiteConvertLanguage(sourceLanguage ?? "en");
TargetLanguage = LiteConvertLanguage(targetLanguage ?? "ru");
var settings = new Settings()
{
GTranslatorAPIURL = "https://translate.googleapis.com/translate_a/single?client=gtx&sl={srcl}&tl={tgtl}&dt=t&q={txt}",
NetworkQueryTimeout = 2000,
ParallelizeTranslationOfSegments = true,
SplitStringBeforeTranslate = false,
UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"
};
TranslatorAPI = new Translator(settings);
}
public string Translate(string text)
{
try
{
var cacheKey = SourceLanguage + TargetLanguage + "|" + text;
if (Cache.TryGetValue(cacheKey, out var cacheVal))
{
return cacheVal;
}
text = Preprocessing(text);
Task<Translation> task = TranslatorAPI.TranslateAsync(
SourceLanguage,
TargetLanguage,
text
);
task.Wait();
var val = task.Result.TranslatedText;
val = Postprocessing(val);
Cache[cacheKey] = val;
return val;
}
catch
{
return "";
}
}
private const string Separator = "##";
private const string Shielding = "(#)";
private const string SeparatorSpaсe = " " + Separator + " ";
/// <summary>
/// Убираем переносы строк, и вставляем разделитель, который для переводчика не разбивает предложение на насколько, но который он сохраняет в тексте перевода.
/// </summary>
private string Preprocessing(string text)
=> text.Replace("\r\n", "\n").Replace("\r", "\n").Replace("\n", "\r\n")
.Replace(Separator, Shielding).Replace("\r\n", SeparatorSpaсe)
.Replace(SeparatorSpaсe + SeparatorSpaсe + SeparatorSpaсe + SeparatorSpaсe, "\r\n").Replace(SeparatorSpaсe + SeparatorSpaсe + SeparatorSpaсe, "\r\n").Replace(SeparatorSpaсe + SeparatorSpaсe, "\r\n");
/// <summary>
/// Восстанавливаем переносы строк по разделителю
/// </summary>
private string Postprocessing(string text)
=> text.Replace(Separator, "\r\n").Replace("\r\n ", "\r\n").Replace(" \r\n", "\r\n").Replace(Shielding, Separator);
}
}