コード例 #1
0
        public TranslateService(IOptions <TranslateOptions> op, MongoService mongo, TranslateStoreService store)
        {
            Book = new NbBook(op.Value.NotabenoidLogin, op.Value.NotabenoidPassword, op.Value.BookId);

            _gameDir      = op.Value.GameDir;
            _translateDir = op.Value.TranslateDir ?? Path.Combine(_gameDir, "TRANSLATE");
            _notaCache    = mongo.Database.GetCollection <NotaCache>("NotaCache");
            _store        = store;

            UpdateDate = UpdateCreateDate();
        }
コード例 #2
0
        protected override async Task Do()
        {
            NbBook book = new NbBook(NotabenoidLogin, NotabenoidPassword, BookId);

            if (Resource != null)
            {
                await book.Upload(package, Resource);
            }
            else
            {
                await book.Upload(package);
            }
        }
コード例 #3
0
        protected async Task OnExecute()
        {
            var book = new NbBook(NotabenoidLogin, NotabenoidPassword, BookId);
            await book.ReadVolumes();

            foreach (var v in book.Volumes)
            {
                Console.WriteLine(v.Name);
                var tr = await book.GetTranslates(v.URL, true);

                foreach (var kv in tr)
                {
                    if (String.IsNullOrEmpty(kv.Value))
                    {
                        File.AppendAllText("en.txt", kv.Key + "\n");
                    }
                }
            }

            Console.WriteLine("Completed");
        }
コード例 #4
0
        private async Task OnExecute()
        {
            var book = new NbBook(NotabenoidLogin, NotabenoidPassword, BookId);
            var dict = await book.GetDict();

            glossary = new GlossaryConfig
            {
                GlossaryData = new GlossaryData
                {
                    GlossaryPairs = dict.Where(kv => !kv.Key.StartsWith('-'))
                                    .Select(kv => new GlossaryPair {
                        SourceText = kv.Key, TranslatedText = kv.Value
                    })
                                    .ToArray()
                }
            };

            rest = new RestClient("https://translate.api.cloud.yandex.net/translate/v2/translate");
            rest.UseNewtonsoftJson();
            rest.AddDefaultHeader("Authorization", "Api-Key " + YandexApiKey);

            //var test = await Translate("That was foolish of me and good of Tuck.");
            //Console.WriteLine(test);

            string destFile = "ytrans.json";

            List <GameTranslate>        translatedList = new List <GameTranslate>();
            Dictionary <string, string> translations   = new Dictionary <string, string>();

            if (File.Exists(destFile))
            {
                translatedList = GameTranslate.Load(destFile);
                translations   = translatedList.ToDictionary(t => t.en, t => t.ru);
            }

            SCIPackage package = SCIPackage.Load(GameDir);
            var        texts   = package.Texts;
            var        scripts = package.Scripts;

            Console.WriteLine("Gathering english");

            HashSet <string> toTranslate = new HashSet <string>(); // Множество всех оригинальных фраз

            foreach (var r in texts)
            {
                var enLines = r.GetText(false); // Оригинальный текст
                var ruLines = r.GetText(true);  // Уже переведенный текст

                if (enLines.Length != ruLines.Length)
                {
                    Console.WriteLine($"{r} Lines count error");
                    continue;
                }

                for (int i = 0; i < enLines.Length; i++)
                {
                    var en = enLines[i];
                    var ru = ruLines[i];

                    if (en.Trim().Length == 0)
                    {
                        continue;                        // Пустые строки
                    }
                    if (en.Contains("%"))
                    {
                        continue;                   // Системные сообщения
                    }
                    //if (!ru.Equals(en)) continue; // Пропускаем уже готовый перевод

                    if (!translations.ContainsKey(en) && !toTranslate.Contains(en))
                    {
                        toTranslate.Add(en);
                    }
                }
            }

            foreach (var r in scripts)
            {
                var enScr = r.GetScript(false);
                var ruScr = r.GetScript(true);

                var enStrings = enScr.AllStrings.Where(s => !s.IsClassName).ToArray();
                var ruStrings = ruScr.AllStrings.Where(s => !s.IsClassName).ToArray();

                for (int i = 0; i < enStrings.Length; i++)
                {
                    var en = enStrings[i].Value;
                    var ru = ruStrings[i].Value;

                    if (en.Trim().Length == 0)
                    {
                        continue;                        // Пустые строки
                    }
                    if (en.Contains("%"))
                    {
                        continue;                   // Системные сообщения
                    }
                    //if (!ru.Equals(en)) continue; // Пропускаем уже готовый перевод

                    if (!translations.ContainsKey(en) && !toTranslate.Contains(en))
                    {
                        toTranslate.Add(en);
                    }
                }
            }

            Console.WriteLine("Translate");

            async Task TranslatePart(List <string> txt)
            {
                var tr = await Translate(txt.ToArray());

                if (txt.Count != tr.Length)
                {
                    Console.WriteLine("Translate Error");
                }
                for (int n = 0; n < tr.Length; n++)
                {
                    translations[txt[n]] = tr[n];
                    translatedList.Add(new GameTranslate {
                        en = txt[n], ru = tr[n]
                    });
                }
            }

            var           arr = toTranslate.ToArray();
            int           len = 0;
            List <string> txt = new List <string>();

            for (int i = 0; i < arr.Length; i++)
            {
                var val = arr[i].Trim();
                //var escaped = JsonConvert.ToString(val);

                if (len + val.Length > 10000)
                {
                    await TranslatePart(txt);

                    txt.Clear();
                    len = 0;
                }

                len += val.Length;
                txt.Add(val);

                if (i == arr.Length - 1)
                {
                    await TranslatePart(txt);
                }
            }

            if (Apply)
            {
                Console.WriteLine("Apply translate");

                foreach (var r in texts)
                {
                    bool isChanged = false;
                    var  enLines   = r.GetText(false); // Оригинальный текст
                    var  ruLines   = r.GetText(true);  // Уже переведенный текст

                    if (enLines.Length != ruLines.Length)
                    {
                        continue;
                    }

                    for (int i = 0; i < enLines.Length; i++)
                    {
                        var en = enLines[i];
                        var ru = ruLines[i];

                        if (en.Trim().Length == 0)
                        {
                            continue;                        // Пустые строки
                        }
                        if (en.Contains("%"))
                        {
                            continue;                   // Системные сообщения
                        }
                        if (!ru.Equals(en))
                        {
                            continue;                 // Пропускаем уже готовый перевод
                        }
                        if (translations.TryGetValue(en, out string tr))
                        {
                            ruLines[i] = tr;
                            isChanged  = true;
                        }
                    }

                    if (isChanged)
                    {
                        r.SetTranslate(ruLines);
                    }
                }

                foreach (var r in scripts)
                {
                    bool isChanged = false;
                    var  enScr     = r.GetScript(false);
                    var  ruScr     = r.GetScript(true);

                    var enStrings = enScr.AllStrings.Where(s => !s.IsClassName).ToArray();
                    var ruStrings = ruScr.AllStrings.Where(s => !s.IsClassName).ToArray();

                    for (int i = 0; i < enStrings.Length; i++)
                    {
                        var en = enStrings[i].Value;
                        var ru = ruStrings[i].Value;

                        if (en.Trim().Length == 0)
                        {
                            continue;                        // Пустые строки
                        }
                        if (en.Contains("%"))
                        {
                            continue;                   // Системные сообщения
                        }
                        if (!ru.Equals(en))
                        {
                            continue;                 // Пропускаем уже готовый перевод
                        }
                        if (translations.TryGetValue(en, out string tr))
                        {
                            ruStrings[i].Value = tr;
                            isChanged          = true;
                        }
                    }

                    if (isChanged)
                    {
                        r.SaveTranslate(ruScr.GetBytes());
                    }
                }
            }

            File.WriteAllText(destFile, JsonConvert.SerializeObject(translatedList, Formatting.None));

            Console.WriteLine("Completed");
        }
