public static void Export(ResourceData resourceData, string project, string module, string fName, string language, string exportPath, string key = null) { var filter = new ResCurrent { Project = new ResProject { Name = project }, Module = new ResModule { Name = module }, Language = new ResCulture { Title = language }, Word = new ResWord() { ResFile = new ResFile() { FileName = fName } } }; var words = resourceData.GetListResWords(filter, string.Empty).GroupBy(x => x.ResFile.FileID).ToList(); if (!words.Any()) { Console.WriteLine("Error!!! Can't find appropriate project and module. Possibly wrong names!"); return; } foreach (var fileWords in words) { var wordsDictionary = new Dictionary <string, object>(); var firstWord = fileWords.FirstOrDefault(); var fileName = firstWord == null ? module : Path.GetFileNameWithoutExtension(firstWord.ResFile.FileName); var zipFileName = Path.Combine(exportPath, $"{fileName}{(language == "Neutral" ? string.Empty : "." + language)}.resx"); var dirName = Path.GetDirectoryName(zipFileName); if (!Directory.Exists(dirName)) { Directory.CreateDirectory(dirName); } var toAdd = new List <ResWord>(); if (!string.IsNullOrEmpty(key)) { var keys = key.Split(",").Distinct(); if (File.Exists(zipFileName)) { using var resXResourceReader = new ResXResourceReader(zipFileName); foreach (var v in resXResourceReader.Cast <DictionaryEntry>()) { toAdd.Add(new ResWord { Title = v.Key.ToString(), ValueTo = v.Value?.ToString() }); } } foreach (var k in keys) { if (!toAdd.Any(r => r.Title == k)) { var exists = fileWords.FirstOrDefault(r => r.Title == k); if (exists != null) { toAdd.Add(exists); } } } } else { toAdd.AddRange(fileWords.Where(word => !wordsDictionary.ContainsKey(word.Title))); } using var resXResourceWriter = new ResXResourceWriter(zipFileName); foreach (var word in toAdd.Where(r => r != null && (!string.IsNullOrEmpty(r.ValueTo) || language == "Neutral")).OrderBy(x => x.Title)) { resXResourceWriter.AddResource(word.Title, word.ValueTo); } resXResourceWriter.Generate(); resXResourceWriter.Close(); } }
public static void Export(string project, string module, string fName, string language, string exportPath, string key = null) { var filter = new ResCurrent { Project = new ResProject { Name = project }, Module = new ResModule { Name = module }, Language = new ResCulture { Title = language }, Word = new ResWord() { ResFile = new ResFile() { FileName = fName } } }; var words = ResourceData.GetListResWords(filter, string.Empty).GroupBy(x => x.ResFile.FileID).ToList(); if (!words.Any()) { Console.WriteLine("Error!!! Can't find appropriate project and module. Possibly wrong names!"); return; } foreach (var fileWords in words) { var wordsDictionary = new Dictionary <string, object>(); var firstWord = fileWords.FirstOrDefault(); var fileName = firstWord == null ? module : Path.GetFileNameWithoutExtension(firstWord.ResFile.FileName); var zipFileName = Path.Combine(exportPath, language == "Neutral" ? "en" : language, $"{fileName}.json"); var dirName = Path.GetDirectoryName(zipFileName); if (!Directory.Exists(dirName)) { Directory.CreateDirectory(dirName); } var toAdd = new List <ResWord>(); if (!string.IsNullOrEmpty(key)) { if (File.Exists(zipFileName)) { var jObject = JObject.Parse(File.ReadAllText(zipFileName)); foreach (var j in jObject) { toAdd.Add(new ResWord { Title = j.Key, ValueFrom = j.Value.ToString() }); } } if (!toAdd.Any(r => r.Title == key)) { toAdd.Add(fileWords.FirstOrDefault(r => r.Title == key)); } } else { toAdd.AddRange(fileWords.OrderBy(x => x.Title).Where(word => !wordsDictionary.ContainsKey(word.Title))); } foreach (var word in toAdd.Where(r => r != null)) { if (string.IsNullOrEmpty(word.ValueTo)) { continue; } var newVal = word.ValueTo ?? word.ValueFrom; if (!string.IsNullOrEmpty(newVal)) { newVal = newVal.TrimEnd('\n').TrimEnd('\r'); } var newKey = GetKey(word.Title, newVal); wordsDictionary.Add(newKey.Keys.First(), newKey.Values.First()); } using TextWriter writer = new StreamWriter(zipFileName); var obj = JsonConvert.SerializeObject(wordsDictionary, Formatting.Indented); writer.Write(obj); } }