Files
back_cantanBuilding/Assets/Scripts/Services/LocalizationMgr.cs
2026-05-26 16:15:54 +08:00

199 lines
7.1 KiB
C#

using System.Collections.Generic;
using asap.core;
using cfg;
using game;
using UnityEngine;
using UnityEngine.Localization;
using UnityEngine.Localization.Settings;
// TODO Refactor namespace to game
namespace GameCore
{
public class ChangeLanguageEvent
{
public string lang;
}
// TODO Refactor To Service
public static class LocalizationMgr
{
public static string[] LanguageLanguages;
public static List<string> enumLanguage;
public static List<string> languagePackList;
public static int LanguageIndex { get; private set; } = 1;
static int unitOfWeight;
static List<string> unitOfWeightStrs = new List<string> { "UI_FishingRewardPanel_101017", "UI_FishingRewardPanel_101039" };
static List<double> unitOfWeightValues = new List<double> { 1, 2.20462262f };
static string unitOfWeightStr = "UI_FishingRewardPanel_101017";
static double unitOfWeightValue = 1f;
public static void Init()
{
TbLanguageConfig languageConfig = GContext.container.Resolve<cfg.Tables>().TbLanguageConfig;
List<LanguageConfig> _dataMap = languageConfig.DataList;
enumLanguage = new List<string>();// GContext.container.Resolve<cfg.Tables>().TbGlobalConfig.LanguageList;
languagePackList = new List<string>(); //GContext.container.Resolve<cfg.Tables>().TbGlobalConfig.LanguagePackList;
for (int i = 0; i < _dataMap.Count; i++)
{
enumLanguage.Add(_dataMap[i].ID);
languagePackList.Add(_dataMap[i].LanGroup);
}
LanguageLanguages = new string[enumLanguage.Count];
for (int i = 0; i < enumLanguage.Count; i++)
{
if (enumLanguage[i] == "zh_Hans")
{
LanguageLanguages[i] = "中文 (简体)";
}
else if (enumLanguage[i] == "zh_Hant")
{
LanguageLanguages[i] = "中文 (繁體)";
}
else
{
LanguageLanguages[i] = System.Globalization.CultureInfo.GetCultureInfo(enumLanguage[i]).NativeName;
}
}
SetUnitOfWeight();
SetLanguage();
}
static async void SetLanguage()
{
ISettingService setting = GContext.container.Resolve<ISettingService>();
ILoadResourceService loadResourceService = GContext.container.Resolve<ILoadResourceService>();
int index = enumLanguage.IndexOf(setting.Lang);
if (index == -1)
{
index = 1;
}
string languagePack = languagePackList[index];
bool isInit = await loadResourceService.CheckResource(languagePack);
if (!isInit || !enumLanguage.Contains(setting.Lang))
{
setting.Lang = GContext.container.Resolve<cfg.Tables>().TbGlobalConfig.LanguageSetting;
index = enumLanguage.IndexOf(setting.Lang);
}
if (index == -1)
{
index = 1;
}
LanguageIndex = index;// language;
await LocalizationSettings.InitializationOperation.Task;
string lang = setting.Lang.Replace('_', '-');
Locale locale = LocalizationSettings.AvailableLocales.GetLocale(lang);
if (locale == null)
{
Debug.LogError($"未找到语言包: {setting.Lang}");
return;
}
LocalizationSettings.SelectedLocale = locale;
}
public static async void SetLanguageAsync(int languageIndex)
{
ISettingService setting = GContext.container.Resolve<ISettingService>();
setting.Lang = enumLanguage[languageIndex];
LanguageIndex = languageIndex;
IUserService iUService = GContext.container.Resolve<IUserService>();
await LocalizationSettings.InitializationOperation.Task;
string lang = setting.Lang.Replace('_', '-');
Locale locale = LocalizationSettings.AvailableLocales.GetLocale(lang);
if (locale == null)
{
Debug.LogError($"未找到语言包: {setting.Lang}");
return;
}
await iUService.UpdateLanguage(setting.Lang);
LocalizationSettings.SelectedLocale = locale;
GContext.Publish(new ChangeLanguageEvent());
}
private static cfg.TbText table;
private static cfg.TbText TbText
{
get
{
if (null == table)
{
table = GContext.container.Resolve<cfg.Tables>()?.TbText;
}
return table;
}
}
public static string GetText(string text_key)
{
if (string.IsNullOrEmpty(text_key))
{
return "";
}
text_key = text_key.Replace(" ", "");
if (TbText != null)
{
var text_value = TbText.GetOrDefault(text_key);
if (text_value != null)
{
return text_value.GetText(enumLanguage[LanguageIndex]);
}
else
{
GameDebug.LogError($"[LocalizationMgr]GetText: Not found text_key {text_key} in TbText!");
}
}
else
{
GameDebug.LogError($"[LocalizationMgr]GetText: Not found tables in DataManager!");
}
return text_key;
}
public static void SetUnitOfWeight()
{
var setting = GContext.container.Resolve<ISettingService>();
unitOfWeight = setting.UnitOfWeight;
if (unitOfWeight >= unitOfWeightStrs.Count)
{
unitOfWeight = unitOfWeightStrs.Count - 1;
Debug.LogError($"[LocalizationMgr]SetUnitOfWeight: Not found unitOfWeight {unitOfWeight} in TbText!");
}
unitOfWeightStr = unitOfWeightStrs[unitOfWeight];
unitOfWeightValue = unitOfWeightValues[unitOfWeight];
}
public static string GetWeight(double num, bool keep = false)
{
num *= unitOfWeightValue;
if (num < 1000)
{
return GetFormatTextValue(
unitOfWeightStr,
ConvertTools.GetNumberStringRetain(num, keep));
}
else
{
return GetFormatTextValue(
unitOfWeightStr,
ConvertTools.GetNumberString((ulong)num, keep));
}
}
public static string GetFormatTextValue(string text_key, params object[] str)
{
try
{
return GetText(text_key).SafeFormat(str);
}
catch
{
Debug.LogError($"Localization Format Text Error :{text_key}");
return text_key;
}
}
}
}