244 lines
5.1 KiB
C#
244 lines
5.1 KiB
C#
// ***********************************************************************
|
||
// 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
|
||
}
|
||
}
|