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

442 lines
13 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 cfg;
using cfg.StringCfg;
using Cysharp.Threading.Tasks;
using Newtonsoft.Json;
using PhxhSDK;
using SimpleJSON;
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 18:26:15 +08:00
DebugUtil.LogG($"--- OnLogin LanguageType:{type}");
2024-11-12 16:29:13 +08:00
var systemLanguage = LanguageManager.Instance.GetDeviceLanguage();
2024-11-12 18:26:15 +08:00
DebugUtil.LogG($"--- 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 18:26:15 +08:00
DebugUtil.LogG($"--- 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 18:26:15 +08:00
DebugUtil.LogG($"--- 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 18:26:15 +08:00
DebugUtil.LogG($"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
// switch (LanguageManager.CurLanguage)
// {
// case (LanguageManager.LanguageType.Default):
// {
// value = data.Value;
// break;
// }
// case (LanguageManager.LanguageType.CN):
// {
// value = data.Value;
// break;
// }
// case (LanguageManager.LanguageType.TW):
// {
// break;
// }
// case (LanguageManager.LanguageType.EN):
// {
// value = data.ValueEn;
// break;
// }
// default:
// {
// DebugUtil.LogError($"==== 文本翻译的语言不存在相应的枚举值!请检查语言设置!!! ====");
// break;
// }
// }
2023-10-19 15:00:19 +08:00
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);
2023-10-19 15:00:19 +08:00
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;
}
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;
}
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);
}
//可填入参数的文本,目前最多支持三个参数
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
public static string GetStoryTalkText(string key)
{
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
}