Unity多语言功能

本文详细介绍了如何在Unity游戏开发中实现多语言支持,通过LanguageMgr脚本管理和切换语言资源,LanguageText脚本则用于Text组件上的语言动态更新。文中提供了具体的代码实现,包括语言字典的加载和值的获取,以及事件驱动的文本更新机制。

1.把Txt三种语言挂在Login(启动页)面板中去
2.要有多语言的功能的Text 都挂脚本LanguageText 脚本
LanguageMgr.cs脚本

using System;
using System.Collections.Generic;
using UnityEngine;
using System.Text;
public class LanguageMgr
{
    private static StringBuilder mBuilder;
    private static LanguageMgr instance;
    public static LanguageMgr mInstance { get { if (instance == null) instance = new LanguageMgr(); return instance; } }
    /// <summary>     当前的语言 0简中 1英文    2繁中     </summary>
    public int mCurLanguage = 0;
    /// <summary>     得到当前语言的 txt 名字     </summary>
    public string GetCurLanguageTxtName()
    {
        if (mCurLanguage == 0)//简
        {
            return "Language_ZH";
        }
        else if (mCurLanguage == 1)//英
        {
            return "Language_EN";
        }
        else if (mCurLanguage == 2)//繁体
        {
            return "Language_TW";
        }
        return "Language_ZH";
    }
    private Dictionary<string, string> mDicKeyLanguage = new Dictionary<string, string>();
    public event Action EActTextChange;
    /// <summary>     初始化 从component传内容     </summary>
    public void StartSetDicLanguage(string pLanguage)
    {
        mDicKeyLanguage.Clear();
        string[] lines = pLanguage.Split(new string[] { "\n" }, StringSplitOptions.None);
        foreach (string line in lines)
        {
            if (line == null || line.Contains("=") == false) 
                continue;
            string[] keyAndValue = line.Split('=');
            if (keyAndValue.Length <= 2)
            {
                mDicKeyLanguage[keyAndValue[0]] = keyAndValue[1].Trim();
            }
            else
            {
                if (null == mBuilder)
                    mBuilder = new StringBuilder();
                if (mBuilder.Length > 0)
                    mBuilder.Clear();
                for (int i = 1; i < keyAndValue.Length; i++)
                {
                    mBuilder.Append(keyAndValue[i]);
                    if (i < keyAndValue.Length - 1)
                    {
                        mBuilder.Append("=");
                    }
                }
                mDicKeyLanguage[keyAndValue[0]] = mBuilder.ToString().Trim();
            }
        }
    }
    /// <summary>     手动改语言.将发事件给Text 们     </summary>
    public void SettingSetDicLanguage(string pLanguage)
    {
        PlayerPrefsMgr.mInstance.SetInt(PlayerPrefsKeys.KEY_LANGUAGE, mCurLanguage.GetHashCode());
        StartSetDicLanguage(pLanguage);
        EActTextChange();
    }
    /// <summary>     根据key 去取值     </summary>
    public string GetLanguageForKey(string key)
    {
        string value;
        if (mDicKeyLanguage.TryGetValue(key, out value))
        {
            //#if LOG_ZSX
            //        return value.Replace("\\n", "\n") + "T";
            //#endif
            return value.Replace("\\n", "\n");
        }
        return "";
    }

    /// <summary>     根据key 去取值   value又有多个值 用^分隔开  index从0开始 </summary>
    public string GetLanguageForKeyMoreValue(string key, int index)
    {
        string value;
        if (mDicKeyLanguage.TryGetValue(key, out value))
        {
            var tOthers = value.Split('^');
            //#if LOG_ZSX
            //            return tOthers[index] + "T";
            //#endif
            return tOthers[index];
        }
        return "";
    }

    public string[] GetLanguageForKeyMoreValues(string key)
    {
        string value;
        if (mDicKeyLanguage.TryGetValue(key, out value))
        {
            var tOthers = value.Split('^');
            //#if LOG_ZSX
            //            for (int i = 0; i < tOthers.Length; i++)
            //            {
            //                tOthers[i] = tOthers[i] + "T";
            //            }
            //#endif
            return tOthers;
        }
        return new string[] { };
    }
}

LanguageText 挂在每个Text组件上

using UnityEngine;
using UnityEngine.UI;
public class LanguageText : MonoBehaviour
{
      public string mKey;
      private Text textLbl;
      /// <summary>除登录页=false               其他都=true         </summary>
      public bool mUseAwake = true;
      private void Awake()
      {
          if (mUseAwake)
          {
              LoadContent();
          }
      }
      private void Start()
      {
          if (mUseAwake == false)
              LoadContent();
      }
      void LoadContent()
      {
          if (string.IsNullOrEmpty(mKey)) return;
          textLbl = this.GetComponent<Text>();
          if (textLbl == null) { Debug.LogError("没Text 组件呀~~"); return; }
          textLbl.text = LanguageMgr.mInstance.GetLanguageForKey(mKey);
          LanguageMgr.mInstance.EActTextChange += EventActionChangeTxt;//加上监听
      }
      private void EventActionChangeTxt()
      {
          if (textLbl != null)
              textLbl.text = LanguageMgr.mInstance.GetLanguageForKey(mKey);
      }
      public void OnDestroy()
      {
          LanguageMgr.mInstance.EActTextChange -= EventActionChangeTxt;
      }   
}

在这里插入图片描述
在这里插入图片描述
PS:辅助小工具在第5项 https://blog.csdn.net/SendSI/article/details/99948814

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值