/// <summary>Adds all TUs from another TuEntryList.</summary> /// <param name="another">Another TuEntryList.</param> public void AddRange(TuEntryList another) { Tus.AddRange(another.Tus); SourceLanguages.UnionWith(another.SourceLanguages); TargetLanguages.UnionWith(another.TargetLanguages); }
/// <summary>Reads a TMX document from an XmlReader to return a series of assets.</summary> /// <param name="reader">An XmlReader object.</param> /// <param name="package">The name of package the XmlReader reads data from.</param> /// <returns>A series of assets.</returns> private IEnumerable <IAsset> ReadAssets(XmlReader reader, string package) { XElement header; IEnumerable <XElement> tus; if (!ParseEnumerateTmx(reader, out header, out tus)) { return(null); } var X = header.Name.Namespace; var locker = new object(); var all_tus = new TuEntryList(); AltParallel.ForEach(tus, // Local Init () => new TuEntryList(), // Body (tu, state_UNUSED, index_long, local_tus) => { var index = (int)index_long; local_tus.Add(new TuEntry(tu, index)); return(local_tus); }, // Local Finally (local_tus) => { lock (locker) { all_tus.AddRange(local_tus); } } ); all_tus.Sort(); var header_source_language = LangCode.NoAll((string)header.Attribute("srclang")); if (header_source_language != null) { all_tus.SourceLanguages.Add(header_source_language); } var slangs = all_tus.SourceLanguages; var tlangs = all_tus.TargetLanguages; if (slangs.Count == 0) { slangs = tlangs; } var assets = new List <IAsset>(slangs.Count * tlangs.Count); AltParallel.ForEach(LangPair.Enumerate(slangs, tlangs), (lang_pair) => { var asset = CreateAsset(package, lang_pair, all_tus.Tus); if (asset != null) { lock (locker) { assets.Add(asset); } } } ); // Sort the assets with language codes so that the result is predicatble. assets.Sort((x, y) => { var s = string.Compare(x.SourceLang, y.SourceLang, StringComparison.OrdinalIgnoreCase); if (s != 0) { return(s); } var t = string.Compare(x.TargetLang, y.TargetLang, StringComparison.OrdinalIgnoreCase); return(t); }); return(assets); }