public void Add(ResourceDataCollection coll) { foreach (ResourceData it in coll) { keyedData.Add(it.ResourceName, it); List.Add(it); } }
public void ProcessAssembly(string source) { XmlReaderSettings settings = new XmlReaderSettings(); settings.ConformanceLevel = ConformanceLevel.Fragment; settings.IgnoreWhitespace = true; settings.IgnoreComments = true; XmlReader reader = null; try { reader = XmlReader.Create(source, settings); } catch (Exception e) { Tools.Error("Can't open file " + source, e.Message); } ResourceDataCollection data = new ResourceDataCollection(); AssemblyName assemblyName = new AssemblyName(); resources.Add(assemblyName, data); using (reader) { if (ReadHeader(assemblyName, reader)) { try { while (!reader.EOF) { reader.Read(); if (reader.Name == "NewDataSet") { string xml = reader.ReadOuterXml(); XmlDataDocument xmlDoc = new XmlDataDocument(); ResourceData.PrepareDataSet(xmlDoc.DataSet); xmlDoc.LoadXml(xml); ResourceData rd = new ResourceData(); rd.DataSet = xmlDoc.DataSet.Copy(); rd.ResourceName = rd.DataSet.Tables["MetaData"].Rows[0]["Name"].ToString(); rd.ResourceType = rd.DataSet.Tables["MetaData"].Rows[0]["Type"].ToString(); data.Add(rd); } } } catch (Exception e) { Tools.Error("Corruption in resources XML", e.Message); } } } }
public void Save(string outputDirectory) { if (Directory.Exists(outputDirectory) == false) { throw new ArgumentException(string.Format(CultureInfo.CurrentUICulture, "Invalid output directory {0}", outputDirectory)); } string cultureFile = Path.Combine(outputDirectory, "culture.txt"); if (File.Exists(cultureFile)) { using (StreamReader reader = new StreamReader(cultureFile)) { culture = reader.ReadToEnd(); } } foreach (KeyValuePair <AssemblyName, ResourceDataCollection> pair in resources) { AssemblyName assemblyName = pair.Key; ResourceDataCollection data = pair.Value; string fileName = Path.Combine(outputDirectory, assemblyName.Name + ".xml"); InsertExistingTranslations(fileName, data); using (XmlTextWriter writer = new XmlTextWriter(fileName, Encoding.UTF8)) { writer.Formatting = Formatting.Indented; writer.WriteStartElement("root"); writer.WriteStartElement("assembly"); writer.WriteAttributeString("culture", string.IsNullOrEmpty(fileCulture) ? culture : fileCulture); writer.WriteAttributeString("name", assemblyName.Name + ".resources"); writer.WriteAttributeString("version", assemblyName.Version.ToString()); writer.WriteEndElement(); foreach (ResourceData rd in data) { writer.WriteStartElement("resources"); writer.WriteAttributeString("name", rd.ResourceName); writer.WriteAttributeString("type", rd.ResourceType); XmlDataDocument xml = new XmlDataDocument(rd.DataSet); xml.Save(writer); writer.WriteEndElement(); } writer.WriteEndElement(); writer.Close(); } } }
public void Save() { AppDomain appDomain = AppDomain.CurrentDomain; foreach (KeyValuePair <AssemblyName, ResourceDataCollection> pair in resources) { AssemblyName assemblyName = pair.Key; ResourceDataCollection data = pair.Value; AssemblyBuilder asmBuilder = appDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.ReflectionOnly); string satelliteAssemblyFileName = assemblyName.Name + ".dll"; ModuleBuilder moduleBuilder = asmBuilder.DefineDynamicModule(satelliteAssemblyFileName, satelliteAssemblyFileName); foreach (ResourceData rd in data) { MemoryStream stream = new MemoryStream(); string resourceStreamExtension = Path.GetExtension(rd.ResourceName).ToLower(); if (resourceStreamExtension == ".resources") { ResourceWriter resourceWriter = new ResourceWriter(stream); moduleBuilder.DefineManifestResource(LocResourceName(rd.ResourceName, assemblyName.CultureInfo.ToString()), stream, ResourceAttributes.Private); foreach (DataRow dr in rd.DataSet.Tables["Resources"].Rows) { if (dr["Translation"].ToString() != dr["Source"].ToString()) { resourceWriter.AddResource(dr["ID"].ToString(), dr["Translation"].ToString()); } } resourceWriter.Generate(); } if ((resourceStreamExtension == ".xsd") || (resourceStreamExtension == ".xml")) { if (!Convert.IsDBNull(rd.DataSet.Tables["Resources"].Rows[0]["Translation"])) { TextWriter textWriter = new StreamWriter(stream); moduleBuilder.DefineManifestResource(LocResourceName(rd.ResourceName, assemblyName.CultureInfo.ToString()), stream, ResourceAttributes.Private); textWriter.Write(rd.DataSet.Tables["Resources"].Rows[0]["Translation"] as string); textWriter.Flush(); } } } asmBuilder.Save(satelliteAssemblyFileName); } }
void InsertExistingTranslations(string fileName, ResourceDataCollection data) { if (File.Exists(fileName)) { try { XPathDocument document = new XPathDocument(fileName); XPathNavigator navigator = document.CreateNavigator(); XPathNodeIterator iterator = navigator.Select("/root/resources"); fileCulture = string.Empty; fileCulture = (string)navigator.Evaluate("string(/root/assembly/@culture)"); while (iterator.MoveNext()) { string name = iterator.Current.GetAttribute("name", string.Empty); ResourceData resource = data[name]; if (resource != null) { XPathNodeIterator resourceIterator = iterator.Current.Select("NewDataSet/Resources"); while (resourceIterator.MoveNext()) { string id = (string)resourceIterator.Current.Evaluate("string(ID)"); string translation = (string)resourceIterator.Current.Evaluate("string(Translation)"); string source = (string)resourceIterator.Current.Evaluate("string(Source)"); if (translation != source) { resource.SetTranslation(id, translation); } } } } } catch (Exception e) { throw new Exception("Failed to insert from " + fileName, e); } } }
void ProcessAssembly(string path) { string fullFileName = Path.GetFullPath(path); Console.WriteLine("Processing {0}", fullFileName); Assembly assembly = null; try { assembly = Assembly.ReflectionOnlyLoadFrom(fullFileName); } catch (Exception e) { Tools.Error("Can't open assembly: " + AssemblyPath, e.Message); } AssemblyName assemblyName = assembly.GetName(); ResourceDataCollection data = new ResourceDataCollection(); resources.Add(assemblyName, data); string[] ResourceNames = assembly.GetManifestResourceNames(); foreach (string ResourceName in ResourceNames) { Stream ResourceStream = assembly.GetManifestResourceStream(ResourceName); string resourceStreamExtension = Path.GetExtension(ResourceName).ToLower(); if (resourceStreamExtension == ".resources") { ResourceReader resourceReader = new ResourceReader(ResourceStream); ResourceData rd = new ResourceData(ResourceName, ResourceTypes.StringTable.ToString()); IDictionaryEnumerator dictionaryEnumerator = resourceReader.GetEnumerator(); while (dictionaryEnumerator.MoveNext()) { bool extract = dictionaryEnumerator.Value is string; if (extract) { string id = dictionaryEnumerator.Key.ToString(); if (dontLocalize.Contains(id) == false) { rd.Add(id, dictionaryEnumerator.Value.ToString(), crucial.Contains(id)); } } } data.Add(rd); } if ((resourceStreamExtension == ".xsd") || (resourceStreamExtension == ".xml")) { ResourceData rd = new ResourceData(ResourceName, ResourceTypes.XML.ToString()); TextReader textReader = new StreamReader(ResourceStream); if (dontLocalize.Contains(ResourceName) == false) { rd.Add(ResourceName, textReader.ReadToEnd(), crucial.Contains(ResourceName)); } data.Add(rd); } } }