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.");
            }
        }
示例#2
0
        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);
            }
        }
示例#3
0
        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);
        }
示例#11
0
        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();
 }
示例#13
0
 public abstract IEnumerator Translate(TranslationData data);
示例#14
0
        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));
 }
示例#16
0
        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;
        }