コード例 #5
0
        protected override async Task Do()
        {
            NbBook book = new NbBook(NotabenoidLogin, NotabenoidPassword, BookId);
            await book.ReadVolumes();

            Console.WriteLine("Read parts...");
            var tasks = book.Volumes.Select(v => book.GetParts(v)).ToArray();
            await Task.WhenAll(tasks);

            Console.WriteLine("Complete");

            var parts = tasks.SelectMany(t => t.Result);

            // Групируем по исходному тексту
            var groups = parts.GroupBy(p => p.En).Where(g => g.Count() > 1);

            foreach (var byEn in groups)
            {
                // Группируем по главе
                var byVol = byEn.GroupBy(p => p.Volume).Where(g => g.Count() > 1);
                if (!byVol.Any())
                {
                    continue;
                }

                Console.WriteLine();
                Console.WriteLine(byEn.Key);
                Console.WriteLine();
                foreach (var volumeParts in byVol)
                {
                    var volume = volumeParts.Key;
                    Console.WriteLine(volume.Name);
                    Console.WriteLine(volume.URL);

                    if (volumeParts.Any(p => !String.IsNullOrWhiteSpace(p.Tr))) // Есть перевод
                    {
                        // Удаляем без перевода
                        var remTasks = volumeParts.Where(p => String.IsNullOrWhiteSpace(p.Tr))
                                       .Select(p => book.Remove(p))
                                       .ToArray();
                        await Task.WhenAll(remTasks);

                        // Удаляем лишние с переводом (оставляем первый в списке)
                        var translated = volumeParts.Where(p => !String.IsNullOrWhiteSpace(p.Tr));

                        remTasks = translated.TakeLast(translated.Count() - 1)
                                   .Select(p => book.Remove(p))
                                   .ToArray();
                        await Task.WhenAll(remTasks);
                    }
                    else
                    {
                        var remTasks = volumeParts.TakeLast(volumeParts.Count() - 1)
                                       .Select(p => book.Remove(p))
                                       .ToArray();
                        await Task.WhenAll(remTasks);
                    }

                    foreach (var p in volumeParts)
                    {
                        Console.WriteLine($"\t{p.Id} : {p.Tr}");
                    }
                }
            }

            // Чистим и групируем еще раз
            parts  = parts.Where(p => !p.Removed);
            groups = parts.GroupBy(p => p.En).Where(g => g.Count() > 1);
            foreach (var byEn in groups)
            {
                if (!byEn.Any(p => !String.IsNullOrWhiteSpace(p.Tr)))
                {
                    continue;                                                   // Нет перевода - пропускаем
                }
                if (byEn.All(p => !String.IsNullOrWhiteSpace(p.Tr)))
                {
                    continue;                                                  // Все переведены - пропускаем
                }
                Console.WriteLine();
                Console.WriteLine(byEn.Key);
                Console.WriteLine();

                foreach (var p in byEn)
                {
                    Console.WriteLine(p.Url);
                    Console.WriteLine(p.Tr);
                    Console.WriteLine();
                }
                Console.WriteLine("========================");

                var tr = byEn.First(p => !String.IsNullOrWhiteSpace(p.Tr)).Tr;

                var tasksTr = byEn.Where(p => String.IsNullOrWhiteSpace(p.Tr))
                              .Select(p => book.AddTranslate(p.Volume.Name, p.En, tr))
                              .ToArray();
                await Task.WhenAll(tasksTr);
            }
        }