public TmxPair GetTransPair(string source_lang, string target_lang, PropertiesManager propman) { // if (SourceLang != null && !LangCode.Covers(source_lang, SourceLang)) return null; if (SourceLang != null && !LangCode.Equals(source_lang, SourceLang)) { return(null); } var source_tuv = GetTuv(source_lang, true); if (source_tuv == null) { return(null); } var target_tuv = GetTuv(target_lang, false); if (target_tuv == null) { return(null); } if (source_tuv == target_tuv) { return(null); } var pair = new TmxPair { Serial = Index + 1, Id = Id, Source = source_tuv.Inline, Target = target_tuv.Inline, SourceLang = source_lang, // or source_tuv.Lang? FIXME. TargetLang = target_lang, // or target_tuv.Lang? FIXME. }; pair.SetProps(propman, TuProps, source_tuv.Props, target_tuv.Props); pair.SetNotes(TuNotes, source_tuv.Notes, target_tuv.Notes); return(pair); }
public IAssetBundle Read(XmlReader reader, string package, string filename) { XElement header; IEnumerable <XElement> tus; if (!ParseEnumerateTmx(reader, out header, out tus)) { return(null); } var X = header.Name.Namespace; var pool = new ConcurrentStringPool(); var slang = DetectSourceLanguage(header); if (slang == null) { return(null); } var propman = new PropertiesManager(true); var pair_store_pool = new ConcurrentStack <PairStore>(); Parallel.ForEach(tus, new ParallelOptions() { MaxDegreeOfParallelism = Environment.ProcessorCount - 1 }, // Local Init () => { PairStore pairs; return(pair_store_pool.TryPop(out pairs) ? pairs : new PairStore()); }, // Body (tu, state, index_long, pairs) => { var index = (int)index_long; // collect tu info. var id = (string)tu.Attribute("tuid") ?? ""; var tu_props = CollectProps(tu); var tu_notes = CollectNotes(tu); var source_tuv = tu.Elements(X + "tuv").FirstOrDefault(tuv => Covers(slang, Lang(tuv))); if (source_tuv != null) { // collec source tuv info. var source_lang = Lang(source_tuv); var source_inline = GetInline(source_tuv.Element(X + "seg"), X); var source_props = CollectProps(source_tuv); var source_notes = CollectNotes(source_tuv); var tag_pool = NumberTags(source_inline); foreach (var target_tuv in tu.Elements(X + "tuv")) { if (Covers(slang, Lang(target_tuv))) { continue; } // collet target tuv info. var target_lang = Lang(target_tuv); var target_inline = MatchTags(tag_pool, GetInline(target_tuv.Element(X + "seg"), X)); var target_props = CollectProps(target_tuv); var target_notes = CollectNotes(target_tuv); var pair = new TmxPair() { Serial = index + 1, Id = id, Source = source_inline, Target = target_inline, SourceLang = source_lang, TargetLang = target_lang, }; pair.SetProps(propman, pool, tu_props, source_props, target_props); pair.SetNotes(tu_notes, source_notes, target_notes); pairs.Add(index, target_lang, pair); } } return(pairs); }, // Local Finally pairs => { pair_store_pool.Push(pairs); } ); // Merge pairs in pair_store_pool into a single PairStore. PairStore all_pairs; pair_store_pool.TryPop(out all_pairs); while (!pair_store_pool.IsEmpty) { PairStore pairs; pair_store_pool.TryPop(out pairs); all_pairs.AddAll(pairs); } // Wrap pairs in assets, then in an asset bundle. IEnumerable <IAsset> assets = Enumerable.Empty <IAsset>(); if (all_pairs != null) { assets = all_pairs.GetTargetLanguages().Select(tlang => new TmxAsset() { Package = package, Original = string.Format("{0} - {1}", slang, tlang), SourceLang = slang, TargetLang = tlang, TransPairs = all_pairs.GetPairs(tlang), Properties = propman.Properties, }).ToList(); } return(new SimpleAssetBundle(assets, filename)); }