Exemple #1
0
        /// <inheritdoc />
        public override Support.Translation Translate(IEnumerable <string> translatables, Language source, Language target)
        {
            var translation = new Support.Translation
            {
                Source = source,
                Target = target,
            };

            translatables = translatables.ToList();
            var       count    = 0;
            var       total    = translatables.Count();
            const int batchMax = 50;

            using (var enumerator = translatables.GetEnumerator())
            {
                while (enumerator.MoveNext())
                {
                    var batch = new List <string>();
                    do
                    {
                        batch.Add(enumerator.Current);
                    }while (batch.Count < batchMax && enumerator.MoveNext());

                    var translatedRaw = Translate(batch, source, target);
                    if (!translatedRaw.StartsWith("["))
                    {
                        throw new PaywallReachedException("Paywall reached.");
                    }
                    var json = JArray.Parse(translatedRaw);
                    ProcessTranslationBatch(batch, json, translation);

                    count += batch.Count;
                    var progress = count * 100 / total;
                    OnStatusChanged($"Translating ({count} of {total})...", progress);
                }
            }

            return(translation);
        }
Exemple #2
0
        private static void ProcessTranslationBatch(IList <string> batch, JToken token, Support.Translation translation)
        {
            var jsonTranslations = (JArray)token.First;
            var translationIndex = 0;

            foreach (var translatable in batch)
            {
                var accumulatedTranslation  = "";
                var accumulatedTranslatable = "";
                var found = false;
                while (!found && translationIndex < jsonTranslations.Count && jsonTranslations[translationIndex].Type == JTokenType.Array)
                {
                    var jsonTranslationTemp = jsonTranslations[translationIndex];
                    var jsonTranslation     = (JArray)jsonTranslationTemp;
                    accumulatedTranslation  += jsonTranslation[0].Value <string>();
                    accumulatedTranslatable += jsonTranslation[1].Value <string>();

                    found = Regex.IsMatch(accumulatedTranslatable, "(\r\n\\s*)\\z");
                    translationIndex++;
                }

                if (found || translationIndex == jsonTranslations.Count)
                {
                    accumulatedTranslation = Regex.Replace(accumulatedTranslation, "(\r\n\\s*)\\z", "");
                    translation.Translations.Add(translatable, accumulatedTranslation);
                }
                else
                {
                    File.AppendAllText(Path.Combine(Environment.CurrentDirectory, "log.log"),
                                       $"[{DateTime.Now}] Exception: Failed to locate match for {translatable}.\r\n" +
                                       "Request: " + string.Join("\r\n", batch) + "\r\n" +
                                       "Response: " + token + "\r\n" +
                                       "\r\n");
                }
            }

            if (translation.Source.Code == "auto")
            {
                var detectedLanguage = Languages.FirstOrDefault(l => l.Code == token[2].Value <string>());
                if (detectedLanguage != null)
                {
                    translation.Source = detectedLanguage;
                }
            }
        }