//文件是自动生成,请勿手动修改.此类只有一个接口用于填充字典数据.
using System;
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using FLanguage = UnityEngine.Gonbest.MagicCube.FLanguage;
namespace Thousandto.Launcher.Form
{
[ExecuteAlways]
public class UILauncherLangScript : MonoBehaviour
{
#region //静态变量
private static UILauncherLangScript _instance;
public static UILauncherLangScript Instance
{
get
{
return _instance;
}
}
///
/// 翻译字符串
///
///
///
public static string ConvertLanText(string key)
{
if (_instance != null && _instance._langDatas.Count > 0)
{
var _chList = _instance._langDatas[0].Contents;
var _resultIndex = _chList.IndexOf(key);
if (_resultIndex >= 0)
{
var langdat = _instance._langDatas.Find(x => { return x.LanKey == FLanguage.Default; });
if (langdat != null && _resultIndex < langdat.Contents.Count)
{
return langdat.Contents[_resultIndex];
}
}
}
return key;
}
#endregion
#region//序列化变量
[SerializeField]
private List _langDatas = new List();
[SerializeField]
private List _labelList = new List();
[SerializeField]
private List _spriteList = new List();
//当前语言的字体
[SerializeField]
private UIFont _curLanFont = null;
//当前图集
[SerializeField]
private UIAtlas _curAtlas = null;
#endregion
#region//MonoBehaviour
private void Awake()
{
LoadAltasAndFont();
}
private void Start()
{
_instance = this;
StartCoroutine(SetAtlasAndFont());
}
private void OnDestroy()
{
_instance = null;
#if !UNITY_EDITOR
if (_curAtlas != null)
{
_curAtlas.DestoryAssets();
_curAtlas = null;
}
if (_curLanFont != null)
{
_curLanFont.DestoryAssets();
_curLanFont = null;
}
#endif
}
#endregion
#region //运行时的处理
//设置图集和字体
private IEnumerator SetAtlasAndFont()
{
yield return null;
//设置字体
if (_labelList.Count > 0)
{
for (int i = 0; i < _labelList.Count; ++i)
{
if (_curLanFont != null)
{
_labelList[i].bitmapFont = _curLanFont;
}
SetStrByLan(_labelList[i]);
if (_labelList[i].TextChangeCallBack == null)
{
_labelList[i].TextChangeCallBack = OnLabelValueChange;
}
}
}
yield return null;
if (_curAtlas != null && _spriteList.Count > 0)
{
for (int i = 0; i < _spriteList.Count; ++i)
{
_spriteList[i].atlas = _curAtlas;
}
}
yield return null;
}
//设置语言字符串
private void SetStrByLan(UILabel label)
{
if (label == null) return;
label.text = ConvertLanText(label.text);
}
//Label内容改变
private void OnLabelValueChange(UILabel label)
{
SetStrByLan(label);
}
//加载图集和字体
private void LoadAltasAndFont()
{
var _lan = FLanguage.Default;
string fontPath = string.Format("LauncherUI/Base/{0}/Font/LauncherFont", _lan);
var font = Resources.Load(fontPath);
if (font != null)
{
if (_curLanFont != font)
{
#if !UNITY_EDITOR
if(_curLanFont != null)_curLanFont.DestoryAssets();
#endif
_curLanFont = font;
}
}
string atlasPath = string.Format("LauncherUI/Base/{0}/Atlas/Update", _lan);
var atlas = Resources.Load(atlasPath);
if (atlas != null)
{
if (_curAtlas != atlas)
{
#if !UNITY_EDITOR
if(_curAtlas != null) _curAtlas.DestoryAssets();
#endif
_curAtlas = atlas;
}
}
}
#endregion
#region //编辑器状态下使用
public void ToCollection(Dictionary dic, List lanList)
{
//1.1检索所有的Label和sprite
_labelList.Clear();
_labelList.AddRange(transform.GetComponentsInChildren(true));
_spriteList.Clear();
_spriteList.AddRange(transform.GetComponentsInChildren(true));
//1.2读取默认的atlas和字体
foreach (var lbl in _labelList)
{
if (lbl.bitmapFont != null)
{
if (_curLanFont == null)
{
_curLanFont = lbl.bitmapFont;
}
else if(_curLanFont != lbl.bitmapFont)
{
Debug.LogError("启动窗体竟然关联两个字体,请检查一下!!"+ lbl.bitmapFont.name+";;;"+lbl.name);
}
}
}
foreach (var spr in _spriteList)
{
if (spr.atlas != null)
{
if (_curAtlas == null)
{
_curAtlas = spr.atlas;
}
else if (_curAtlas != spr.atlas)
{
Debug.LogError("启动窗体竟然关联两个图集,请检查一下!!"+ spr.atlas.name + ";;;" + spr.name);
}
}
}
//2.初始化所有语言数据
_langDatas.Clear();
_langDatas.Add(new LanguageData(FLanguage.CH));
var cloneList = new List(lanList);
cloneList.Remove(FLanguage.CH);
for (int i = 0; i < cloneList.Count; i++)
{
_langDatas.Add(new LanguageData(cloneList[i]));
}
//3.填充语言数据
var e = dic.GetEnumerator();
try
{
while (e.MoveNext())
{
_langDatas[0].Contents.Add(e.Current.Key);
for (int i = 1; i < _langDatas.Count; i++)
{
var lang = _langDatas[i];
if (e.Current.Value.Length > lang.LanIndex)
lang.Contents.Add(e.Current.Value[lang.LanIndex]);
else
lang.Contents.Add(e.Current.Key);
}
}
}
finally
{
e.Dispose();
}
}
#endregion
}
#region//内部数据类
[System.Serializable]
public class LanguageData
{
public string LanKey;
public List Contents;
[NonSerialized]
public int LanIndex;
public LanguageData(string lan)
{
LanKey = lan;
LanIndex = FLanguage.CastToIndex(lan);
Contents = new List();
}
}
#endregion
}