salarcode / AutoResxTranslator

A tool to automatically translate Resx files to any language using Google Translator. No API key is required for the translator. This tool also provides a text translator out of the box.
92 stars 37 forks source link

How to change "_TranslateMain.cs" to get the translation result? #4

Closed it19862 closed 1 year ago

it19862 commented 5 years ago

I used the classes from your application in my application. To translate the text, I made the usual class. When I try to translate two copies of the text in one session, the following happens:

How to change "_TranslateMain.cs" to correctly get the translation result from "GTranslateService"? Grid_uc.cs

_TranslateMain traslateText_cls;
 private void Grid_uc_Load(object sender, EventArgs e) // при загрузке формы
{
            // Перевод текста
            traslateText_cls = new _TranslateMain(); //             
}

// Присваиваем значение переменным. Заполняем ДатаТабле
// public async void VarAddValue()
public async Task<DataTable> VarAddValue()
{
 for (int i = 1; i <= 5; i++)
    {                
                        // Обращаемся к экземпляру репозитария
                        // var instanceRepo = resultRepo.Items[i];
                        instanceRepo = resultRepo.Items[i];
                        instanceRepoId = instanceRepo.Id;

                        descript = instanceRepo.Description; // описание репозитария краткое (которое под именем находится)                        
                        descrip_translate = traslateText_cls.TranslateText(descript);

                        var readme = await client_cur.Repository.Content.GetReadme(instanceRepoId);
                        var rawText = readme.Content;

                        readme_content = rawText.ToString(); // содержание "readme"                        
                        readme_content_translate = traslateText_cls.TranslateText(readme_content);
    }
}

_TranslateMain.cs

using System.Threading.Tasks;

//
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
// 
using AutoResxTranslator;

namespace rsh.Core.Translate
{
    class _TranslateMain
    {        
        public string txtDesc; // текст переведённый

        private readonly Dictionary<string, string> _languages = new Dictionary<string, string>
        {
                {"auto", "(Detect)"},
                {"af", "Afrikaans"},
                {"sq", "Albanian"},
                {"ar", "Arabic"},
                {"hy", "Armenian"},
                {"az", "Azerbaijani"},
                {"eu", "Basque"},
                {"be", "Belarusian"},
                {"bn", "Bengali"},
                {"bg", "Bulgarian"},
                {"ca", "Catalan"},
                {"zh-CN", "Chinese (Simplified)"},
                {"zh-TW", "Chinese (Traditional)"},
                {"hr", "Croatian"},
                {"cs", "Czech"},
                {"da", "Danish"},
                {"nl", "Dutch"},
                {"en", "English"},
                {"eo", "Esperanto"},
                {"et", "Estonian"},
                {"tl", "Filipino"},
                {"fi", "Finnish"},
                {"fr", "French"},
                {"gl", "Galician"},
                {"ka", "Georgian"},
                {"de", "German"},
                {"el", "Greek"},
                {"gu", "Gujarati"},
                {"ht", "Haitian Creole"},
                {"iw", "Hebrew"},
                {"hi", "Hindi"},
                {"hu", "Hungarian"},
                {"is", "Icelandic"},
                {"id", "Indonesian"},
                {"ga", "Irish"},
                {"it", "Italian"},
                {"ja", "Japanese"},
                {"kn", "Kannada"},
                {"km", "Khmer"},
                {"ko", "Korean"},
                {"lo", "Lao"},
                {"la", "Latin"},
                {"lv", "Latvian"},
                {"lt", "Lithuanian"},
                {"mk", "Macedonian"},
                {"ms", "Malay"},
                {"mt", "Maltese"},
                {"no", "Norwegian"},
                {"fa", "Persian"},
                {"pl", "Polish"},
                {"pt", "Portuguese"},
                {"ro", "Romanian"},
                {"ru", "Russian"},
                {"sr", "Serbian"},
                {"sk", "Slovak"},
                {"sl", "Slovenian"},
                {"es", "Spanish"},
                {"sw", "Swahili"},
                {"sv", "Swedish"},
                {"ta", "Tamil"},
                {"te", "Telugu"},
                {"th", "Thai"},
                {"tr", "Turkish"},
                {"uk", "Ukrainian"},
                {"ur", "Urdu"},
                {"vi", "Vietnamese"},
                {"cy", "Welsh"},
                {"yi", "Yiddish"}
        };

        void FillComboBoxes()
        {
            //cmbSrc.DisplayMember = "Value";
            //cmbSrc.ValueMember = "Key";

            //cmbDesc.DisplayMember = "Value";
            //cmbDesc.ValueMember = "Key";
            // lstResxLanguages.Items.Clear();

            //foreach (var k in _languages)
            //{
            //    cmbSrc.Items.Add(k);
            //    if (k.Key == "auto")
            //        continue;

            //    cmbDesc.Items.Add(k);

            //    // cmbSourceResxLng.Items.Add(k);
            //    // lstResxLanguages.Items.Add(k.Key, k.Value, -1);
            //}
            // cmbSrc.SelectedIndex = 0;
            // cmbDesc.Text = "English";
            // 
            // srcLang = "auto";
            // descLang = "Russian";
        }

