Unity实现多语言 本地化 UGUI多语言

1.首先在Resources下创建两个txt文件,我这里命名为 en.txt,zh.txt,就是 一个英文一个中文

不一定放在Resources下,我这里为了方便加载,也可以放到其他可以加载的地方

txt文件内容如图 注意编码格式一定要UTF-8,否则在unity中可能会有中文显示问题

2.管理器加载配置和切换语言

这里继承了一个单例类,可以直接调用    LanguageMgr.Instance.OnInit();初始化语言,切换语言后,我这里是写了通知派发事件

扫描二维码关注公众号,回复: 15074322 查看本文章
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;

public enum EnLanguageType { 
    English,
    Chinese,
    None,
}
// 多语言
public class LanguageMgr : TSingleton<LanguageMgr>
{
    private readonly string[] m_languageNames = {"en", "zh"};

    //选择自已需要的本地语言  
    private EnLanguageType m_language = EnLanguageType.None;

    private Dictionary<EnLanguageType, Dictionary<string, string>> m_dic = new  Dictionary<EnLanguageType, Dictionary<string, string>>();
    /// <summary>  
    /// 读取配置文件,将文件信息保存到字典里  
    /// </summary>  
    public LanguageMgr()
    {
        // 加载多语言配置
        for (int i = 0; i < m_languageNames.Length; i++)
        {
            if (!m_dic.ContainsKey((EnLanguageType)i))
            {
                m_dic[(EnLanguageType)i] = new Dictionary<string, string>();
            }
            TextAsset ta = Resources.Load<TextAsset>("LanguageTxt/" + m_languageNames[i]);
            string text = ta.text;

            string[] lines = text.Split('\n');
            foreach (string line in lines)
            {
                if (line == null)
                {
                    continue;
                }
                string[] keyAndValue = line.Split('=');
                m_dic[(EnLanguageType)i].Add(keyAndValue[0], keyAndValue[1]);
            }
        }
    }
    public void OnInit()
    {
        ChangeLanguage(EnLanguageType.English);
    }
    /// <summary>  
    /// 获取value  
    /// </summary>  
    /// <param name="key"></param>  
    /// <returns></returns>  
    public string GetValue(string key)
    {
        if (m_dic.ContainsKey(m_language) == false)
        {
            return null;// 不包含语言库
        }
        if (!m_dic[m_language].ContainsKey(key)) return null;// 不包含key
        string value = null;
        m_dic[m_language].TryGetValue(key, out value);
        return value;
    }
    // 格式化 多参数
    public string LanguageFormat(string key,params string[] par)
    {
        var text = GetValue(key);
        if (text == null) return null;
        return string.Format(text, par);
    }
    // 切换语言
    public void ChangeLanguage(EnLanguageType lang)
    {
        if (m_language == lang) return;
        m_language = lang;
        // 更新所有;Text
        EventManager.Instance.DispatchEvent(EventType.UPDATELANGUAGESHOW);
        
    }
}




3.建一个LanguageText脚本,用来挂在有Text组件的UI物体上, 绑定好对应的多语言key

这里初始化监听事件,收到语言更新后,更新text

using System;
using UnityEngine;
using UnityEngine.UI;

/// <summary>
/// text多语言绑定
/// </summary>

public class LanguageText : MonoBehaviour
{
    public string key = " ";
    void Start()
    {
        EventManager.Instance.AddListener((int)EventType.UPDATELANGUAGESHOW, UpdateText);
        this.UpdateText(null);
    }
    // 
    public void UpdateText(Message ms)
    {
        if (!gameObject) return;
        GetComponent<Text>().text = LanguageMgr.Instance.GetValue(key);
    }
    private void OnDestroy()
    {
        EventManager.Instance.RemoveListener((int)EventType.UPDATELANGUAGESHOW, UpdateText);
    }
}

 可以调用 LanguageMgr.Instance.LanguageFormat("abc","哈哈哈","20")获取格式参数多语言

猜你喜欢

转载自blog.csdn.net/github_38633141/article/details/123133363