public IEnumerable <ResWord> GetListResWords(ResCurrent current, string search) { var dbManager = GetDb(); var exist = new SqlQuery(ResDataTable + " rd3") .Select("rd3.title") .Where("rd3.fileid = rd1.fileid") .Where("rd3.title = concat('del_', rd1.title)") .Where("rd3.cultureTitle = rd1.cultureTitle"); var sql = new SqlQuery(ResDataTable + " rd1") .Select("rd1.title", "rd1.fileid", "rd1.textValue", "rd1.description", "rd1.flag", "rd1.link", "rf.resName", "rd2.id", "rd2.flag", "rd2.textValue") .LeftOuterJoin(ResDataTable + " rd2", Exp.EqColumns("rd1.fileid", "rd2.fileid") & Exp.EqColumns("rd1.title", "rd2.title") & Exp.Eq("rd2.cultureTitle", current.Language.Title)) .InnerJoin(ResFilesTable + " rf", Exp.EqColumns("rf.ID", "rd1.fileID")) .Where("rd1.cultureTitle", "Neutral") .Where("rd1.flag != 4") .Where("rd1.resourceType", "text") .Where(!Exp.Like("rd1.title", @"del\_", SqlLike.StartWith) & !Exp.Exists(exist)) .OrderBy("rd1.id", true); if (current.Module != null && !string.IsNullOrEmpty(current.Module.Name)) { sql.Where("rf.moduleName", current.Module.Name); } if (current.Project != null && !string.IsNullOrEmpty(current.Project.Name)) { sql.Where("rf.projectName", current.Project.Name); } if (current.Word != null && current.Word.ResFile != null && !string.IsNullOrEmpty(current.Word.ResFile.FileName)) { sql.Where("rf.resName", current.Word.ResFile.FileName); } if (!string.IsNullOrEmpty(search)) { sql.Where(Exp.Like("rd1.textvalue", search)); } return(dbManager.ExecuteList(sql).ConvertAll(r => { var word = GetWord(r); word.ResFile.FileName = Convert.ToString(r[6]); if (r[7] != null) { word.Status = (int)r[8] == 3 ? WordStatusEnum.Changed : WordStatusEnum.Translated; word.ValueTo = Convert.ToString(r[9]); } else { word.Status = WordStatusEnum.Untranslated; } return word; }).OrderBy(r => r.ValueFrom)); }
public void GetListModules(ResCurrent currentData) { var dbManager = GetDb(); var notExist = new SqlQuery(ResDataTable + " rd1") .Select("1") .Where("rd1.fileid = rd.fileid") .Where("rd1.title = concat('del_', rd.title)") .Where("rd1.cultureTitle = 'Neutral'"); var exist = new SqlQuery(ResDataTable + " rd2") .Select("1") .Where("rd2.fileid = rd.fileid") .Where("rd2.title = rd.title") .Where("rd2.cultureTitle = 'Neutral'"); var sql = new SqlQuery(ResFilesTable + " rf").Select("rf.moduleName", string.Format("sum(case rd.cultureTitle when '{0}' then (case rd.flag when 3 then 0 else 1 end) else 0 end)", currentData.Language.Title), string.Format("sum(case rd.cultureTitle when '{0}' then (case rd.flag when 3 then 1 else 0 end) else 0 end)", currentData.Language.Title), string.Format("sum(case rd.cultureTitle when '{0}' then 1 else 0 end)", "Neutral")) .InnerJoin(ResDataTable + " rd", Exp.EqColumns("rd.fileid", "rf.id")) .Where("rf.projectName", currentData.Project.Name) .Where("rd.resourceType", "text") .Where(!Exp.Like("rd.title", @"del\_", SqlLike.StartWith) & Exp.Exists(exist) & !Exp.Exists(notExist)) .GroupBy("moduleName"); dbManager.ExecuteList(sql).ForEach(r => { var module = currentData.Project.Modules.Find(mod => mod.Name == r[0].ToString()); if (module == null) { return; } module.Counts[WordStatusEnum.Translated] = Convert.ToInt32(r[1]); module.Counts[WordStatusEnum.Changed] = Convert.ToInt32(r[2]); module.Counts[WordStatusEnum.All] = Convert.ToInt32(r[3]); module.Counts[WordStatusEnum.Untranslated] = module.Counts[WordStatusEnum.All] - module.Counts[WordStatusEnum.Changed] - module.Counts[WordStatusEnum.Translated]; }); }
public IEnumerable <ResWord> GetListResWords(ResCurrent current, string search) { IQueryable <TempResData> exist = DbContext.ResData .Where(r => r.Flag != 4) .Where(r => r.ResourceType == "text") .Where(r => r.CultureTitle == "Neutral") .Join(DbContext.ResData.DefaultIfEmpty(), r => new { r.FileId, r.Title }, r => new { r.FileId, r.Title }, (r1, r2) => new { r1, r2 }) .Join(DbContext.ResFiles, r => r.r1.FileId, f => f.Id, (d, f) => new TempResData { R1 = d.r1, R2 = d.r2, RF = f }) .Where(r => r.R2.CultureTitle == current.Language.Title) .Where(r => !r.R1.Title.StartsWith(@"del\_")) .Where(r => !DbContext.ResData .Where(d => d.FileId == r.R1.FileId) .Where(d => d.Title == "del_" + r.R1.Title) .Where(d => d.CultureTitle == r.R1.CultureTitle) .Any() ) .OrderBy(r => r.R1.Id); if (current.Module != null && !string.IsNullOrEmpty(current.Module.Name)) { exist = exist.Where(r => r.RF.ModuleName == current.Module.Name); } if (current.Project != null && !string.IsNullOrEmpty(current.Project.Name)) { exist = exist.Where(r => r.RF.ProjectName == current.Project.Name); } if (current.Word != null && current.Word.ResFile != null && !string.IsNullOrEmpty(current.Word.ResFile.FileName)) { exist = exist.Where(r => r.RF.ResName == current.Word.ResFile.FileName); } if (!string.IsNullOrEmpty(search)) { exist = exist.Where(r => r.R1.TextValue == search); } return(exist.ToList().Select(r => { var word = new ResWord { Title = r.R1.Title, ResFile = new ResFile { FileID = r.R1.FileId }, ValueFrom = r.R1.TextValue, TextComment = r.R1.Description, Flag = r.R1.Flag, Link = r.R1.Link }; word.ResFile.FileName = r.RF.ResName; if (r.R2 != null) { word.Status = r.R2.Flag == 3 ? WordStatusEnum.Changed : WordStatusEnum.Translated; word.ValueTo = r.R2.TextValue; } else { word.Status = WordStatusEnum.Untranslated; } return word; }).OrderBy(r => r.ValueFrom)); }
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 bool Export(IServiceProvider serviceProvider, 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 } } }; using var scope = serviceProvider.CreateScope(); var resourceData = scope.ServiceProvider.GetService <ResourceData>(); var words = resourceData.GetListResWords(filter, string.Empty).GroupBy(x => x.ResFile.FileID).ToList(); if (!words.Any()) { Console.WriteLine($"db empty file:{fName}, lang:{language}"); return(false); } 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>(); var toAddFiles = new Dictionary <string, ResXFileRef>(); if (!string.IsNullOrEmpty(key)) { var keys = key.Split(",").Distinct(); if (File.Exists(zipFileName)) { using var resXResourceReader = new ResXResourceReader(zipFileName); resXResourceReader.BasePath = Path.GetDirectoryName(zipFileName); resXResourceReader.UseResXDataNodes = true; foreach (var v in resXResourceReader.OfType <DictionaryEntry>()) { var k = v.Key.ToString(); var val = v.Value as ResXDataNode; if (keys.Any()) { if (val.FileRef != null) { var fileRef = new ResXFileRef(Path.GetFileName(val.FileRef.FileName), val.FileRef.TypeName); toAddFiles.Add(k, fileRef); } else { if (!keys.Any(r => r.EndsWith("*") && k.StartsWith(r.Replace("*", ""))) && (!k.Contains("_") || k.StartsWith("subject_") || k.StartsWith("pattern_"))) { k = keys.FirstOrDefault(r => r == k); } if (k != null) { var word = fileWords.FirstOrDefault(r => r.Title == k); if (word != null) { toAdd.Add(word); } else { toAdd.Add(new ResWord() { Title = k, ValueTo = val.GetValue((ITypeResolutionService)null)?.ToString() }); } } } } else { if (val.FileRef != null) { var fileRef = new ResXFileRef(Path.GetFileName(val.FileRef.FileName), val.FileRef.TypeName); toAddFiles.Add(k, fileRef); } else { toAdd.Add(new ResWord { Title = k, ValueTo = val.GetValue((ITypeResolutionService)null)?.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 { if (File.Exists(zipFileName)) { using var resXResourceReader = new ResXResourceReader(zipFileName); resXResourceReader.BasePath = Path.GetDirectoryName(zipFileName); resXResourceReader.UseResXDataNodes = true; foreach (var v in resXResourceReader.OfType <DictionaryEntry>()) { var k = v.Key.ToString(); var val = v.Value as ResXDataNode; if (val.FileRef != null) { var fileRef = new ResXFileRef(Path.GetFileName(val.FileRef.FileName), val.FileRef.TypeName); toAddFiles.Add(k, fileRef); } } } 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); } foreach (var f in toAddFiles) { resXResourceWriter.AddResource(new ResXDataNode(f.Key, f.Value)); } resXResourceWriter.Generate(); resXResourceWriter.Close(); } return(true); }
public static void Export(IServiceProvider serviceProvider, 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 } } }; using var scope = serviceProvider.CreateScope(); var resourceData = scope.ServiceProvider.GetService <ResourceData>(); 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); } }