230 lines
8.0 KiB
C#
230 lines
8.0 KiB
C#
/*
|
||
* @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<MultilingualTextMono> _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<string> paramList=null)
|
||
{
|
||
if (!textCom) return;
|
||
var multilingual = textCom.gameObject.GetComponent<MultilingualTextMono>();
|
||
if (!multilingual) multilingual = textCom.gameObject.AddComponent<MultilingualTextMono>();
|
||
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<string> paramList=null)
|
||
{
|
||
if (!textCom) return;
|
||
var multilingual = textCom.gameObject.GetComponent<MultilingualTextMono>();
|
||
if (!multilingual) return;
|
||
multilingual.ParamList = paramList;
|
||
multilingual.OnMultilingualChanged();
|
||
}
|
||
|
||
private void RefreshMultilingualData()
|
||
{
|
||
if (!_multilingualData) _multilingualData = Resources.Load<MultilingualData>("Export/Multilingual");
|
||
}
|
||
|
||
private void RefreshTextComs()
|
||
{
|
||
var uiObj = GameObject.Find("UICanvas");
|
||
if (!uiObj)
|
||
{
|
||
LogSystem.LogError($"找不到UI根节点 UICanvas");
|
||
return;
|
||
}
|
||
|
||
_textComs = uiObj.GetComponentsInChildren<MultilingualTextMono>(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;
|
||
}
|
||
}
|
||
} |