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
|
|||
|
}
|
|||
|
}
|