        public string TranslateText(string text_str)
        {
            string lngSrc_str = "auto";
            string lngDest_str = "ru";
            // string text_str = textBox1.Text;

            var lngSrc = lngSrc_str; // язык "КОТОРЫЙ" нужно перевести 
            var lngDest = lngDest_str;  // язык "НА КОТОРЫЙ" нужно перевести
            var text = text_str; // текст для перевода

            // There is no longer a key to validate
            // Нет больше ключа для проверки
            var textTranslatorUrlKey = "";

            // IsBusy(true);

            GTranslateService.TranslateAsync(
                text,
                lngSrc,
                lngDest,
                textTranslatorUrlKey
                ,(success, result)
                =>
                {
                    // SetResult(result);
                    // IsBusy(false);
                    txtDesc = result;
                });

            return txtDesc;
        }
        void IsBusy(bool isbusy)
        {
            //if (this.InvokeRequired)
            //{
            //    this.BeginInvoke(new Action<bool>(IsBusy), isbusy);
            //    return;
            //}
            //else
            //{
            //    // tabMain.Enabled = !isbusy;
            //}
        }

        public void SetResult(string result)
        {
            #region MyRegion
            //// if (InvokeRequired)
            //// if (this.InvokeRequired)
            //{
            //    // this.BeginInvoke(new Action<string>(SetResult), result);
            //    // BeginInvoke(new Action<string>(SetResult), result);
            //    return;

            //}
            //else
            //{
            //    txtDesc = result; // переведённый текст
            //}

            #endregion

        }

    }
}

GTranslateService.cs

using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;
using System.Web;

namespace AutoResxTranslator
{
    public class GTranslateService
    {
        private const string RequestUserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0";
        private const string RequestGoogleTranslatorUrl = "https://translate.googleapis.com/translate_a/single?client=gtx&sl={0}&tl={1}&hl=en&dt=t&dt=bd&dj=1&source=icon&tk=467103.467103&q={2}";

        public delegate void TranslateCallBack(bool succeed, string result);
        public static void TranslateAsync(
            string text,
            string sourceLng,
            string destLng,
            string textTranslatorUrlKey,
            TranslateCallBack callBack)
        {
            var request = CreateWebRequest(text, sourceLng, destLng, textTranslatorUrlKey);

            request.BeginGetResponse(
                TranslateRequestCallBack,
                new KeyValuePair<WebRequest, TranslateCallBack>(request, callBack));
        }

        public static bool Translate(
            string text,
            string sourceLng,
            string destLng,
            string textTranslatorUrlKey,
            out string result)
        {
            var request = CreateWebRequest(text, sourceLng, destLng, textTranslatorUrlKey);
            try
            {
                var response = (HttpWebResponse)request.GetResponse();

                if (response.StatusCode != HttpStatusCode.OK)
                {
                    result = "Response is failed with code: " + response.StatusCode;
                    return false;
                }

                using (var stream = response.GetResponseStream())
                {
                    string output;
                    var succeed = ReadGoogleTranslatedResult(stream, out output);
                    result = output;
                    return succeed;
                }
            }
            catch (Exception ex)
            {
                result = ex.Message;
                return false;
            }
        }

        static WebRequest CreateWebRequest(
            string text,
            string lngSourceCode,
            string lngDestinationCode,
            string textTranslatorUrlKey)
        {
            text = HttpUtility.UrlEncode(text);

            var url = string.Format(RequestGoogleTranslatorUrl, lngSourceCode, lngDestinationCode, text);

            var create = (HttpWebRequest)WebRequest.Create(url);
            create.UserAgent = RequestUserAgent;
            create.Timeout = 50 * 1000;
            return create;
        }

        private static void TranslateRequestCallBack(IAsyncResult ar)
        {
            var pair = (KeyValuePair<WebRequest, TranslateCallBack>)ar.AsyncState;
            var request = pair.Key;
            var callback = pair.Value;
            HttpWebResponse response = null;
            try
            {
                response = (HttpWebResponse)request.EndGetResponse(ar);
                if (response.StatusCode != HttpStatusCode.OK)
                {
                    callback(false, "Response is failed with code: " + response.StatusCode);
                    return;
                }

                using (var stream = response.GetResponseStream())
                {
                    string output;
                    var succeed = ReadGoogleTranslatedResult(stream, out output);

                    callback(succeed, output);
                }
            }
            catch (Exception ex)
            {
                callback(false, "Request failed.\r\n" + ex.Message);
            }
            finally
            {
                if (response != null)
                {
                    response.Close();
                }
            }
        }

        /// <summary>
        ///  the main trick :)
        /// </summary>
        static bool ReadGoogleTranslatedResult(Stream rawdata, out string result)
        {
            string text;
            using (var reader = new StreamReader(rawdata, Encoding.UTF8))
            {
                text = reader.ReadToEnd();
            }

            try
            {
                dynamic obj = SimpleJson.DeserializeObject(text);

                var final = "";

                // the number of lines
                int lines = obj[0].Count;
                for (int i = 0; i < lines; i++)
                {
                    // the translated text.
                    final += (obj[0][i][0]).ToString();
                }
                result = final;
                return true;
            }
            catch (Exception ex)
            {
                result = ex.Message;
                return false;
            }
        }

    }