public List <string> Translate(string sourceLanguage, string targetLanguage, List <Paragraph> paragraphs, StringBuilder log) { var baseUrl = "https://translation.googleapis.com/language/translate/v2"; var format = "text"; var input = new StringBuilder(); var formattings = new Formatting[paragraphs.Count]; for (var index = 0; index < paragraphs.Count; index++) { var p = paragraphs[index]; var f = new Formatting(); formattings[index] = f; if (input.Length > 0) { input.Append("&"); } var text = f.SetTagsAndReturnTrimmed(TranslationHelper.PreTranslate(p.Text, sourceLanguage), sourceLanguage); input.Append("q=" + Utilities.UrlEncode(text)); } string uri = $"{baseUrl}/?{input}&target={targetLanguage}&source={sourceLanguage}&format={format}&key={_apiKey}"; var request = WebRequest.Create(uri); request.Proxy = Utilities.GetProxy(); request.ContentType = "application/json"; request.ContentLength = 0; request.Method = "POST"; var response = request.GetResponse(); var reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); string content = reader.ReadToEnd(); var resultList = new List <string>(); var parser = new JsonParser(); var x = (Dictionary <string, object>)parser.Parse(content); foreach (var k in x.Keys) { if (x[k] is Dictionary <string, object> v) { foreach (var innerKey in v.Keys) { if (v[innerKey] is List <object> l) { foreach (var o2 in l) { if (o2 is Dictionary <string, object> v2) { foreach (var innerKey2 in v2.Keys) { if (v2[innerKey2] is string translatedText) { translatedText = Regex.Unescape(translatedText); translatedText = string.Join(Environment.NewLine, translatedText.SplitToLines()); translatedText = TranslationHelper.PostTranslate(translatedText, targetLanguage); if (resultList.Count < formattings.Length) { translatedText = formattings[resultList.Count].ReAddFormatting(translatedText); } resultList.Add(translatedText); } } } } } } } } return(resultList); }
public List <string> Translate(string sourceLanguage, string targetLanguage, List <Paragraph> paragraphs, StringBuilder log) { var url = string.Format(TranslateUrl, sourceLanguage, targetLanguage); if (!string.IsNullOrEmpty(_category)) { url += "&category=" + _category.Trim(); } var httpWebRequest = (HttpWebRequest)WebRequest.Create(url); httpWebRequest.Proxy = Utilities.GetProxy(); httpWebRequest.ContentType = "application/json"; httpWebRequest.Method = "POST"; httpWebRequest.Headers.Add("Authorization", "Bearer " + _accessToken); var jsonBuilder = new StringBuilder(); jsonBuilder.Append("["); bool isFirst = true; bool skipNext = false; var formatList = new List <Formatting>(); for (var index = 0; index < paragraphs.Count; index++) { if (skipNext) { skipNext = false; continue; } var p = paragraphs[index]; if (!isFirst) { jsonBuilder.Append(","); } else { isFirst = false; } var nextText = string.Empty; if (index < paragraphs.Count - 1 && paragraphs[index + 1].StartTime.TotalMilliseconds - p.EndTime.TotalMilliseconds < 200) { nextText = paragraphs[index + 1].Text; } var f = new Formatting(); formatList.Add(f); var text = f.SetTagsAndReturnTrimmed(TranslationHelper.PreTranslate(p.Text, sourceLanguage), sourceLanguage, nextText); skipNext = f.SkipNext; if (!skipNext) { text = f.UnBreak(text, p.Text); } jsonBuilder.Append("{ \"Text\":\"" + Json.EncodeJsonText(text) + "\"}"); } jsonBuilder.Append("]"); var json = jsonBuilder.ToString(); using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) { streamWriter.Write(json); streamWriter.Flush(); streamWriter.Close(); } var results = new List <string>(); var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); using (var streamReader = new StreamReader(httpResponse.GetResponseStream() ?? throw new InvalidOperationException())) { var result = streamReader.ReadToEnd(); var parser = new JsonParser(); var x = (List <object>)parser.Parse(result); foreach (var xElement in x) { var dict = (Dictionary <string, object>)xElement; var y = (List <object>)dict["translations"]; foreach (var o in y) { var textDics = (Dictionary <string, object>)o; var res = (string)textDics["text"]; string nextText = null; if (formatList.Count > results.Count) { res = formatList[results.Count].ReAddFormatting(res, out nextText); if (nextText == null) { res = formatList[results.Count].ReBreak(res, targetLanguage); } } res = TranslationHelper.PostTranslate(res, targetLanguage); results.Add(res); if (nextText != null) { results.Add(nextText); } } } } return(results); }