123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- using UnityEngine;
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.Text;
- using System.Text.RegularExpressions;
- using System.Linq;
- using UnityEngine.Networking;
- namespace I2.Loc
- {
- using TranslationDictionary = Dictionary<string, TranslationQuery>;
- public class TranslationJob_WEB : TranslationJob_WWW
- {
- TranslationDictionary _requests;
- GoogleTranslation.fnOnTranslationReady _OnTranslationReady;
- public string mErrorMessage;
- string mCurrentBatch_ToLanguageCode;
- string mCurrentBatch_FromLanguageCode;
- List<string> mCurrentBatch_Text;
- List<KeyValuePair<string, string>> mQueries;
- public TranslationJob_WEB(TranslationDictionary requests, GoogleTranslation.fnOnTranslationReady OnTranslationReady)
- {
- _requests = requests;
- _OnTranslationReady = OnTranslationReady;
- FindAllQueries();
- ExecuteNextBatch();
- }
- void FindAllQueries()
- {
- mQueries = new List<KeyValuePair<string, string>>();
- foreach (var kvp in _requests)
- {
- foreach (var langCode in kvp.Value.TargetLanguagesCode)
- {
- mQueries.Add(new KeyValuePair<string, string>(kvp.Value.OrigText, kvp.Value.LanguageCode+":"+langCode));
- }
- }
- mQueries.Sort((a, b) => a.Value.CompareTo(b.Value));
- }
- void ExecuteNextBatch()
- {
- if (mQueries.Count==0)
- {
- mJobState = eJobState.Succeeded;
- return;
- }
- mCurrentBatch_Text = new List<string>();
- string lastLangCode = null;
- int maxLength = 200;
- var sb = new StringBuilder();
- int i;
- for (i=0; i<mQueries.Count; ++i)
- {
- var text = mQueries[i].Key;
- var langCode = mQueries[i].Value;
- if (lastLangCode==null || langCode==lastLangCode)
- {
- if (i != 0)
- sb.Append("|||");
- sb.Append(text);
- mCurrentBatch_Text.Add(text);
- lastLangCode = langCode;
- }
- if (sb.Length > maxLength)
- break;
- }
- mQueries.RemoveRange(0, i);
- var fromtoLang = lastLangCode.Split(':');
- mCurrentBatch_FromLanguageCode = fromtoLang[0];
- mCurrentBatch_ToLanguageCode = fromtoLang[1];
- string url = string.Format ("http://www.google.com/translate_t?hl=en&vi=c&ie=UTF8&oe=UTF8&submit=Translate&langpair={0}|{1}&text={2}", mCurrentBatch_FromLanguageCode, mCurrentBatch_ToLanguageCode, Uri.EscapeUriString( sb.ToString() ));
- Debug.Log(url);
- www = UnityWebRequest.Get(url);
- I2Utils.SendWebRequest(www);
- }
- public override eJobState GetState()
- {
- if (www != null && www.isDone)
- {
- ProcessResult(www.downloadHandler.data, www.error);
- www.Dispose();
- www = null;
- }
- if (www == null)
- {
- ExecuteNextBatch();
- }
- return mJobState;
- }
- public void ProcessResult(byte[] bytes, string errorMsg)
- {
- if (string.IsNullOrEmpty(errorMsg))
- {
- var wwwText = Encoding.UTF8.GetString(bytes, 0, bytes.Length); //www.text
- var result = ParseTranslationResult(wwwText, "aab");
- //errorMsg = GoogleTranslation.ParseTranslationResult(wwwText, _requests);
- Debug.Log(result);
- if (string.IsNullOrEmpty(errorMsg))
- {
- if (_OnTranslationReady != null)
- _OnTranslationReady(_requests, null);
- return;
- }
- }
-
- mJobState = eJobState.Failed;
- mErrorMessage = errorMsg;
- }
- string ParseTranslationResult( string html, string OriginalText )
- {
- try
- {
- // This is a Hack for reading Google Translation while Google doens't change their response format
- int iStart = html.IndexOf("TRANSLATED_TEXT='") + "TRANSLATED_TEXT='".Length;
- int iEnd = html.IndexOf("';var", iStart);
- string Translation = html.Substring( iStart, iEnd-iStart);
- // Convert to normalized HTML
- Translation = System.Text.RegularExpressions.Regex.Replace(Translation,
- @"\\x([a-fA-F0-9]{2})",
- match => char.ConvertFromUtf32(Int32.Parse(match.Groups[1].Value, System.Globalization.NumberStyles.HexNumber)));
- // Convert ASCII Characters
- Translation = System.Text.RegularExpressions.Regex.Replace(Translation,
- @"&#(\d+);",
- match => char.ConvertFromUtf32(Int32.Parse(match.Groups[1].Value)));
- Translation = Translation.Replace("<br>", "\n");
- if (OriginalText.ToUpper()==OriginalText)
- Translation = Translation.ToUpper();
- else
- if (GoogleTranslation.UppercaseFirst(OriginalText)==OriginalText)
- Translation = GoogleTranslation.UppercaseFirst(Translation);
- else
- if (GoogleTranslation.TitleCase(OriginalText)==OriginalText)
- Translation = GoogleTranslation.TitleCase(Translation);
- return Translation;
- }
- catch (System.Exception ex)
- {
- Debug.LogError(ex.Message);
- return string.Empty;
- }
- }
- }
- }
|