diff --git a/VPet.ModMaker/Models/I18nData.cs b/VPet.ModMaker/Models/I18nData.cs deleted file mode 100644 index c34696f..0000000 --- a/VPet.ModMaker/Models/I18nData.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.ComponentModel; -using System.Diagnostics; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using HKW.HKWUtils.Observable; - -namespace VPet.ModMaker.Models; - -/// -/// I18n数据 -/// -[DebuggerDisplay("{ID}, Count = {Datas.Count}")] -public class I18nData : ObservableObjectX -{ - #region ID - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - private string _id = string.Empty; - - /// - /// ID - /// - public string ID - { - get => _id; - set => SetProperty(ref _id, value); - } - #endregion - - /// - /// 基于 的索引的数据列表 - /// - public ObservableList> Datas { get; } = new(); -} diff --git a/VPet.ModMaker/Models/I18nHelper.cs b/VPet.ModMaker/Models/I18nHelper.cs deleted file mode 100644 index c93b6a3..0000000 --- a/VPet.ModMaker/Models/I18nHelper.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Collections.Specialized; -using System.Diagnostics; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using HKW.HKWUtils.Observable; - -namespace VPet.ModMaker.Models; - -// TODO: 更新事件 -/// -/// I18n助手 -/// -public class I18nHelper : ObservableObjectX -{ - /// - /// 当前数据 - /// - public static I18nHelper Current { get; set; } = new(); - - /// - /// 当前文化名称 - /// - #region CultureName - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - private string _cultureName; - - public string CultureName - { - get => _cultureName; - set => SetProperty(ref _cultureName, value); - } - #endregion - - /// - /// 文化列表 - /// - public ObservableList CultureNames { get; } = new(); -} diff --git a/VPet.ModMaker/Models/I18nModel.cs b/VPet.ModMaker/Models/I18nModel.cs deleted file mode 100644 index 81cf737..0000000 --- a/VPet.ModMaker/Models/I18nModel.cs +++ /dev/null @@ -1,97 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using HKW.HKWUtils.Extensions; -using HKW.HKWUtils.Observable; -using Mapster; - -namespace VPet.ModMaker.Models; - -/// -/// I18n模型 -/// -/// 类型 -public class I18nModel : ObservableObjectX - where T : ObservableObjectX, new() -{ - /// - /// 当前I18n数据 - /// - #region CurrentI18nData - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - private T _currentI18nData; - - [AdaptIgnore] - public T CurrentI18nData - { - get => _currentI18nData; - set => SetProperty(ref _currentI18nData, value); - } - #endregion - - /// - /// 所有I18n数据 - /// - [AdaptIgnore] - public Dictionary I18nDatas { get; } = new(); - - public I18nModel() - { - I18nHelper.Current.PropertyChangedX += Current_PropertyChangedX; - I18nHelper.Current.CultureNames.ListChanged += CultureNames_ListChanged; - if (I18nHelper.Current.CultureNames.HasValue() is false) - return; - foreach (var item in I18nHelper.Current.CultureNames) - I18nDatas.Add(item, new()); - CurrentI18nData = I18nDatas[I18nHelper.Current.CultureName]; - } - - private void CultureNames_ListChanged( - IObservableList sender, - NotifyListChangedEventArgs e - ) - { - if (e.Action is ListChangeAction.Add && e.NewItems is not null) - { - foreach (var item in e.NewItems) - I18nDatas.TryAdd(item, new()); - } - else if (e.Action is ListChangeAction.Remove && e.OldItems is not null) - { - foreach (var item in e.OldItems) - I18nDatas.Remove(item); - } - else if ( - e.Action is ListChangeAction.Add - && e.NewItems is not null - && e.OldItems is not null - ) - { - var newItem = e.NewItems.First(); - var oldItem = e.OldItems.First(); - if (I18nDatas.ContainsKey(oldItem) is false) - return; - I18nDatas[newItem] = I18nDatas[oldItem]; - I18nDatas.Remove(oldItem); - } - } - - /// - /// 文化改变 - /// - /// - /// - private void Current_PropertyChangedX(object? sender, PropertyChangedXEventArgs e) - { - if (e.PropertyName == nameof(I18nHelper.CultureName)) - { - if (e.NewValue is null) - CurrentI18nData = null!; - else if (I18nDatas.TryGetValue((string)e.NewValue, out var result)) - CurrentI18nData = result; - } - } -} diff --git a/VPet.ModMaker/Models/ModLoader.cs b/VPet.ModMaker/Models/ModLoader.cs index 2df8060..380f05b 100644 --- a/VPet.ModMaker/Models/ModLoader.cs +++ b/VPet.ModMaker/Models/ModLoader.cs @@ -94,14 +94,14 @@ public class ModLoader public List SelectTexts { get; } = new(); /// - /// I18n数据 + /// I18n资源 /// - public Dictionary I18nDatas { get; } = new(); + //public Dictionary I18nDatas { get; } = new(); /// - /// 其它I18n数据 + /// I18n资源 /// - public Dictionary> OtherI18nDatas { get; } = new(); + public Dictionary> I18nDatas { get; } = new(); public ModLoader(DirectoryInfo path) { @@ -125,15 +125,15 @@ public class ModLoader //MOD未加载时支持翻译 foreach (var line in modlps.FindAllLine("lang")) { - var i18nData = new I18nModInfoModel(); + if (I18nDatas.TryGetValue(line.Info, out var datas) is false) + datas = I18nDatas[line.Info] = new(); foreach (var sub in line) { if (sub.Name == Name) - i18nData.Name = sub.Info; + datas[Name] = sub.Info; else if (sub.Name == Intro) - i18nData.Description = sub.Info; + datas[Intro] = sub.Info; } - I18nDatas.Add(line.Info, i18nData); } DirectoryInfo? langDirectory = null; foreach (DirectoryInfo di in path.EnumerateDirectories()) @@ -236,17 +236,14 @@ public class ModLoader } if (langDirectory is null) return; - foreach (DirectoryInfo dis in langDirectory.EnumerateDirectories()) + foreach (var dis in langDirectory.EnumerateDirectories()) { - OtherI18nDatas.Add(dis.Name, new()); + I18nDatas.TryAdd(dis.Name, new()); foreach (FileInfo fi in dis.EnumerateFiles("*.lps")) { var lps = new LPS(File.ReadAllText(fi.FullName)); foreach (var item in lps) - { - if (OtherI18nDatas[dis.Name].ContainsKey(item.Name) is false) - OtherI18nDatas[dis.Name].TryAdd(item.Name, item.Info); - } + I18nDatas[dis.Name].TryAdd(item.Name, item.Info); } } } diff --git a/VPet.ModMaker/Models/ModMakeHistory.cs b/VPet.ModMaker/Models/ModMakeHistory.cs index b84180e..9e4d5a5 100644 --- a/VPet.ModMaker/Models/ModMakeHistory.cs +++ b/VPet.ModMaker/Models/ModMakeHistory.cs @@ -14,6 +14,8 @@ namespace VPet.ModMaker.Models; /// public class ModMakeHistory : IEquatable { + public ModMakeHistory() { } + /// /// 图片 /// @@ -28,7 +30,7 @@ public class ModMakeHistory : IEquatable /// /// 路径 /// - private string _path = string.Empty; + private string _sourcePath = string.Empty; /// /// 资源路径 @@ -36,11 +38,13 @@ public class ModMakeHistory : IEquatable [Line(ignoreCase: true)] public string SourcePath { - get => _path; + get => _sourcePath; set { - _path = value; - var imagePath = Path.Combine(_path, "icon.png"); + if (string.IsNullOrWhiteSpace(_sourcePath) is false) + Image?.CloseStream(); + _sourcePath = value; + var imagePath = Path.Combine(_sourcePath, "icon.png"); if (File.Exists(imagePath)) Image = NativeUtils.LoadImageToMemoryStream(imagePath); } diff --git a/VPet.ModMaker/Models/ModModel/AnimeModel.cs b/VPet.ModMaker/Models/ModModel/AnimeModel.cs index d347804..08d949e 100644 --- a/VPet.ModMaker/Models/ModModel/AnimeModel.cs +++ b/VPet.ModMaker/Models/ModModel/AnimeModel.cs @@ -35,7 +35,7 @@ public class AnimeModel : ObservableObjectX, ICloneable private string _id = string.Empty; /// - /// Id + /// ID /// public string ID { diff --git a/VPet.ModMaker/Models/ModModel/AnimeTypeModel.cs b/VPet.ModMaker/Models/ModModel/AnimeTypeModel.cs index b63e208..7cf63a9 100644 --- a/VPet.ModMaker/Models/ModModel/AnimeTypeModel.cs +++ b/VPet.ModMaker/Models/ModModel/AnimeTypeModel.cs @@ -9,6 +9,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Media.Imaging; +using HKW.HKWUtils.Extensions; using HKW.HKWUtils.Observable; using VPet_Simulator.Core; using static VPet_Simulator.Core.GraphInfo; @@ -103,7 +104,7 @@ public class AnimeTypeModel : ObservableObjectX private string _id = string.Empty; /// - /// Id + /// ID /// public string ID { @@ -202,7 +203,7 @@ public class AnimeTypeModel : ObservableObjectX public AnimeTypeModel(GraphInfo.GraphType graphType, string path) { Name = Path.GetFileName(path); - // 为带有名字的类型设置Id + // 为带有名字的类型设置ID if (graphType.IsHasNameAnime()) ID = $"{graphType}_{Name}"; else @@ -643,8 +644,8 @@ public class AnimeTypeModel : ObservableObjectX static void SaveAnimes(string animePath, ObservableList animes) { Directory.CreateDirectory(animePath); - foreach (var anime in animes.EnumerateIndex()) - SaveImages(Path.Combine(animePath, anime.Index.ToString()), anime.Value); + foreach ((var index, var anime) in animes.EnumerateIndex()) + SaveImages(Path.Combine(animePath, index.ToString()), anime); } } @@ -656,10 +657,10 @@ public class AnimeTypeModel : ObservableObjectX static void SaveImages(string imagesPath, AnimeModel model) { Directory.CreateDirectory(imagesPath); - foreach (var image in model.Images.EnumerateIndex()) + foreach ((var index, var image) in model.Images.EnumerateIndex()) { - image.Value.Image.SaveToPng( - Path.Combine(imagesPath, $"{model.ID}_{image.Index:000}_{image.Value.Duration}.png") + image.Image.SaveToPng( + Path.Combine(imagesPath, $"{model.ID}_{index:000}_{image.Duration}.png") ); } } diff --git a/VPet.ModMaker/Models/ModModel/ClickTextModel.cs b/VPet.ModMaker/Models/ModModel/ClickTextModel.cs index b52f9ae..fef2d0f 100644 --- a/VPet.ModMaker/Models/ModModel/ClickTextModel.cs +++ b/VPet.ModMaker/Models/ModModel/ClickTextModel.cs @@ -17,9 +17,14 @@ namespace VPet.ModMaker.Models; /// /// 点击文本模型 /// -public class ClickTextModel : I18nModel +public class ClickTextModel : ObservableObjectX { - public ClickTextModel() { } + public ClickTextModel() + { + ModInfoModel.Current.I18nResource.I18nObjectInfos.Add( + new(this, OnPropertyChanged, [(nameof(ID), ID, nameof(Text), true)]) + ); + } public ClickTextModel(ClickTextModel clickText) : this() @@ -37,9 +42,6 @@ public class ClickTextModel : I18nModel Drink = clickText.Drink.Clone(); Feel = clickText.Feel.Clone(); Strength = clickText.Strength.Clone(); - foreach (var item in clickText.I18nDatas) - I18nDatas[item.Key] = item.Value.Clone(); - CurrentI18nData = I18nDatas[I18nHelper.Current.CultureName]; } public ClickTextModel(ClickText clickText) @@ -121,6 +123,15 @@ public class ClickTextModel : I18nModel } #endregion + #region I18nData + [AdaptIgnore] + public string Text + { + get => ModInfoModel.Current.I18nResource.GetCurrentCultureDataOrDefault(ID, string.Empty); + set => ModInfoModel.Current.I18nResource.SetCurrentCultureData(ID, value); + } + #endregion + #region Working [DebuggerBrowsable(DebuggerBrowsableState.Never)] private string _working = string.Empty; diff --git a/VPet.ModMaker/Models/ModModel/FoodAnimeTypeModel.cs b/VPet.ModMaker/Models/ModModel/FoodAnimeTypeModel.cs index f9a4441..416c777 100644 --- a/VPet.ModMaker/Models/ModModel/FoodAnimeTypeModel.cs +++ b/VPet.ModMaker/Models/ModModel/FoodAnimeTypeModel.cs @@ -7,6 +7,7 @@ using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; +using HKW.HKWUtils.Extensions; using HKW.HKWUtils.Observable; using LinePutScript; using LinePutScript.Localization.WPF; @@ -271,10 +272,10 @@ public class FoodAnimeTypeModel : ObservableObjectX var animePath = Path.Combine(path, Name); if ( Directory.Exists(animePath) - && HappyAnimes.Count == 0 - && NomalAnimes.Count == 0 - && PoorConditionAnimes.Count == 0 - && IllAnimes.Count == 0 + && HappyAnimes.HasValue() is false + && NomalAnimes.HasValue() is false + && PoorConditionAnimes.HasValue() is false + && IllAnimes.HasValue() is false ) { Directory.Delete(animePath, true); @@ -303,15 +304,15 @@ public class FoodAnimeTypeModel : ObservableObjectX ) { var modeAnimePath = Path.Combine(animePath, mode.ToString()); - foreach (var anime in animes.EnumerateIndex()) + foreach ((var index, var anime) in animes.EnumerateIndex()) { - var indexPath = Path.Combine(modeAnimePath, anime.Index.ToString()); + var indexPath = Path.Combine(modeAnimePath, index.ToString()); Directory.CreateDirectory(indexPath); var infoFile = Path.Combine(indexPath, ModMakerInfo.InfoFile); - var frontLayName = $"{Name.ToLower()}_{FrontLayName}_{anime.Index}"; - var backLayName = $"{Name.ToLower()}_{BackLayName}_{anime.Index}"; - SaveInfoFile(infoFile, frontLayName, backLayName, anime.Value, mode); - SaveImages(anime.Value, indexPath); + var frontLayName = $"{Name.ToLower()}_{FrontLayName}_{index}"; + var backLayName = $"{Name.ToLower()}_{BackLayName}_{index}"; + SaveInfoFile(infoFile, frontLayName, backLayName, anime, mode); + SaveImages(anime, indexPath); } } @@ -328,22 +329,16 @@ public class FoodAnimeTypeModel : ObservableObjectX var backLayPath = Path.Combine(indexPath, BackLayName); Directory.CreateDirectory(frontLayPath); Directory.CreateDirectory(backLayPath); - foreach (var frontImage in anime.FrontImages.EnumerateIndex()) + foreach ((var index, var frontImage) in anime.FrontImages.EnumerateIndex()) { - frontImage.Value.Image.SaveToPng( - Path.Combine( - frontLayPath, - $"{anime.ID}_{frontImage.Index:000}_{frontImage.Value.Duration}.png" - ) + frontImage.Image.SaveToPng( + Path.Combine(frontLayPath, $"{anime.ID}_{index:000}_{frontImage.Duration}.png") ); } - foreach (var backImage in anime.BackImages.EnumerateIndex()) + foreach ((var index, var backImage) in anime.BackImages.EnumerateIndex()) { - backImage.Value.Image.SaveToPng( - Path.Combine( - backLayPath, - $"{anime.ID}_{backImage.Index:000}_{backImage.Value.Duration}.png" - ) + backImage.Image.SaveToPng( + Path.Combine(backLayPath, $"{anime.ID}_{backImage:000}_{backImage.Duration}.png") ); } } @@ -376,10 +371,10 @@ public class FoodAnimeTypeModel : ObservableObjectX new Sub("mode", mode.ToString()), new Sub("graph", Name) }; - foreach (var foodLocation in anime.FoodLocations.EnumerateIndex()) + foreach ((var index, var foodLocation) in anime.FoodLocations.EnumerateIndex()) { - var sub = new Sub($"a{foodLocation.Index}"); - sub.info = foodLocation.Value.ToString(); + var sub = new Sub($"a{index}"); + sub.info = foodLocation.ToString(); line.Add(sub); } line.Add(new Sub(FrontLayName, frontLayName)); diff --git a/VPet.ModMaker/Models/ModModel/FoodModel.cs b/VPet.ModMaker/Models/ModModel/FoodModel.cs index ad59c77..e5c32aa 100644 --- a/VPet.ModMaker/Models/ModModel/FoodModel.cs +++ b/VPet.ModMaker/Models/ModModel/FoodModel.cs @@ -21,11 +21,21 @@ namespace VPet.ModMaker.Models; /// /// 食物模型 /// -public class FoodModel : I18nModel +public class FoodModel : ObservableObjectX { public FoodModel() { PropertyChangedX += FoodModel_PropertyChangedX; + ModInfoModel.Current.I18nResource.I18nObjectInfos.Add( + new( + this, + OnPropertyChanged, + [ + (nameof(ID), ID, nameof(Name), true), + (nameof(DescriptionID), DescriptionID, nameof(Description), true) + ] + ) + ); } private static FrozenSet _notifyReferencePrice = FrozenSet.ToFrozenSet( @@ -54,9 +64,6 @@ public class FoodModel : I18nModel { model.Adapt(this); Image = model.Image?.CloneStream(); - foreach (var item in model.I18nDatas) - I18nDatas[item.Key] = item.Value.Clone(); - CurrentI18nData = I18nDatas[I18nHelper.Current.CultureName]; } public FoodModel(Food food) @@ -108,6 +115,26 @@ public class FoodModel : I18nModel } #endregion + #region I18nData + [AdaptIgnore] + public string Name + { + get => ModInfoModel.Current.I18nResource.GetCurrentCultureDataOrDefault(ID, string.Empty); + set => ModInfoModel.Current.I18nResource.SetCurrentCultureData(ID, value); + } + + [AdaptIgnore] + public string Description + { + get => + ModInfoModel.Current.I18nResource.GetCurrentCultureDataOrDefault( + DescriptionID, + string.Empty + ); + set => ModInfoModel.Current.I18nResource.SetCurrentCultureData(DescriptionID, value); + } + #endregion + #region Graph [DebuggerBrowsable(DebuggerBrowsableState.Never)] private string _graph = string.Empty; @@ -310,7 +337,7 @@ public class FoodModel : I18nModel //}; } - public void RefreshId() + public void RefreshID() { DescriptionID = $"{ID}_{nameof(DescriptionID)}"; } @@ -318,34 +345,10 @@ public class FoodModel : I18nModel public void Close() { Image?.CloseStream(); + var item = ModInfoModel.Current.I18nResource.I18nObjectInfos.FirstOrDefault(i => + i.Source == this + ); + if (item is not null) + ModInfoModel.Current.I18nResource.I18nObjectInfos.Remove(item); } } - -public class I18nFoodModel : ObservableObjectX, ICloneable -{ - #region Name - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - private string _name = string.Empty; - - public string Name - { - get => _name; - set => SetProperty(ref _name, value); - } - #endregion - - #region Description - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - private string _description = string.Empty; - - public string Description - { - get => _description; - set => SetProperty(ref _description, value); - } - #endregion - - public I18nFoodModel Clone() => this.Adapt(); - - object ICloneable.Clone() => Clone(); -} diff --git a/VPet.ModMaker/Models/ModModel/LowTextModel.cs b/VPet.ModMaker/Models/ModModel/LowTextModel.cs index f4d3448..0001f93 100644 --- a/VPet.ModMaker/Models/ModModel/LowTextModel.cs +++ b/VPet.ModMaker/Models/ModModel/LowTextModel.cs @@ -16,18 +16,19 @@ namespace VPet.ModMaker.Models; /// /// 低状态文本 /// -public class LowTextModel : I18nModel +public class LowTextModel : ObservableObjectX { - public LowTextModel() { } + public LowTextModel() + { + ModInfoModel.Current.I18nResource.I18nObjectInfos.Add( + new(this, OnPropertyChanged, [(nameof(ID), ID, nameof(Text), true)]) + ); + } public LowTextModel(LowTextModel lowText) : this() { lowText.Adapt(this); - - foreach (var item in lowText.I18nDatas) - I18nDatas[item.Key] = item.Value.Clone(); - CurrentI18nData = I18nDatas[I18nHelper.Current.CultureName]; } public LowTextModel(LowText lowText) @@ -69,6 +70,15 @@ public class LowTextModel : I18nModel } #endregion + #region I18nData + [AdaptIgnore] + public string Text + { + get => ModInfoModel.Current.I18nResource.GetCurrentCultureDataOrDefault(ID, string.Empty); + set => ModInfoModel.Current.I18nResource.SetCurrentCultureData(ID, value); + } + #endregion + #region Mode [DebuggerBrowsable(DebuggerBrowsableState.Never)] private LowText.ModeType _mode; @@ -119,24 +129,3 @@ public class LowTextModel : I18nModel return this.Adapt(); } } - -public class I18nLowTextModel : ObservableObjectX, ICloneable -{ - #region Text - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - private string _text = string.Empty; - - public string Text - { - get => _text; - set => SetProperty(ref _text, value); - } - #endregion - - public I18nLowTextModel Clone() - { - return this.Adapt(); - } - - object ICloneable.Clone() => Clone(); -} diff --git a/VPet.ModMaker/Models/ModModel/ModInfoModel.cs b/VPet.ModMaker/Models/ModModel/ModInfoModel.cs index 5e7691c..0e52755 100644 --- a/VPet.ModMaker/Models/ModModel/ModInfoModel.cs +++ b/VPet.ModMaker/Models/ModModel/ModInfoModel.cs @@ -4,6 +4,7 @@ using System.Collections.ObjectModel; using System.Collections.Specialized; using System.ComponentModel; using System.Diagnostics; +using System.Globalization; using System.IO; using System.Linq; using System.Text; @@ -26,10 +27,11 @@ namespace VPet.ModMaker.Models; /// /// 模组信息模型 /// -public class ModInfoModel : I18nModel +public class ModInfoModel : ObservableObjectX { public ModInfoModel() { + Current = this; PropertyChanged += ModInfoModel_PropertyChanged; Pets.CollectionChanged += Pets_CollectionChanged; } @@ -104,25 +106,22 @@ public class ModInfoModel : I18nModel LoadAnime(petModel, p); } - //loader.Pets.First().Name = "TestMainPet"; - //Pets.Insert(0, new(loader.Pets.First(), true)); - // 插入本体宠物 foreach (var pet in ModMakerInfo.MainPets) { - // 确保Id不重复 + // 确保ID不重复 if (Pets.All(i => i.ID != pet.Key)) Pets.Insert(0, pet.Value); } - // 载入本地化 - foreach (var lang in loader.I18nDatas) - I18nDatas.Add(lang.Key, lang.Value); - OtherI18nDatas = loader.OtherI18nDatas; + // 载入本地化模组信息 + //foreach (var lang in loader.I18nDatas) + // I18nDatas.Add(lang.Key, lang.Value); + //OtherI18nDatas = loader.I18nDatas; - LoadI18nDatas(); - RefreshAllId(); - if (I18nHelper.Current.CultureNames.HasValue()) + LoadI18nDatas(loader); + RefreshAllID(); + if (I18nResource.CultureDatas.HasValue()) RefreshID(); } @@ -143,6 +142,21 @@ public class ModInfoModel : I18nModel /// public static ModInfoModel Current { get; set; } = new(); + public I18nResource I18nResource { get; } = new(); + + #region I18nData + public string Name + { + get => I18nResource.GetCurrentCultureDataOrDefault(ID, string.Empty); + set => I18nResource.SetCurrentCultureData(ID, value); + } + public string Description + { + get => I18nResource.GetCurrentCultureDataOrDefault(DescriptionID, string.Empty); + set => I18nResource.SetCurrentCultureData(DescriptionID, value); + } + #endregion + #region AutoSetFoodPrice [DebuggerBrowsable(DebuggerBrowsableState.Never)] private bool _autoSetFoodPrice; @@ -173,12 +187,12 @@ public class ModInfoModel : I18nModel #region ModInfo /// - /// 作者Id + /// 作者ID /// public long AuthorID { get; } /// - /// 项目Id + /// 项目ID /// public ulong ItemID { get; } @@ -187,7 +201,7 @@ public class ModInfoModel : I18nModel private string _id = string.Empty; /// - /// Id + /// ID /// public string ID { @@ -198,15 +212,15 @@ public class ModInfoModel : I18nModel #region DescriptionID [DebuggerBrowsable(DebuggerBrowsableState.Never)] - private string _descriptionId = string.Empty; + private string _descriptionID = string.Empty; /// - /// 描述Id + /// 描述ID /// public string DescriptionID { - get => _descriptionId; - set => SetProperty(ref _descriptionId, value); + get => _descriptionID; + set => SetProperty(ref _descriptionID, value); } #endregion @@ -322,15 +336,6 @@ public class ModInfoModel : I18nModel } #endregion - /// - /// 其它I18n数据 - /// - public Dictionary> OtherI18nDatas { get; } = new(); - - /// - /// 需要保存的I18n数据 - /// - public static Dictionary> SaveI18nDatas { get; } = new(); #endregion private void Pets_CollectionChanged(object? sender, NotifyCollectionChangedEventArgs e) @@ -439,100 +444,121 @@ public class ModInfoModel : I18nModel /// /// 加载本地化数据 /// - private void LoadI18nDatas() + private void LoadI18nDatas(ModLoader modLoader) { - foreach (var lang in I18nDatas.Keys.Union(OtherI18nDatas.Keys)) - { - if (I18nHelper.Current.CultureNames.Contains(lang) is false) - I18nHelper.Current.CultureNames.Add(lang); - } - if (I18nHelper.Current.CultureNames.Count == 0) + if (modLoader.I18nDatas.HasValue() is false) return; - I18nHelper.Current.CultureName = I18nHelper.Current.CultureNames.First(); - foreach (var i18nData in OtherI18nDatas) + foreach (var cultureDatas in modLoader.I18nDatas) { - LoadFoodI18nData(i18nData.Key, i18nData.Value); - LoadLowTextI18nData(i18nData.Key, i18nData.Value); - LoadClickTextI18nData(i18nData.Key, i18nData.Value); - LoadSelectTextI18nData(i18nData.Key, i18nData.Value); - LoadPetI18nData(i18nData.Key, i18nData.Value); + var culture = CultureInfo.GetCultureInfo(cultureDatas.Key); + I18nResource.AddCulture(culture); + foreach (var data in cultureDatas.Value) + I18nResource.AddCultureData(culture, data.Key, data.Value); } + if (I18nResource.SetCurrentCulture(CultureInfo.CurrentCulture) is false) + I18nResource.SetCurrentCulture(I18nResource.CultureDatas.First().Key); + I18nResource.I18nObjectInfos.Add( + new( + this, + OnPropertyChanged, + [ + (nameof(ID), ID, nameof(Name), true), + (nameof(DescriptionID), DescriptionID, nameof(Description), true) + ] + ) + ); + //foreach (var lang in I18nDatas.Keys.Union(OtherI18nDatas.Keys)) + //{ + // if (I18nHelper.Current.CultureNames.Contains(lang) is false) + // I18nHelper.Current.CultureNames.Add(lang); + //} + //if (I18nHelper.Current.CultureNames.Count == 0) + // return; + //I18nHelper.Current.CultureName = I18nHelper.Current.CultureNames.First(); + //foreach (var i18nData in OtherI18nDatas) + //{ + // LoadFoodI18nData(i18nData.Key, i18nData.Value); + // LoadLowTextI18nData(i18nData.Key, i18nData.Value); + // LoadClickTextI18nData(i18nData.Key, i18nData.Value); + // LoadSelectTextI18nData(i18nData.Key, i18nData.Value); + // LoadPetI18nData(i18nData.Key, i18nData.Value); + //} } - private void LoadFoodI18nData(string key, Dictionary i18nData) + //private void LoadFoodI18nData(string key, Dictionary i18nData) + //{ + // foreach (var food in Foods) + // { + // if (food.I18nDatas.TryGetValue(key, out var data) is false) + // continue; + // if (i18nData.TryGetValue(food.ID, out var name)) + // data.Name = name; + // if (i18nData.TryGetValue(food.DescriptionID, out var description)) + // data.Description = description; + // } + //} + + //private void LoadLowTextI18nData(string key, Dictionary i18nData) + //{ + // foreach (var lowText in LowTexts) + // { + // if (lowText.I18nDatas.TryGetValue(key, out var data) is false) + // continue; + // if (i18nData.TryGetValue(lowText.ID, out var text)) + // data.Text = text; + // } + //} + + //private void LoadClickTextI18nData(string key, Dictionary i18nData) + //{ + // foreach (var clickText in ClickTexts) + // { + // if (clickText.I18nDatas.TryGetValue(key, out var data) is false) + // continue; + // if (i18nData.TryGetValue(clickText.ID, out var text)) + // data.Text = text; + // } + //} + + //private void LoadSelectTextI18nData(string key, Dictionary i18nData) + //{ + // foreach (var selectText in SelectTexts) + // { + // if (selectText.I18nDatas.TryGetValue(key, out var data) is false) + // continue; + // if (i18nData.TryGetValue(selectText.ID, out var text)) + // data.Text = text; + // if (i18nData.TryGetValue(selectText.ChooseID, out var choose)) + // data.Choose = choose; + // } + //} + + //private void LoadPetI18nData(string key, Dictionary i18nData) + //{ + // foreach (var pet in Pets) + // { + // if (pet.I18nDatas.TryGetValue(key, out var data) is false) + // continue; + // if (i18nData.TryGetValue(pet.ID, out var name)) + // data.Name = name; + // if (i18nData.TryGetValue(pet.PetNameID, out var petName)) + // data.PetName = petName; + // if (i18nData.TryGetValue(pet.DescriptionID, out var description)) + // data.Description = description; + // foreach (var work in pet.Works) + // { + // if (work.I18nDatas.TryGetValue(key, out var workData) is false) + // continue; + // if (i18nData.TryGetValue(work.ID, out var workName)) + // workData.Name = workName; + // } + // } + //} + + private void RefreshAllID() { foreach (var food in Foods) - { - if (food.I18nDatas.TryGetValue(key, out var data) is false) - continue; - if (i18nData.TryGetValue(food.ID, out var name)) - data.Name = name; - if (i18nData.TryGetValue(food.DescriptionID, out var description)) - data.Description = description; - } - } - - private void LoadLowTextI18nData(string key, Dictionary i18nData) - { - foreach (var lowText in LowTexts) - { - if (lowText.I18nDatas.TryGetValue(key, out var data) is false) - continue; - if (i18nData.TryGetValue(lowText.ID, out var text)) - data.Text = text; - } - } - - private void LoadClickTextI18nData(string key, Dictionary i18nData) - { - foreach (var clickText in ClickTexts) - { - if (clickText.I18nDatas.TryGetValue(key, out var data) is false) - continue; - if (i18nData.TryGetValue(clickText.ID, out var text)) - data.Text = text; - } - } - - private void LoadSelectTextI18nData(string key, Dictionary i18nData) - { - foreach (var selectText in SelectTexts) - { - if (selectText.I18nDatas.TryGetValue(key, out var data) is false) - continue; - if (i18nData.TryGetValue(selectText.ID, out var text)) - data.Text = text; - if (i18nData.TryGetValue(selectText.ChooseID, out var choose)) - data.Choose = choose; - } - } - - private void LoadPetI18nData(string key, Dictionary i18nData) - { - foreach (var pet in Pets) - { - if (pet.I18nDatas.TryGetValue(key, out var data) is false) - continue; - if (i18nData.TryGetValue(pet.ID, out var name)) - data.Name = name; - if (i18nData.TryGetValue(pet.PetNameID, out var petName)) - data.PetName = petName; - if (i18nData.TryGetValue(pet.DescriptionID, out var description)) - data.Description = description; - foreach (var work in pet.Works) - { - if (work.I18nDatas.TryGetValue(key, out var workData) is false) - continue; - if (i18nData.TryGetValue(work.ID, out var workName)) - workData.Name = workName; - } - } - } - - private void RefreshAllId() - { - foreach (var food in Foods) - food.RefreshId(); + food.RefreshID(); foreach (var selectText in SelectTexts) selectText.RefreshID(); foreach (var pet in Pets) @@ -554,7 +580,6 @@ public class ModInfoModel : I18nModel /// 路径 public void SaveTo(string path) { - SaveI18nDatas.Clear(); // 保存模型信息 SaveModInfo(path); // 保存模组数据 @@ -563,7 +588,6 @@ public class ModInfoModel : I18nModel SaveText(path); SaveI18nData(path); SaveImage(path); - SaveI18nDatas.Clear(); } /// @@ -576,10 +600,6 @@ public class ModInfoModel : I18nModel if (File.Exists(modInfoFile) is false) File.Create(modInfoFile).Close(); - SaveI18nDatas.Clear(); - foreach (var cultureName in I18nHelper.Current.CultureNames) - SaveI18nDatas.Add(cultureName, new()); - var lps = new LPS() { new Line("vupmod", ID) @@ -593,13 +613,23 @@ public class ModInfoModel : I18nModel new Line("itemid", ItemID.ToString()), new Line("cachedate", DateTime.Now.Date.ToString("s")) }; - foreach (var cultureName in I18nHelper.Current.CultureNames) + foreach (var cultureData in Current.I18nResource.CultureDatas) { lps.Add( - new Line("lang", cultureName) + new Line("cultureDatas", cultureData.Key.Name) { - new Sub(ID, I18nDatas[cultureName].Name), - new Sub(DescriptionID, I18nDatas[cultureName].Description), + new Sub( + ID, + I18nResource.GetCultureDataOrDefault(cultureData.Key.Name, ID, string.Empty) + ), + new Sub( + DescriptionID, + I18nResource.GetCultureDataOrDefault( + cultureData.Key.Name, + DescriptionID, + string.Empty + ) + ), } ); } @@ -646,15 +676,7 @@ public class ModInfoModel : I18nModel File.Create(foodFile).Close(); var lps = new LPS(); foreach (var food in Foods) - { lps.Add(LPSConvert.SerializeObjectToLine(food.ToFood(), "food")); - foreach (var cultureName in I18nHelper.Current.CultureNames) - { - SaveI18nDatas[cultureName].TryAdd(food.ID, food.I18nDatas[cultureName].Name); - SaveI18nDatas[cultureName] - .TryAdd(food.DescriptionID, food.I18nDatas[cultureName].Description); - } - } File.WriteAllText(foodFile, lps.ToString()); } @@ -690,15 +712,7 @@ public class ModInfoModel : I18nModel File.Create(textFile).Close(); var lps = new LPS(); foreach (var text in SelectTexts) - { lps.Add(LPSConvert.SerializeObjectToLine(text.ToSelectText(), "SelectText")); - foreach (var cultureName in I18nHelper.Current.CultureNames) - { - SaveI18nDatas[cultureName].TryAdd(text.ID, text.I18nDatas[cultureName].Text); - SaveI18nDatas[cultureName] - .TryAdd(text.ChooseID, text.I18nDatas[cultureName].Choose); - } - } File.WriteAllText(textFile, lps.ToString()); } @@ -714,13 +728,7 @@ public class ModInfoModel : I18nModel File.Create(textFile).Close(); var lps = new LPS(); foreach (var text in LowTexts) - { lps.Add(LPSConvert.SerializeObjectToLine(text.ToLowText(), "lowfoodtext")); - foreach (var cultureName in I18nHelper.Current.CultureNames) - { - SaveI18nDatas[cultureName].TryAdd(text.ID, text.I18nDatas[cultureName].Text); - } - } File.WriteAllText(textFile, lps.ToString()); } @@ -736,32 +744,26 @@ public class ModInfoModel : I18nModel File.Create(textFile).Close(); var lps = new LPS(); foreach (var text in ClickTexts) - { lps.Add(LPSConvert.SerializeObjectToLine(text.ToClickText(), "clicktext")); - foreach (var cultureName in I18nHelper.Current.CultureNames) - { - SaveI18nDatas[cultureName].TryAdd(text.ID, text.I18nDatas[cultureName].Text); - } - } File.WriteAllText(textFile, lps.ToString()); } #endregion /// - /// 保存I18n数据 + /// 保存I18n资源 /// /// 路径 private void SaveI18nData(string path) { var langPath = Path.Combine(path, "lang"); Directory.CreateDirectory(langPath); - foreach (var cultureName in I18nHelper.Current.CultureNames) + foreach (var cultureData in I18nResource.CultureDatas) { - var culturePath = Path.Combine(langPath, cultureName); + var culturePath = Path.Combine(langPath, cultureData.Key.Name); Directory.CreateDirectory(culturePath); - var cultureFile = Path.Combine(culturePath, $"{cultureName}.lps"); + var cultureFile = Path.Combine(culturePath, $"{cultureData.Key.Name}.lps"); File.Create(cultureFile).Close(); var lps = new LPS(); - foreach (var data in SaveI18nDatas[cultureName]) + foreach (var data in cultureData.Value) lps.Add(new Line(data.Key, data.Value)); File.WriteAllText(cultureFile, lps.ToString()); } @@ -806,7 +808,7 @@ public class ModInfoModel : I18nModel // 保存模型信息 SaveModInfo(path); // 保存文化数据 - var langPath = Path.Combine(path, "lang"); + var langPath = Path.Combine(path, "cultureDatas"); Directory.CreateDirectory(langPath); foreach (var cultureName in cultures) { @@ -828,26 +830,26 @@ public class ModInfoModel : I18nModel } } -public class I18nModInfoModel : ObservableObjectX -{ - #region Name - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - private string _name = string.Empty; +//public class I18nModInfoModel : ObservableObjectX +//{ +// #region Name +// [DebuggerBrowsable(DebuggerBrowsableState.Never)] +// private string _name = string.Empty; - public string Name - { - get => _name; - set => SetProperty(ref _name, value); - } - #endregion - #region Description - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - private string _description = string.Empty; +// public string Name +// { +// get => _name; +// set => SetProperty(ref _name, value); +// } +// #endregion +// #region Description +// [DebuggerBrowsable(DebuggerBrowsableState.Never)] +// private string _description = string.Empty; - public string Description - { - get => _description; - set => SetProperty(ref _description, value); - } - #endregion -} +// public string Description +// { +// get => _description; +// set => SetProperty(ref _description, value); +// } +// #endregion +//} diff --git a/VPet.ModMaker/Models/ModModel/PetModel.cs b/VPet.ModMaker/Models/ModModel/PetModel.cs index 9f3c0f2..782a8a3 100644 --- a/VPet.ModMaker/Models/ModModel/PetModel.cs +++ b/VPet.ModMaker/Models/ModModel/PetModel.cs @@ -23,13 +23,24 @@ namespace VPet.ModMaker.Models; /// /// 宠物模型 /// -public class PetModel : I18nModel +public class PetModel : ObservableObjectX { public PetModel() { PropertyChanged += PetModel_PropertyChanged; Animes.PropertyChanged += Animes_PropertyChanged; FoodAnimes.PropertyChanged += FoodAnimes_PropertyChanged; + ModInfoModel.Current.I18nResource.I18nObjectInfos.Add( + new( + this, + OnPropertyChanged, + [ + (nameof(ID), ID, nameof(Name), true), + (nameof(PetNameID), PetNameID, nameof(Name), true), + (nameof(DescriptionID), DescriptionID, nameof(Description), true) + ] + ) + ); } private void PetModel_PropertyChanged(object? sender, PropertyChangedEventArgs e) @@ -54,10 +65,6 @@ public class PetModel : I18nModel RaisePoint = model.RaisePoint.Clone(); foreach (var work in model.Works) Works.Add(work); - - foreach (var item in model.I18nDatas) - I18nDatas[item.Key] = item.Value.Clone(); - CurrentI18nData = I18nDatas[I18nHelper.Current.CultureName]; } public PetModel(PetLoader loader, bool fromMain = false) @@ -185,6 +192,37 @@ public class PetModel : I18nModel } #endregion + #region I18nData + [AdaptIgnore] + public string Name + { + get => ModInfoModel.Current.I18nResource.GetCurrentCultureDataOrDefault(ID, string.Empty); + set => ModInfoModel.Current.I18nResource.SetCurrentCultureData(ID, value); + } + + [AdaptIgnore] + public string PetName + { + get => + ModInfoModel.Current.I18nResource.GetCurrentCultureDataOrDefault( + PetNameID, + string.Empty + ); + set => ModInfoModel.Current.I18nResource.SetCurrentCultureData(PetNameID, value); + } + + [AdaptIgnore] + public string Description + { + get => + ModInfoModel.Current.I18nResource.GetCurrentCultureDataOrDefault( + DescriptionID, + string.Empty + ); + set => ModInfoModel.Current.I18nResource.SetCurrentCultureData(DescriptionID, value); + } + #endregion + #region Tags [DebuggerBrowsable(DebuggerBrowsableState.Never)] private string _tags = string.Empty; @@ -344,16 +382,17 @@ public class PetModel : I18nModel /// 路径 public void Save(string path) { - foreach (var cultureName in I18nHelper.Current.CultureNames) - { - ModInfoModel.SaveI18nDatas[cultureName].TryAdd(ID, I18nDatas[cultureName].Name); - ModInfoModel - .SaveI18nDatas[cultureName] - .TryAdd(PetNameID, I18nDatas[cultureName].PetName); - ModInfoModel - .SaveI18nDatas[cultureName] - .TryAdd(DescriptionID, I18nDatas[cultureName].Description); - } + // TODO + //foreach (var cultureName in I18nHelper.Current.CultureNames) + //{ + // ModInfoModel.SaveI18nDatas[cultureName].TryAdd(ID, I18nDatas[cultureName].Name); + // ModInfoModel + // .SaveI18nDatas[cultureName] + // .TryAdd(PetNameID, I18nDatas[cultureName].PetName); + // ModInfoModel + // .SaveI18nDatas[cultureName] + // .TryAdd(DescriptionID, I18nDatas[cultureName].Description); + //} var petFile = Path.Combine(path, $"{ID}.lps"); if (File.Exists(petFile) is false) File.Create(petFile).Close(); @@ -400,13 +439,14 @@ public class PetModel : I18nModel { foreach (var work in Works) { - lps.Add(LPSConvert.SerializeObjectToLine(work.ToWork(), "work")); - foreach (var cultureName in I18nHelper.Current.CultureNames) - { - ModInfoModel - .SaveI18nDatas[cultureName] - .TryAdd(work.ID, work.I18nDatas[cultureName].Name); - } + //TODO + //lps.Add(LPSConvert.SerializeObjectToLine(work.ToWork(), "work")); + //foreach (var cultureName in I18nHelper.Current.CultureNames) + //{ + // ModInfoModel + // .SaveI18nDatas[cultureName] + // .TryAdd(work.ID, work.I18nDatas[cultureName].Name); + //} } } @@ -545,51 +585,6 @@ public class PetModel : I18nModel #endregion } -public class I18nPetInfoModel : ObservableObjectX, ICloneable -{ - #region Name - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - private string _name = string.Empty; - - public string Name - { - get => _name; - set => SetProperty(ref _name, value); - } - #endregion - #region PetName - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - private string _petName = string.Empty; - - public string PetName - { - get => _petName; - set => SetProperty(ref _petName, value); - } - #endregion - #region Description - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - private string _description = string.Empty; - - public string Description - { - get => _description; - set => SetProperty(ref _description, value); - } - #endregion - - public I18nPetInfoModel Clone() - { - var result = new I18nPetInfoModel(); - result.Name = Name; - result.PetName = PetName; - result.Description = Description; - return result; - } - - object ICloneable.Clone() => Clone(); -} - public class ObservableMultiStateRectangleLocation : ObservableObjectX, IEquatable, diff --git a/VPet.ModMaker/Models/ModModel/SelectTextModel.cs b/VPet.ModMaker/Models/ModModel/SelectTextModel.cs index 36ffe79..c81fade 100644 --- a/VPet.ModMaker/Models/ModModel/SelectTextModel.cs +++ b/VPet.ModMaker/Models/ModModel/SelectTextModel.cs @@ -16,9 +16,21 @@ namespace VPet.ModMaker.Models; /// /// 选择文本模型 /// -public class SelectTextModel : I18nModel +public class SelectTextModel : ObservableObjectX { - public SelectTextModel() { } + public SelectTextModel() + { + ModInfoModel.Current.I18nResource.I18nObjectInfos.Add( + new( + this, + OnPropertyChanged, + [ + (nameof(ID), ID, nameof(Text), true), + (nameof(ChooseID), ChooseID, nameof(Choose), true) + ] + ) + ); + } public SelectTextModel(SelectTextModel model) : this() @@ -37,10 +49,6 @@ public class SelectTextModel : I18nModel Drink = model.Drink.Clone(); Feel = model.Feel.Clone(); Strength = model.Strength.Clone(); - - foreach (var item in model.I18nDatas) - I18nDatas[item.Key] = item.Value.Clone(); - CurrentI18nData = I18nDatas[I18nHelper.Current.CultureName]; } public SelectTextModel(SelectText text) @@ -126,6 +134,26 @@ public class SelectTextModel : I18nModel } #endregion + #region I18nData + [AdaptIgnore] + public string Text + { + get => ModInfoModel.Current.I18nResource.GetCurrentCultureDataOrDefault(ID, string.Empty); + set => ModInfoModel.Current.I18nResource.SetCurrentCultureData(ID, value); + } + + [AdaptIgnore] + public string Choose + { + get => + ModInfoModel.Current.I18nResource.GetCurrentCultureDataOrDefault( + ChooseID, + string.Empty + ); + set => ModInfoModel.Current.I18nResource.SetCurrentCultureData(ChooseID, value); + } + #endregion + /// /// 宠物状态 /// @@ -212,34 +240,3 @@ public class SelectTextModel : I18nModel }; } } - -public class I18nSelectTextModel : ObservableObjectX, ICloneable -{ - #region Choose - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - private string _choose = string.Empty; - - public string Choose - { - get => _choose; - set => SetProperty(ref _choose, value); - } - #endregion - #region Text - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - private string _text = string.Empty; - - public string Text - { - get => _text; - set => SetProperty(ref _text, value); - } - #endregion - - public I18nSelectTextModel Clone() - { - return this.Adapt(); - } - - object ICloneable.Clone() => Clone(); -} diff --git a/VPet.ModMaker/Models/ModModel/WorkModel.cs b/VPet.ModMaker/Models/ModModel/WorkModel.cs index a6ec649..0dd9478 100644 --- a/VPet.ModMaker/Models/ModModel/WorkModel.cs +++ b/VPet.ModMaker/Models/ModModel/WorkModel.cs @@ -18,11 +18,14 @@ namespace VPet.ModMaker.Models; /// /// 工作模型 /// -public class WorkModel : I18nModel +public class WorkModel : ObservableObjectX { public WorkModel() { PropertyChanged += WorkModel_PropertyChanged; + ModInfoModel.Current.I18nResource.I18nObjectInfos.Add( + new(this, OnPropertyChanged, [(nameof(ID), ID, nameof(Name), true)]) + ); } private static readonly FrozenSet _notifyIsOverLoad = FrozenSet.ToFrozenSet( @@ -71,9 +74,6 @@ public class WorkModel : I18nModel Width = model.Width; //Image = model.Image?.CloneStream(); - foreach (var item in model.I18nDatas) - I18nDatas[item.Key] = item.Value.Clone(); - CurrentI18nData = I18nDatas[I18nHelper.Current.CultureName]; } public WorkModel(VPet_Simulator.Core.GraphHelper.Work work) @@ -111,12 +111,12 @@ public class WorkModel : I18nModel public static FrozenSet WorkTypes { get; } = Enum.GetValues().ToFrozenSet(); - #region Id + #region ID [DebuggerBrowsable(DebuggerBrowsableState.Never)] private string _id = string.Empty; /// - /// Id + /// ID /// public string ID { @@ -125,6 +125,15 @@ public class WorkModel : I18nModel } #endregion + #region I18nData + [AdaptIgnore] + public string Name + { + get => ModInfoModel.Current.I18nResource.GetCurrentCultureDataOrDefault(ID, string.Empty); + set => ModInfoModel.Current.I18nResource.SetCurrentCultureData(ID, value); + } + #endregion + #region Graph [DebuggerBrowsable(DebuggerBrowsableState.Never)] private string _graph = string.Empty; @@ -450,28 +459,10 @@ public class WorkModel : I18nModel public void Close() { //Image?.CloseStream(); + var item = ModInfoModel.Current.I18nResource.I18nObjectInfos.FirstOrDefault(i => + i.Source == this + ); + if (item is not null) + ModInfoModel.Current.I18nResource.I18nObjectInfos.Remove(item); } } - -public class I18nWorkModel : ObservableObjectX, ICloneable -{ - #region Name - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - private string _name = string.Empty; - - public string Name - { - get => _name; - set => SetProperty(ref _name, value); - } - #endregion - - public I18nWorkModel Clone() - { - var result = new I18nWorkModel(); - result.Name = Name; - return result; - } - - object ICloneable.Clone() => Clone(); -} diff --git a/VPet.ModMaker/Templates.xaml b/VPet.ModMaker/Templates.xaml index b1d1c71..bc00863 100644 --- a/VPet.ModMaker/Templates.xaml +++ b/VPet.ModMaker/Templates.xaml @@ -46,9 +46,9 @@ + SelectedItem="{Binding I18nResource.CurrentCulture}">