TranslationJob_WEB.cs 5.8 KB

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