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