using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using UnityEngine.Networking; namespace I2.Loc { using TranslationDictionary = Dictionary; public static partial class GoogleTranslation { static List mCurrentTranslations = new List(); static List mTranslationJobs = new List(); public delegate void fnOnTranslationReady(TranslationDictionary dict, string error); #region Multiple Translations public static void Translate( TranslationDictionary requests, fnOnTranslationReady OnTranslationReady, bool usePOST = true ) { //WWW www = GetTranslationWWW( requests, usePOST ); //I2.Loc.CoroutineManager.Start(WaitForTranslation(www, OnTranslationReady, requests)); AddTranslationJob( new TranslationJob_Main(requests, OnTranslationReady) ); } public static bool ForceTranslate(TranslationDictionary requests, bool usePOST = true) { var job = new TranslationJob_Main(requests, null); while (true) { var state = job.GetState(); if (state == TranslationJob.eJobState.Running) continue; if (state == TranslationJob.eJobState.Failed) return false; //TranslationJob.eJobState.Succeeded return true; } } public static List ConvertTranslationRequest(TranslationDictionary requests, bool encodeGET) { List results = new List(); var sb = new StringBuilder(); foreach (var kvp in requests) { var request = kvp.Value; if (sb.Length > 0) sb.Append(""); sb.Append(GoogleLanguages.GetGoogleLanguageCode(request.LanguageCode)); sb.Append(":"); for (int i = 0; i < request.TargetLanguagesCode.Length; ++i) { if (i != 0) sb.Append(","); sb.Append(GoogleLanguages.GetGoogleLanguageCode(request.TargetLanguagesCode[i])); } sb.Append("="); var text = TitleCase(request.Text) == request.Text ? request.Text.ToLowerInvariant() : request.Text; if (!encodeGET) { sb.Append(text); } else { sb.Append(Uri.EscapeDataString(text)); if (sb.Length > 4000) { results.Add(sb.ToString()); sb.Length = 0; } } } results.Add(sb.ToString()); return results; } static void AddTranslationJob( TranslationJob job ) { mTranslationJobs.Add(job); if (mTranslationJobs.Count==1) { CoroutineManager.Start(WaitForTranslations()); } } static IEnumerator WaitForTranslations() { while (mTranslationJobs.Count > 0) { var jobs = mTranslationJobs.ToArray(); foreach (var job in jobs) { if (job.GetState() != TranslationJob.eJobState.Running) mTranslationJobs.Remove(job); } yield return null; } } public static string ParseTranslationResult( string html, TranslationDictionary requests ) { //Debug.Log(html); // Handle google restricting the webservice to run if (html.StartsWith("") || html.StartsWith("")) { if (html.Contains("The script completed but did not return anything")) return "The current Google WebService is not supported.\nPlease, delete the WebService from the Google Drive and Install the latest version."; if (html.Contains("Service invoked too many times in a short time")) return ""; // ignore and try again return "There was a problem contacting the WebService. Please try again later\n" + html; } string[] texts = html.Split (new[]{""}, StringSplitOptions.None); string[] splitter = {""}; int i = 0; var Keys = requests.Keys.ToArray(); foreach (var text in Keys) { var temp = FindQueryFromOrigText(text, requests); var fullText = texts[i++]; if (temp.Tags != null) { //for (int j = 0, jmax = temp.Tags.Length; j < jmax; ++j) for (int j = temp.Tags.Length-1; j>=0; --j) { fullText = fullText.Replace(GetGoogleNoTranslateTag(j), temp.Tags[j]); //fullText = fullText.Replace( /*"{[" + j + "]}"*/ ((char)(0x2600+j)).ToString(), temp.Tags[j]); } } temp.Results = fullText.Split (splitter, StringSplitOptions.None); // Google has problem translating this "This Is An Example" but not this "this is an example" if (TitleCase(text)==text) { for (int j=0; j0 || mTranslationJobs.Count > 0; } public static void CancelCurrentGoogleTranslations() { mCurrentTranslations.Clear (); foreach (var job in mTranslationJobs) { job.Dispose(); } mTranslationJobs.Clear(); } #endregion } }