【Unity】多语言实现方案

一、简介
  1. 数据格式

小编使用的Excel管理所有语言,格式如下:
在这里插入图片描述
如有更多的语言翻译,只需要在后面加一列即可。另外我们也可以把数据以上面的结构保存成Json文件的方式。

  1. 编辑器 -> 静态文本

为Text组件添加LocalizationText.cs脚本,在属性页面可以设置当前Text组件的文本多语言ID,即可查看对应翻译内容
在这里插入图片描述

  1. 动态文本

比如:LEVELS {0},需要再脚本动态更新关卡数目,这样的话可以通过封装的获取文本的接口LocalizationManager.GetLocalText(ID)获取文本,然后设置动态属性值

二、代码实现
  1. LocalizationTextEditor

主要逻辑就是依赖CustomEditor类为LocalizationText脚本添加编辑器管理脚本,通过获取目标组件对象,在属性窗口为目标对象设置属性,具体使用方法可以参考脚本中官方文档以及代码注释

/// <summary>
/// LocalizationText组件的属性页面编辑器
/// [官方]https://docs.unity3d.com/Manual/editor-CustomEditors.html
/// </summary>
[CustomEditor(typeof(LocalizationText))]
public class LocalizationTextEditor : Editor
{
    private LocalizationText m_LocalizationText;
    /// <summary>
    /// 获取编辑器所属组件对象
    /// </summary>
    private void OnEnable()
    {
        OnCheckLocalization();
        m_LocalizationText = target as LocalizationText;
    }
    /// <summary>
    /// 执行代码,访问目标组件属性
    /// </summary>
    public override void OnInspectorGUI()
    {
        //依据属性名称获取目标对象属性
        EditorGUILayout.PropertyField(serializedObject.FindProperty("Text"),true);
        //应用修改属性
        serializedObject.ApplyModifiedProperties();
        //设置用户输入,获取文本ID
        m_LocalizationText.LanguageID = EditorGUILayout.IntField("多语言ID", m_LocalizationText.LanguageID);
        string content = LocalizationManager.GetLocalText(m_LocalizationText.LanguageID);
        if (!string.IsNullOrEmpty(content))
        {
            EditorGUILayout.HelpBox(content,MessageType.Info);
        }
        else
        {
            EditorGUILayout.HelpBox("俺没有找到哎", MessageType.Error);
        }
    }
    private void OnCheckLocalization()
    {
        if(!LocalizationManager.IsAvalibleLanguage())
        {
            LocalizationManager.InitLanguage();
        }
    }
}
  1. LocalizationText.cs

为Text组件添加该脚本并在属性窗口设置文本ID,游戏运行即可以获取正确的翻译文本,方法不多,不在赘述

public class LocalizationText : MonoBehaviour
{
    public Text Text;
    public int LanguageID;
    private void Awake()
    {
        OnModifiedProperties();
    }
    /// <summary>
    /// 修改文本内容
    /// </summary>
    public void OnModifiedProperties()
    {
        string content = LocalizationManager.GetLocalText(LanguageID);
        Text.text = string.IsNullOrEmpty(content) ? Text.text : content;
    }
}
  1. LocalizationManager.cs管理脚本

(1)依据设备所在地区,读取相应的翻译内容
(2)提供接口,依据ID获取文本
注:小编使用的QuickSheet管理Excel数据,感兴趣的话,可以在网上搜下

private static LanguageConfig m_LanguageConfig;
    private static Dictionary<int, string> m_LanguageTextDic = new Dictionary<int, string>();
    /// <summary>
    /// 更新本地语言库
    /// </summary>
    public static void OnUpdateLanguage()
    {
        if(m_LanguageConfig == null)
        {
            m_LanguageConfig = ResourcesManager.Instance.Load<LanguageConfig>(string.Format(Define.Path.RESOURCES_EXCELASSETS, typeof(LanguageConfig).Name));
        }
        m_LanguageTextDic.Clear();
        Debug.Log(Application.systemLanguage);
        switch (Application.systemLanguage)
        {
            case SystemLanguage.ChineseSimplified:
                foreach (var item in m_LanguageConfig.dataArray)
                {
                    m_LanguageTextDic.Add(item.Id, item.Chinese);
                }
                break;
            case SystemLanguage.Chinese :
                foreach (var item in m_LanguageConfig.dataArray)
                {
                    m_LanguageTextDic.Add(item.Id, item.Chinese);
                }
                break;
            case SystemLanguage.English:
                foreach (var item in m_LanguageConfig.dataArray)
                {
                    m_LanguageTextDic.Add(item.Id, item.English);
                }
                break;
        }
    }

    /// <summary>
    /// 获取本地语言
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    public static string GetLocalText(int id)
    {
        if (m_LanguageTextDic.ContainsKey(id))
            return m_LanguageTextDic[id];
        return null;
    }
    /// <summary>
    /// 多语言是否可用
    /// </summary>
    /// <returns></returns>
    public static bool IsAvalibleLanguage()
    {
        return m_LanguageTextDic.Count > 0 ? true : false;
    }
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity游戏中,支持多语言的字体可以在以下几个地方使用:代码中出现中文的地方,比如一些飘字或文字提示;配置表中出现的中文,比如道具名字和玩法描述;带有中文字体的图片资源;以及Prefab中Text组件中的中文。 Unity提供了多种工具和组件来支持多语言字体的使用,包括Unity UI、Unity 2D、TextMesh Pro、NGUI、2D ToolKit、SVG Importer等。这些工具和组件可以用于本地化支持图像、文本、声音、字体、精灵、图集、预制件、文本网格、下拉列表等组件。同时,Unity还提供了自动翻译内置功能,可以帮助在不同语言之间进行翻译。 在制作多语言版本的游戏时,需要考虑每个国家的文字,如泰国的泰文、韩国的韩文、***通过使用Unity提供的多语言支持工具和组件,可以轻松地实现游戏中的多语言字体显示。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [【Unity】多语言版本解决方案](https://blog.csdn.net/zh634455283/article/details/85011010)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [I2 Localization v2.8.15 f2.unitypackage](https://download.csdn.net/download/lu940114/87217961)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值