From 033e950887264eddd11c32c21d4126d83e98a659 Mon Sep 17 00:00:00 2001
From: lcy <1459594991@qq.com>
Date: 星期四, 02 四月 2026 18:12:59 +0800
Subject: [PATCH] 592 多语言适配
---
Assets/Editor/UIComponent/TextLanguageAdapterEditor.cs | 286 ++++++++++++++++++--------------------------------------
1 files changed, 94 insertions(+), 192 deletions(-)
diff --git a/Assets/Editor/UIComponent/TextLanguageAdapterEditor.cs b/Assets/Editor/UIComponent/TextLanguageAdapterEditor.cs
index 524ac79..8c2934b 100644
--- a/Assets/Editor/UIComponent/TextLanguageAdapterEditor.cs
+++ b/Assets/Editor/UIComponent/TextLanguageAdapterEditor.cs
@@ -1,298 +1,200 @@
-using UnityEngine;
-using UnityEditor;
using System.Collections.Generic;
+using UnityEditor;
+using UnityEngine;
-/// <summary>
-/// TextLanguageAdapter 鑷畾涔夌紪杈戝櫒
-/// 鎻愪緵鍙鍖栫殑澶氳瑷�鎺掔増閰嶇疆鐣岄潰
-/// </summary>
[CustomEditor(typeof(TextLanguageAdapter), true)]
[CanEditMultipleObjects]
public class TextLanguageAdapterEditor : Editor
{
private Dictionary<string, bool> m_FoldoutStates = new Dictionary<string, bool>();
- private Dictionary<string, string> m_LanguageShowDict;
- private static readonly string[] m_PresetLanguageIds = { TextLanguageAdapter.DefaultLangId, "zh", "ft", "en"};
- private static readonly string[] m_PresetLanguageNames = { "榛樿", "绠�浣�", "绻佷綋", "English" };
- private string m_CopySourceLanguageId = "";
- protected virtual void OnEnable()
+ private void OnEnable()
{
- InitLanguageShowDict();
+ TextLanguageAdapterHelper.Initialize();
+
if (target is TextLanguageAdapter adapter)
{
- // 纭繚 default 閰嶇疆瀛樺湪
if (!adapter.HasConfig(TextLanguageAdapter.DefaultLangId))
{
adapter.ReadCurrentToConfig(TextLanguageAdapter.DefaultLangId);
EditorUtility.SetDirty(adapter);
}
-
- foreach (var langId in adapter.GetConfiguredLanguages())
- {
- m_FoldoutStates.TryAdd(langId, false);
- }
+ foreach (var langId in adapter.GetConfiguredLanguages()) m_FoldoutStates.TryAdd(langId, false);
}
}
public override void OnInspectorGUI()
{
- TextLanguageAdapter adapter = target as TextLanguageAdapter;
-
+ var adapter = target as TextLanguageAdapter;
+
DrawBasicInfo(adapter);
EditorGUILayout.Space();
DrawLanguageConfigs(adapter);
- if (GUI.changed)
- {
- EditorUtility.SetDirty(target);
- }
- }
-
- private void InitLanguageShowDict()
- {
- if (m_LanguageShowDict != null) return;
-
- m_LanguageShowDict = new Dictionary<string, string>();
- for (int i = 0; i < m_PresetLanguageIds.Length; i++)
- {
- m_LanguageShowDict[m_PresetLanguageIds[i]] = m_PresetLanguageNames[i];
- }
- }
-
- private string GetLanguageDisplayName(string languageId)
- {
- if (m_LanguageShowDict != null && m_LanguageShowDict.TryGetValue(languageId, out string name))
- {
- return name;
- }
- return TextLanguageAdapter.GetLanguageShowName(languageId);
+ if (GUI.changed) EditorUtility.SetDirty(target);
}
private void DrawBasicInfo(TextLanguageAdapter adapter)
{
- EditorGUILayout.BeginVertical(EditorStyles.helpBox);
- EditorGUILayout.LabelField("鍩烘湰淇℃伅", EditorStyles.boldLabel);
-
- EditorGUI.BeginDisabledGroup(true);
- // 浣跨敤鏂板紑鏀剧殑 TargetTextComponent 灞炴�э紝褰诲簳娑堥櫎鍙嶅皠
- EditorGUILayout.ObjectField("鐩爣缁勪欢", adapter.LanguageConfigs.keys.Count > 0 ? adapter.TargetTextComponent : null, typeof(Component), true);
- EditorGUILayout.EnumPopup("缁勪欢绫诲瀷", adapter.TargetTextType);
- EditorGUI.EndDisabledGroup();
-
- if (GUILayout.Button("鍒锋柊缁勪欢妫�娴�", GUILayout.Width(120)))
+ using (new EditorGUILayout.VerticalScope(EditorStyles.helpBox))
{
- adapter.Editor_ForceRefreshDetection();
- }
+ EditorGUILayout.LabelField("鍩烘湰淇℃伅", EditorStyles.boldLabel);
+
+ using (new EditorGUI.DisabledScope(true))
+ {
+ EditorGUILayout.ObjectField("鐩爣缁勪欢", adapter.LanguageConfigs.keys.Count > 0 ? adapter.TargetTextComponent : null, typeof(Component), true);
+ EditorGUILayout.EnumPopup("缁勪欢绫诲瀷", adapter.TargetTextType);
+ }
- EditorGUILayout.EndVertical();
+ if (GUILayout.Button("鍒锋柊缁勪欢妫�娴�", GUILayout.Width(120))) adapter.Editor_ForceRefreshDetection();
+ EditorGUILayout.HelpBox("缁勪欢鎴栫被鍨嬪彉鏇村悗闇�鎵ц鍒锋柊缁勪欢妫�娴�", MessageType.Info);
+ }
}
private void DrawLanguageConfigs(TextLanguageAdapter adapter)
{
- EditorGUILayout.BeginVertical(EditorStyles.helpBox);
- EditorGUILayout.LabelField($"璇█鎺掔増閰嶇疆 (蹇呴』鍖呭惈 {TextLanguageAdapter.DefaultLangId} 榛樿閰嶇疆)", EditorStyles.boldLabel);
-
- List<string> configuredLanguages = adapter.GetConfiguredLanguages();
- foreach (var langId in configuredLanguages)
+ using (new EditorGUILayout.VerticalScope(EditorStyles.helpBox))
{
- DrawLanguageConfigItem(adapter, langId);
- }
+ EditorGUILayout.LabelField("璇█鎺掔増閰嶇疆", EditorStyles.boldLabel);
+ EditorGUILayout.HelpBox("default浠呯敤浜庣紪杈戞椂鎭㈠鍒濆鐘舵��,鏃犲搴旇瑷�閰嶇疆鏃剁敤缁勪欢褰撳墠鐘舵��", MessageType.Info);
+
+ foreach (var langId in adapter.GetConfiguredLanguages()) DrawLanguageConfigItem(adapter, langId);
- EditorGUILayout.Space();
- DrawAddLanguageConfig(adapter);
- EditorGUILayout.EndVertical();
+ EditorGUILayout.Space();
+ DrawAddLanguageConfig(adapter);
+ }
}
- private void DrawLanguageConfigItem(TextLanguageAdapter adapter, string languageId)
+ private void DrawLanguageConfigItem(TextLanguageAdapter adapter, string langId)
{
- m_FoldoutStates.TryAdd(languageId, false);
+ m_FoldoutStates.TryAdd(langId, false);
- string displayName = GetLanguageDisplayName(languageId);
- string foldoutLabel = string.IsNullOrEmpty(displayName) ? languageId : $"{languageId} ({displayName})";
+ int presetIndex = System.Array.IndexOf(TextLanguageAdapterHelper.PresetLanguageIds, langId);
+ string name = presetIndex >= 0 ? TextLanguageAdapterHelper.PresetLanguageNames[presetIndex] : TextLanguageAdapter.GetLanguageShowName(langId);
+ string label = string.IsNullOrEmpty(name) ? langId : $"{langId} ({name})";
EditorGUI.indentLevel++;
-
- // 楂樹寒榛樿閰嶇疆
- if (languageId == TextLanguageAdapter.DefaultLangId)
- {
- GUI.backgroundColor = new Color(1f, 0.9f, 0.7f);
- }
-
- m_FoldoutStates[languageId] = EditorGUILayout.Foldout(m_FoldoutStates[languageId], foldoutLabel, true);
+ if (langId == TextLanguageAdapter.DefaultLangId) GUI.backgroundColor = new Color(1f, 0.9f, 0.7f);
+
+ m_FoldoutStates[langId] = EditorGUILayout.Foldout(m_FoldoutStates[langId], label, true);
GUI.backgroundColor = Color.white;
- if (m_FoldoutStates[languageId])
+ if (m_FoldoutStates[langId])
{
EditorGUI.indentLevel++;
- LanguageConfigItem config = adapter.LanguageConfigs.Get(languageId);
+ var config = adapter.LanguageConfigs.Get(langId);
if (config != null)
{
DrawConfigItem(config);
EditorGUILayout.Space();
- DrawConfigItemActions(adapter, languageId);
+ DrawConfigItemActions(adapter, langId);
}
EditorGUI.indentLevel--;
}
-
EditorGUI.indentLevel--;
}
- /// <summary>
- /// 缁樺埗 RectTransform 鍜屾寚瀹氱殑鏂囨湰閫傞厤灞炴��
- /// </summary>
- private void DrawConfigItem(LanguageConfigItem config)
+ private void DrawConfigItem(LanguageConfigItem cfg)
{
- // 1. RectTransform 閰嶇疆
EditorGUILayout.LabelField("RectTransform 閰嶇疆", EditorStyles.miniBoldLabel);
EditorGUI.BeginChangeCheck();
- config.anchoredPosition = EditorGUILayout.Vector2Field("Anchored Position", config.anchoredPosition);
- config.sizeDelta = EditorGUILayout.Vector2Field("Size Delta", config.sizeDelta);
- config.anchorMin = EditorGUILayout.Vector2Field("Anchor Min", config.anchorMin);
- config.anchorMax = EditorGUILayout.Vector2Field("Anchor Max", config.anchorMax);
- config.pivot = EditorGUILayout.Vector2Field("Pivot", config.pivot);
- config.localScale = EditorGUILayout.Vector3Field("Local Scale", config.localScale);
- config.localRotation = EditorGUILayout.Vector3Field("Local Rotation", config.localRotation);
+ cfg.anchoredPosition = EditorGUILayout.Vector2Field("Anchored Position", cfg.anchoredPosition);
+ cfg.sizeDelta = EditorGUILayout.Vector2Field("Size Delta", cfg.sizeDelta);
+ cfg.anchorMin = EditorGUILayout.Vector2Field("Anchor Min", cfg.anchorMin);
+ cfg.anchorMax = EditorGUILayout.Vector2Field("Anchor Max", cfg.anchorMax);
+ cfg.pivot = EditorGUILayout.Vector2Field("Pivot", cfg.pivot);
+ cfg.localScale = EditorGUILayout.Vector3Field("Local Scale", cfg.localScale);
+ cfg.localRotation = EditorGUILayout.Vector3Field("Local Rotation", cfg.localRotation);
+
EditorGUILayout.Space();
-
- // 2. 鏂囨湰鎺掔増涓庨�傞厤閰嶇疆
EditorGUILayout.LabelField("鏂囨湰鎺掔増涓庨�傞厤閰嶇疆", EditorStyles.miniBoldLabel);
- config.font = (Font)EditorGUILayout.ObjectField("Font", config.font, typeof(Font), false);
- config.fontStyle = (FontStyle)EditorGUILayout.EnumPopup("Font Style", config.fontStyle);
- config.fontSize = EditorGUILayout.IntField("Font Size", config.fontSize);
- config.lineSpacing = EditorGUILayout.FloatField("Line Spacing", config.lineSpacing);
- config.alignment = (TextAnchor)EditorGUILayout.EnumPopup("Alignment", config.alignment);
- config.alignByGeometry = EditorGUILayout.Toggle("Align By Geometry", config.alignByGeometry);
- config.horizontalOverflow = (HorizontalWrapMode)EditorGUILayout.EnumPopup("Horizontal Overflow", config.horizontalOverflow);
- config.verticalOverflow = (VerticalWrapMode)EditorGUILayout.EnumPopup("Vertical Overflow", config.verticalOverflow);
- config.resizeTextForBestFit = EditorGUILayout.Toggle("Best Fit", config.resizeTextForBestFit);
+ cfg.font = (Font)EditorGUILayout.ObjectField("Font", cfg.font, typeof(Font), false);
+ cfg.fontStyle = (FontStyle)EditorGUILayout.EnumPopup("Font Style", cfg.fontStyle);
+ cfg.fontSize = EditorGUILayout.IntField("Font Size", cfg.fontSize);
+ cfg.lineSpacing = EditorGUILayout.FloatField("Line Spacing", cfg.lineSpacing);
+ cfg.alignment = (TextAnchor)EditorGUILayout.EnumPopup("Alignment", cfg.alignment);
+ cfg.alignByGeometry = EditorGUILayout.Toggle("Align By Geometry", cfg.alignByGeometry);
+ cfg.horizontalOverflow = (HorizontalWrapMode)EditorGUILayout.EnumPopup("Horizontal Overflow", cfg.horizontalOverflow);
+ cfg.verticalOverflow = (VerticalWrapMode)EditorGUILayout.EnumPopup("Vertical Overflow", cfg.verticalOverflow);
+ cfg.resizeTextForBestFit = EditorGUILayout.Toggle("Best Fit", cfg.resizeTextForBestFit);
- if (config.resizeTextForBestFit)
+ if (cfg.resizeTextForBestFit)
{
EditorGUI.indentLevel++;
- config.resizeTextMinSize = EditorGUILayout.IntField("Min Size", config.resizeTextMinSize);
- config.resizeTextMaxSize = EditorGUILayout.IntField("Max Size", config.resizeTextMaxSize);
+ cfg.resizeTextMinSize = EditorGUILayout.IntField("Min Size", cfg.resizeTextMinSize);
+ cfg.resizeTextMaxSize = EditorGUILayout.IntField("Max Size", cfg.resizeTextMaxSize);
EditorGUI.indentLevel--;
}
- if (EditorGUI.EndChangeCheck())
- {
- EditorUtility.SetDirty(target);
- }
+ if (EditorGUI.EndChangeCheck()) EditorUtility.SetDirty(target);
}
- private void DrawConfigItemActions(TextLanguageAdapter adapter, string languageId)
+ private void DrawConfigItemActions(TextLanguageAdapter adapter, string langId)
{
- EditorGUILayout.BeginHorizontal();
- GUILayout.Space(EditorGUI.indentLevel * 15f); // 琛ュ伩 GUILayout 蹇界暐 indentLevel 鐨勯棶棰�
-
- if (GUILayout.Button("浠庡綋鍓嶈鍙�", GUILayout.Width(80)))
+ using (new EditorGUILayout.HorizontalScope())
{
- Undo.RecordObject(adapter, "Read Current Config");
- adapter.ReadCurrentToConfig(languageId);
- }
+ GUILayout.Space(EditorGUI.indentLevel * 15f);
- if (GUILayout.Button("搴旂敤", GUILayout.Width(60)))
- {
- Undo.RecordObject(adapter, "Apply Config");
- adapter.ApplyConfig(languageId);
- }
-
- bool isDefault = languageId == TextLanguageAdapter.DefaultLangId;
-
- if (!isDefault)
- {
- if (GUILayout.Button("澶嶅埗鍒伴粯璁�", GUILayout.Width(80)))
+ if (GUILayout.Button("浠庡綋鍓嶈鍙�", GUILayout.Width(80)))
{
- Undo.RecordObject(adapter, "Copy to Default");
- adapter.SetConfig(TextLanguageAdapter.DefaultLangId, adapter.LanguageConfigs.Get(languageId)?.Clone());
+ Undo.RecordObject(adapter, "Read Current Config");
+ adapter.ReadCurrentToConfig(langId);
+ }
+
+ if (GUILayout.Button("搴旂敤", GUILayout.Width(60)))
+ {
+ Undo.RecordObject(adapter, "Apply Config");
+ adapter.ApplyConfig(langId);
+ }
+
+ using (new EditorGUI.DisabledScope(langId == TextLanguageAdapter.DefaultLangId))
+ {
+ if (GUILayout.Button("鍒犻櫎", GUILayout.Width(50)))
+ {
+ Undo.RecordObject(adapter, "Remove Config");
+ adapter.RemoveConfig(langId);
+ m_FoldoutStates.Remove(langId);
+ }
}
}
-
- // Default 涓嶅彲鍒犻櫎
- GUI.enabled = !isDefault;
- if (GUILayout.Button("鍒犻櫎", GUILayout.Width(50)))
- {
- Undo.RecordObject(adapter, "Remove Config");
- adapter.RemoveConfig(languageId);
- m_FoldoutStates.Remove(languageId);
- }
- GUI.enabled = true;
-
- EditorGUILayout.EndHorizontal();
}
private void DrawAddLanguageConfig(TextLanguageAdapter adapter)
{
- // === 娣诲姞棰勮璇█ ===
EditorGUILayout.BeginHorizontal();
GUILayout.Space(15f);
EditorGUILayout.LabelField("娣诲姞棰勮璇█:", GUILayout.Width(100));
- // Inspector 闈㈡澘鐨勫彲鐢ㄦ�诲搴� (鍑忓幓鍙充晶婊氬姩鏉$殑澶ц嚧瀹藉害)
float viewWidth = EditorGUIUtility.currentViewWidth - 30f;
- float currentWidth = 115f; // 璧峰瀹藉害锛�15(Space) + 100(LabelWidth)
- float buttonWidth = 64f; // 鎸夐挳瀹藉害 60 + 榛樿杈硅窛澶х害 4
+ float currentWidth = 115f;
+ float buttonWidth = 64f;
- for (int i = 0; i < m_PresetLanguageIds.Length; i++)
+ for (int i = 0; i < TextLanguageAdapterHelper.PresetLanguageIds.Length; i++)
{
- string langId = m_PresetLanguageIds[i];
+ string langId = TextLanguageAdapterHelper.PresetLanguageIds[i];
if (!adapter.HasConfig(langId))
{
- // 妫�娴嬪綋鍓嶈鏄惁鏀惧緱涓嬩笅涓�涓寜閽�
if (currentWidth + buttonWidth > viewWidth)
{
- // 鏀句笉涓嬶紝缁撴潫褰撳墠琛岋紝寮�鍚柊鐨勪竴琛�
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
-
- // 鏂拌涓轰簡缇庤锛岀缉杩涘榻愪笂闈㈢殑鎸夐挳
GUILayout.Space(115f);
currentWidth = 115f;
}
- if (GUILayout.Button(m_PresetLanguageNames[i], GUILayout.Width(60)))
+ if (GUILayout.Button(TextLanguageAdapterHelper.PresetLanguageNames[i], GUILayout.Width(60)))
{
- CreateNewLanguageConfig(adapter, langId);
+ Undo.RecordObject(adapter, "Add Language Config");
+ var newConfig = adapter.HasConfig(TextLanguageAdapter.DefaultLangId)
+ ? adapter.LanguageConfigs.Get(TextLanguageAdapter.DefaultLangId).Clone()
+ : new LanguageConfigItem();
+ adapter.SetConfig(langId, newConfig);
+ m_FoldoutStates[langId] = true;
}
-
- // 绱姞褰撳墠琛岀殑瀹藉害
currentWidth += buttonWidth;
}
}
EditorGUILayout.EndHorizontal();
-
- EditorGUILayout.Space(2f);
-
- // === 娣诲姞鑷畾涔夎瑷� ===
- EditorGUILayout.BeginHorizontal();
- GUILayout.Space(15f);
- EditorGUILayout.LabelField("鑷畾涔夎瑷�ID:", GUILayout.Width(100));
- m_CopySourceLanguageId = EditorGUILayout.TextField(m_CopySourceLanguageId, GUILayout.Width(80));
-
- if (GUILayout.Button("娣诲姞", GUILayout.Width(50)))
- {
- string newLangId = m_CopySourceLanguageId.Trim();
- if (!string.IsNullOrEmpty(newLangId) && !adapter.HasConfig(newLangId))
- {
- CreateNewLanguageConfig(adapter, newLangId);
- m_CopySourceLanguageId = "";
- GUI.FocusControl(null);
- }
- }
- EditorGUILayout.EndHorizontal();
- }
-
- /// <summary> 杈呭姪鏂规硶锛氬皝瑁呮柊寤鸿瑷�閰嶇疆鐨勫鐢ㄩ�昏緫 </summary>
- private void CreateNewLanguageConfig(TextLanguageAdapter adapter, string langId)
- {
- Undo.RecordObject(adapter, "Add Language Config");
- LanguageConfigItem newConfig = adapter.HasConfig(TextLanguageAdapter.DefaultLangId)
- ? adapter.LanguageConfigs.Get(TextLanguageAdapter.DefaultLangId).Clone()
- : new LanguageConfigItem();
-
- adapter.SetConfig(langId, newConfig);
- m_FoldoutStates[langId] = true; // 鑷姩灞曞紑鏂版坊鍔犵殑椤�
}
}
\ No newline at end of file
--
Gitblit v1.8.0