TH1/Unity/Assets/Scripts/TH1_Logic/Multilingual/MultilingualManager.cs
2026-03-17 18:40:51 +08:00

230 lines
8.0 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 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;
}
}
}