今天工作的时候,老板要求做一个多种语言的功能。
目前公司就我一个unity程序,因为大学刚出来实习,懂得的知识有限,所以可能有所错误或者不妥之处,希望大佬们能够多多指正。
先看一下我的demo
下面说一下我的实现方式
先创建一个下拉框和一个按钮
然后在Excel表格中把翻译好数据
将Excel表格中的数据复制下,然后转化为json
稍做更改
{
"Chinese":{"汉语":"汉语","英语":"英语","日语":"日语","韩语":"韩语","进入游戏":"进入游戏"},
"English":{"汉语":"Chinese","英语":"English","日语":"Japanese","韩语":"Korean","进入游戏":"Enter"},
"Japanese":{"汉语":"中国語","英语":"英語","日语":"日本語","韩语":"朝鮮語","进入游戏":"ゲームに入る"},
"Korean":{"汉语":"중국어","英语":"영어","日语":"일본어","韩语":"한국어","进入游戏":"게임에 참가하십시오."}
}
新建一个命名为LanguageType的C#脚本,定义一个枚举类型
public enum LanguageType
{
CHINESE,
ENGLISH,
JAPANESE,
KOREAN
}
然后新建一个命名为LanguageManagers的C#脚本。这个脚本通过枚举将Json中对应语种的数据保存到字典里,同时给出两个方法来改变Dropdown和Text的文本显示
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using LitJson;
using UnityEngine.UI;
public delegate void ChangeLanguage();
public class LanguageManagers : MonoBehaviour {
public static LanguageManagers Instance;
//定义一个委托事件,用于改变语言时,可以改变当前所显示的文本
public event ChangeLanguage ChangeLangeuageEvent;
private Dictionary<string, string> languageDic = new Dictionary<string, string>();
private string languageTable;
private JsonData languageTables;
private void Awake()
{
Instance = this;
InitLanguageDate();
}
/// <summary>
/// 读取配置文件
/// </summary>
private void InitLanguageDate()
{
languageTable = Resources.Load<TextAsset>("LanguageTable").text;
languageTables = JsonMapper.ToObject(languageTable);
languageDic = JsonMapper.ToObject<Dictionary<string, string>>(languageTables["Chinese"].ToJson());
}
/// <summary>
/// 读取配置文件
/// </summary>
private void GetLanguageByType(LanguageType type, string str)
{
languageDic = JsonMapper.ToObject<Dictionary<string, string>>(languageTables[str].ToJson());
ChangeLangeuageEvent(); //切换语言时,改变当前所有的语言文字显示
}
/// <summary>
/// 根据类型读取配置文件,保存对应的数据到字典里
/// </summary>
public void LanguageState(LanguageType type)
{
switch (type)
{
case LanguageType.CHINESE:
GetLanguageByType(type, "Chinese");
break;
case LanguageType.ENGLISH:
GetLanguageByType(type, "English");
break;
case LanguageType.JAPANESE:
GetLanguageByType(type, "Japanese");
break;
case LanguageType.KOREAN:
GetLanguageByType(type, "Korean");
break;
default:
break;
}
}
/// <summary>
/// 通过key获取数据,设置Text的文本显示内容
/// </summary>
public void SetText(Text text, string target)
{
string outStr;
if (languageDic.TryGetValue(target, out outStr))
{
text.text = outStr;
}
}
/// <summary>
/// 设置下拉框的文本显示内容
/// </summary>
public void SetDropdownText(Dropdown dropdown,Text text,List<string> keys,int index)
{
string outStr;
for (int i = 0;i < dropdown.options.Count; i++)
{
if (languageDic.TryGetValue(keys[i], out outStr))
{
dropdown.options[i].text = outStr;
}
}
SetText(text, keys[index]);
}
}
新建一个脚本,绑定下拉框选择事件
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class LanguageSelect : MonoBehaviour {
private Dropdown dropdown;
private Text label;
private Button button;
private List<string> keys;
private void Start()
{
dropdown = GetComponentInChildren<Dropdown>();
label = dropdown.transform.Find("Label").GetComponent<Text>();
button = GetComponentInChildren<Button>();
keys = new List<string>();
for (int i = 0; i < dropdown.options.Count; i++)
{
keys.Add(dropdown.options[i].text);
}
dropdown.onValueChanged.AddListener(delegate { SetLanguage(dropdown); });
}
public void SetLanguage(Dropdown dropdown)
{
int index = dropdown.value;
switch (index)
{
case 0:
LanguageState(LanguageType.CHINESE,index);
break;
case 1:
LanguageState(LanguageType.ENGLISH,index);
break;
case 2:
LanguageState(LanguageType.JAPANESE,index);
break;
case 3:
LanguageState(LanguageType.KOREAN,index);
break;
default:
break;
}
}
public void LanguageState(LanguageType type,int index)
{
LanguageManagers.Instance.LanguageState(type);
LanguageManagers.Instance.SetDropdownText(dropdown,label,keys,index);
}
}
然后我们还需要一个挂载到含有Text组件的脚本上,设置好key之后,就可以跟着选择的语言改变了。
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
//public delegate void DelegatGetText();
/// <summary>
/// text添加该脚本,获取文字信息,设置给text
/// </summary>
public class SetTextByLanguageType : MonoBehaviour {
[SerializeField] private string key;
private Text text;
void Start () {
text = GetComponent<Text>();
GetLanguageText();
LanguageManagers.Instance.ChangeLangeuageEvent += GetLanguageText; // 绑定语言改变事件
}
private void GetLanguageText()
{
LanguageManagers.Instance.SetText(text,key);
}
}
第一次写blog,写得不好,希望大佬们多多海涵