244 lines
5.1 KiB
C#
Raw Permalink Normal View History

2025-05-18 01:04:31 +08:00
// ***********************************************************************
// Assembly : Unity
// Author : Kimch
// Created :
//
// Last Modified By : Kimch
// Last Modified On :
// ***********************************************************************
// <copyright file= "LanguageProxy" company=""></copyright>
// <summary></summary>
// ***********************************************************************
namespace G
{
using System.Collections;
using System.Collections.Generic;
using F;
using UnityEngine;
internal class LanguageProxy : GameProxy
{
#region Property
public LanguageEntry defaultLanguage
{
get;
private set;
}
public LanguageEntry currentLanguage
{
get;
private set;
}
public LanguageEntry[] allLanguages
{
get;
private set;
}
public SystemLanguage systemLanguage
{
get { return Application.systemLanguage; }
}
public override int priority
{
get
{
return 998;
}
}
#endregion
#region Method
public LanguageEntry GetLanguage(string name)
{
if (allLanguages != null)
{
return System.Array.Find(allLanguages, l => l.name == name);
}
return null;
}
public void SetLanguage(string name)
{
currentLanguage = GetLanguage(name);
if (currentLanguage == null)
{
currentLanguage = defaultLanguage;
}
PlayerPrefs.SetString("language", currentLanguage.name);
PlayerPrefs.Save();
}
private void Load(IDictionary<string, object> table)
{
var langList = table.GetList("language");
if (langList != null && langList.Count > 0)
{
var languages = new LanguageEntry[langList.Count - 1];
var tmpL0 = (IList<object>)langList[0];
int nameIndex = tmpL0.IndexOf("name");
int iconIndex = tmpL0.IndexOf("icon");
int dataIndex = tmpL0.IndexOf("data");
int mainIndex = tmpL0.IndexOf("main");
for (int i = 1; i < langList.Count; i++)
{
var tmpLi = (IList<object>)langList[i];
var language = new LanguageEntry
{
name = tmpLi.GetString(nameIndex),
iconName = tmpLi.GetString(iconIndex),
database = tmpLi.GetString(dataIndex),
};
var keySegment = tmpLi.GetIntArray(mainIndex);
if (keySegment != null && keySegment.Length >= 2)
{
language.keyRangeMin = keySegment[0];
language.keyRangeMax = keySegment[1];
defaultLanguage = language;
defaultLanguage.SetAsDefault();
}
language.LoadEntries(table.GetList(language.database));
languages[i - 1] = language;
}
allLanguages = languages;
}
}
private void ApplyLanguage()
{
var languageName = PlayerPrefs.GetString("language", string.Empty);
if (string.IsNullOrEmpty(languageName))
{
var systemLanguage = Application.systemLanguage;
switch (systemLanguage)
{
case SystemLanguage.ChineseSimplified:
currentLanguage = GetLanguage("ChineseSimplified");
PlayerPrefs.SetString("language", "ChineseSimplified");
PlayerPrefs.Save();
break;
default:
currentLanguage = GetLanguage("ChineseSimplified");
PlayerPrefs.SetString("language", "ChineseSimplified");
PlayerPrefs.Save();
break;
}
if (currentLanguage == null)
{
currentLanguage = defaultLanguage;
}
}
else
{
currentLanguage = GetLanguage(languageName);
if (currentLanguage == null)
{
currentLanguage = defaultLanguage;
}
}
}
/// <summary>
/// Ĭ<>ϴ<EFBFBD><CFB4><EFBFBD>Id
/// </summary>
/// <param name="entry"></param>
/// <returns></returns>
public int GetStringId(string entry)
{
if (defaultLanguage != null)
{
defaultLanguage.TryGetId(entry, out int id);
return id;
}
return 0;
}
/// <summary>
/// 用默认语言翻译本地语言
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public string GetLocalString(int id)
{
if (currentLanguage != null)
{
currentLanguage.TryGet(id, out string entry);
return entry;
}
return string.Empty;
}
/// <summary>
/// 用默认语言翻译本地语言
/// </summary>
/// <param name="entry"></param>
/// <returns></returns>
public string GetTranslateString(string entry)
{
if (defaultLanguage == null || currentLanguage == null || currentLanguage == defaultLanguage)
{
return entry;
}
if (defaultLanguage.TryGetId(entry, out int id))
{
currentLanguage.TryGet(id, out string retEntry);
return retEntry;
}
return entry;
}
#endregion
#region Unity
public static LanguageProxy Instance { get; private set; }
public LanguageProxy()
{
Instance = this;
}
public void LoadBytes(byte[] bytes)
{
var table = bytes.ToJsonTable();
if (table != null)
{
Load(table);
}
ApplyLanguage();
}
//// Use this for initialization
//public async override Task LoadAsync()
//{
// TextAsset textAsset = await AssetProxy.Instance.GetConfigAssetAsync("language");
// if (textAsset)
// {
// var table = textAsset.bytes.ToJsonTable();
// if (table != null)
// {
// Load(table);
// }
// AssetProxy.Instance.ReleaseAsset(textAsset);
// }
// ApplyLanguage();
//}
#endregion
}
}