/* * @Author: 白哉 * @Description: * @Date: 2025年05月26日 星期一 14:05:31 * @Modify: */ using System.Collections.Generic; using System.Linq; using Logic.Config; using Logic.CrashSight; using TH1_Logic.Config; using TMPro; using UnityEngine; using ConfigManager = TH1_Logic.Config.ConfigManager; namespace Logic.Multilingual { public class MultilingualManager { public static MultilingualManager Instance = new MultilingualManager(); public MultilingualType CurrentType => _currentType; private MultilingualData _multilingualData; private MultilingualType _currentType; private List _textComs; public void Init() { RefreshMultilingualData(); _currentType = ConfigManager.Instance.Config.MultilingualType; if (_currentType == MultilingualType.None) _currentType = GetSystemLanguage(); ChangedMultilingual(_currentType); } public string GetMultilingualText(uint id) { RefreshMultilingualData(); return _multilingualData.GetMultilingualStr(id, _currentType); } public string GetMultilingualTextSafe(string idString) { if (string.IsNullOrEmpty(idString)) { LogSystem.LogError($"多语言ID为空"); return ""; } if (uint.TryParse(idString, out uint id)) { return GetMultilingualText(id); } LogSystem.LogError($"无法解析多语言ID: {idString}"); return idString; // 返回原始字符串作为fallback } public string GetMultilingualText(string str) { if (!uint.TryParse(str, out var id)) return ""; return GetMultilingualText(id); } public TMP_FontAsset GetMultilingualFont(uint fontId) { RefreshMultilingualData(); return _multilingualData.GetMultilingualFont(fontId, _currentType); } public void ChangedMultilingual(MultilingualType type) { RefreshMultilingualData(); RefreshTextComs(); _currentType = type; foreach (var textCom in _textComs) textCom.OnMultilingualChanged(); ConfigManager.Instance.Config.MultilingualType = _currentType; } public uint GetFontGroupID(TMP_FontAsset font) { RefreshMultilingualData(); return _multilingualData.GetFontGroupID(font); } // 这里的 ID 是 ID 字符串,paramList 是实际的字符串 public void SetUIText(TextMeshProUGUI textCom, string id, List paramList=null) { if (!textCom) return; var multilingual = textCom.gameObject.GetComponent(); if (!multilingual) multilingual = textCom.gameObject.AddComponent(); bool isNumeric = uint.TryParse(id, out uint realId); // 仅整数 if (!isNumeric) return; multilingual.ID = realId; multilingual.ParamList = paramList; multilingual.OnMultilingualChanged(); } // paramList 是实际的字符串 public void SetUIText(TextMeshProUGUI textCom, List paramList=null) { if (!textCom) return; var multilingual = textCom.gameObject.GetComponent(); if (!multilingual) return; multilingual.ParamList = paramList; multilingual.OnMultilingualChanged(); } private void RefreshMultilingualData() { if (!_multilingualData) _multilingualData = Resources.Load("Export/Multilingual"); } private void RefreshTextComs() { var uiObj = GameObject.Find("UICanvas"); if (!uiObj) { LogSystem.LogError($"找不到UI根节点 UICanvas"); return; } _textComs = uiObj.GetComponentsInChildren(true).ToList(); } // 这里仅考虑了 PC public MultilingualType GetSystemLanguage() { // 获取系统语言 var systemLanguage = Application.systemLanguage; // 根据系统语言切换对应的多语言类型 var systemType = systemLanguage switch { SystemLanguage.Chinese => MultilingualType.ZH, SystemLanguage.ChineseSimplified => MultilingualType.ZH, SystemLanguage.ChineseTraditional => MultilingualType.TDZH, SystemLanguage.Japanese => MultilingualType.JP, SystemLanguage.Korean => MultilingualType.KR, _ => MultilingualType.EN // 其他语言默认使用英语 }; return _multilingualData.GetSystemLanguageTargetMultilingual(systemType); } } }