unity 多語言管理器

 

多語言是遊戲中比較長見的功能,實現起來也相對比較簡單,在這裏簡單說一下思路,稍後代碼附上


簡單說一下步驟:

步驟一、設計多語言配置表。在這裏說一下多語言配置表。就是一個json格式文件,每種語言的簡寫作

             爲當前語言的鍵,比如簡體用zh-hans,值是一個json對象。比如遊戲中有一個需要多語言的

             label,內容是“登陸游戲”,我們簡單寫一下這個表

            {

                "zh-hans": {

                       "登陸游戲": "",

                       " 輸入暱稱": "",

                       "***力增加{0}%":"" 

                 },

                "zh-hant": {

                    "登陸游戲": "登錄遊戲",

                    "輸入暱稱": "輸入暱稱",

                    "***力增加{0}%":"攻擊力增加{0}%" 

                 }

             }

        “zh-hans”表示簡體表,“zh-hant”表示繁體表,可能還會有其他語言,比如,英文,德       

            文,法文等等,都可以加。您可能也注意到了,不管是哪個語言表,他們的鍵都是簡體中文,

            這樣設計的好處就是直觀,後面隨着語言的增多,和表中的鍵值對增多,給鍵取名也是很難的

            事。所以,乾脆就是用簡體中文作爲鍵,其他的語言都通過它來翻譯,這樣既直觀又省事。

            配置表設計好了以後,將遊戲各個模塊中用到的,需要進行多語言設置的label中的文字,以

            label爲單位,每個label中的文本作爲一對鍵值,添加到配置表裏。這裏有一種特殊情況,就

            是label中可能有不斷變化的數值,例如:“***力增加5%”,“英雄獲得200金幣”等,這樣

            的情況,這時就不能直接寫到配置表裏,需要一個字符串格式化處理,例如:“***力增加

            5%”改爲“***力增加{0}%”;“英雄獲得200金幣”改爲“英雄獲得{0}金幣”。在下面的代

            碼中也提供相應的方法。


步驟二、初始化,主要工作就是解析多語言配置表,加載對應語言的字庫。


步驟三、LanguageManager中提供了兩個重載的GetValue()方法,遊戲中需要多語言顯示的label,普

            通文本就調用GetValue(string key,UILabel label)方法,有需要格式化字符的label,例

            如:“***力增加5%”就調用GetValue(string key,UILabel label, params object[] 

            args),args是可變參數,可以傳入數值,int,float,string都可以,如:GetValue("***力

            增加{0}%",label,5);因爲多語言表中可以查到"***力增加{0}%"這個鍵,所以就可以顯示出與

            當前語言對應的文本。


步驟四、當切換語言的時候,LanguageManager提供了一個ChangeLanguage方法,重新設置當前的

             語言鍵值表,並且發送一個消息,通知所有模塊更新本模塊內的所有涉及的多語言的label,所

            以在各個模塊需要監聽一個多語言發生改變的事件方法,在方法裏重新調用GetValue方法給

            label賦值。一般切換語言後需要做一下本地存儲,方便玩家下次進入遊戲就可以直接進入上次

            選擇的語言環境。


代碼如下:


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>

    /// 獲取與當前語言對應的簡體中文的鍵

    /// </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.初始化多語言配置表

        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", "簡體中文");

        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>

    /// 切換語言

    /// </summary>

    /// <param name="lan"></param>

    public void ChangeLanguage(string lan)

    {

        if (UserData.Instance.CurrentLanguage == lan)

            return;

        UserData.Instance.CurrentLanguage = lan;

        currLanguageKey = lan;


        RefreshGameLanguagePack();

        //應該在這裏發送一個語言環境改變的事件通知

        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>

    /// 更新遊戲語言環境,用於玩家切換語言環境

    /// </summary>

    public void RefreshGameLanguagePack()

    {

        parse(JDAllLanguages);

    }


    //給對象添加多語言腳本

    //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>();

    //    }

    //}


}


這裏只出裏了文字性的多語言,另外圖片也會涉及到多語言,其實都差不多,可以存一下圖片的名字,在不同的語言環境調用不同的圖片名(或者路徑)就可以。


先寫到這,有什麼錯誤的地方,歡迎大家留言指正,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章