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);
            }
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        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);
        }