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}">