示例#1
0
 /// <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);
 }
示例#2
0
        /// <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);
        }