fix
This commit is contained in:
parent
152faa5991
commit
80d3a482b7
@ -17,6 +17,10 @@ namespace AlicizaX.Localization.Editor
|
|||||||
private SerializedProperty generateScriptCodeFirstConfig;
|
private SerializedProperty generateScriptCodeFirstConfig;
|
||||||
private List<string> popConfig = new List<string>();
|
private List<string> popConfig = new List<string>();
|
||||||
|
|
||||||
|
// Track original state for comparison
|
||||||
|
private List<string> _originalLanguages = new List<string>();
|
||||||
|
private bool _hasUnsavedChanges = false;
|
||||||
|
|
||||||
public LocalizationSettingsProvider() : base("Project/Localization Settings", SettingsScope.Project)
|
public LocalizationSettingsProvider() : base("Project/Localization Settings", SettingsScope.Project)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -34,6 +38,14 @@ namespace AlicizaX.Localization.Editor
|
|||||||
_languageTypes = _serializedObject.FindProperty("LanguageTypes");
|
_languageTypes = _serializedObject.FindProperty("LanguageTypes");
|
||||||
_genLangaugeTypePath = _serializedObject.FindProperty("_genLangaugeTypePath");
|
_genLangaugeTypePath = _serializedObject.FindProperty("_genLangaugeTypePath");
|
||||||
generateScriptCodeFirstConfig = _serializedObject.FindProperty("generateScriptCodeFirstConfig");
|
generateScriptCodeFirstConfig = _serializedObject.FindProperty("generateScriptCodeFirstConfig");
|
||||||
|
|
||||||
|
// Store original language list
|
||||||
|
_originalLanguages.Clear();
|
||||||
|
for (int i = 0; i < _languageTypes.arraySize; i++)
|
||||||
|
{
|
||||||
|
_originalLanguages.Add(_languageTypes.GetArrayElementAtIndex(i).stringValue);
|
||||||
|
}
|
||||||
|
|
||||||
// 自定义 ReorderableList
|
// 自定义 ReorderableList
|
||||||
_languageList = new ReorderableList(_serializedObject, _languageTypes,
|
_languageList = new ReorderableList(_serializedObject, _languageTypes,
|
||||||
draggable: false,
|
draggable: false,
|
||||||
@ -58,9 +70,15 @@ namespace AlicizaX.Localization.Editor
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
element.stringValue = EditorGUI.TextField(
|
EditorGUI.BeginChangeCheck();
|
||||||
|
string newValue = EditorGUI.TextField(
|
||||||
new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight),
|
new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight),
|
||||||
element.stringValue);
|
element.stringValue);
|
||||||
|
if (EditorGUI.EndChangeCheck())
|
||||||
|
{
|
||||||
|
element.stringValue = newValue;
|
||||||
|
_hasUnsavedChanges = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -69,6 +87,31 @@ namespace AlicizaX.Localization.Editor
|
|||||||
{
|
{
|
||||||
return list.index >= 2; // 只有索引 >=2 的项才能删除
|
return list.index >= 2; // 只有索引 >=2 的项才能删除
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Hook for when a language is added
|
||||||
|
_languageList.onAddCallback = list =>
|
||||||
|
{
|
||||||
|
int newIndex = _languageTypes.arraySize;
|
||||||
|
_languageTypes.InsertArrayElementAtIndex(newIndex);
|
||||||
|
var newElement = _languageTypes.GetArrayElementAtIndex(newIndex);
|
||||||
|
newElement.stringValue = "NewLanguage";
|
||||||
|
_hasUnsavedChanges = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Hook for when a language is removed
|
||||||
|
_languageList.onRemoveCallback = list =>
|
||||||
|
{
|
||||||
|
if (list.index < 2)
|
||||||
|
{
|
||||||
|
EditorUtility.DisplayDialog("Cannot Remove", "The first two languages (ChineseSimplified and English) cannot be removed.", "OK");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Just remove from the list, no immediate sync
|
||||||
|
_languageTypes.DeleteArrayElementAtIndex(list.index);
|
||||||
|
_hasUnsavedChanges = true;
|
||||||
|
};
|
||||||
|
|
||||||
popConfig.Clear();
|
popConfig.Clear();
|
||||||
if (setting.LanguageTypeNames.Count > 0)
|
if (setting.LanguageTypeNames.Count > 0)
|
||||||
{
|
{
|
||||||
@ -110,6 +153,27 @@ namespace AlicizaX.Localization.Editor
|
|||||||
_serializedObject.ApplyModifiedProperties();
|
_serializedObject.ApplyModifiedProperties();
|
||||||
LocalizationConfiguration.Save();
|
LocalizationConfiguration.Save();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add Save button
|
||||||
|
EditorGUILayout.Space(10);
|
||||||
|
EditorGUILayout.BeginHorizontal();
|
||||||
|
GUILayout.FlexibleSpace();
|
||||||
|
|
||||||
|
using (new EditorGUI.DisabledGroupScope(!_hasUnsavedChanges))
|
||||||
|
{
|
||||||
|
if (GUILayout.Button("Save Language Changes", GUILayout.Width(200), GUILayout.Height(30)))
|
||||||
|
{
|
||||||
|
ApplyLanguageChanges();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GUILayout.FlexibleSpace();
|
||||||
|
EditorGUILayout.EndHorizontal();
|
||||||
|
|
||||||
|
if (_hasUnsavedChanges)
|
||||||
|
{
|
||||||
|
EditorGUILayout.HelpBox("You have unsaved language changes. Click 'Save Language Changes' to apply them to all GameLocalizationTable assets.", MessageType.Warning);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RegenerateLanguageTypes()
|
private void RegenerateLanguageTypes()
|
||||||
@ -172,6 +236,152 @@ namespace AlicizaX.Localization.Editor
|
|||||||
LocalizationConfiguration.Save();
|
LocalizationConfiguration.Save();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void ApplyLanguageChanges()
|
||||||
|
{
|
||||||
|
// Get current language list
|
||||||
|
List<string> currentLanguages = new List<string>();
|
||||||
|
for (int i = 0; i < _languageTypes.arraySize; i++)
|
||||||
|
{
|
||||||
|
currentLanguages.Add(_languageTypes.GetArrayElementAtIndex(i).stringValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Detect changes
|
||||||
|
List<string> addedLanguages = new List<string>();
|
||||||
|
List<string> removedLanguages = new List<string>();
|
||||||
|
Dictionary<string, string> renamedLanguages = new Dictionary<string, string>(); // old -> new
|
||||||
|
|
||||||
|
// Find added languages
|
||||||
|
foreach (var lang in currentLanguages)
|
||||||
|
{
|
||||||
|
if (!_originalLanguages.Contains(lang))
|
||||||
|
{
|
||||||
|
addedLanguages.Add(lang);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find removed languages
|
||||||
|
foreach (var lang in _originalLanguages)
|
||||||
|
{
|
||||||
|
if (!currentLanguages.Contains(lang))
|
||||||
|
{
|
||||||
|
removedLanguages.Add(lang);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Detect renames (same index, different name)
|
||||||
|
for (int i = 0; i < Mathf.Min(_originalLanguages.Count, currentLanguages.Count); i++)
|
||||||
|
{
|
||||||
|
if (_originalLanguages[i] != currentLanguages[i])
|
||||||
|
{
|
||||||
|
// Check if this is a rename (not an add/remove)
|
||||||
|
if (!addedLanguages.Contains(currentLanguages[i]) && !removedLanguages.Contains(_originalLanguages[i]))
|
||||||
|
{
|
||||||
|
renamedLanguages[_originalLanguages[i]] = currentLanguages[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply changes to all tables
|
||||||
|
string[] guids = AssetDatabase.FindAssets("t:GameLocaizationTable");
|
||||||
|
int tablesUpdated = 0;
|
||||||
|
|
||||||
|
foreach (string guid in guids)
|
||||||
|
{
|
||||||
|
string assetPath = AssetDatabase.GUIDToAssetPath(guid);
|
||||||
|
GameLocaizationTable table = AssetDatabase.LoadAssetAtPath<GameLocaizationTable>(assetPath);
|
||||||
|
|
||||||
|
if (table == null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
bool tableModified = false;
|
||||||
|
|
||||||
|
// Handle renames first
|
||||||
|
foreach (var rename in renamedLanguages)
|
||||||
|
{
|
||||||
|
LocalizationLanguage language = table.Languages.Find(lang => lang.LanguageName == rename.Key);
|
||||||
|
if (language != null)
|
||||||
|
{
|
||||||
|
language.LanguageName = rename.Value;
|
||||||
|
language.name = rename.Value;
|
||||||
|
tableModified = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle additions
|
||||||
|
foreach (var newLang in addedLanguages)
|
||||||
|
{
|
||||||
|
// Skip if already exists
|
||||||
|
if (table.Languages.Exists(lang => lang.LanguageName == newLang))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Create new LocalizationLanguage asset
|
||||||
|
LocalizationLanguage newLanguage = ScriptableObject.CreateInstance<LocalizationLanguage>();
|
||||||
|
newLanguage.name = newLang;
|
||||||
|
newLanguage.LanguageName = newLang;
|
||||||
|
newLanguage.Strings = new List<LocalizationLanguage.LocalizationString>();
|
||||||
|
|
||||||
|
// Synchronize keys from existing table structure
|
||||||
|
foreach (var section in table.TableSheet)
|
||||||
|
{
|
||||||
|
foreach (var item in section.SectionSheet)
|
||||||
|
{
|
||||||
|
string sectionKey = section.SectionName.Replace(" ", "");
|
||||||
|
string itemKey = item.Key.Replace(" ", "");
|
||||||
|
string fullKey = sectionKey + "." + itemKey;
|
||||||
|
|
||||||
|
newLanguage.Strings.Add(new LocalizationLanguage.LocalizationString
|
||||||
|
{
|
||||||
|
SectionId = section.Id,
|
||||||
|
EntryId = item.Id,
|
||||||
|
Key = fullKey,
|
||||||
|
Value = string.Empty
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AssetDatabase.AddObjectToAsset(newLanguage, table);
|
||||||
|
table.Languages.Add(newLanguage);
|
||||||
|
tableModified = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle removals
|
||||||
|
foreach (var removedLang in removedLanguages)
|
||||||
|
{
|
||||||
|
LocalizationLanguage languageToDelete = table.Languages.Find(lang => lang.LanguageName == removedLang);
|
||||||
|
if (languageToDelete != null)
|
||||||
|
{
|
||||||
|
table.Languages.Remove(languageToDelete);
|
||||||
|
UnityEngine.Object.DestroyImmediate(languageToDelete, true);
|
||||||
|
tableModified = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tableModified)
|
||||||
|
{
|
||||||
|
EditorUtility.SetDirty(table);
|
||||||
|
tablesUpdated++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AssetDatabase.SaveAssets();
|
||||||
|
AssetDatabase.Refresh();
|
||||||
|
|
||||||
|
// Update original languages list
|
||||||
|
_originalLanguages.Clear();
|
||||||
|
_originalLanguages.AddRange(currentLanguages);
|
||||||
|
_hasUnsavedChanges = false;
|
||||||
|
|
||||||
|
// Log results
|
||||||
|
if (addedLanguages.Count > 0)
|
||||||
|
Debug.Log($"Added {addedLanguages.Count} language(s) to {tablesUpdated} table(s): {string.Join(", ", addedLanguages)}");
|
||||||
|
if (removedLanguages.Count > 0)
|
||||||
|
Debug.Log($"Removed {removedLanguages.Count} language(s) from {tablesUpdated} table(s): {string.Join(", ", removedLanguages)}");
|
||||||
|
if (renamedLanguages.Count > 0)
|
||||||
|
Debug.Log($"Renamed {renamedLanguages.Count} language(s) in {tablesUpdated} table(s)");
|
||||||
|
|
||||||
|
EditorUtility.DisplayDialog("Success", $"Language changes applied to {tablesUpdated} GameLocalizationTable(s).", "OK");
|
||||||
|
}
|
||||||
|
|
||||||
static LocalizationSettingsProvider s_provider;
|
static LocalizationSettingsProvider s_provider;
|
||||||
|
|
||||||
[SettingsProvider]
|
[SettingsProvider]
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user