Unity 多语言之 本地化动态设置多语言界面
1、打开Unity,新建一个空工程,具体如下图

2、在场景中,设计界面如下,添加两个Toggle来控制语言选择(注意添加Togglegroup来设置多组单选),添加两个文本Text用来测试语言设置的效果,其中一个文本隐藏,用来测试文本隐藏时,也能更新Text,界面具体如下图




3、在工程中添加文件夹Resources/Language,并且添加两个Txt文本(注意是UTF-8格式),分别对应命名为Chinese.txt,English.txt,具体如下图


4、Chinese.txt 的文本内容如下:
Chinese_Toggle:中文
English_Toggle:英文
Text1:文本 1
Text2:文本 2
English.txt 的文本内容如下:
Chinese_Toggle:Chinese
English_Toggle:English
Text1:Text 1
Text2:Text 2
5、新建脚本LanguageDataManager,LanguageUIText,SelectLanguageToggle,用来管理语言的动态设置,具体如下图

6、LanguageDataManager 脚本用来加载Txt内容到字典中,然后给与通过key获取文本内容的方法,具体如下图




7、LanguageDataManager 脚本具体如内容如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public enum Language
{
Chinese, //中文
English, //英文
}
public enum LanguageTextName
{
Chinese_Toggle, //中文Toggle
English_Toggle, //英文Toggle
Text1, // 文本1
Text2, // 文本2
}
public class LanguageDataManager : MonoBehaviour {
[SerializeField]
internal Language currentLanguage = Language.Chinese; //当前设置的语言
// 中英文字典
private Dictionary<string, string> ChineseDictionary = new Dictionary<string, string>();
private Dictionary<string, string> EnglishDictionary = new Dictionary<string, string>();
private static LanguageDataManager instancce = null;
public static LanguageDataManager Instancce
{
get
{
return instancce;
}
}
private void Awake()
{
instancce = this;
// 加载语言资源
LoadLanguageTxt(Language.Chinese);
LoadLanguageTxt(Language.English);
}
/// <summary>
/// 设置语言
/// </summary>
public void SetCurrentLanguageValue(Language language)
{
currentLanguage = language;
//获取场景中所有类型脚本
LanguageUIText[] languageUITexts = Resources.FindObjectsOfTypeAll<LanguageUIText>();
for (int i = 0; i < languageUITexts.Length; i++)
{
Debug.Log("SetCurrentLanguageValue:" + languageUITexts.Length);
languageUITexts[i].SetLanguageTextName();
}
Debug.Log("languageUITexts:" + languageUITexts.Length);
}
/// <summary>
/// 加载对应的语言资源txt,保存到字典中
/// </summary>
/// <param name="language"></param>
internal void LoadLanguageTxt(Language language)
{
TextAsset ta = Resources.Load<TextAsset>("Language/" + language.ToString());
if (ta == null)
{
Debug.LogWarning("没有该语言的文本文件");
return;
}
string[] lines = ta.text.Split('\n');
for (int i = 0; i < lines.Length; i++)
{
if (string.IsNullOrEmpty(lines[i]))
{
continue;
}
string[] kv = lines[i].Split(':');
if (language == Language.Chinese)
{
ChineseDictionary.Add(kv[0], kv[1]);
}
else if (language == Language.English)
{
EnglishDictionary.Add(kv[0], kv[1]);
}
Debug.Log(string.Format("key:{0},value:{1}", kv[0], kv[1]));
}
}
/// <summary>
/// 获得对应语言字典中的对应的 key 值
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
internal string GetLanguageText(string key)
{
if (currentLanguage == Language.Chinese)
{
if (ChineseDictionary.ContainsKey(key))
{
return ChineseDictionary[key];
}
else {
Debug.Log("!ChineseDictionary.ContainsKey(key)");
}
}
else if (currentLanguage == Language.English)
{
if (EnglishDictionary.ContainsKey(key))
{
return EnglishDictionary[key];
}
else
{
Debug.Log("!EnglishDictionary.ContainsKey(key)");
}
}
return string.Empty;
}
}
8、LanguageUIText 脚本用来绑定到需要更新的Text上,动态获取文本值添加到对应的Text上,在Start和OnEnable函数中同时更新,避免未及时更新,具体如下图

9、LanguageUIText 脚本具体内容如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class LanguageUIText : MonoBehaviour {
[SerializeField]
private LanguageTextName languageTextName;
// Use this for initialization
void Start()
{
SetLanguageTextName();
}
private void OnEnable()
{
SetLanguageTextName();
}
/// <summary>
/// 根据当前语言设置 Text 文本
/// </summary>
internal void SetLanguageTextName()
{
string value = LanguageDataManager.Instancce.GetLanguageText(languageTextName.ToString());
if (string.IsNullOrEmpty(value) != true)
{
gameObject.GetComponent<Text>().text = value;
}
}
}
10、SelectLanguageToggle 脚本用来管理选择具体的语言设置,并设置对应Toggle的监听事件,具体如下图


11、SelectLanguageToggle 脚本具体内容如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class SelectLanguageToggle : MonoBehaviour {
public Toggle Chinese_Toggle;
public Toggle English_Toggle;
// Use this for initialization
void Start()
{
if (Chinese_Toggle != null)
{
Chinese_Toggle.onValueChanged.AddListener(SetChineseLanguageIsOn);
}
if (English_Toggle != null)
{
English_Toggle.onValueChanged.AddListener(SetEnglishLanguageIsOn);
}
}
private void SetChineseLanguageIsOn(bool isOn)
{
if (isOn == true)
{
SetLanguage(Language.Chinese);
}
}
private void SetEnglishLanguageIsOn(bool isOn)
{
if (isOn == true)
{
SetLanguage(Language.English);
}
}
private void SetLanguage(Language language)
{
Debug.Log("SetLanguage :" + language);
LanguageDataManager.Instancce.SetCurrentLanguageValue(language);
}
}
12、脚本编译正确,回到Unity,把脚本LanguageDataManager挂载到LanguageDataManager昌吉惊鸿的物体上,具体如下图

13、SelectLanguageToggle 脚本添加到,两个Toggle的父物体上,并对应赋值Toggle,具体如下图

14、把 LanguageUIText 添加到对应的Text上,并对应选取文本languageTextName 值,具体如下图

15、以上正确完成后,运行场景,切换语言,即可动态设置语言Text,而且隐藏的Text,也同步更新了,可以查看Text2,具体如下图
