/// <summary> /// Aktualizuje lookup pro sentenci /// </summary> public void finish(Trados.Sentence srcSent) { finish(srcSent.SrcText, (Langs)srcSent.SrcLang, srcSent.TransText, (Langs)srcSent.TransLang); }
public static Trados.Sentence insertTrans(int id, Trados.Sentence dummySent, string oldSrcText, string newSrcText, string transText, StringBuilder log, StringBuilder sb) { if (!checkTrans(id, ref newSrcText, ref transText, sb, log)) return null; //kontrola stejnych NOTRANS Trados.TradosDataContext db = Machines.getTradosContext(); Trados.Sentence sent = null; try { sent = db.Sentences.Where(s => s.Id == id).Single(); } catch (Exception exp) { if (dummySent != null) { sent = dummySent; oldSrcText = null; } else throw new Exception(string.Format("Sentence {0}", id), exp); } string oldTransText = sent.TransText; sent.SrcText = newSrcText; sent.TransText = normalizeXmlText(transText, sb); sent.finish(); RefreshLookup(db, sent, excelTextToXmlText(oldSrcText, log), oldTransText, sb, log); db.SubmitChanges(); return sent; }
public static void ImportXml(string xml, Trados.Sentence dummySent, StringBuilder log) { if (xml[0] != '<') xml = xml.Remove(0, 1); //xml = xml.Replace(" ", crlfCode); xml = xml.Replace(" ", " "); XElement xmlData = XElement.Parse(xml, LoadOptions.PreserveWhitespace); XNamespace ad = "urn:schemas-microsoft-com:office:spreadsheet"; XNamespace ss = "urn:schemas-microsoft-com:office:spreadsheet"; //ID vet s priznakem OK z Excel XML var okNodeIds = from el in xmlData.Descendants(ad + "Data") where (string)el.Attribute(ss + "Type") == "Number" && //ciselny node, obsahujici sentence ID el.Parent.Parent.Elements().ElementAt(0).Elements().ElementAt(0).Value.ToLower() == "ok" //veta oznacena jako OK select int.Parse(el.Value); StringBuilder sb = new StringBuilder(); //Vety k prekladu z foreach (int okId in okNodeIds) { try { XElement row = xmlData.Descendants(ad + "Data").Where(el => (string)el.Attribute(ss + "Type") == "Number" && el.Value == okId.ToString()).Single().Parent.Parent; insertTrans(okId, dummySent, row.Elements().ElementAt(3).Value, //stary vzor je v Cell s indexem 3 row.Elements().ElementAt(2).Value, //novy vzor je v Cell s indexem 2 row.Elements().ElementAt(1).Value, //preklad je v Cell s indexem 1 log, sb); } catch {/*loguje se*/} } }
/// <summary> /// vrati vety k prekladu, v excel kodovani /// </summary> public static IEnumerable<exportCmlItem> ExportXmlItems(Trados.TradosDataContext db, Trados.Page pg, Langs srcLang, Langs transLang, List<LocCommand> filter) { StringBuilder sb = new StringBuilder(); /*var s1 = (from Trados.Sentence s in db.Sentences.Where(s => s.PageId == pg.Id && s.TransLang == (short)transLang) let newSrc = db.Sentences.Where(s2 => s2.PageId == s.PageId && s2.TransLang == s.SrcLang && s2.Name == s.Name).Select(s2 => new { s2.TransText, s2.TransHash, s2.Id }).Single() select new { sent = s, newSrcText = newSrc.TransText, newSrcId = newSrc==null ? -1 : newSrc.Id, lookups = db.Lookups.Where(l => l.SrcLang == (short)srcLang && l.TransLang == (short)transLang && l.SrcHash == newSrc.TransHash). Select(l => new { l.SrcText, l.TransText }) }).ToArray(); if (s1 == null) yield break;*/ var sentSrcTexts = (from Trados.Sentence s in db.Sentences.Where(s => s.PageId == pg.Id && s.TransLang == (short)transLang) //let newSrc = db.Sentences.Where(s2 => s2.PageId == s.PageId && s2.TransLang == s.SrcLang && s2.Name == s.Name).Select(s2 => new { s2.TransText, s2.TransHash, s2.Id }).Single() let newSrc = db.Sentences.Where(s2 => s2.PageId == s.PageId && s2.TransLang == s.SrcLang && s2.Name == s.Name).Select(s2 => new { s2.TransText, s2.TransHash, s2.Id }).First() select new { sent = s, newSrcText = newSrc.TransText, newSrcId = newSrc == null ? -1 : newSrc.Id, lookups = db.Lookups.Where(l => l.SrcLang == (short)srcLang && l.TransLang == (short)transLang && l.SrcHash == newSrc.TransHash). Select(l => new { l.SrcText, l.TransText }) }).ToArray(); //Cyklus pres sentence k prekladu (obohacene o text zdrojove sentence) foreach (var sentSrcText in sentSrcTexts) { string oldSrcText = xmlToExcel(sentSrcText.sent.SrcText, sb); string newSrcText = xmlToExcel(sentSrcText.newSrcText, sb); LocCommand actCmd = excelFlag(oldSrcText, newSrcText); if (actCmd == LocCommand.NONE) continue; //Zdroj je prazdny, neni co prekladat //Lookup zaznam: exact match na SrcText string[] lkp = sentSrcText.lookups.Where(l => l.SrcText == sentSrcText.newSrcText).Select(l => l.TransText).Distinct().ToArray(); //lookup zaznam existuje: zmena TRANS nebo CHANGE na OK commandu pro pripad unique exact match v lookup if ((actCmd == LocCommand.TRANS || actCmd == LocCommand.CHANGE) && lkp != null && lkp.Length > 0) actCmd = lkp.Length == 1 ? LocCommand.OK : LocCommand.CHOICE; if (filter != null && filter.IndexOf(actCmd) < 0) continue; //Spocitej TransText: string transTxt; if (actCmd == LocCommand.TRANS) //predpripravi text s NOTRANS prvky transTxt = transXmlToExcel(sentSrcText.sent.TransText, sentSrcText.newSrcText, sb); else if (actCmd == LocCommand.OK) //predpripravi text s NOTRANS prvky transTxt = xmlToExcel(lkp[0], sb); else if (actCmd == LocCommand.CHOICE) { //nabidne volbu z puvodniho prekladu a vsech lookups sb.Length = 0; if (!string.IsNullOrEmpty(sentSrcText.sent.TransText)) sb.Append(sentSrcText.sent.TransText + crlfCode + "=============" + crlfCode); foreach (string ls in lkp.Where(s => s != sentSrcText.sent.TransText)) sb.Append(ls + crlfCode + "=============" + crlfCode); transTxt = xmlToExcel(sb.ToString(), sb); } else //puvodni TRANS text (pro done nebo change) transTxt = xmlToExcel(sentSrcText.sent.TransText, sb); //return yield return new exportCmlItem( pg.SeeUrl, sentSrcText.sent.Id, sentSrcText.sent.Name, actCmd, transTxt, oldSrcText, newSrcText, sentSrcText.newSrcId); } }
public static void GenerateResx(Trados.TradosDataContext db, Trados.Page pg, Langs transLang) { if (pg.PageGroup == (short)LocPageGroup.newEA || pg.PageGroup == (short)LocPageGroup.fakeRussian) return; LocFileType ft = TradosLib.getFileType(pg.FileName.Replace(".resx", null)); LocPageGroup grp = (LocPageGroup)pg.PageGroup; if (ft == LocFileType.js) { //generace lokalizovaneho .JS souboru misto .RESX string fn = null; string fnContent = null; LocCfgPageGroupFilter group = LocCfg.Instance().findPageGroup(grp); switch (grp) { case LocPageGroup.EA_Code: fn = group.BasicPath + @"\framework\script\lm\tradosData." + transLang.ToString().Replace('_', '-') + ".js"; break; case LocPageGroup.rew_school: fn = group.BasicPath + @"\schools\loc\tradosData." + transLang.ToString().Replace('_', '-') + ".js"; fnContent = NewEATradosLib.locJS(db.Sentences.Where(s => s.PageId == pg.Id && s.TransLang == (short)transLang).ToDictionary(sent => sent.Name, sent => sent.TransText == null ? "###TRANS TODO###" : transFinal(sent.TransText))); fnContent = "var tradosData = " + fnContent + "; tradosData[\"forceLang\"] = \"" + transLang.ToString().Replace('_', '-') + "\";"; break; case LocPageGroup.rew_rewise: fn = group.BasicPath + @"\rewise\loc\tradosData." + transLang.ToString().Replace('_', '-') + ".js"; break; } if (fn != null) { using (StreamWriter wr = new StreamWriter(fn)) { if (fnContent != null) wr.Write(fnContent); else { wr.WriteLine("var tradosData = [];"); foreach (Trados.Sentence sent in db.Sentences.Where(s => s.PageId == pg.Id && s.TransLang == (short)transLang)) { wr.Write("tradosData['"); wr.Write(sent.Name); wr.Write("'] = '"); wr.Write(sent.TransText == null ? "###TRANS TODO###" : transFinal(sent.TransText).Replace("'", "\\'")); wr.WriteLine("';"); } } } } } else { bool isPartial = pg.Langs != null && !pg.Langs.Contains(transLang.ToString()); string fn = resxFileName(pg.FileName, transLang); Langs dbLang = isPartial ? Langs.en_gb : transLang; //Difotne je vse anglicky LowUtils.AdjustFileDir(fn); using (ResXResourceWriter wr = new ResXResourceWriter(fn)) foreach (Trados.Sentence sent in db.Sentences.Where(s => s.PageId == pg.Id && s.TransLang == (short)dbLang)) wr.AddResource(sent.Name, sent.TransText == null ? "###TRANS TODO###" : transFinal(sent.TransText).Replace("$nbsp;", " ").Replace(crlfCode, " "));/*sent.TransText.Replace(crlfCode, "\r\n"));*/ if (ft == LocFileType.lmdata && (grp == LocPageGroup.CPV || fn.ToLowerInvariant().IndexOf(@"\localizecommon\") >= 0)) { //vystup primo lokalizovaneho lmdata string lmdata = pg.FileName.Replace(".resx", null).Replace(@"app_localresources\", null); string resData = pg.FileName.Replace(".resx", null).Replace(".lmdata", "." + transLang.ToString().Replace('_', '-') + ".lmdata"); using (FileStream fs = new FileStream(resData, FileMode.Create, FileAccess.Write)) LocalizeXmlLow(lmdata, transLang, fs, false); } } }
/// <summary> /// Pred save vety: ev. pridani do lookup tabulky /// </summary> public static void RefreshLookup(Trados.TradosDataContext db, Trados.Sentence srcSent, string oldSrcText, string oldTransText, StringBuilder sb, StringBuilder log) { if (string.IsNullOrEmpty(srcSent.SrcText) || string.IsNullOrEmpty(srcSent.TransText)) return; Trados.Lookup[] lkps; if (!string.IsNullOrEmpty(oldSrcText)) lkps = db.Lookups.Where(l => l.SrcLang == srcSent.SrcLang && l.TransLang == srcSent.TransLang && ((l.SrcHash == srcSent.SrcHash && l.SrcText == srcSent.SrcText) || (l.SrcHash == LowUtils.crc(oldSrcText) && l.SrcText == oldSrcText))).ToArray(); else lkps = db.Lookups. Where(l => l.SrcLang == srcSent.SrcLang && l.TransLang == srcSent.TransLang && l.SrcHash == srcSent.SrcHash && l.SrcText == srcSent.SrcText). ToArray(); //Lookup zaznam nove verze sentence Trados.Lookup newLkp; try { newLkp = lkps.Where(l => l.SrcText == srcSent.SrcText && l.TransText == srcSent.TransText).SingleOrDefault(); } catch (Exception exp) { throw new Exception(string.Format("Lookup duplicites error: src={0}, trans={1}", srcSent.SrcText, srcSent.TransText), exp); } //Lookup zaznam stare verze sentence //Jedna se o opravu? Kdyz ano, budto puvodni polozku smaz (existuje-li j*z nova) nebo uprav (neexistuje-li) Trados.Lookup oldLkp; try { oldLkp = lkps.Where(l => !string.IsNullOrEmpty(oldSrcText) && !string.IsNullOrEmpty(oldTransText) && l.SrcText == oldSrcText && l.TransText == oldTransText).SingleOrDefault(); } catch (Exception exp) { throw new Exception(string.Format("Lookup duplicites error: src={0}, trans={1}", oldSrcText, oldTransText), exp); } if (oldLkp != null) { if (newLkp == null) oldLkp.finish(srcSent); //else db.Lookups.DeleteOnSubmit(oldLkp); return; } //nejedna se o opravu, novy zaznam v lookup j*z existuje: neni co delat if (newLkp != null) return; //Kontrola duplicit if (lkps.Where(l => l.SrcText == srcSent.SrcText).Any()) if (log != null) log.AppendFormat("Vznikla duplicita v Lookup tabulce, doporučujeme zkontrolovat (src={0}, trans={1})<br/>", srcSent.SrcText, srcSent.TransText); //Lookup polozka neexistuje, zaloz: Trados.Lookup lkp = new Trados.Lookup(); db.Lookups.InsertOnSubmit(lkp); lkp.finish(srcSent); }