using System; using System.Collections.Generic; using System.Globalization; using System.Text; using System.Text.RegularExpressions; using UnityEngine; using UnityEngine.Networking; namespace I2.Loc { using TranslationDictionary = Dictionary; public class TranslationJob_WEB : TranslationJob_WWW { TranslationDictionary _requests; GoogleTranslation.fnOnTranslationReady _OnTranslationReady; public string mErrorMessage; string mCurrentBatch_ToLanguageCode; string mCurrentBatch_FromLanguageCode; List mCurrentBatch_Text; List> mQueries; public TranslationJob_WEB(TranslationDictionary requests, GoogleTranslation.fnOnTranslationReady OnTranslationReady) { _requests = requests; _OnTranslationReady = OnTranslationReady; FindAllQueries(); ExecuteNextBatch(); } void FindAllQueries() { mQueries = new List>(); foreach (var kvp in _requests) { foreach (var langCode in kvp.Value.TargetLanguagesCode) { mQueries.Add(new KeyValuePair(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 lastLangCode = null; int maxLength = 200; var sb = new StringBuilder(); int i; for (i=0; i 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='", StringComparison.Ordinal) + "TRANSLATED_TEXT='".Length; int iEnd = html.IndexOf("';var", iStart, StringComparison.Ordinal); string Translation = html.Substring( iStart, iEnd-iStart); // Convert to normalized HTML Translation = Regex.Replace(Translation, @"\\x([a-fA-F0-9]{2})", match => char.ConvertFromUtf32(int.Parse(match.Groups[1].Value, NumberStyles.HexNumber))); // Convert ASCII Characters Translation = Regex.Replace(Translation, @"&#(\d+);", match => char.ConvertFromUtf32(int.Parse(match.Groups[1].Value))); Translation = Translation.Replace("
", "\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 (Exception ex) { Debug.LogError(ex.Message); return string.Empty; } } } }