2025-09-25 11:11:19 +08:00
|
|
|
using System.Collections.Generic;
|
2025-09-23 19:27:17 +08:00
|
|
|
using System.Text;
|
2025-09-25 11:11:19 +08:00
|
|
|
using AlicizaX.Editor;
|
2025-09-23 12:04:39 +08:00
|
|
|
using UnityEditor;
|
|
|
|
|
using UnityEngine;
|
|
|
|
|
using UnityEngine.UIElements;
|
|
|
|
|
using UnityEditorInternal;
|
|
|
|
|
|
|
|
|
|
namespace AlicizaX.Localization.Editor
|
|
|
|
|
{
|
|
|
|
|
internal class LocalizationSettingsProvider : UnityEditor.SettingsProvider
|
|
|
|
|
{
|
|
|
|
|
private SerializedObject _serializedObject;
|
|
|
|
|
private SerializedProperty _languageTypes;
|
|
|
|
|
private ReorderableList _languageList;
|
2025-09-23 19:27:17 +08:00
|
|
|
private SerializedProperty _genLangaugeTypePath;
|
2025-09-25 11:11:19 +08:00
|
|
|
private SerializedProperty generateScriptCodeFirstConfig;
|
|
|
|
|
private List<string> popConfig = new List<string>();
|
2025-09-23 12:04:39 +08:00
|
|
|
|
2025-09-23 19:27:17 +08:00
|
|
|
public LocalizationSettingsProvider() : base("Project/Localization Settings", SettingsScope.Project)
|
|
|
|
|
{
|
|
|
|
|
}
|
2025-09-23 12:04:39 +08:00
|
|
|
|
|
|
|
|
public override void OnActivate(string searchContext, VisualElement rootElement)
|
|
|
|
|
{
|
|
|
|
|
InitGUI();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void InitGUI()
|
|
|
|
|
{
|
|
|
|
|
var setting = LocalizationConfiguration.Instance;
|
|
|
|
|
_serializedObject?.Dispose();
|
|
|
|
|
_serializedObject = new SerializedObject(setting);
|
|
|
|
|
_languageTypes = _serializedObject.FindProperty("LanguageTypes");
|
2025-09-23 19:27:17 +08:00
|
|
|
_genLangaugeTypePath = _serializedObject.FindProperty("_genLangaugeTypePath");
|
2025-09-25 11:11:19 +08:00
|
|
|
generateScriptCodeFirstConfig = _serializedObject.FindProperty("generateScriptCodeFirstConfig");
|
2025-09-23 12:04:39 +08:00
|
|
|
// 自定义 ReorderableList
|
|
|
|
|
_languageList = new ReorderableList(_serializedObject, _languageTypes,
|
2025-09-25 11:11:19 +08:00
|
|
|
draggable: false,
|
2025-09-23 12:04:39 +08:00
|
|
|
displayHeader: true,
|
|
|
|
|
displayAddButton: true,
|
|
|
|
|
displayRemoveButton: true);
|
|
|
|
|
|
2025-09-23 19:27:17 +08:00
|
|
|
_languageList.drawHeaderCallback = rect => { EditorGUI.LabelField(rect, "Language Types"); };
|
2025-09-23 12:04:39 +08:00
|
|
|
|
|
|
|
|
_languageList.drawElementCallback = (rect, index, isActive, isFocused) =>
|
|
|
|
|
{
|
|
|
|
|
var element = _languageTypes.GetArrayElementAtIndex(index);
|
|
|
|
|
rect.y += 2;
|
|
|
|
|
|
2025-09-25 11:11:19 +08:00
|
|
|
if (index < 2) // 前两个(中文、英文)禁止修改
|
|
|
|
|
{
|
|
|
|
|
EditorGUI.BeginDisabledGroup(true);
|
|
|
|
|
EditorGUI.TextField(
|
|
|
|
|
new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight),
|
|
|
|
|
element.stringValue);
|
|
|
|
|
EditorGUI.EndDisabledGroup();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
element.stringValue = EditorGUI.TextField(
|
|
|
|
|
new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight),
|
|
|
|
|
element.stringValue);
|
|
|
|
|
}
|
2025-09-23 12:04:39 +08:00
|
|
|
};
|
2025-09-25 11:11:19 +08:00
|
|
|
|
|
|
|
|
// 禁止删除前两个
|
|
|
|
|
_languageList.onCanRemoveCallback = list =>
|
|
|
|
|
{
|
|
|
|
|
return list.index >= 2; // 只有索引 >=2 的项才能删除
|
|
|
|
|
};
|
|
|
|
|
popConfig.Clear();
|
|
|
|
|
if (setting.LanguageTypeNames.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
foreach (var lang in setting.LanguageTypeNames)
|
|
|
|
|
{
|
|
|
|
|
string name = lang.Or("Unknown");
|
|
|
|
|
popConfig.Add(name);
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-09-23 12:04:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override void OnGUI(string searchContext)
|
|
|
|
|
{
|
|
|
|
|
if (_serializedObject == null || !_serializedObject.targetObject)
|
|
|
|
|
{
|
|
|
|
|
InitGUI();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_serializedObject.Update();
|
|
|
|
|
EditorGUI.BeginChangeCheck();
|
2025-09-25 11:11:19 +08:00
|
|
|
|
2025-09-23 19:27:17 +08:00
|
|
|
EditorGUILayout.PropertyField(_genLangaugeTypePath);
|
2025-09-25 11:11:19 +08:00
|
|
|
EditorDrawing.DrawStringSelectPopup(new GUIContent("Gen Lang"), new GUIContent("None"), popConfig.ToArray(), generateScriptCodeFirstConfig.stringValue,
|
|
|
|
|
(e) =>
|
|
|
|
|
{
|
|
|
|
|
generateScriptCodeFirstConfig.stringValue = e;
|
|
|
|
|
_serializedObject.ApplyModifiedProperties();
|
|
|
|
|
LocalizationConfiguration.Save();
|
|
|
|
|
});
|
2025-09-23 19:27:17 +08:00
|
|
|
if (GUILayout.Button("Generate Language Types"))
|
|
|
|
|
{
|
|
|
|
|
RegenerateLanguageTypes();
|
|
|
|
|
}
|
2025-09-23 12:04:39 +08:00
|
|
|
|
|
|
|
|
_languageList.DoLayoutList();
|
|
|
|
|
|
|
|
|
|
if (EditorGUI.EndChangeCheck())
|
|
|
|
|
{
|
|
|
|
|
_serializedObject.ApplyModifiedProperties();
|
|
|
|
|
LocalizationConfiguration.Save();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-09-23 19:27:17 +08:00
|
|
|
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("}");
|
2025-09-25 11:11:19 +08:00
|
|
|
|
2025-09-23 19:27:17 +08:00
|
|
|
System.IO.File.WriteAllText(_genLangaugeTypePath.stringValue, sb.ToString());
|
|
|
|
|
AssetDatabase.Refresh();
|
|
|
|
|
}
|
|
|
|
|
|
2025-09-23 12:04:39 +08:00
|
|
|
public override void OnDeactivate()
|
|
|
|
|
{
|
|
|
|
|
base.OnDeactivate();
|
|
|
|
|
LocalizationConfiguration.Save();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static LocalizationSettingsProvider s_provider;
|
|
|
|
|
|
|
|
|
|
[SettingsProvider]
|
|
|
|
|
public static SettingsProvider CreateMyCustomSettingsProvider()
|
|
|
|
|
{
|
|
|
|
|
if (s_provider == null)
|
|
|
|
|
{
|
|
|
|
|
s_provider = new LocalizationSettingsProvider();
|
|
|
|
|
}
|
2025-09-23 19:27:17 +08:00
|
|
|
|
2025-09-23 12:04:39 +08:00
|
|
|
return s_provider;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|