Ejemplo n.º 1
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 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);
        }