public static bool Translate(string audio, out SubtitleLine[] lines) { OrderedDictionary orderedDictionaries; OrderedDictionary orderedDictionaries1; bool count; object translationLock = SubtitleTranslator.TranslationLock; Monitor.Enter(translationLock); try { try { List <SubtitleLine> value = null; if (SubtitleTranslator.translationsLv.TryGetValue(Application.loadedLevel, out orderedDictionaries)) { SubtitleDataBase item = orderedDictionaries[audio] as SubtitleDataBase; if (item == null) { goto Label2; } value = item.Value; goto Label1; } Label2: SubtitleDataBase subtitleDataBase = SubtitleTranslator.translations[audio] as SubtitleDataBase; if (subtitleDataBase != null) { value = subtitleDataBase.Value; } Label1: if (value == null) { value = new List <SubtitleLine>(); if (IniSettings.FindAudio) { if (!IniSettings.DumpAudioByLevel) { string filePath = SubtitleTranslator.FilePath; SubtitleTranslator.translations.Add(audio, new SubtitleDataBase(filePath, value)); SubtitleTranslator.DumpSubtitle(filePath, audio); } else { if (!SubtitleTranslator.translationsLv.TryGetValue(Application.loadedLevel, out orderedDictionaries1)) { orderedDictionaries1 = new OrderedDictionary(); SubtitleTranslator.translationsLv.Add(Application.loadedLevel, orderedDictionaries1); } string lvFilePath = SubtitleTranslator.LvFilePath; orderedDictionaries1.Add(audio, new SubtitleDataBase(lvFilePath, value)); SubtitleTranslator.DumpSubtitle(lvFilePath, audio); } } } List <SubtitleLine> subtitleLines = new List <SubtitleLine>(); foreach (SubtitleLine subtitleLine in value) { if (string.IsNullOrEmpty(subtitleLine.Text)) { continue; } subtitleLines.Add(subtitleLine); } if (subtitleLines.Count == 0 && IniSettings.FindAudio) { SubtitleLine subtitleLine1 = new SubtitleLine() { Position = SubtitleSettings.Anchor, Text = audio }; subtitleLines.Add(subtitleLine1); } lines = subtitleLines.ToArray(); count = subtitleLines.Count > 0; return(count); } catch (Exception exception) { IniSettings.Error(string.Concat("TextTranslator::Translate:\n", exception.ToString())); } lines = null; count = false; } finally { Monitor.Exit(translationLock); } return(count); }
public LineData(SubtitleLine line, HashSet <SubtitleLine> anchor) { this.Line = line; this.Visible = false; this.anchor = anchor; }
private static void LoadTranslations(string file, bool retranslate = false) { object translationLock = SubtitleTranslator.TranslationLock; Monitor.Enter(translationLock); try { try { if (Path.GetExtension(file).ToLower() == ".txt") { if (!Path.GetFileName(file).StartsWith(".")) { if (file.StartsWith(Environment.CurrentDirectory)) { file = file.Remove(0, Environment.CurrentDirectory.Length); if (!file.StartsWith("\\")) { file = string.Concat("\\", file); } file = string.Concat(".", file); } int fileLevel = SubtitleTranslator.GetFileLevel(file); bool flag = fileLevel > -1; OrderedDictionary orderedDictionaries = null; if (!flag) { SubtitleTranslator.RemoveAllTranslation(SubtitleTranslator.translations, file); } else { SubtitleTranslator.translationsLv.TryGetValue(fileLevel, out orderedDictionaries); if (orderedDictionaries != null) { SubtitleTranslator.RemoveAllTranslation(orderedDictionaries, file); } } using (StreamReader streamReader = new StreamReader(file, Encoding.UTF8)) { bool flag1 = false; bool flag2 = true; List <SubtitleLine> subtitleLines = null; string empty = string.Empty; while (!streamReader.EndOfStream) { string str = streamReader.ReadLine(); if (str.StartsWith("//") || empty.Length == 0 && str.Length == 0) { continue; } Match match = Regex.Match(str.TrimEnd(new char[0]), "^#sub[ ]+\"(.+?)\"(?:[ ]+(?:{\\\\a([\\d]+)})?(.*))?$", RegexOptions.IgnoreCase); if (!match.Success) { if (empty.Length <= 0) { continue; } if (!flag1) { if (str.Length == 0) { continue; } Match match1 = Regex.Match(str, "^([\\d]*\\.?[\\d]+)[ ]+-->[ ]+([\\d]*\\.?[\\d]+)$", RegexOptions.None); if (!match1.Success) { flag1 = true; subtitleLines.Add(new SubtitleLine()); } else { if (streamReader.EndOfStream) { continue; } flag1 = true; SubtitleLine subtitleLine = new SubtitleLine() { StartTime = float.Parse(match1.Groups[1].Value, CultureInfo.InvariantCulture), EndTime = float.Parse(match1.Groups[2].Value, CultureInfo.InvariantCulture) }; subtitleLines.Add(subtitleLine); continue; } } if (flag2) { int count = subtitleLines.Count - 1; if (str.Length > 0) { Match match2 = Regex.Match(str, "^(?:{\\\\a([\\d]+)})?(.*)$", RegexOptions.None); if (match2.Success) { string str1 = match2.Groups[2].Value.Trim(); if (str1.Length != 0 || !streamReader.EndOfStream) { SubtitleLine item = subtitleLines[count]; item.Position = (match2.Groups[1].Success ? item.Position.Parse(match2.Groups[1].Value, SubtitleSettings.Anchor) : SubtitleSettings.Anchor); item.Text = str1; subtitleLines[count] = item; continue; } } } flag1 = false; flag2 = true; subtitleLines.RemoveAt(count); } else if (str.Length <= 0) { flag1 = false; flag2 = true; int num = subtitleLines.Count - 1; if (subtitleLines[num].Text.Length != 0) { continue; } subtitleLines.RemoveAt(num); } else { string str2 = str.Trim(); int count1 = subtitleLines.Count - 1; SubtitleLine item1 = subtitleLines[count1]; if (str2.Length <= 0) { if (!streamReader.EndOfStream || item1.Text.Length != 0) { continue; } subtitleLines.RemoveAt(count1); } else { if (item1.Text.Length > 0) { item1.Text = string.Concat(item1.Text, "\n"); } item1.Text = string.Concat(item1.Text, str2); subtitleLines[count1] = item1; } } } else { flag1 = false; flag2 = true; SubtitleDataBase subtitleDataBase = null; empty = match.Groups[1].Value; subtitleLines = new List <SubtitleLine>(); if (match.Groups[3].Success) { string str3 = match.Groups[3].Value.Trim(); if (str3.Length > 0) { SubtitleLine subtitleLine1 = new SubtitleLine() { Text = str3 }; subtitleLine1.Position = (match.Groups[2].Success ? subtitleLine1.Position.Parse(match.Groups[2].Value, SubtitleSettings.Anchor) : SubtitleSettings.Anchor); subtitleLines.Add(subtitleLine1); } } if (!flag) { subtitleDataBase = SubtitleTranslator.translations[empty] as SubtitleDataBase; } else if (orderedDictionaries != null) { subtitleDataBase = orderedDictionaries[empty] as SubtitleDataBase; } if (subtitleDataBase != null) { if (!flag) { SubtitleTranslator.translations.Remove(empty); } else { orderedDictionaries.Remove(empty); } } subtitleDataBase = new SubtitleDataBase(file, subtitleLines); if (!flag) { SubtitleTranslator.translations.Add(empty, subtitleDataBase); } else { if (orderedDictionaries == null) { orderedDictionaries = new OrderedDictionary(); SubtitleTranslator.translationsLv.Add(fileLevel, orderedDictionaries); } orderedDictionaries.Add(empty, subtitleDataBase); } } } } if (retranslate) { AudioSourceSubtitle.Instance.Reload(); } if (IniSettings.DebugMode || IniSettings.FindAudio) { IniSettings.Log(string.Concat("Loaded: ", file)); } } } } catch (Exception exception) { IniSettings.Error(string.Concat("LoadSubtitles:\n", exception.ToString())); } } finally { Monitor.Exit(translationLock); } }