/* * @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); } #if UNITY_EDITOR public void SetMultilingualType(MultilingualType type) { _currentType = type; } #endif 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, SystemLanguage.Russian => MultilingualType.RU, SystemLanguage.Spanish => MultilingualType.ES, SystemLanguage.Portuguese => MultilingualType.PT, SystemLanguage.French => MultilingualType.FR, _ => MultilingualType.EN // 其他语言默认使用英语 }; return _multilingualData.GetSystemLanguageTargetMultilingual(systemType); } public MultilingualType GetCurLanguage() { return ConfigManager.Instance.Config.MultilingualType; } public MultilingualType GetLanguageByString(string str) { // 默认返回英语 if (string.IsNullOrEmpty(str)) return MultilingualType.EN; // 按照日 韩 繁体 中 英的顺序检测 // 检测日语(平假名、片假名、日文汉字范围) if (str.Any(c => (c >= '\u3040' && c <= '\u309F') || // 平假名 (c >= '\u30A0' && c <= '\u30FF'))) // 片假名 { return MultilingualType.JP; } // 检测韩语(韩文音节) if (str.Any(c => c >= '\uAC00' && c <= '\uD7AF')) { return MultilingualType.KR; } // 检测繁体中文(CJK兼容汉字、康熙部首、扩展区) if (str.Any(c => (c >= '\uF900' && c <= '\uFAFF') || // CJK兼容汉字 (c >= '\u2F00' && c <= '\u2FDF') || // 康熙部首 (c >= '\u3400' && c <= '\u4DBF'))) // CJK扩展A { return MultilingualType.TDZH; } // 检测简体中文(CJK统一汉字基本区) if (str.Any(c => c >= '\u4E00' && c <= '\u9FFF')) { return MultilingualType.ZH; } // 检测俄语(西里尔字母) if (str.Any(c => c >= '\u0400' && c <= '\u04FF')) { return MultilingualType.RU; } // 检测法语特有重音字符(如 œ, æ, ç 等) if (str.Any(c => c == '\u0153' || c == '\u0152' || // œ Œ c == '\u00E6' || c == '\u00C6' || // æ Æ c == '\u00E7' || c == '\u00C7')) // ç Ç { return MultilingualType.FR; } // 检测葡萄牙语特有重音字符(如 ã, õ, â, ê, ô 等) if (str.Any(c => c == '\u00E3' || c == '\u00C3' || // ã à c == '\u00F5' || c == '\u00D5')) // õ Õ { return MultilingualType.PT; } // 检测西班牙语特有字符(如 ñ, ¡, ¿ 等) if (str.Any(c => c == '\u00F1' || c == '\u00D1' || // ñ Ñ c == '\u00A1' || c == '\u00BF')) // ¡ ¿ { return MultilingualType.ES; } // 默认返回英语 return MultilingualType.EN; } } }