TranslationJob_WEB.cs 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. using UnityEngine;
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using System.Text;
  6. using System.Text.RegularExpressions;
  7. using System.Linq;
  8. using UnityEngine.Networking;
  9. namespace I2.Loc
  10. {
  11. using TranslationDictionary = Dictionary<string, TranslationQuery>;
  12. public class TranslationJob_WEB : TranslationJob_WWW
  13. {
  14. TranslationDictionary _requests;
  15. GoogleTranslation.fnOnTranslationReady _OnTranslationReady;
  16. public string mErrorMessage;
  17. string mCurrentBatch_ToLanguageCode;
  18. string mCurrentBatch_FromLanguageCode;
  19. List<string> mCurrentBatch_Text;
  20. List<KeyValuePair<string, string>> mQueries;
  21. public TranslationJob_WEB(TranslationDictionary requests, GoogleTranslation.fnOnTranslationReady OnTranslationReady)
  22. {
  23. _requests = requests;
  24. _OnTranslationReady = OnTranslationReady;
  25. FindAllQueries();
  26. ExecuteNextBatch();
  27. }
  28. void FindAllQueries()
  29. {
  30. mQueries = new List<KeyValuePair<string, string>>();
  31. foreach (var kvp in _requests)
  32. {
  33. foreach (var langCode in kvp.Value.TargetLanguagesCode)
  34. {
  35. mQueries.Add(new KeyValuePair<string, string>(kvp.Value.OrigText, kvp.Value.LanguageCode+":"+langCode));
  36. }
  37. }
  38. mQueries.Sort((a, b) => a.Value.CompareTo(b.Value));
  39. }
  40. void ExecuteNextBatch()
  41. {
  42. if (mQueries.Count==0)
  43. {
  44. mJobState = eJobState.Succeeded;
  45. return;
  46. }
  47. mCurrentBatch_Text = new List<string>();
  48. string lastLangCode = null;
  49. int maxLength = 200;
  50. var sb = new StringBuilder();
  51. int i;
  52. for (i=0; i<mQueries.Count; ++i)
  53. {
  54. var text = mQueries[i].Key;
  55. var langCode = mQueries[i].Value;
  56. if (lastLangCode==null || langCode==lastLangCode)
  57. {
  58. if (i != 0)
  59. sb.Append("|||");
  60. sb.Append(text);
  61. mCurrentBatch_Text.Add(text);
  62. lastLangCode = langCode;
  63. }
  64. if (sb.Length > maxLength)
  65. break;
  66. }
  67. mQueries.RemoveRange(0, i);
  68. var fromtoLang = lastLangCode.Split(':');
  69. mCurrentBatch_FromLanguageCode = fromtoLang[0];
  70. mCurrentBatch_ToLanguageCode = fromtoLang[1];
  71. 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() ));
  72. Debug.Log(url);
  73. www = UnityWebRequest.Get(url);
  74. I2Utils.SendWebRequest(www);
  75. }
  76. public override eJobState GetState()
  77. {
  78. if (www != null && www.isDone)
  79. {
  80. ProcessResult(www.downloadHandler.data, www.error);
  81. www.Dispose();
  82. www = null;
  83. }
  84. if (www == null)
  85. {
  86. ExecuteNextBatch();
  87. }
  88. return mJobState;
  89. }
  90. public void ProcessResult(byte[] bytes, string errorMsg)
  91. {
  92. if (string.IsNullOrEmpty(errorMsg))
  93. {
  94. var wwwText = Encoding.UTF8.GetString(bytes, 0, bytes.Length); //www.text
  95. var result = ParseTranslationResult(wwwText, "aab");
  96. //errorMsg = GoogleTranslation.ParseTranslationResult(wwwText, _requests);
  97. Debug.Log(result);
  98. if (string.IsNullOrEmpty(errorMsg))
  99. {
  100. if (_OnTranslationReady != null)
  101. _OnTranslationReady(_requests, null);
  102. return;
  103. }
  104. }
  105. mJobState = eJobState.Failed;
  106. mErrorMessage = errorMsg;
  107. }
  108. string ParseTranslationResult( string html, string OriginalText )
  109. {
  110. try
  111. {
  112. // This is a Hack for reading Google Translation while Google doens't change their response format
  113. int iStart = html.IndexOf("TRANSLATED_TEXT='") + "TRANSLATED_TEXT='".Length;
  114. int iEnd = html.IndexOf("';var", iStart);
  115. string Translation = html.Substring( iStart, iEnd-iStart);
  116. // Convert to normalized HTML
  117. Translation = System.Text.RegularExpressions.Regex.Replace(Translation,
  118. @"\\x([a-fA-F0-9]{2})",
  119. match => char.ConvertFromUtf32(Int32.Parse(match.Groups[1].Value, System.Globalization.NumberStyles.HexNumber)));
  120. // Convert ASCII Characters
  121. Translation = System.Text.RegularExpressions.Regex.Replace(Translation,
  122. @"&#(\d+);",
  123. match => char.ConvertFromUtf32(Int32.Parse(match.Groups[1].Value)));
  124. Translation = Translation.Replace("<br>", "\n");
  125. if (OriginalText.ToUpper()==OriginalText)
  126. Translation = Translation.ToUpper();
  127. else
  128. if (GoogleTranslation.UppercaseFirst(OriginalText)==OriginalText)
  129. Translation = GoogleTranslation.UppercaseFirst(Translation);
  130. else
  131. if (GoogleTranslation.TitleCase(OriginalText)==OriginalText)
  132. Translation = GoogleTranslation.TitleCase(Translation);
  133. return Translation;
  134. }
  135. catch (System.Exception ex)
  136. {
  137. Debug.LogError(ex.Message);
  138. return string.Empty;
  139. }
  140. }
  141. }
  142. }