/// <summary> /// Формирует Single Translated запись /// </summary> /// <param name="line"></param> /// <param name="id"></param> /// <returns></returns> private DataEntry getSingleTranslatedEntry(string line, int id) { var textLine = line.GetMatch(EscapeSeqHelper.SingleTranslatedTextTemplate); var template = line.GetTemplateFromLine(textLine); var temp = new DefaultEntry(EntryType.SingleTranslated, id, template); temp.AddTextLine(new TextLine(temp, "ST1", Language.NotSpecified, "FROM_NATIVE", DateTime.Now, textLine)); return(temp); }
/// <summary> /// Обновить загруженный скрипт с помощью патч-файла /// </summary> /// <param name="patch"></param> public void Merge(XElement patch) { var _masterFIleRequiredVersion = patch.Attribute(XmlDataValues.ScriptVersionAttr).Value; var version = new ScriptVersion(_masterFIleRequiredVersion); // Патчфайл применяется только к определенной версии матер-файла if (_version.CompareTo(version) != 0) { throw new ArgumentOutOfRangeException(@"Cannot apply this patch file to current master file, destination master file version incorrect"); } foreach (var entry in patch.Elements(XmlDataValues.EntryTitle)) { var patchedEntryType = entry.GetEntryType(); DataEntry patchedEntry = null; switch (patchedEntryType) { case EntryType.Hidden: { throw new ArgumentOutOfRangeException("Patch file cannot contain hidden entries"); } case EntryType.Default: { patchedEntry = new DefaultEntry(entry, EntryType.Default); break; } case EntryType.SingleTranslated: { patchedEntry = new DefaultEntry(entry, EntryType.SingleTranslated); break; } } var sourceEntry = this.GetEntry(patchedEntry.Id); if (sourceEntry == null) { throw new IndexOutOfRangeException(string.Format("Can't find in master-file entry with {0} id", patchedEntry.Id)); } foreach (var line in patchedEntry.EnumerateLines()) { // Возможно, тут будет падать. Внимательно! line.Approved = false; sourceEntry.AddTextLine(line); } } }
/// <summary> /// Считывает из входного потока Default-запись /// </summary> /// <param name="japLine"></param> /// <param name="reader"></param> /// <param name="id"></param> /// <returns></returns> private DataEntry getDefaultEntry(string japLine, StreamReader reader, int id) { // 1-я строка - на японском (оригинал) // Получам строку с переменными - заполнителями var lineWithoutVars = japLine.GetTemplateFromVars(_variables, Language.Jap); /// Получаем строчку текста var japTextLine = lineWithoutVars.GetLine(); // Получаем "шаблон" var template = lineWithoutVars.GetTemplateFromLine(japTextLine); var temp = new DefaultEntry(EntryType.Default, id, template); temp.AddTextLine(new TextLine(temp, "JAP1", Language.Jap, "FROM_NATIVE", DateTime.Now, japTextLine)); // Английским переводом считается 1-я закоментированная строчка после японской. // Остальные закоментированные строчки игнорируются bool englishTranslateFound = false; bool russianTranslateFound = false; while (true) { var nextLine = reader.ReadLine(); if (string.IsNullOrEmpty(nextLine)) { if (!russianTranslateFound) { throw new ArgumentException("Line MUST contain russian translate!"); } // Больше в этой группе строчек нет return(temp); } if (nextLine.IsMatchesToRegex(EscapeSeqHelper.CommentLineTemplate)) { if (englishTranslateFound) { continue; } // Строка с английским переводом englishTranslateFound = true; var engTextLine = nextLine.GetTextLine(Language.Eng); temp.AddTextLine(new TextLine(temp, "ENG1", Language.Eng, "FROM_NATIVE", DateTime.Now, engTextLine)); } else { // Найдена незакоментированная строка if (!englishTranslateFound) { // Английского перевода до сих пор не было найдено // throw new InvalidDataException("Can't find english translation"); } // Это русский перевод var rusTextLine = nextLine.GetTextLine(Language.Rus); temp.AddTextLine(new TextLine(temp, "RUS1", Language.Rus, "FROM_NATIVE", DateTime.Now, rusTextLine)); russianTranslateFound = true; break; } } return(temp); }
public Chapter(XElement xml) { if (!string.Equals(xml.Name.ToString(), XmlDataValues.ChapterTitle, StringComparison.Ordinal)) { throw new ArgumentOutOfRangeException("Can't create chapter form non-chapter xml"); } _filename = xml.Attribute(XmlDataValues.RootNameAttr).Value; bool firstEntry = true; _data = new List <DataEntry>(); foreach (var entry in xml.Elements(XmlDataValues.EntryTitle)) { if (firstEntry) { // Запись должна всегда иметь id var startId = entry.Attribute(XmlDataValues.IdAttr).Value; _startChapterId = int.Parse(startId); firstEntry = false; } // Определяем тип записи и создаем соотв. объект EntryType type; var typeAttr = entry.Attribute(XmlDataValues.EntryTypeAttr); if (typeAttr != null) { type = (EntryType)Enum.Parse(typeof(EntryType), typeAttr.Value); } else { type = EntryType.Default; } DataEntry temp; switch (type) { case EntryType.Hidden: { temp = new HiddenEntry(entry); break; } case EntryType.SingleTranslated: { temp = new DefaultEntry(entry, EntryType.SingleTranslated); break; } case EntryType.Default: { temp = new DefaultEntry(entry, EntryType.Default); break; } default: { throw new ArgumentOutOfRangeException("Can't create entry of unknown type!"); } } _data.Add(temp); } }