GithubHelp home page GithubHelp logo

salarcode / autoresxtranslator Goto Github PK

View Code? Open in Web Editor NEW
90.0 11.0 37.0 386 KB

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.

C# 100.00%

autoresxtranslator's Introduction

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.

Text translation

Text-Translation

Resx Translation

ResX-Translation

Resx translation is in progress

ResX-Translation

Import from Excel sheet

excel-import

Select Microsoft Cognitive Translation Service

ms-translator

autoresxtranslator's People

Contributors

abenedykt avatar adamhwang avatar cacpgomes avatar dependabot[bot] avatar salarcode avatar sudarshansmd avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

autoresxtranslator's Issues

Can I translate the text "html" page?

I have a "html" code page.
The page contains the text in "English".

Can the program "AutoResxTranslator" translate the text of the page into another language so that I get the "html" code of the page with the text in another language?
If this is not possible, could you give recommendations on how this can be implemented?

there is a new translator (DeepL) with api

I saw a new translator and it translates better than google. May be you want to add. It has simple api

EXAMPLE REQUEST
curl -X POST 'https://api-free.deepl.com/v2/translate'
--header 'Authorization: DeepL-Auth-Key [yourAuthKey]'
--header 'Content-Type: application/json'
--data '{
"text": [
"Hello, world!"
],
"target_lang": "DE"
}'
EXAMPLE RESPONSE
{
"translations": [
{
"detected_source_language": "EN",
"text": "Hallo, Welt!"
}
]
}

Are there any restrictions on the use of the program?

I am using a program to translate text.
Are there any restrictions:

  • to translate the number of characters;
  • to translate the number of characters per minute;
  • to translate the number of characters per hour;
  • to translate the number of characters per day;
  • other restrictions.

Excel Import : Linked field can't translate

hi,
I think there is a bug in Excel Import.

When I choose the Key Column, it changes the Translation column too with this value and when I change the Translation column, it changes the Key column with the same value.

image
How can i choose distinct column ?

Tranlate only New added Key (not issue but Couldnt create pull request)

Hello. First of all thanks for that beautiful app. Its life saver but I think it need this little improvement. Most programmer adds new features in their app by time and adds new keys to their resource files. But Google Translate is not perfect yet and translations can be wrong. So Programmers Fix their wrong translation by time. but when they add new keys their corrected Translations can gone if they translate them with this app and they have to fix all again one by one. So I made a little change to fix this.

In frmMain

I added a checkbox named "checkBoxTranslateOnlyNew"

image

in frmMain.cs ResxProgressCallback action was

		private delegate void ResxProgressCallback(int max, int pos, string status);

		async void TranslateResxFilesAsync(
			string sourceResx,
			string sourceLng,
			TranslationOptions translationOptions,
			List<string> desLanguages, string destDir,
			ResxProgressCallback progress,
			bool translateFromKey)
		{
			int max = 0;
			int pos = 0;
			int trycount = 0;
			string status = "";
			bool hasErrors = false;

			var sourceResxFilename = ReadLanguageFilename(sourceResx);
			var errorLogFilename = sourceResxFilename + ".errors.log";
			var errorLogFile = Path.Combine(destDir, errorLogFilename);

			foreach (var destLng in desLanguages)
			{
				var destFile = Path.Combine(destDir, sourceResxFilename + "." + destLng + ".resx");
				var doc = new XmlDocument();
				doc.Load(sourceResx);
				var dataList = ResxTranslator.ReadResxData(doc);
				max = dataList.Count;

				pos = 0;
				status = "Translating language: " + destLng;
				progress.BeginInvoke(max, pos, status, null, null);

				try
				{

					foreach (var node in dataList)
					{
						status = "Translating language: " + destLng;
						pos += 1;
						progress.BeginInvoke(max, pos, status, null, null);


						var valueNode = ResxTranslator.GetDataValueNode(node);
						if (valueNode == null) continue;

						var orgText = translateFromKey ? ResxTranslator.GetDataKeyName(node) : valueNode.InnerText;

and changed code as

		private delegate void ResxProgressCallback(int max, int pos, string status);

		async void TranslateResxFilesAsync(
			string sourceResx,
			string sourceLng,
			TranslationOptions translationOptions,
			List<string> desLanguages, string destDir,
			ResxProgressCallback progress,
			bool translateFromKey)
		{
			int max = 0;
			int pos = 0;
			int trycount = 0;
			string status = "";
			bool hasErrors = false;

			var sourceResxFilename = ReadLanguageFilename(sourceResx);
			var errorLogFilename = sourceResxFilename + ".errors.log";
			var errorLogFile = Path.Combine(destDir, errorLogFilename);

			foreach (var destLng in desLanguages)
			{
				var destFile = Path.Combine(destDir, sourceResxFilename + "." + destLng + ".resx");
				var doc = new XmlDocument();
				doc.Load(sourceResx);
				var dataList = ResxTranslator.ReadResxData(doc);
				max = dataList.Count;
                                // From Here ------>
				List<XmlNode> targetDataList = new List<XmlNode>();
				bool FileExist= File.Exists(destFile);
				if (checkBoxTranslateOnlyNew.Checked && FileExist)
				{
					var Targetdoc = new XmlDocument();
					Targetdoc.Load(destFile);

					targetDataList = ResxTranslator.ReadResxData(Targetdoc);
				}
                                // <--- to Here
				pos = 0;
				status = "Translating language: " + destLng;
				progress.BeginInvoke(max, pos, status, null, null);

				try
				{
                                         // From here ---->
					int indexCorrection = 0;
					foreach (var (node, index) in dataList.Select((n, i) => (n, i)))
					{
						status = "Translating language: " + destLng;
						pos += 1;
						progress.BeginInvoke(max, pos, status, null, null);

						var valueNode = ResxTranslator.GetDataValueNode(node);
						var orgText = translateFromKey ? ResxTranslator.GetDataKeyName(node) : valueNode.InnerText;
						if (checkBoxTranslateOnlyNew.Checked && FileExist)
                        {
							int Destindex = index - indexCorrection;
							if (ResxTranslator.GetDataKeyName(targetDataList.ElementAt(Destindex)) == ResxTranslator.GetDataKeyName(node))
							{
								valueNode.InnerText = ResxTranslator.GetDataValueNode(targetDataList.ElementAt(Destindex)).InnerText;
								indexCorrection++;
								continue;
							}

						}

						if (valueNode == null) continue;


						if (string.IsNullOrWhiteSpace(orgText))
							continue;
                                                /// <------ to Here..

						if (translationOptions.ServiceType == ServiceTypeEnum.Google)

I hope this would help other people too.

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

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:

  • "Text_1" send to "_TranslateMain.cs" for translation;
  • in "txtDesc = result;" null is returned;
GTranslateService.TranslateAsync (
   text,
            lngSrc
            lngDest
            textTranslatorUrlKey
            , (success, result)
            =>
            {
                // SetResult (result);
                // IsBusy (false);
                txtDesc = result;
            });
  • "Text_2" is sent to "_TranslateMain.cs";
  • in "txtDesc = result;" returns "Text_1";

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;
            }
        }

    }

MsCognitiveServicesApiUrl broken

This is not working anymore:

private const string MsCognitiveServicesApiUrl = "https://api-apc.cognitive.microsofttranslator.com";

This is the correct link:

https://api.cognitive.microsofttranslator.com/

Thanks

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.