Unity 多语言功能实现

今天工作的时候,老板要求做一个多种语言的功能。

目前公司就我一个unity程序,因为大学刚出来实习,懂得的知识有限,所以可能有所错误或者不妥之处,希望大佬们能够多多指正。

先看一下我的demo

下面说一下我的实现方式

先创建一个下拉框和一个按钮

然后在Excel表格中把翻译好数据

将Excel表格中的数据复制下,然后转化为json

稍做更改

{
"Chinese":{"汉语":"汉语","英语":"英语","日语":"日语","韩语":"韩语","进入游戏":"进入游戏"},
"English":{"汉语":"Chinese","英语":"English","日语":"Japanese","韩语":"Korean","进入游戏":"Enter"},
"Japanese":{"汉语":"中国語","英语":"英語","日语":"日本語","韩语":"朝鮮語","进入游戏":"ゲームに入る"},
"Korean":{"汉语":"중국어","英语":"영어","日语":"일본어","韩语":"한국어","进入游戏":"게임에 참가하십시오."}
}

新建一个命名为LanguageType的C#脚本,定义一个枚举类型

public enum LanguageType
{
    CHINESE,
    ENGLISH,
    JAPANESE,
    KOREAN
}

然后新建一个命名为LanguageManagers的C#脚本。这个脚本通过枚举将Json中对应语种的数据保存到字典里,同时给出两个方法来改变Dropdown和Text的文本显示

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using LitJson;
using UnityEngine.UI;


public delegate void ChangeLanguage();
public class LanguageManagers : MonoBehaviour {
    public static LanguageManagers Instance;

    //定义一个委托事件,用于改变语言时,可以改变当前所显示的文本
    public event ChangeLanguage ChangeLangeuageEvent;  

    private Dictionary<string, string> languageDic = new Dictionary<string, string>();

    private string languageTable;
    private JsonData languageTables;

    private void Awake()
    {
        Instance = this;
        InitLanguageDate();
    }


    /// <summary>
    /// 读取配置文件
    /// </summary>
    private void InitLanguageDate()
    {
        languageTable = Resources.Load<TextAsset>("LanguageTable").text;

        languageTables = JsonMapper.ToObject(languageTable);
        languageDic = JsonMapper.ToObject<Dictionary<string, string>>(languageTables["Chinese"].ToJson());
    }

    /// <summary>
    /// 读取配置文件
    /// </summary>
    private void GetLanguageByType(LanguageType type, string str)
    {
        languageDic = JsonMapper.ToObject<Dictionary<string, string>>(languageTables[str].ToJson());

        ChangeLangeuageEvent();  //切换语言时,改变当前所有的语言文字显示
    }

    /// <summary>
    /// 根据类型读取配置文件,保存对应的数据到字典里
    /// </summary>
    public void LanguageState(LanguageType type)
    {
        switch (type)
        {
            case LanguageType.CHINESE:
                GetLanguageByType(type, "Chinese");
                break;
            case LanguageType.ENGLISH:
                GetLanguageByType(type, "English");
                break;
            case LanguageType.JAPANESE:
                GetLanguageByType(type, "Japanese");
                break;
            case LanguageType.KOREAN:
                GetLanguageByType(type, "Korean");
                break;
            default:
                break;
        }
    }

  

    /// <summary>
    /// 通过key获取数据,设置Text的文本显示内容
    /// </summary>
    public void SetText(Text text, string target)
    {
        string outStr;

        if (languageDic.TryGetValue(target, out outStr))
        {
            text.text = outStr;
        }
    }

    /// <summary>
    /// 设置下拉框的文本显示内容
    /// </summary>
    public void SetDropdownText(Dropdown dropdown,Text text,List<string> keys,int index)
    {
        string outStr;
        for (int i = 0;i < dropdown.options.Count; i++)
        {
            if (languageDic.TryGetValue(keys[i], out outStr))
            {
                dropdown.options[i].text = outStr;
            }
        }
        SetText(text, keys[index]);
    }
}

新建一个脚本,绑定下拉框选择事件

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class LanguageSelect : MonoBehaviour {
    private Dropdown dropdown;
    private Text label;
    private Button button;
    private List<string> keys;
    private void Start()
    {
        dropdown = GetComponentInChildren<Dropdown>();
        label = dropdown.transform.Find("Label").GetComponent<Text>();

        button = GetComponentInChildren<Button>();

        keys = new List<string>();
        for (int i = 0; i < dropdown.options.Count; i++)
        {
            keys.Add(dropdown.options[i].text);
        }

        dropdown.onValueChanged.AddListener(delegate { SetLanguage(dropdown); });
    }

    public void SetLanguage(Dropdown dropdown)
    {
        int index = dropdown.value;
        switch (index)
        {
            case 0:
                LanguageState(LanguageType.CHINESE,index);
                break;
            case 1:
                LanguageState(LanguageType.ENGLISH,index);
                break;
            case 2:
                LanguageState(LanguageType.JAPANESE,index);
                break;
            case 3:
                LanguageState(LanguageType.KOREAN,index);
                break;
            default:
                break;
        }
    }

    public void LanguageState(LanguageType type,int index)
    {
        LanguageManagers.Instance.LanguageState(type);
        LanguageManagers.Instance.SetDropdownText(dropdown,label,keys,index);
    }
}

然后我们还需要一个挂载到含有Text组件的脚本上,设置好key之后,就可以跟着选择的语言改变了。

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

//public delegate void DelegatGetText();

/// <summary>
/// text添加该脚本,获取文字信息,设置给text
/// </summary>
public class SetTextByLanguageType : MonoBehaviour {

    [SerializeField] private string key;

    private Text text;
	void Start () {
        text = GetComponent<Text>();

        GetLanguageText();

        LanguageManagers.Instance.ChangeLangeuageEvent += GetLanguageText;   // 绑定语言改变事件
	}

    private void GetLanguageText()
    {
       LanguageManagers.Instance.SetText(text,key);  
    }
}

第一次写blog,写得不好,希望大佬们多多海涵

发布了9 篇原创文章 · 获赞 2 · 访问量 2715

猜你喜欢

转载自blog.csdn.net/u014288698/article/details/88093547