NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Framework/Localization/StringManager.cs

736 lines
21 KiB
C#
Raw Normal View History

2023-08-22 19:08:45 +08:00
using Framework;
using System;
2023-11-08 15:50:08 +08:00
using System.Collections;
2023-08-22 19:08:45 +08:00
using System.Collections.Generic;
using System.Linq;
2023-08-22 19:08:45 +08:00
using cfg;
using cfg.StringCfg;
using Cysharp.Threading.Tasks;
using Newtonsoft.Json;
using PhxhSDK;
using SimpleJSON;
using Sirenix.Utilities;
2023-08-22 19:08:45 +08:00
using UnityEngine;
2024-11-11 15:36:59 +08:00
using Constants = Framework.Constants;
2023-08-22 19:08:45 +08:00
public class StringManager
{
private static StringManager m_instance;
2024-10-12 11:49:08 +08:00
//public static LanguageType CurLanguage = LanguageType.Default;
public static Dictionary<string, string> MixKeyDic;
public static string MixKeyConfigPath = "Assets/Config/MixKey/MixKeyConfig.json";
2024-11-11 15:36:59 +08:00
public static StringConfig StringConfig;
2023-08-22 19:08:45 +08:00
public static StringManager Instance
{
get
{
if (m_instance == null)
{
m_instance = new StringManager();
}
2024-10-12 11:49:08 +08:00
2023-08-22 19:08:45 +08:00
return m_instance;
}
}
//public enum LanguageType
//{
// Default,
// CN,
// TW,
// EN,
//}
2024-11-12 16:29:13 +08:00
//登录时获取语言
public static LanguageManager.LanguageType GetLoginLanguageType()
{
#if UNITY_EDITOR
var storeData = StorageMgr.Instance.GetStorage<LanguageStorage>("LanguageStorage");
if (storeData != null)
{
if (!storeData.IsSetLanguage)
{
var systemLanguage = LanguageManager.Instance.GetDeviceLanguage();
switch (systemLanguage)
{
case SystemLanguage.Chinese:
LanguageManager.Instance.SetCurrentLanguage(LanguageManager.LanguageType.CN);
break;
case SystemLanguage.ChineseSimplified:
LanguageManager.Instance.SetCurrentLanguage(LanguageManager.LanguageType.CN);
break;
case SystemLanguage.English:
LanguageManager.Instance.SetCurrentLanguage(LanguageManager.LanguageType.EN);
break;
default:
LanguageManager.Instance.SetCurrentLanguage(LanguageManager.LanguageType.CN);
break;
}
}
else
{
LanguageManager.Instance.SetCurrentLanguage(storeData.LanguageType);
}
StoreCurLanguage();
}
#else
var type = LanguageManager.GetLanguageTypeByIndex();
2024-11-12 19:27:16 +08:00
DebugUtil.LogError($"--- OnLogin LanguageType:{type}");
2024-11-12 16:29:13 +08:00
var systemLanguage = LanguageManager.Instance.GetDeviceLanguage();
2024-11-12 19:27:16 +08:00
DebugUtil.LogError($"--- OnLogin systemLanguage:{systemLanguage}");
2024-11-12 16:29:13 +08:00
if (type == LanguageManager.LanguageType.Default)
{
switch (systemLanguage)
{
case SystemLanguage.Chinese:
LanguageManager.Instance.SetCurrentLanguage(LanguageManager.LanguageType.CN);
break;
case SystemLanguage.ChineseSimplified:
LanguageManager.Instance.SetCurrentLanguage(LanguageManager.LanguageType.CN);
break;
case SystemLanguage.English:
2024-11-12 19:27:16 +08:00
DebugUtil.LogError($"--- OnLogin systemLanguage:English");
2024-11-12 16:29:13 +08:00
LanguageManager.Instance.SetCurrentLanguage(LanguageManager.LanguageType.EN);
break;
default:
LanguageManager.Instance.SetCurrentLanguage(LanguageManager.LanguageType.CN);
break;
}
}
else
{
2024-11-12 19:27:16 +08:00
DebugUtil.LogError($"--- OnLogin SetCurrentLanguage:{type}");
2024-11-12 16:29:13 +08:00
LanguageManager.Instance.SetCurrentLanguage(type);
}
#endif
return LanguageManager.CurLanguage;
}
2024-11-11 15:36:59 +08:00
public static string GetLocalizeJsonPath()
{
switch (LanguageManager.CurLanguage)
{
case LanguageManager.LanguageType.CN:
return Constants.DATA_LANGUAGE_PATH_CN;
case LanguageManager.LanguageType.EN:
return Constants.DATA_LANGUAGE_PATH_EN;
default:
return Constants.DATA_LANGUAGE_PATH_CN;
}
}
2024-11-12 16:29:13 +08:00
public static void StoreCurLanguage()
{
#if UNITY_EDITOR
var storeData = StorageMgr.Instance.GetStorage<LanguageStorage>("LanguageStorage");
if (storeData != null)
{
storeData.LanguageType = LanguageManager.CurLanguage;
storeData.IsSetLanguage = true;
StorageMgr.Instance.SyncForce = true;
}
#else
LanguageManager.SetLanguageType(LanguageManager.CurLanguage);
2024-11-12 19:27:16 +08:00
DebugUtil.LogError($"LanguageType:{LanguageManager.CurLanguage}");
2024-11-12 16:29:13 +08:00
#endif
}
#region 读对应文本值
2024-11-11 15:36:59 +08:00
2023-08-22 19:08:45 +08:00
private DataString GetStringConfigByKey(string key)
{
2024-11-11 15:36:59 +08:00
var dataString = StringConfig?.GetOrDefault(key);
if (dataString == null || string.IsNullOrEmpty(dataString.Name))
2023-10-19 15:00:19 +08:00
{
2024-10-12 11:49:08 +08:00
DebugUtil.LogWarning("{0}.GetStringConfigByKey: key = {1} is not exist, check table please!!", GetType(),
key);
2023-10-19 15:00:19 +08:00
}
2024-10-12 11:49:08 +08:00
2023-10-19 15:00:19 +08:00
return dataString;
}
private string GetStringConfigValue(DataString data)
{
string value = "";
2024-11-11 15:36:59 +08:00
value = data.Name;
//DebugUtil.LogG($"key:{data.Key}, name:{data.Name}");
2024-04-23 16:10:10 +08:00
value = _GetParamsReplacedStr(data, value);
return value;
}
private bool _CheckIsOutCalculate(DataString data)
{
2025-01-02 16:52:31 +08:00
return data.OutCalculate.Count > 1;
}
private string GetStringConfigValue(DataString data, float outParam)
{
string value = "";
value = data.Name;
//DebugUtil.LogG($"key:{data.Key}, name:{data.Name}");
if (_CheckIsOutCalculate(data))
{
value = _GetInnerCalculateContent(data, value, outParam);
}
return value;
2023-08-22 19:08:45 +08:00
}
2024-04-23 16:10:10 +08:00
private string _GetParamsReplacedStr(DataString data, string content)
{
2024-10-12 11:49:08 +08:00
if (!content.Contains("[p"))
2024-04-23 16:10:10 +08:00
{
return content;
}
2024-10-12 11:49:08 +08:00
2024-04-23 16:10:10 +08:00
string retStr = content;
if (content.Contains("[p0]"))
{
var param = _GetParam(data, 0);
if (param == null || !MixKeyDic.ContainsKey(param))
2024-04-23 16:10:10 +08:00
{
DebugUtil.LogError($"MixKey配置有误StringConfigKey: {data.Key}");
return content;
}
2024-10-12 11:49:08 +08:00
var val = MixKeyDic[param];
2024-04-23 16:10:10 +08:00
retStr = retStr.Replace("[p0]", val);
}
2024-10-12 11:49:08 +08:00
2024-04-23 16:10:10 +08:00
if (content.Contains("[p1]"))
{
var param = _GetParam(data, 1);
if (param == null || !MixKeyDic.ContainsKey(param))
2024-04-23 16:10:10 +08:00
{
DebugUtil.LogError($"MixKey配置有误StringConfigKey: {data.Key}");
return content;
}
2024-10-12 11:49:08 +08:00
var val = MixKeyDic[param];
2024-04-23 16:10:10 +08:00
retStr = retStr.Replace("[p1]", val);
}
2024-10-12 11:49:08 +08:00
2024-04-23 16:10:10 +08:00
if (content.Contains("[p2]"))
{
var param = _GetParam(data, 2);
2024-07-08 19:50:20 +08:00
if (param == null || !MixKeyDic.ContainsKey(param))
2024-04-23 16:10:10 +08:00
{
DebugUtil.LogError($"MixKey配置有误StringConfigKey: {data.Key}");
return content;
}
2024-10-12 11:49:08 +08:00
2024-07-08 19:50:20 +08:00
var val = MixKeyDic[param];
2024-04-23 16:10:10 +08:00
retStr = retStr.Replace("[p2]", val);
}
return retStr;
}
#region MixKey计算
private string _GetInnerCalculateContent(DataString data, string content, float outParam)
{
if (data == null)
{
return content;
}
if (_CheckIsOutCalculate(data))
{
if (!content.Contains("[p"))
{
DebugUtil.LogError($"文本内容缺少参数值请检查StringLocalConfig表!!!Key:{data.Key}");
return content;
}
var paramStrList = _GetParamStrList(data);
if (paramStrList.Count < 0)
{
DebugUtil.LogError($"文本内容参数值数量不足请检查StringLocalConfig表!!!Key:{data.Key}");
return content;
}
var expression = _GetParamExpression(content, paramStrList, out List<string> paramList);
var result = _GetCalculateResult(data, expression, outParam, paramList);
content = content.Replace(expression, result.ToString());
}
2025-01-02 16:52:31 +08:00
content = _FilterOtherParam(data, content);
return content;
}
2025-01-02 16:52:31 +08:00
/// <summary>
/// 过滤掉非计算公式内的参数
/// </summary>
private string _FilterOtherParam(DataString data, string content)
{
var retStr = content;
if (content.Contains("[p0]"))
{
var param = _GetParam(data, 0);
if (param == null || !MixKeyDic.ContainsKey(param))
{
DebugUtil.LogError($"MixKey配置有误StringConfigKey: {data.Key}");
return content;
}
var val = MixKeyDic[param];
retStr = retStr.Replace("[p0]", val);
}
if (content.Contains("[p1]"))
{
var param = _GetParam(data, 1);
if (param == null || !MixKeyDic.ContainsKey(param))
{
DebugUtil.LogError($"MixKey配置有误StringConfigKey: {data.Key}");
return content;
}
var val = MixKeyDic[param];
retStr = retStr.Replace("[p1]", val);
}
if (content.Contains("[p2]"))
{
var param = _GetParam(data, 2);
if (param == null || !MixKeyDic.ContainsKey(param))
{
DebugUtil.LogError($"MixKey配置有误StringConfigKey: {data.Key}");
return content;
}
var val = MixKeyDic[param];
retStr = retStr.Replace("[p2]", val);
}
return retStr;
}
/// <summary>
/// 根据表达式获取到最终结果
/// </summary>
/// <param name="data"></param>
/// <param name="expression"></param>
/// <param name="outParam"></param>
/// <param name="paramList"></param>
/// <returns></returns>
private int _GetCalculateResult(DataString data, string expression, float outParam, List<string> paramList)
{
var listOp = new string(expression);
foreach (var param in paramList)
{
listOp = listOp.Replace(param, "");
}
var vals = new List<float>();
for (int i = 0; i < paramList.Count; i++)
{
var param = paramList[i];
var valStr = _GetParamsReplacedStr(data, param);
float val = 0;
if (valStr.Contains('%'))
{
valStr = valStr.Replace("%", "");
var f = float.Parse(valStr);
val = f / 100 * outParam;
}
else
{
val = float.Parse(valStr);
}
vals.Add(val);
}
float result = 0;
if (paramList.Count == 3)
{
if (listOp.Length < 2)
{
DebugUtil.LogError($"参数配置有误请检查StringLocalConfig key:{data.Key}");
return 0;
}
result = _Calculate(vals[0], vals[1], listOp[0]);
result = _Calculate(result, vals[2], listOp[1]);
}
if (paramList.Count == 2)
{
if (listOp.Length < 1)
{
DebugUtil.LogError($"参数配置有误请检查StringLocalConfig key:{data.Key}");
return 0;
}
result = _Calculate(vals[0], vals[1], listOp[0]);
}
if (paramList.Count == 1)
{
result = vals[0];
}
return (int)result;
}
/// <summary>
/// 获取参数数量
/// </summary>
/// <param name="content"></param>
/// <returns></returns>
private List<string> _GetParamStrList(DataString data)
{
2025-01-02 16:52:31 +08:00
var strList = _GetParamStrList(data.OutCalculate);
return strList;
}
private List<string> _GetParamStrList(List<int> paramList)
{
var strList = new List<string>();
if (paramList.Count > 0)
{
for (int i = 0; i < paramList.Count; i++)
{
if (paramList[i] == 0)
{
strList.Add("[p0]");
}
if (paramList[i] == 1)
{
strList.Add("[p1]");
}
if (paramList[i] == 2)
{
strList.Add("[p2]");
}
}
}
return strList;
}
/// <summary>
/// 获取计算表达式,包含[p0]、[p1]、[p2]
/// </summary>
/// <param name="content"></param>
/// <param name="paramCount"></param>
/// <returns></returns>
private string _GetParamExpression(string content, List<string> paramStrList, out List<string> paramList)
{
if (!string.IsNullOrEmpty(content))
{
var paramCount = paramStrList.Count;
if (paramCount == 3)
{
var idx0 = content.IndexOf("[p0]");
var idx1 = content.IndexOf("[p1]");
var idx2 = content.IndexOf("[p2]");
var sortList = new List<ValueTuple<int, string>>();
sortList.Add((idx0, "[p0]"));
sortList.Add((idx1, "[p1]"));
sortList.Add((idx2, "[p2]"));
2025-01-02 16:52:31 +08:00
sortList.Sort((a, b) => a.Item1.CompareTo(b.Item1));
var startIdx = sortList[0].Item1;
var endIdx = sortList[2].Item1 + 4;
var calStr = content.Substring(startIdx, endIdx - startIdx);
paramList = new List<string>(sortList.Select(item => item.Item2).ToList());
return calStr;
}
if (paramCount == 2)
{
var idx0 = content.IndexOf(paramStrList[0]);
var idx1 = content.IndexOf(paramStrList[1]);
var startIdx = idx0 > idx1 ? idx1 : idx0;
var endIdx = idx0 > idx1 ? idx0 : idx1;
endIdx += 4;
var calStr = content.Substring(startIdx, endIdx - startIdx);
if (idx0 > idx1)
{
paramList = new List<string>{paramStrList[0], paramStrList[1]};
}
else
{
paramList = new List<string>{paramStrList[1], paramStrList[0]};
}
return calStr;
}
if (paramCount == 1)
{
var idx = content.IndexOf(paramStrList[0]);
var startIdx = idx;
var endIdx = idx + 4;
var calStr = content.Substring(startIdx, endIdx - startIdx);
paramList = new List<string>{paramStrList[0]};
return calStr;
}
}
paramList = new List<string>();
return "";
}
private float _Calculate(float p1, float p2, char op)
{
switch (op)
{
case '+':
return p1 + p2;
case '-':
return p1 - p2;
case '*':
return p1 * p2;
case 'x':
return p1 * p2;
case '/':
{
if (p2 == 0)
{
DebugUtil.LogError("传入出数为0");
return 0;
}
return p1 / p2;
}
default:
return 0;
}
}
#endregion
2024-04-23 16:10:10 +08:00
private string _GetParam(DataString data, int idx)
{
if (idx == 0)
{
return data.Param0;
}
2024-10-12 11:49:08 +08:00
2024-04-23 16:10:10 +08:00
if (idx == 1)
{
return data.Param1;
}
2024-10-12 11:49:08 +08:00
2024-04-23 16:10:10 +08:00
if (idx == 2)
{
return data.Param2;
}
return null;
}
2023-08-22 19:08:45 +08:00
public string GetTextByKey(string key)
{
DataString dataString = GetStringConfigByKey(key);
if (dataString != null)
2023-08-22 19:08:45 +08:00
{
return GetStringConfigValue(dataString);
2023-08-22 19:08:45 +08:00
}
2024-10-12 11:49:08 +08:00
2023-08-22 19:08:45 +08:00
return key;
}
public string GetTextByKey(string key, float outParam)
{
DataString dataString = GetStringConfigByKey(key);
if (dataString != null)
{
return GetStringConfigValue(dataString, outParam);
}
return key;
}
2024-10-12 11:49:08 +08:00
public string GetTextFirstParamByKey(string key)
{
DataString DataString = GetStringConfigByKey(key);
if (DataString != null)
{
return GetFirstParamValue(DataString);
}
return key;
}
/// <summary>
/// 获取string中第一个param的值
/// </summary>
private string GetFirstParamValue(DataString data)
{
string value = data.Name;
2024-10-12 11:49:08 +08:00
if (!value.Contains("[p"))
{
return null;
}
if (value.Contains("[p0]"))
{
var param = _GetParam(data, 0);
if (param == null || !MixKeyDic.ContainsKey(param))
{
DebugUtil.LogError($"MixKey配置有误StringConfigKey: {data.Key}");
return null;
}
return MixKeyDic[param];
}
return null;
}
2023-08-22 19:08:45 +08:00
public string GetTextByKeyAndParams<T>(string key, T param)
{
DataString DataString = GetStringConfigByKey(key);
string str = key;
if (DataString != null)
{
2023-10-19 15:00:19 +08:00
str = GetStringConfigValue(DataString);
2023-08-22 19:08:45 +08:00
str = string.Format(str, param);
}
2023-10-19 15:00:19 +08:00
2023-08-22 19:08:45 +08:00
return str;
}
2024-10-12 11:49:08 +08:00
2023-08-22 19:08:45 +08:00
public string GetTextByKeyAndParams<T0, T1>(string key, T0 param0, T1 param1)
{
DataString DataString = GetStringConfigByKey(key);
string str = key;
if (DataString != null)
{
2023-10-19 15:00:19 +08:00
str = GetStringConfigValue(DataString);
2023-08-22 19:08:45 +08:00
str = string.Format(str, param0, param1);
}
2023-10-19 15:00:19 +08:00
2023-08-22 19:08:45 +08:00
return str;
}
2024-10-12 11:49:08 +08:00
2023-08-22 19:08:45 +08:00
public string GetTextByKeyAndParams<T0, T1, T2>(string key, T0 param0, T1 param1, T2 param2)
{
DataString DataString = GetStringConfigByKey(key);
string str = key;
if (DataString != null)
{
2023-10-19 15:00:19 +08:00
str = GetStringConfigValue(DataString);
2023-08-22 19:08:45 +08:00
str = string.Format(str, param0, param1, param2);
}
2023-10-19 15:00:19 +08:00
2023-08-22 19:08:45 +08:00
return str;
}
//本地化,后续扩展
public string GetLocalizeTextByKey(string key)
{
return GetTextByKey(key);
}
/// <summary>
/// 传入外部参数的含有Mixkey的文本
/// </summary>
/// <param name="key"></param>
/// <param name="outParam"></param>
/// <returns></returns>
public string GetLocalizeTextByKey(string key, float outParam)
{
return GetTextByKey(key, outParam);
}
2023-08-22 19:08:45 +08:00
//可填入参数的文本,目前最多支持三个参数
public string GetLocalizeTextByKeyAndParams(string key, params object[] param)
{
if (param.Length <= 0)
{
return GetTextByKey(key);
}
else if (param.Length == 1)
{
return GetTextByKeyAndParams(key, param[0]);
}
else if (param.Length == 2)
{
return GetTextByKeyAndParams(key, param[0], param[1]);
}
else if (param.Length == 3)
{
return GetTextByKeyAndParams(key, param[0], param[1], param[2]);
}
DebugUtil.LogError(string.Format("==== 请检查文本内容参数个数!!! 文本Key为 {0} ====", key));
return "";
}
2023-10-19 15:00:19 +08:00
2024-04-15 17:59:58 +08:00
/// <summary>
2024-04-15 19:34:15 +08:00
/// 获取本地化文本根据本地化key和参数列表
2024-04-15 17:59:58 +08:00
/// </summary>
/// <param name="key"></param>
/// <param name="param"></param>
/// <returns></returns>
public string GetLocalizeTextByKeyAndList(string key, params string[] param)
2023-11-08 15:50:08 +08:00
{
2024-04-15 17:59:58 +08:00
if (param == null)
2023-11-08 15:50:08 +08:00
return GetTextByKey(key);
2024-04-15 17:59:58 +08:00
switch (param.Length)
2023-11-08 15:50:08 +08:00
{
2024-04-15 17:59:58 +08:00
case 0:
return GetTextByKey(key);
case 1:
return GetTextByKeyAndParams(key, param[0]);
case 2:
return GetTextByKeyAndParams(key, param[0], param[1]);
case 3:
return GetTextByKeyAndParams(key, param[0], param[1], param[2]);
default:
2024-10-12 11:49:08 +08:00
{
DebugUtil.LogError($"==== 请检查文本内容参数个数!!! 文本Key为 {key} ====");
}
2024-04-15 17:59:58 +08:00
return string.Empty;
2023-11-08 15:50:08 +08:00
}
}
2024-10-12 11:49:08 +08:00
//public static void ChangeLanguage(LanguageType language)
//{
// CurLanguage = language;
//}
2023-10-24 14:47:25 +08:00
2024-11-22 14:44:15 +08:00
public static string GetStoryTalkText(string key, bool isFightStory = false)
2023-10-24 14:47:25 +08:00
{
2024-11-22 14:44:15 +08:00
if (isFightStory)
{
return Instance.GetLocalizeTextByKey(key);
}
2023-10-24 14:47:25 +08:00
return key;
}
2024-11-12 16:29:13 +08:00
#endregion
#region MixKey加载
public static async UniTask LoadMixKeyDic()
{
var txtAsset = await AssetManager.Instance.LoadAssetAsync<TextAsset>(MixKeyConfigPath);
if (txtAsset == null)
{
DebugUtil.LogError("MixKeyConfig 资源无法加载,请检查路径!");
return;
}
2024-10-12 11:49:08 +08:00
var jsonTxt = txtAsset.text;
var dic = JsonConvert.DeserializeObject<Dictionary<string, string>>(jsonTxt);
MixKeyDic = dic;
}
#endregion
2024-11-12 16:29:13 +08:00
}
public class LanguageStorage
{
public LanguageManager.LanguageType LanguageType;
public bool IsSetLanguage;
2023-08-22 19:08:45 +08:00
}