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

288 lines
7.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using Framework;
using System;
using System.Collections;
using System.Collections.Generic;
using cfg;
using cfg.StringCfg;
using Cysharp.Threading.Tasks;
using Newtonsoft.Json;
using PhxhSDK;
using SimpleJSON;
using UnityEngine;
public class StringManager
{
private static StringManager m_instance;
public static LanguageType CurLanguage = LanguageType.Default;
public static Dictionary<string, string> MixKeyDic;
public static string MixKeyConfigPath = "Assets/Config/MixKey/MixKeyConfig.json";
public static StringManager Instance
{
get
{
if (m_instance == null)
{
m_instance = new StringManager();
}
return m_instance;
}
}
public enum LanguageType
{
Default,
CN,
TW,
EN,
}
private DataString GetStringConfigByKey(string key)
{
var dataString = TableManager.Instance.Tables.StringConfig?.GetOrDefault(key);
if (dataString == null || string.IsNullOrEmpty(dataString.Value))
{
DebugUtil.LogWarning("{0}.GetStringConfigByKey: key = {1} is not exist, check table please!!",GetType(), key);
}
return dataString;
}
private string GetStringConfigValue(DataString data)
{
string value = "";
switch (CurLanguage)
{
case (LanguageType.Default):
{
value = data.Value;
break;
}
case (LanguageType.CN):
{
value = data.Value;
break;
}
case (LanguageType.TW):
{
break;
}
case (LanguageType.EN):
{
value = data.ValueEn;
break;
}
default:
{
DebugUtil.LogError($"==== 文本翻译的语言不存在相应的枚举值!请检查语言设置!!! ====");
break;
}
}
value = _GetParamsReplacedStr(data, value);
return value;
}
private string _GetParamsReplacedStr(DataString data, string content)
{
if(!content.Contains("[p"))
{
return content;
}
string 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;
}
private string _GetParam(DataString data, int idx)
{
if (idx == 0)
{
return data.Param0;
}
if (idx == 1)
{
return data.Param1;
}
if (idx == 2)
{
return data.Param2;
}
return null;
}
public string GetTextByKey(string key)
{
DataString DataString = GetStringConfigByKey(key);
if (DataString != null)
{
return GetStringConfigValue(DataString);
}
return key;
}
public string GetTextByKeyAndParams<T>(string key, T param)
{
DataString DataString = GetStringConfigByKey(key);
string str = key;
if (DataString != null)
{
str = GetStringConfigValue(DataString);
str = string.Format(str, param);
}
return str;
}
public string GetTextByKeyAndParams<T0, T1>(string key, T0 param0, T1 param1)
{
DataString DataString = GetStringConfigByKey(key);
string str = key;
if (DataString != null)
{
str = GetStringConfigValue(DataString);
str = string.Format(str, param0, param1);
}
return str;
}
public string GetTextByKeyAndParams<T0, T1, T2>(string key, T0 param0, T1 param1, T2 param2)
{
DataString DataString = GetStringConfigByKey(key);
string str = key;
if (DataString != null)
{
str = GetStringConfigValue(DataString);
str = string.Format(str, param0, param1, param2);
}
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 "";
}
/// <summary>
/// 获取本地化文本根据本地化key和参数列表
/// </summary>
/// <param name="key"></param>
/// <param name="param"></param>
/// <returns></returns>
public string GetLocalizeTextByKeyAndList(string key, params string[] param)
{
if (param == null)
return GetTextByKey(key);
switch (param.Length)
{
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:
{
DebugUtil.LogError($"==== 请检查文本内容参数个数!!! 文本Key为 {key} ====");
}
return string.Empty;
}
}
public static void ChangeLanguage(LanguageType language)
{
CurLanguage = language;
}
public static string GetStoryTalkText(string key)
{
return key;
}
#region MixKey加载
public static async UniTask LoadMixKeyDic()
{
var txtAsset = await AssetManager.Instance.LoadAssetAsync<TextAsset>(MixKeyConfigPath);
if (txtAsset == null)
{
DebugUtil.LogError("MixKeyConfig 资源无法加载,请检查路径!");
return;
}
var jsonTxt = txtAsset.text;
var dic = JsonConvert.DeserializeObject<Dictionary<string, string>>(jsonTxt);
MixKeyDic = dic;
}
#endregion
}