Unity 多语言之 本地化动态设置多语言界面

2025-11-02 23:07:35

1、打开Unity,新建一个空工程,具体如下图

Unity 多语言之 本地化动态设置多语言界面

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

Unity 多语言之 本地化动态设置多语言界面

Unity 多语言之 本地化动态设置多语言界面

Unity 多语言之 本地化动态设置多语言界面

Unity 多语言之 本地化动态设置多语言界面

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

Unity 多语言之 本地化动态设置多语言界面

Unity 多语言之 本地化动态设置多语言界面

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,用来管理语言的动态设置,具体如下图

Unity 多语言之 本地化动态设置多语言界面

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

Unity 多语言之 本地化动态设置多语言界面

Unity 多语言之 本地化动态设置多语言界面

Unity 多语言之 本地化动态设置多语言界面

Unity 多语言之 本地化动态设置多语言界面

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函数中同时更新,避免未及时更新,具体如下图

Unity 多语言之 本地化动态设置多语言界面

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的监听事件,具体如下图

Unity 多语言之 本地化动态设置多语言界面

Unity 多语言之 本地化动态设置多语言界面

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昌吉惊鸿的物体上,具体如下图

Unity 多语言之 本地化动态设置多语言界面

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

Unity 多语言之 本地化动态设置多语言界面

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

Unity 多语言之 本地化动态设置多语言界面

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

Unity 多语言之 本地化动态设置多语言界面

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