private IEnumerator DoTranslation(TranslationData result) { var id = result.Id; Logger.Log($"Starting translation {id}!",Level.Debug); var lab = result.Display; _mostRecentTranslations[lab] = id; yield return StartCoroutine(Translator.Translate(result)); Logger.Log($"Finished Translation {id}!",Level.Debug); CacheTranslation(result); if (result.State != TranslationState.Finished) { Logger.Log($"Failed translation #{id} ({result.OriginalText})!", Level.Warn); yield break; } if (_mostRecentTranslations[lab] == id) { UpdateDisplay(result, lab); } else { Logger.Log("A newer translation request for this label exists."); } }
private IEnumerator Test() { var dat = new TranslationData() { Id = 0, ProcessedText = "Hallo Welt" }; var cd = CreateCoroutineEx(TranslateGoogle(dat.ProcessedText, "de", "en", dat)); yield return(cd.coroutine); try { cd.Check(); if (dat.State == TranslationState.Finished) { Logger.Log("Google seems OK", Level.Debug); } else { Logger.Log("There seems to be a problem with Google!", Level.Warn); } } catch (Exception e) { Logger.Log("There seems to be a problem with Google!", Level.Warn); Logger.Log(e); } }
public override IEnumerator Translate(TranslationData data) { var cd = CreateCoroutineEx(TranslateGoogle(data.ProcessedText, "ja", _targetLanguage, data)); yield return(cd.coroutine); if (cd.GetException() != null) { Logger.LogException(cd.GetException(), Level.Warn); data.State = TranslationState.Failed; } }
public static void SendTranslationRequest(TranslationData data, Stream outStream) { Logger.Log($"Sending packet {data.Id}", Level.Debug); var pack = new Packet { method = PacketMethod.translate, text = data.ProcessedText, id = data.Id }; SendPacket(pack, outStream); }
private void LoadCacheFromDisk() { if (!Directory.Exists(TranslationFolder)) { Logger.Log($"Folder {TranslationFolder} does not exist, creating it.", Level.Info); Directory.CreateDirectory(TranslationFolder); } if (!File.Exists(TranslationFilePath)) { Logger.Log($"Cache file {TranslationFilePath} does not exist, creating it.", Level.Info); File.Create(TranslationFilePath); return; } var lineNr = 1; foreach (var line in File.ReadAllLines(TranslationFilePath)) { var parts = line.Split('\t'); if (parts.Length < 2) { Logger.Log($"Cache line (Line {lineNr}) is invalid! It contains no tab character!", Level.Warn); Logger.Log($"Offending line is \"{line}\"", Level.Warn); } else if (parts.Length > 2) { Logger.Log($"Cache line (Line {lineNr}) is invalid! It contains more than one tab character!", Level.Warn); Logger.Log($"Offending line is \"{line}\"", Level.Warn); } else { if (_translationCache.ContainsKey(parts[0])) { Logger.Log($"Line {lineNr} contains a duplicate translation!", Level.Warn); } var orig = parts[0]; var transl = parts[1]; _translationCache[orig] = new TranslationData() { OriginalText = orig, ProcessedText = orig, Translation = transl, State = TranslationState.Finished, SavedOnDisk = true }; } lineNr++; } Logger.Log($"Loaded {_translationCache.Count} translations from cache ({lineNr-1} lines).", Level.Info); }
private void CacheTranslation(TranslationData result) { if (result.State != TranslationState.Finished) { Logger.Log($"Trying to cache unfinised translation #{result.Id}!", Level.Warn); return; } _translationCache[result.OriginalText] = result; if (_cacheDumpFrequenzy != CacheDumpFrequenzy.Instant || !_dumpCache) return; result.SavedOnDisk = true; File.AppendAllText(TranslationFilePath,result.GetCacheLine()); }
private static void UpdateDisplay(TranslationData result, MonoBehaviour display) { switch (display) { case UILabel lab: lab.text = result.Translation; lab.useFloatSpacing = false; lab.spacingX = -1; break; case Text txt: txt.text = result.Translation; break; default: Logger.Log( $"Translation for unsupported object {display.GetType().Name}" , Level.Warn ); break; } }
public static bool ParsePacketForTranslation(Packet p, TranslationData d) { if (p.method != PacketMethod.translation) { return(false); } d.State = (p.success ?? false) ? TranslationState.Finished : TranslationState.Failed; if (d.State != TranslationState.Finished) { return(true); } d.Translation = p.translation ?? ""; if (d.Translation == "") { d.State = TranslationState.Failed; return(false); } return(true); }
internal TranslationData BuildTranslationData(string text, MonoBehaviour display) { var searchtext = text.Replace("\n", ""); if (_translationCache.TryGetValue(searchtext, out var translation)) { Logger.Log("\tFound translation in cache.", Level.Verbose); switch (translation.State) { case TranslationState.Finished: return(translation); case TranslationState.InProgress: Logger.Log("\tTranslation is still in progress.", Level.Debug); return(translation); case TranslationState.None: Logger.Log("\tTranslation has state none!", Level.Warn); return(translation); case TranslationState.Failed: Logger.Log("\tTranslation failed before! Retrying...", Level.Warn); break; default: Logger.LogError("Invalid translation state!"); break; } } translation = new TranslationData { Id = TranslationData.AllocateId(), ProcessedText = _preprocessor.Preprocess(text), OriginalText = text, State = TranslationState.InProgress, Display = display }; return(translation); }
public override IEnumerator Translate(TranslationData data) { bool startCollecting = _openRequests == 0; _openRequests++; TranslationProtocoll.SendTranslationRequest(data, _stream); if (startCollecting) { Logger.Log("Starting collection coroutine"); StartCoroutine(CollectPackets()); } yield return(new WaitForTranslation(this, data.Id)); Logger.Log("Translation arrived"); var pack = _arrivedTranslations[data.Id]; TranslationProtocoll.ParsePacketForTranslation(pack, data); }
private IEnumerator TranslateGoogle(string text, string fromCulture, string toCulture, TranslationData translation) { fromCulture = fromCulture.ToLower(); toCulture = toCulture.ToLower(); translation.ProcessedText = text; translation.State = TranslationState.Failed; // normalize the culture in case something like en-us was passed // retrieve only en since Google doesn't support sub-locales string[] tokens = fromCulture.Split('-'); if (tokens.Length > 1) { fromCulture = tokens[0]; } // normalize ToCulture tokens = toCulture.Split('-'); if (tokens.Length > 1) { toCulture = tokens[0]; } //string url = // $@"http://translate.google.com/translate_a/t?client=j&text={WWW.EscapeURL(text)}&hl=en&sl={fromCulture}&tl={toCulture}"; string url = $@"https://translate.googleapis.com/translate_a/single?client=gtx&sl={fromCulture}&tl={toCulture}&dt=t&q={WWW.EscapeURL(text)}"; var headers = new Dictionary <string, string> { { "User-Agent", "Mozilla/5.0" }, { "Accept-Charset", "UTF-8" } }; var www = new WWW(url, null, headers); yield return(www); if (www.error != null) { Logger.LogError(www.error); yield break; } var result = ExtractTranslationFromGoogleString(www.text); result = result.Replace("\\n", ""); Logger.Log($"Got Translation from google: {result}", Level.Debug); translation.Translation = result; translation.State = TranslationState.Finished; }
public override IEnumerator Translate(TranslationData data) { throw new NotImplementedException(); }
public abstract IEnumerator Translate(TranslationData data);
private IEnumerator TranslateBaidu(string text, string fromCulture, string toCulture, TranslationData translation) { fromCulture = fromCulture.ToLower(); toCulture = toCulture.ToLower(); translation.ProcessedText = text; translation.State = TranslationState.Failed; // From http://blog.csdn.net/u014571132/article/details/53334930 string salt = System.DateTime.Now.Millisecond.ToString(); string md5 = CreateMD5(_appId + text + salt + _appSecret); string url = String.Format("http://api.fanyi.baidu.com/api/trans/vip/translate?q={0}&from={1}&to={2}&appid={3}&salt={4}&sign={5}", WWW.EscapeURL(text), fromCulture, toCulture, _appId, salt, md5); var headers = new Dictionary <string, string> { { "User-Agent", "Mozilla/5.0" }, { "Accept-Charset", "UTF-8" } }; var www = new WWW(url, null, headers); yield return(www); if (www.error != null) { Logger.LogError(www.error); yield break; } string result = string.Empty; var jsonResult = JsonFx.Json.JsonReader.Deserialize <TranslationResult>(www.text); Logger.Log(www.text); for (int i = 0; i < jsonResult.trans_result.Length; i++) { // Only add non-japanese chars to prevent repeated translation foreach (char ch in jsonResult.trans_result[i].dst) { if (!AutoTranslatePlugin.is_japanese_char(ch)) { result += ch; } } } result = result.Replace("\\n", ""); Logger.Log($"Got Translation from Baidu: {result}", Level.Debug); translation.Translation = result; translation.State = TranslationState.Finished; }
internal void StartTranslation(TranslationData translation) { StartCoroutine(DoTranslation(translation)); }
private IEnumerator TranslateGoogle(string text, string fromCulture, string toCulture, TranslationData translation) { fromCulture = fromCulture.ToLower(); toCulture = toCulture.ToLower(); translation.ProcessedText = text; translation.State = TranslationState.Failed; // normalize the culture in case something like en-us was passed // retrieve only en since Google doesn't support sub-locales string[] tokens = fromCulture.Split('-'); if (tokens.Length > 1) { fromCulture = tokens[0]; } // normalize ToCulture tokens = toCulture.Split('-'); if (tokens.Length > 1) { toCulture = tokens[0]; } trans tr = new trans(); tr.q = text; tr.source = fromCulture; tr.target = toCulture; tr.format = "text"; string transjson = JsonUtility.ToJson(tr); var bytes = Encoding.UTF8.GetBytes(transjson); string url = "https://translation.googleapis.com/language/translate/v2?key=" + _apiKey; var headers = new Dictionary <string, string> { { "Content-Type", "application/json" } }; var www = new WWW(url, bytes, headers); yield return(www); if (www.error != null) { Logger.LogError(www.error); yield break; } var result = ExtractTranslationFromGoogleString(www.text); result = result.Replace("\\n", ""); Logger.Log($"Got Translation from google: {result}", Level.Debug); translation.Translation = result; translation.State = TranslationState.Finished; }