您好,登錄后才能下訂單哦!
多語(yǔ)言是游戲中比較長(zhǎng)見(jiàn)的功能,實(shí)現(xiàn)起來(lái)也相對(duì)比較簡(jiǎn)單,在這里簡(jiǎn)單說(shuō)一下思路,稍后代碼附上
簡(jiǎn)單說(shuō)一下步驟:
步驟一、設(shè)計(jì)多語(yǔ)言配置表。在這里說(shuō)一下多語(yǔ)言配置表。就是一個(gè)json格式文件,每種語(yǔ)言的簡(jiǎn)寫(xiě)作
為當(dāng)前語(yǔ)言的鍵,比如簡(jiǎn)體用zh-hans,值是一個(gè)json對(duì)象。比如游戲中有一個(gè)需要多語(yǔ)言的
label,內(nèi)容是“登陸游戲”,我們簡(jiǎn)單寫(xiě)一下這個(gè)表
{
"zh-hans": {
"登陸游戲": "",
" 輸入昵稱(chēng)": "",
"***力增加{0}%":""
},
"zh-hant": {
"登陸游戲": "登錄遊戲",
"輸入昵稱(chēng)": "輸入暱稱(chēng)",
"***力增加{0}%":"攻擊力增加{0}%"
}
}
“zh-hans”表示簡(jiǎn)體表,“zh-hant”表示繁體表,可能還會(huì)有其他語(yǔ)言,比如,英文,德
文,法文等等,都可以加。您可能也注意到了,不管是哪個(gè)語(yǔ)言表,他們的鍵都是簡(jiǎn)體中文,
這樣設(shè)計(jì)的好處就是直觀(guān),后面隨著語(yǔ)言的增多,和表中的鍵值對(duì)增多,給鍵取名也是很難的
事。所以,干脆就是用簡(jiǎn)體中文作為鍵,其他的語(yǔ)言都通過(guò)它來(lái)翻譯,這樣既直觀(guān)又省事。
配置表設(shè)計(jì)好了以后,將游戲各個(gè)模塊中用到的,需要進(jìn)行多語(yǔ)言設(shè)置的label中的文字,以
label為單位,每個(gè)label中的文本作為一對(duì)鍵值,添加到配置表里。這里有一種特殊情況,就
是label中可能有不斷變化的數(shù)值,例如:“***力增加5%”,“英雄獲得200金幣”等,這樣
的情況,這時(shí)就不能直接寫(xiě)到配置表里,需要一個(gè)字符串格式化處理,例如:“***力增加
5%”改為“***力增加{0}%”;“英雄獲得200金幣”改為“英雄獲得{0}金幣”。在下面的代
碼中也提供相應(yīng)的方法。
步驟二、初始化,主要工作就是解析多語(yǔ)言配置表,加載對(duì)應(yīng)語(yǔ)言的字庫(kù)。
步驟三、LanguageManager中提供了兩個(gè)重載的GetValue()方法,游戲中需要多語(yǔ)言顯示的label,普
通文本就調(diào)用GetValue(string key,UILabel label)方法,有需要格式化字符的label,例
如:“***力增加5%”就調(diào)用GetValue(string key,UILabel label, params object[]
args),args是可變參數(shù),可以傳入數(shù)值,int,float,string都可以,如:GetValue("***力
增加{0}%",label,5);因?yàn)槎嗾Z(yǔ)言表中可以查到"***力增加{0}%"這個(gè)鍵,所以就可以顯示出與
當(dāng)前語(yǔ)言對(duì)應(yīng)的文本。
步驟四、當(dāng)切換語(yǔ)言的時(shí)候,LanguageManager提供了一個(gè)ChangeLanguage方法,重新設(shè)置當(dāng)前的
語(yǔ)言鍵值表,并且發(fā)送一個(gè)消息,通知所有模塊更新本模塊內(nèi)的所有涉及的多語(yǔ)言的label,所
以在各個(gè)模塊需要監(jiān)聽(tīng)一個(gè)多語(yǔ)言發(fā)生改變的事件方法,在方法里重新調(diào)用GetValue方法給
label賦值。一般切換語(yǔ)言后需要做一下本地存儲(chǔ),方便玩家下次進(jìn)入游戲就可以直接進(jìn)入上次
選擇的語(yǔ)言環(huán)境。
代碼如下:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using LitJson;
public class LanguageManager : Singleton<LanguageManager>
{
private string dataPath = "data/language";
//字體
private Dictionary<string, Font> dicFonts = new Dictionary<string, Font>();
private Dictionary<string, string> dicLanguagePack = new Dictionary<string, string>();
private string currLanguageKey = "";
private JsonData JDAllLanguages = null;
private Dictionary<string, string> dicSupportLanguage = new Dictionary<string, string>();
private Dictionary<int, string> dicLabelsimplifiedKeys = new Dictionary<int, string>();
/// <summary>
/// 獲取與當(dāng)前語(yǔ)言對(duì)應(yīng)的簡(jiǎn)體中文的鍵
/// </summary>
/// <param name="val"></param>
/// <returns></returns>
public string GetSimplifiedKey(string val)
{
foreach (KeyValuePair<string, string> kvp in dicLanguagePack)
if (kvp.Value == val)
return kvp.Key;
return string.Empty;
}
public string GetLanguageKey(string val)
{
foreach (KeyValuePair<string,string> kvp in dicSupportLanguage)
if (kvp.Value == val)
return kvp.Key;
return string.Empty;
}
public string GetLanguageVal(string key)
{
if (dicSupportLanguage.ContainsKey(key))
return dicSupportLanguage[key];
return string.Empty;
}
public List<string> GetLanguageValues()
{
List<string> list = new List<string>();
foreach (KeyValuePair<string,string> kvp in dicSupportLanguage)
list.Add(kvp.Value);
return list;
}
public void Init()
{
currLanguageKey = UserData.Instance.CurrentLanguage;
//1.初始化多語(yǔ)言配置表
TextAsset tex = Resources.Load(dataPath) as TextAsset;
string data = tex.text;
Debug.Log("data is " + data);
JDAllLanguages = JsonMapper.ToObject(data);
Debug.Log("jdalllanguages is " + JDAllLanguages.ToJson());
//JsonData jd = JsonMapper.ToObject(data);
if (JDAllLanguages != null)
parse(JDAllLanguages);
dicSupportLanguage.Clear();
dicSupportLanguage.Add("zh-hans", "簡(jiǎn)體中文");
dicSupportLanguage.Add("zh-hant", "繁體中文");
Font f = Resources.Load("font/hycchj") as Font;
if(!dicFonts.ContainsKey("zh-hans")) dicFonts.Add("zh-hans", f);
f = Resources.Load("font/jingdianfanghei_fanti") as Font;
if (!dicFonts.ContainsKey("zh-hant")) dicFonts.Add("zh-hant", f);
}
void parse(JsonData jd)
{
JsonData jdLan = null;
if (jd.Keys.Contains(currLanguageKey))
jdLan = jd[currLanguageKey];
dicLanguagePack.Clear();
foreach (string key in jdLan.Keys)
if (!dicLanguagePack.ContainsKey(key))
dicLanguagePack.Add(key, jdLan[key].ToString());
}
/// <summary>
/// 切換語(yǔ)言
/// </summary>
/// <param name="lan"></param>
public void ChangeLanguage(string lan)
{
if (UserData.Instance.CurrentLanguage == lan)
return;
UserData.Instance.CurrentLanguage = lan;
currLanguageKey = lan;
RefreshGameLanguagePack();
//應(yīng)該在這里發(fā)送一個(gè)語(yǔ)言環(huán)境改變的事件通知
MessageController.Instance.SendNotification(MessageTypes.LocalMessageType.LanguageChanged.ToString(), this, null);
}
public string GetValue(string key,UILabel label)
{
if (label)
label.trueTypeFont = GetFont();
if (dicLanguagePack.ContainsKey(key))
{
if (currLanguageKey == "zh-hans")
return key;
else
return dicLanguagePack[key];
}
return key;
}
public string GetValue(string key,UILabel label, params object[] args)
{
if (label)
{
label.trueTypeFont = GetFont();
Debug.Log(label.trueTypeFont.name);
}
return GetValue(key, args);
}
string GetValue(string key, params object[] args)
{
if (dicLanguagePack.ContainsKey(key))
{
if(currLanguageKey == "zh-hans")
return string.Format(key, args);
else
return string.Format(dicLanguagePack[key], args);
}
return key;
}
public Font GetFont()
{
if(dicFonts.ContainsKey(currLanguageKey))
return dicFonts[currLanguageKey];
return null;
}
/// <summary>
/// 更新游戲語(yǔ)言環(huán)境,用于玩家切換語(yǔ)言環(huán)境
/// </summary>
public void RefreshGameLanguagePack()
{
parse(JDAllLanguages);
}
//給對(duì)象添加多語(yǔ)言腳本
//public void AddMulLanguageTextScript(GameObject go)
//{
// if (go == null) return;
// UILabel[] labels = go.GetComponentsInChildren<UILabel>();
// foreach (UILabel item in labels)
// {
// if(item.transform.gameObject.GetComponent<MultiLanguageText>() == null)
// item.transform.gameObject.AddComponent<MultiLanguageText>();
// }
//}
}
這里只出里了文字性的多語(yǔ)言,另外圖片也會(huì)涉及到多語(yǔ)言,其實(shí)都差不多,可以存一下圖片的名字,在不同的語(yǔ)言環(huán)境調(diào)用不同的圖片名(或者路徑)就可以。
先寫(xiě)到這,有什么錯(cuò)誤的地方,歡迎大家留言指正,謝謝!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。