This commit is contained in:
陈思海 2025-09-23 19:27:17 +08:00
parent 97c7b8cd36
commit dd0cbf21aa
2 changed files with 71 additions and 10 deletions

View File

@ -1,10 +1,12 @@
using System;
using System.Collections.Generic; using System.Collections.Generic;
using UnityEngine; using UnityEngine;
using UnityEngine.Serialization;
namespace AlicizaX.Localization.Editor namespace AlicizaX.Localization.Editor
{ {
[AlicizaX.Editor.Setting.FilePath("ProjectSettings/LocalizationConfiguration.asset")] [AlicizaX.Editor.Setting.FilePath("ProjectSettings/LocalizationConfiguration.asset")]
public class LocalizationConfiguration : AlicizaX.Editor.Setting.ScriptableSingleton<LocalizationConfiguration> public class LocalizationConfiguration : AlicizaX.Editor.Setting.ScriptableSingleton<LocalizationConfiguration>
{ {
[SerializeField] private List<string> LanguageTypes = new List<string>() [SerializeField] private List<string> LanguageTypes = new List<string>()
{ {
@ -29,6 +31,7 @@ namespace AlicizaX.Localization.Editor
"Russian", "Russian",
}; };
[SerializeField] private string _genLangaugeTypePath = "Assets/LanguageTypes.cs";
public IReadOnlyList<string> LanguageTypeNames => LanguageTypes; public IReadOnlyList<string> LanguageTypeNames => LanguageTypes;
} }

View File

@ -1,4 +1,4 @@
using System.Text;
using UnityEditor; using UnityEditor;
using UnityEngine; using UnityEngine;
using UnityEngine.UIElements; using UnityEngine.UIElements;
@ -11,8 +11,11 @@ namespace AlicizaX.Localization.Editor
private SerializedObject _serializedObject; private SerializedObject _serializedObject;
private SerializedProperty _languageTypes; private SerializedProperty _languageTypes;
private ReorderableList _languageList; private ReorderableList _languageList;
private SerializedProperty _genLangaugeTypePath;
public LocalizationSettingsProvider() : base("Project/Localization Settings", SettingsScope.Project) { } public LocalizationSettingsProvider() : base("Project/Localization Settings", SettingsScope.Project)
{
}
public override void OnActivate(string searchContext, VisualElement rootElement) public override void OnActivate(string searchContext, VisualElement rootElement)
{ {
@ -25,18 +28,15 @@ namespace AlicizaX.Localization.Editor
_serializedObject?.Dispose(); _serializedObject?.Dispose();
_serializedObject = new SerializedObject(setting); _serializedObject = new SerializedObject(setting);
_languageTypes = _serializedObject.FindProperty("LanguageTypes"); _languageTypes = _serializedObject.FindProperty("LanguageTypes");
_genLangaugeTypePath = _serializedObject.FindProperty("_genLangaugeTypePath");
// 自定义 ReorderableList // 自定义 ReorderableList
_languageList = new ReorderableList(_serializedObject, _languageTypes, _languageList = new ReorderableList(_serializedObject, _languageTypes,
draggable: false, // 禁止拖拽 draggable: false, // 禁止拖拽
displayHeader: true, displayHeader: true,
displayAddButton: true, displayAddButton: true,
displayRemoveButton: true); displayRemoveButton: true);
_languageList.drawHeaderCallback = rect => _languageList.drawHeaderCallback = rect => { EditorGUI.LabelField(rect, "Language Types"); };
{
EditorGUI.LabelField(rect, "Language Types");
};
_languageList.drawElementCallback = (rect, index, isActive, isFocused) => _languageList.drawElementCallback = (rect, index, isActive, isFocused) =>
{ {
@ -59,8 +59,12 @@ namespace AlicizaX.Localization.Editor
_serializedObject.Update(); _serializedObject.Update();
EditorGUI.BeginChangeCheck(); EditorGUI.BeginChangeCheck();
EditorGUILayout.PropertyField(_genLangaugeTypePath);
if (GUILayout.Button("Generate Language Types"))
{
RegenerateLanguageTypes();
}
// 使用 ReorderableList 绘制
_languageList.DoLayoutList(); _languageList.DoLayoutList();
if (EditorGUI.EndChangeCheck()) if (EditorGUI.EndChangeCheck())
@ -70,6 +74,59 @@ namespace AlicizaX.Localization.Editor
} }
} }
private void RegenerateLanguageTypes()
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("using System.Collections.Generic;");
sb.AppendLine("");
sb.AppendLine("/// <summary>");
sb.AppendLine("/// AutoGenerate");
sb.AppendLine("/// </summary>");
sb.AppendLine("public static class LanguageTypes");
sb.AppendLine("{");
sb.AppendLine("\tpublic static readonly IReadOnlyList<string> Types = new List<string>");
sb.AppendLine("\t{");
for (int i = 0; i < LocalizationConfiguration.Instance.LanguageTypeNames.Count; i++)
{
sb.AppendLine($"\t\t\"{LocalizationConfiguration.Instance.LanguageTypeNames[i]}\",");
}
sb.AppendLine("\t};");
sb.AppendLine("");
sb.AppendLine("\tpublic static string IndexToString(int index)");
sb.AppendLine("\t{");
sb.AppendLine("\t\tif (index < 0 || index >= Types.Count) return \"Unknown\";");
sb.AppendLine("\t\treturn Types[index];");
sb.AppendLine("\t}");
sb.AppendLine("");
sb.AppendLine("\tpublic static int StringToIndex(string s)");
sb.AppendLine("\t{");
sb.AppendLine("\t\tint index = -1;");
sb.AppendLine("\t\tfor (int i = 0; i < Types.Count; i++)");
sb.AppendLine("\t\t{");
sb.AppendLine("\t\t\tif (Types[i] == s)");
sb.AppendLine("\t\t\t{");
sb.AppendLine("\t\t\t\tindex = i;");
sb.AppendLine("\t\t\t\tbreak;");
sb.AppendLine("\t\t\t}");
sb.AppendLine("\t\t}");
sb.AppendLine("");
sb.AppendLine("\t\treturn index;");
sb.AppendLine("\t}");
sb.AppendLine("");
sb.AppendLine("}");
System.IO.File.WriteAllText(_genLangaugeTypePath.stringValue, sb.ToString());
AssetDatabase.Refresh();
}
public override void OnDeactivate() public override void OnDeactivate()
{ {
base.OnDeactivate(); base.OnDeactivate();
@ -85,6 +142,7 @@ namespace AlicizaX.Localization.Editor
{ {
s_provider = new LocalizationSettingsProvider(); s_provider = new LocalizationSettingsProvider();
} }
return s_provider; return s_provider;
} }
} }