1.首先在Resources下创建两个txt文件,我这里命名为 en.txt,zh.txt,就是 一个英文一个中文
不一定放在Resources下,我这里为了方便加载,也可以放到其他可以加载的地方
txt文件内容如图 注意编码格式一定要UTF-8,否则在unity中可能会有中文显示问题
2.管理器加载配置和切换语言
这里继承了一个单例类,可以直接调用 LanguageMgr.Instance.OnInit();初始化语言,切换语言后,我这里是写了通知派发事件
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public enum EnLanguageType {
English,
Chinese,
None,
}
// 多语言
public class LanguageMgr : TSingleton<LanguageMgr>
{
private readonly string[] m_languageNames = {"en", "zh"};
//选择自已需要的本地语言
private EnLanguageType m_language = EnLanguageType.None;
private Dictionary<EnLanguageType, Dictionary<string, string>> m_dic = new Dictionary<EnLanguageType, Dictionary<string, string>>();
/// <summary>
/// 读取配置文件,将文件信息保存到字典里
/// </summary>
public LanguageMgr()
{
// 加载多语言配置
for (int i = 0; i < m_languageNames.Length; i++)
{
if (!m_dic.ContainsKey((EnLanguageType)i))
{
m_dic[(EnLanguageType)i] = new Dictionary<string, string>();
}
TextAsset ta = Resources.Load<TextAsset>("LanguageTxt/" + m_languageNames[i]);
string text = ta.text;
string[] lines = text.Split('\n');
foreach (string line in lines)
{
if (line == null)
{
continue;
}
string[] keyAndValue = line.Split('=');
m_dic[(EnLanguageType)i].Add(keyAndValue[0], keyAndValue[1]);
}
}
}
public void OnInit()
{
ChangeLanguage(EnLanguageType.English);
}
/// <summary>
/// 获取value
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public string GetValue(string key)
{
if (m_dic.ContainsKey(m_language) == false)
{
return null;// 不包含语言库
}
if (!m_dic[m_language].ContainsKey(key)) return null;// 不包含key
string value = null;
m_dic[m_language].TryGetValue(key, out value);
return value;
}
// 格式化 多参数
public string LanguageFormat(string key,params string[] par)
{
var text = GetValue(key);
if (text == null) return null;
return string.Format(text, par);
}
// 切换语言
public void ChangeLanguage(EnLanguageType lang)
{
if (m_language == lang) return;
m_language = lang;
// 更新所有;Text
EventManager.Instance.DispatchEvent(EventType.UPDATELANGUAGESHOW);
}
}
3.建一个LanguageText脚本,用来挂在有Text组件的UI物体上, 绑定好对应的多语言key
这里初始化监听事件,收到语言更新后,更新text
using System;
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// text多语言绑定
/// </summary>
public class LanguageText : MonoBehaviour
{
public string key = " ";
void Start()
{
EventManager.Instance.AddListener((int)EventType.UPDATELANGUAGESHOW, UpdateText);
this.UpdateText(null);
}
//
public void UpdateText(Message ms)
{
if (!gameObject) return;
GetComponent<Text>().text = LanguageMgr.Instance.GetValue(key);
}
private void OnDestroy()
{
EventManager.Instance.RemoveListener((int)EventType.UPDATELANGUAGESHOW, UpdateText);
}
}
可以调用 LanguageMgr.Instance.LanguageFormat("abc","哈哈哈","20")获取格式参数多语言