123 lines
4.2 KiB
C#
123 lines
4.2 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 TMPro;
|
||
using UnityEngine;
|
||
|
||
|
||
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);
|
||
}
|
||
|
||
public string GetMultilingualText(uint id)
|
||
{
|
||
RefreshMultilingualData();
|
||
return _multilingualData.GetMultilingualStr(id, _currentType);
|
||
}
|
||
|
||
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,
|
||
_ => MultilingualType.EN // 其他语言默认使用英语
|
||
};
|
||
|
||
return _multilingualData.GetSystemLanguageTargetMultilingual(systemType);
|
||
}
|
||
}
|
||
} |