TH1/Unity/Assets/Scripts/Logic/Multilingual/MultilingualManager.cs
2025-07-24 16:29:35 +08:00

123 lines
4.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* @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);
}
}
}