2025-09-23 12:04:39 +08:00
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
|
|
namespace AlicizaX.Localization
|
|
|
|
|
{
|
|
|
|
|
public class GameLocaizationTable : ScriptableObject
|
|
|
|
|
{
|
|
|
|
|
#if UNITY_EDITOR
|
|
|
|
|
[SerializeField] internal string GenerateScriptCodePath = string.Empty;
|
2026-04-17 13:01:42 +08:00
|
|
|
[SerializeField] internal string GenerateScriptCodeNamespace = string.Empty;
|
2025-09-23 12:04:39 +08:00
|
|
|
|
|
|
|
|
[Serializable]
|
|
|
|
|
public struct SheetItem
|
|
|
|
|
{
|
|
|
|
|
public int Id;
|
|
|
|
|
public string Key;
|
|
|
|
|
public bool IsGen;
|
|
|
|
|
|
|
|
|
|
public SheetItem(string key, int id, bool isGen)
|
|
|
|
|
{
|
|
|
|
|
Id = id;
|
|
|
|
|
Key = key;
|
|
|
|
|
IsGen = isGen;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Serializable]
|
|
|
|
|
public struct TableData
|
|
|
|
|
{
|
|
|
|
|
public int Id;
|
|
|
|
|
public string SectionName;
|
|
|
|
|
public List<SheetItem> SectionSheet;
|
|
|
|
|
|
|
|
|
|
public TableData(string section, int id)
|
|
|
|
|
{
|
|
|
|
|
Id = id;
|
|
|
|
|
SectionName = section;
|
|
|
|
|
SectionSheet = new List<SheetItem>();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public List<TableData> TableSheet = new();
|
|
|
|
|
#endif
|
|
|
|
|
public List<LocalizationLanguage> Languages = new();
|
|
|
|
|
|
2026-03-31 17:25:20 +08:00
|
|
|
[NonSerialized] private Dictionary<string, LocalizationLanguage> _languageMap;
|
|
|
|
|
[NonSerialized] private int _languageMapVersion = -1;
|
|
|
|
|
|
2025-09-23 12:04:39 +08:00
|
|
|
internal LocalizationLanguage GetLanguage(string languageCode)
|
|
|
|
|
{
|
2026-03-31 17:25:20 +08:00
|
|
|
if (string.IsNullOrEmpty(languageCode) || Languages == null || Languages.Count == 0)
|
|
|
|
|
{
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
EnsureLanguageMap();
|
|
|
|
|
_languageMap.TryGetValue(languageCode, out LocalizationLanguage language);
|
|
|
|
|
return language;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void InvalidateLanguageLookup()
|
|
|
|
|
{
|
|
|
|
|
_languageMapVersion = -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void EnsureLanguageMap()
|
|
|
|
|
{
|
|
|
|
|
int count = Languages?.Count ?? 0;
|
|
|
|
|
if (_languageMap != null && _languageMapVersion == count)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_languageMap ??= new Dictionary<string, LocalizationLanguage>(count, StringComparer.Ordinal);
|
|
|
|
|
_languageMap.Clear();
|
|
|
|
|
|
|
|
|
|
if (Languages != null)
|
|
|
|
|
{
|
|
|
|
|
for (int i = 0; i < Languages.Count; i++)
|
|
|
|
|
{
|
|
|
|
|
LocalizationLanguage language = Languages[i];
|
|
|
|
|
if (language == null || string.IsNullOrEmpty(language.LanguageName))
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_languageMap[language.LanguageName] = language;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_languageMapVersion = count;
|
2025-09-23 12:04:39 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-03-31 17:25:20 +08:00
|
|
|
|