using System; using System.Collections; using System.Collections.Generic; using System.Globalization; using System.Text; using UnityEngine; namespace I2.Loc { public static class GoogleTranslation { public static bool CanTranslate() { return LocalizationManager.Sources.Count > 0 && !string.IsNullOrEmpty(LocalizationManager.GetWebServiceURL()); } public static void Translate(string text, string LanguageCodeFrom, string LanguageCodeTo, Action OnTranslationReady) { WWW translationWWW = GetTranslationWWW(text, LanguageCodeFrom, LanguageCodeTo); CoroutineManager.pInstance.StartCoroutine(WaitForTranslation(translationWWW, OnTranslationReady, text)); } private static IEnumerator WaitForTranslation(WWW www, Action OnTranslationReady, string OriginalText) { yield return www; if (!string.IsNullOrEmpty(www.error)) { Debug.LogError(www.error); OnTranslationReady(string.Empty); } else { string obj = ParseTranslationResult(www.text, OriginalText); OnTranslationReady(obj); } } public static string ForceTranslate(string text, string LanguageCodeFrom, string LanguageCodeTo) { WWW translationWWW = GetTranslationWWW(text, LanguageCodeFrom, LanguageCodeTo); while (!translationWWW.isDone) { } if (!string.IsNullOrEmpty(translationWWW.error)) { Debug.LogError("-- " + translationWWW.error); return string.Empty; } return ParseTranslationResult(translationWWW.text, text); } public static WWW GetTranslationWWW(string text, string LanguageCodeFrom, string LanguageCodeTo) { LanguageCodeFrom = GoogleLanguages.GetGoogleLanguageCode(LanguageCodeFrom); LanguageCodeTo = GoogleLanguages.GetGoogleLanguageCode(LanguageCodeTo); if (TitleCase(text) == text && text.ToUpper() != text) { text = text.ToLower(); } string url = string.Format("{0}?action=Translate&list={1}:{2}={3}", LocalizationManager.GetWebServiceURL(), LanguageCodeFrom, LanguageCodeTo, Uri.EscapeUriString(text)); return new WWW(url); } public static string ParseTranslationResult(string html, string OriginalText) { try { string text = html; if (TitleCase(OriginalText) == OriginalText && OriginalText.ToUpper() != OriginalText) { text = TitleCase(text); } return text; } catch (Exception ex) { Debug.LogError(ex.Message); return string.Empty; } } public static void Translate(List requests, Action> OnTranslationReady) { WWW translationWWW = GetTranslationWWW(requests); CoroutineManager.pInstance.StartCoroutine(WaitForTranslation(translationWWW, OnTranslationReady, requests)); } public static WWW GetTranslationWWW(List requests) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append(LocalizationManager.GetWebServiceURL()); stringBuilder.Append("?action=Translate&list="); bool flag = true; foreach (TranslationRequest request in requests) { if (!flag) { stringBuilder.Append(""); } stringBuilder.Append(request.LanguageCode); stringBuilder.Append(":"); for (int i = 0; i < request.TargetLanguagesCode.Length; i++) { if (i != 0) { stringBuilder.Append(","); } stringBuilder.Append(request.TargetLanguagesCode[i]); } stringBuilder.Append("="); string stringToEscape = ((!(TitleCase(request.Text) == request.Text)) ? request.Text : request.Text.ToLowerInvariant()); stringBuilder.Append(Uri.EscapeUriString(stringToEscape)); flag = false; } string url = stringBuilder.ToString(); return new WWW(url); } private static IEnumerator WaitForTranslation(WWW www, Action> OnTranslationReady, List requests) { yield return www; if (!string.IsNullOrEmpty(www.error)) { Debug.LogError(www.error); OnTranslationReady(requests); } else { ParseTranslationResult(www.text, requests); OnTranslationReady(requests); } } public static string ParseTranslationResult(string html, List requests) { if (html.StartsWith("") || html.StartsWith("")) { return "There was a problem contacting the WebService. Please try again later"; } string[] array = html.Split(new string[1] { "" }, StringSplitOptions.None); string[] separator = new string[1] { "" }; for (int i = 0; i < Mathf.Min(requests.Count, array.Length); i++) { TranslationRequest value = requests[i]; value.Results = array[i].Split(separator, StringSplitOptions.None); if (TitleCase(value.Text) == value.Text) { for (int j = 0; j < value.Results.Length; j++) { value.Results[j] = TitleCase(value.Results[j]); } } requests[i] = value; } return string.Empty; } public static string UppercaseFirst(string s) { if (string.IsNullOrEmpty(s)) { return string.Empty; } char[] array = s.ToLower().ToCharArray(); array[0] = char.ToUpper(array[0]); return new string(array); } public static string TitleCase(string s) { if (string.IsNullOrEmpty(s)) { return string.Empty; } return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s); } } }