public List <CopyPasteBlock> BuildBlocks(int maxBlockSize, string sourceLanguage, int startIndex) { var result = new List <CopyPasteBlock>(); var input = new StringBuilder(); var paragraphs = new List <Paragraph>(); for (var index = startIndex; index < _paragraphs.Count; index++) { var p = _paragraphs[index]; var f = new Formatting(); _formattings[index - startIndex] = f; var text = f.SetTagsAndReturnTrimmed(TranslationHelper.PreTranslate(p.Text, sourceLanguage), sourceLanguage); while (text.Contains(Environment.NewLine + Environment.NewLine)) { text = text.Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine); } if (input.Length + text.Length + 3 >= maxBlockSize) { result.Add(new CopyPasteBlock { TargetText = input.ToString().Trim(), Paragraphs = paragraphs }); input.Clear(); paragraphs = new List <Paragraph>(); } if (input.Length > 0) { input.Append(Environment.NewLine + _separator + Environment.NewLine); } input.Append(text); paragraphs.Add(p); } if (input.Length > 0 && input.ToString() != Environment.NewLine + _separator + Environment.NewLine) { result.Add(new CopyPasteBlock { TargetText = input.ToString().Trim(), Paragraphs = paragraphs }); } return(result); }
public void Translate(string sourceLanguage, string targetLanguage, List <Paragraph> paragraphs, StringBuilder log) { var input = new StringBuilder(); _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(Environment.NewLine + Environment.NewLine); } var text = f.SetTagsAndReturnTrimmed(TranslationHelper.PreTranslate(p.Text, sourceLanguage), sourceLanguage); while (text.Contains(Environment.NewLine + Environment.NewLine)) { text = text.Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine); } text = text.Replace(Environment.NewLine, "\n"); input.Append(text); } }
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; var formatList = new Formatting[paragraphs.Count]; for (var index = 0; index < paragraphs.Count; index++) { var p = paragraphs[index]; if (!isFirst) { jsonBuilder.Append(","); } else { isFirst = false; } var f = new Formatting(); formatList[index] = f; var text = f.SetTagsAndReturnTrimmed(TranslationHelper.PreTranslate(p.Text, sourceLanguage), sourceLanguage); 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"]; if (formatList.Length > results.Count) { res = formatList[results.Count].ReAddFormatting(res); res = formatList[results.Count].ReBreak(res, targetLanguage); } res = TranslationHelper.PostTranslate(res, targetLanguage); results.Add(res); } } } return(results); }
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 formatList = new List <Formatting>(); bool skipNext = false; for (var index = 0; index < paragraphs.Count; index++) { if (skipNext) { skipNext = false; continue; } var p = paragraphs[index]; var f = new Formatting(); formatList.Add(f); if (input.Length > 0) { input.Append("&"); } var nextText = string.Empty; if (index < paragraphs.Count - 1 && paragraphs[index + 1].StartTime.TotalMilliseconds - p.EndTime.TotalMilliseconds < 200) { nextText = paragraphs[index + 1].Text; } var text = f.SetTagsAndReturnTrimmed(TranslationHelper.PreTranslate(p.Text, sourceLanguage), sourceLanguage, nextText); skipNext = f.SkipNext; if (!skipNext) { text = f.UnBreak(text, p.Text); } 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) { string nextText = null; translatedText = Regex.Unescape(translatedText); translatedText = string.Join(Environment.NewLine, translatedText.SplitToLines()); translatedText = TranslationHelper.PostTranslate(translatedText, targetLanguage); if (resultList.Count < formatList.Count) { translatedText = formatList[resultList.Count].ReAddFormatting(translatedText, out nextText); if (nextText == null) { translatedText = formatList[resultList.Count].ReBreak(translatedText, targetLanguage); } } resultList.Add(translatedText); if (nextText != null) { resultList.Add(nextText); } } } } } } } } } return(resultList); }
public List <string> Translate(string sourceLanguage, string targetLanguage, List <Paragraph> paragraphs, StringBuilder log) { string result; 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(" " + SplitChar + " "); } var text = f.SetTagsAndReturnTrimmed(TranslationHelper.PreTranslate(p.Text.Replace(SplitChar.ToString(), string.Empty), sourceLanguage), sourceLanguage); text = f.Unbreak(text, p.Text); input.Append(text); } using (var wc = new WebClient()) { string url = $"https://translate.googleapis.com/translate_a/single?client=gtx&sl={sourceLanguage}&tl={targetLanguage}&dt=t&q={Utilities.UrlEncode(input.ToString())}"; wc.Proxy = Utilities.GetProxy(); wc.Encoding = Encoding.UTF8; wc.Headers.Add("user-agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"); result = wc.DownloadString(url).Trim(); } var sbAll = new StringBuilder(); int count = 0; int i = 1; int level = result.StartsWith('[') ? 1 : 0; while (i < result.Length - 1) { var sb = new StringBuilder(); var start = false; for (; i < result.Length - 1; i++) { var c = result[i]; if (start) { if (c == '"' && result[i - 1] != '\\') { count++; if (count % 2 == 1 && level > 2) // even numbers are original text, level > 3 is translation { sbAll.Append(" " + sb); } i++; break; } sb.Append(c); } else if (c == '"') { start = true; } else if (c == '[') { level++; } else if (c == ']') { level--; } } } var res = sbAll.ToString().Trim(); res = Regex.Unescape(res); var lines = res.SplitToLines().ToList(); var resultList = new List <string>(); for (var index = 0; index < lines.Count; index++) { var line = lines[index]; var s = Json.DecodeJsonText(line); s = string.Join(Environment.NewLine, s.SplitToLines()); s = TranslationHelper.PostTranslate(s, targetLanguage); s = s.Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine); s = s.Replace(Environment.NewLine + " ", Environment.NewLine); s = s.Replace(Environment.NewLine + " ", Environment.NewLine); s = s.Replace(" " + Environment.NewLine, Environment.NewLine); s = s.Replace(" " + Environment.NewLine, Environment.NewLine).Trim(); if (formattings.Length > index) { s = formattings[index].ReAddFormatting(s); s = formattings[index].Rebreak(s); } resultList.Add(s); } if (resultList.Count > paragraphs.Count) { var timmedList = resultList.Where(p => !string.IsNullOrEmpty(p)).ToList(); if (timmedList.Count == paragraphs.Count) { return(timmedList); } } if (resultList.Count < paragraphs.Count) { var splitList = SplitMergedLines(resultList, paragraphs); if (splitList.Count == paragraphs.Count) { return(splitList); } } return(resultList); }
public List <string> Translate(string sourceLanguage, string targetLanguage, List <Paragraph> paragraphs, StringBuilder log) { //TODO: Get access token... var input = new StringBuilder(); var formatList = new List <Formatting>(); bool skipNext = false; for (var index = 0; index < paragraphs.Count; index++) { if (skipNext) { skipNext = false; continue; } var p = paragraphs[index]; var f = new Formatting(); formatList.Add(f); if (input.Length > 0) { input.Append(","); } var nextText = string.Empty; if (index < paragraphs.Count - 1 && paragraphs[index + 1].StartTime.TotalMilliseconds - p.EndTime.TotalMilliseconds < 200) { nextText = paragraphs[index + 1].Text; } var text = f.SetTagsAndReturnTrimmed(TranslationHelper.PreTranslate(p.Text, sourceLanguage), sourceLanguage, nextText); skipNext = f.SkipNext; if (!skipNext) { text = f.UnBreak(text, p.Text); } input.Append("\"" + Json.EncodeJsonText(text) + "\""); } var request = (HttpWebRequest)WebRequest.Create($"https://translation.googleapis.com/v3/{_projectNumberOrId}:translateText"); request.Proxy = Utilities.GetProxy(); request.ContentType = "application/json"; request.Method = "POST"; using (var streamWriter = new StreamWriter(request.GetRequestStream())) { var requestJson = "{ \"sourceLanguageCode\": \"" + sourceLanguage + "\", \"targetLanguageCode\": \"" + targetLanguage + "\", " + "\"contents\": [" + input + "]}"; streamWriter.Write(requestJson); } var response = request.GetResponse(); var reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); string content = reader.ReadToEnd(); var skipCount = 0; 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) { string nextText = null; translatedText = Regex.Unescape(translatedText); translatedText = string.Join(Environment.NewLine, translatedText.SplitToLines()); translatedText = TranslationHelper.PostTranslate(translatedText, targetLanguage); if (resultList.Count - skipCount < formatList.Count) { translatedText = formatList[resultList.Count - skipCount].ReAddFormatting(translatedText, out nextText); if (nextText == null) { translatedText = formatList[resultList.Count - skipCount].ReBreak(translatedText, targetLanguage); } } resultList.Add(translatedText); if (nextText != null) { resultList.Add(nextText); skipCount++; } } } } } } } } } return(resultList); }