1. Primeiro crie dois arquivos txt em Recursos. Eu os nomeei en.txt e zh.txt aqui, um em inglês e outro em chinês
Não precisa ser colocado em Recursos, para comodidade de carregar aqui, também pode ser colocado em outros locais que podem ser carregados.
O conteúdo do arquivo txt é mostrado na figura, observe que o formato de codificação deve ser UTF-8, caso contrário, pode haver problemas de exibição em chinês na unidade.
2. O gerente carrega a configuração e muda o idioma
Uma classe singleton é herdada aqui e LanguageMgr.Instance.OnInit() pode ser chamado diretamente; para inicializar o idioma, depois de trocar de idioma, escrevi um evento de envio de notificação aqui
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. Crie um script LanguageText para pendurar no objeto UI com o componente Text e vincule a chave multilíngue correspondente
Inicialize o evento de escuta aqui e atualize o texto após receber a atualização do idioma
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);
}
}
Você pode chamar LanguageMgr.Instance.LanguageFormat("abc","hahaha","20") para obter o parâmetro de formato multilíngue