Unity编程笔记----多语言切换

来源:互联网 发布:知乎 风扇灯什么牌子好 编辑:程序博客网 时间:2024/05/17 08:51

一套项目完结之后,还项发布英文版 日文版怎么办? 有两种解决方案,第一种比较笨的方法是手动的把相应文字替换掉.
第二种就是把需要切换的语言集中存放到txt文档中,通过list集合,的方法进行访问(每一个key可以对应多个value). 下面实现的是第二种方法.
目标:实现 中文.英文.日文的切换.
1 界面UI的简单搭建:
这里写图片描述
2 txt文档的创建 格式为UTF-8
这里写图片描述
3 LanguageMgr的创建,挂载到Canvas上

using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;public class LanguageMgr : MonoBehaviour{    private static LanguageMgr instance = null;    public static LanguageMgr Instance    {        get { return instance; }    }    /// <summary>    /// 语言    /// </summary>    [SerializeField]    private SystemLanguage language;    /// <summary>    /// 相同的key 对应 不同国家的value    /// </summary>    private Dictionary<string, string> dict = new Dictionary<string, string>();/// <summary>    /// 加载预翻译的语言    /// </summary>    private void loadLanguage()    {        //加载文件        TextAsset ta = Resources.Load<TextAsset>(language.ToString());        if (ta == null)        {            Debug.LogWarning("没有这个语言的翻译文件");            return;        }        //获取每一行        string[] lines = ta.text.Split('\n');        //获取key value        for (int i = 0; i < lines.Length; i++)        {            //检测            if (string.IsNullOrEmpty(lines[i]))                continue;            //获取 key:kv[0] value kv[1]            string[] kv = lines[i].Split(':');            //保存到字典            dict.Add(kv[0], kv[1]);            Debug.Log(string.Format("key:{0}, value:{1}", kv[0], kv[1]));        }    }    void Awake()    {        instance = this;        loadLanguage();    }    /// <summary>    /// 获取对应的value    /// </summary>    /// <param name="key"></param>    /// <returns>返回对应的value 如果不存在这个key 就返回空串</returns>    public string GetText(string key)    {        if (dict.ContainsKey(key))            return dict[key];        else//没有这个key        {            return string.Empty;        }    }}

4 UIText 在需要切换语言的text上挂载该脚本

using UnityEngine;using System.Collections;using System.Collections.Generic;using UnityEngine.UI;public class UIText : MonoBehaviour{    [SerializeField]    private string key;    // Use this for initialization    void Start()    {        if (!string.IsNullOrEmpty(key))        {            string value = LanguageMgr.Instance.GetText(key);            if (!string.IsNullOrEmpty(value))            {                gameObject.GetComponent<Text>().text = value;            }        }    }}

5 点击 language 选择相应的语言.即可实现切换.
这里写图片描述

0 0
原创粉丝点击