【Unity 实用工具篇】| 游戏多语言解决方案,官方插件Localization 实现本地化及多种语言切换

news2024/9/24 3:27:54

请添加图片描述

      • 前言
  • 【Unity 实用工具篇】| 游戏多语言解决方案,官方插件Localization 实现本地化及多种语言切换
    • 一、多语言本地化插件 Localization
      • 1.1 介绍
      • 1.2 效果展示
      • 1.3 使用说明
    • 二、 插件导入并配置
      • 2.1 安装 Localization
      • 2.2 全局配置
    • 三、多语言映射表
      • 3.1 创建多语言文本配置表
      • 3.2 添加多语言文本配置表内容
      • 3.3 静态文本
      • 3.2 动态文本
    • 四、资源多语言映射表
    • 五、映射表 导入/导出 Excel 便于管理
      • 5.1 导出Localization Table为CSV
      • 5.2 修改Excel中并重新导入
    • 六、Build
  • 总结

在这里插入图片描述


前言

  • Unity的多语言本地化是一个很实用的功能,它可以帮助游戏支持多种语言,让不同语言的玩家都能够更好地体验游戏。
  • 而实现本地化的方案也有很多种,各个方案之间也各有优劣,后面也会对多个方案进行介绍学习。
  • 本文就来介绍一个专门作用于多语言本地化的Unity官方插件:Localization
  • 这个插件方便进行游戏的多语言本地化,让游戏支持多种语言,下面就来看看该插件的使用方法吧!

【Unity 实用工具篇】| 游戏多语言解决方案,官方插件Localization 实现本地化及多种语言切换

一、多语言本地化插件 Localization

1.1 介绍

Localization是Unity官方推出的本地化插件,它可以帮助开发者在Unity项目中实现多语言支持。

在Unity中,Localization的工作原理是创建多个表格来存储不同语言的不同字符串。

可以通过Localization Tables创建这些表格,表格可以建立不同资源之间的对应关系,一个key对应多个语言的资源。

通过使用Localization插件,开发者可以方便地设置和获取当前语言和当前语言地区,从而为游戏或应用程序提供多种语言的支持。

这对于那些需要面向不同地区和不同语言的用户发布游戏或应用程序的开发者来说是非常有用的。

1.2 效果展示

请添加图片描述

1.3 使用说明

官方文档:官方文档

本文使用的Localization版本为1.4.5,Unity引擎版本为2023.1.9。

后续插件可能会有更新,或者使用老版本的插件时功能使用上可能会有所不同,实际使用时按照自己的版本要求即可。


二、 插件导入并配置

2.1 安装 Localization

打开菜单栏 Window -> Package Manager ,在搜索框中搜索Localization 并进行安装即可。

要注意Packages选择Unity Registry,不然可能搜不到该插件哦。
在这里插入图片描述

2.2 全局配置

打开菜单栏 Edit -> Project Settings -> Localization -> Create,找到Localization,点击Create创建,并选择一个文件目录进行文件保存。
在这里插入图片描述

点击 Locale Generator 搜索zh和en添加中英文配置,第一次添加时会让我们选择一个文件夹目录保存。
在这里插入图片描述

Locale Generator 用于添加或移出语言,每添加一种语言也会生成对应的配置文件,然后可以修改默认语言为中文,如下图所示:
在这里插入图片描述


三、多语言映射表

3.1 创建多语言文本配置表

打开菜单栏 Window -> Asset Management -> Localization Tables ,点击New Table Collection创建表格。

该表格用于建立不同资源之间的对应关系,一个key对应多个语言的资源,可以选择创建文本表或者资源表。

这里我们选择文本表(String Table Collection)使用,写好表名后点击Create就可以创建了,然后选择一个路径目录进行保存。
在这里插入图片描述

经过上面几个配置后可以在我们前面保存文件的路径下看到相关的文件,这里最好是根据自己的情况选择合适的文件夹进行管理保存。
在这里插入图片描述

3.2 添加多语言文本配置表内容

此时在Localization Tables中添加多语言文本即可,配置内容主要是Key和对应多种语言的文本。

可通过Window -> Asset Management -> Localization Tables 打开该窗口。
在这里插入图片描述

实际项目中不一定将多语言内容全部写在一个配置表中,不同的文本内容也可以通过创建多个配置表进行填写,让不同的模块自己管理文本内容也是一个不错的选择。

3.3 静态文本

此时在场景中添加一个文本组件Text,然后在该组件右侧菜单处点击Localize,会自动添加一个Localize String Event组件。
(这里也可以手动在下面添加Localize String Event组件,不过还要手动配置该组件绑定的Text组件,稍微麻烦一些,功能都是一样的)
在这里插入图片描述

此时在该组件中的String Reference参数中选择之前配置的多语言文本配置表中的Key即可完成多语言的配置。
在这里插入图片描述

此时运行程序,可以看到该Text组件的文本内容已经变成我们配置多语言文本配置表中的Key对应的文本了。

通过Game视图右上角的语言选择可以切换语种,点击切换不同语言后,Game视图中的文本也会即时的跟着切换了。
在这里插入图片描述

这样我们的静态文本就可以通过这种方法来添加多语言文本配置表中的Key绑定多语言了。

也可以通过脚本控制语言的切换,测试代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Localization;
using UnityEngine.Localization.Settings;
using UnityEngine.ResourceManagement.AsyncOperations;

public class LanguageManager : MonoBehaviour
{
    AsyncOperationHandle m_InitializeOperation;
    private Locale _chineseLocale;
    private Locale _englishLocale;

    void Start()
    {
        // SelectedLocaleAsync will ensure that the locales have been initialized and a locale has been selected.
        m_InitializeOperation = LocalizationSettings.SelectedLocaleAsync;
        if (m_InitializeOperation.IsDone)
        {
            InitializeCompleted(m_InitializeOperation);
        }
        else
        {
            m_InitializeOperation.Completed += InitializeCompleted;
        }
    }

    void InitializeCompleted(AsyncOperationHandle obj)
    {
        var locales = LocalizationSettings.AvailableLocales.Locales;
        for (int i = 0; i < locales.Count; ++i)
        {
            var locale = locales[i];
            if (locale.LocaleName == "Chinese (Simplified) (zh)")
            {
                _chineseLocale = locale;
            }
            else if (locale.LocaleName == "English (en)")
            {
                _englishLocale = locale;
            }
        }
    }

    public void SwitchChinese()
    {
        LocalizationSettings.Instance.SetSelectedLocale(_chineseLocale);
    }
    public void SwitchEnglish()
    {
        LocalizationSettings.Instance.SetSelectedLocale(_englishLocale);
    }
}

将该脚本挂载到场景中,并在场景中添加两个Button分别绑定切换中英文的方法即可。
请添加图片描述

上述脚本代码也可以换成下方这种,更简单粗暴的方法切换语言。

using UnityEngine;
using UnityEngine.Localization.Settings;

public class LanguageManager : MonoBehaviour
{
    public void SwitchChinese()
    {
        LocalizationSettings.SelectedLocale = LocalizationSettings.AvailableLocales.Locales[0];
    }
    public void SwitchEnglish()
    {
        LocalizationSettings.SelectedLocale = LocalizationSettings.AvailableLocales.Locales[1];
    }
}

索引值为Localization 的配置项中的多种语言的顺序,如下方第一个语言为中文则索引为0。
在这里插入图片描述

3.2 动态文本

除了可以设置静态文本,也可以在代码中获取对应的文本并进行动态设置,下面看一下动态文本的设置方法。

设置动态文本的方法有很多种,可以看情况选择,具体原理可以在官方文档仔细查阅,这里就直接写几种方法的使用示例。

1.最简单粗暴的方法,直接动态读表赋值。

using UnityEngine;
using UnityEngine.Localization.Settings;
using UnityEngine.UI;

public class TestLocalization : MonoBehaviour
{
    public Text text;

    void Start()
    {
        var loadingResult = LocalizationSettings.StringDatabase.GetTableEntry("UITestTable", "ui_Test");
        text.text = loadingResult.Entry.GetLocalizedString();
    }
}

GetTableEntry() 第一个参数为多语言配置表的名字,第二个参数为该表里面的Key。

通过方法传入多语言配置表的名字及对应多语言的Key即可完成动态文本赋值。

不过要注意的是字符串表可能不会立即可用,例如在本地化系统初始化期间或尚未加载表时。

为了保险起见,可以确保该多语言配置表被加载出之后再进行赋值,可以来看第二种方法的使用示例。

2.等待语言配置表初始化之后在赋值。

using System.Collections;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine;
using UnityEngine.Localization.Settings;
using UnityEngine.UI;

public class TestLocalization : MonoBehaviour
{
    public Text text;

    void Start()
    {
        StartCoroutine(LoadStrings());
    }

    IEnumerator LoadStrings()
    {
        // A string table may not be immediately available such as during initialization of the localization system or when a table has not been loaded yet.
        var loadingOperation = LocalizationSettings.StringDatabase.GetTableAsync("UITestTable");
        yield return loadingOperation;
    
        if (loadingOperation.Status == AsyncOperationStatus.Succeeded)
        {
            var stringTable = loadingOperation.Result;
            text.text = stringTable.GetEntry("ui_Test").GetLocalizedString();
        }
        else
        {
            Debug.LogError("Could not load String Table\n" + loadingOperation.OperationException.ToString());
        }
    }
}

3.初始化时获得该多语言配置表,事件动态更新文本。

using UnityEngine;
using UnityEngine.Localization;
using UnityEngine.Localization.Tables;
using UnityEngine.UI;

public class Demo : MonoBehaviour
{
    public Text Name;
    private LocalizedStringTable stringTable = new LocalizedStringTable { TableReference = "UITestTable" };

    void OnEnable()
    {
        stringTable.TableChanged += LoadStrings;
    }

    void OnDisable()
    {
        stringTable.TableChanged -= LoadStrings;
    }

    void LoadStrings(StringTable stringTable)
    {
        Name.text = GetLocalizedString(stringTable, "ui_Test");
    }

    static string GetLocalizedString(StringTable table, string entryName)
    {
        var entry = table.GetEntry(entryName);
        return entry.GetLocalizedString();
    }
}

以上几种方法都可以正常使用,根据实际需求选择合适的即可。


四、资源多语言映射表

除了上面说到的文本的本地化之外,Localization 还支持资源本地化,使用方法与配置文本的方法类似,下面来看一下。

打开菜单栏 Window -> Asset Management -> Localization Tables ,点击New Table Collection创建表格。

该表格用于建立不同资源之间的对应关系,一个key对应多个语言的资源,这里选择创建一个资源配置表(AssetsTable Collection),写好表名后点击Create就可以创建了,然后选择一个路径目录进行保存。
在这里插入图片描述

创建完之后与文本配置的处理方式一样,在表中添加Key以及资源的内容,测试示例如下:
在这里插入图片描述

然后在场景中添加一个Image组件,在右侧菜单点击Localize(或者自己添加组件),选择我们添加的资源配置表中的Key即可完成。
在这里插入图片描述

效果如下,可以使用方法控制切换语言,也可以通过右上角进行切换。
请添加图片描述


五、映射表 导入/导出 Excel 便于管理

当项目中的文本量比较多的时候,使用Localization Table的方法会有些难以操作不便于管理。

所以此时可以考虑将Localization Table导出为Excel表格对文本进行管理,Localization 是支持Table的导入和导出的,下面来看一下怎样操作。

5.1 导出Localization Table为CSV

打开Localization Tables,然后右键Localization Table,选择 Export -> CSV...导出。
在这里插入图片描述

选择一个文件目录进行保存,就可以看到导出的Excel表格内容了,就是Localization Table中的内容。
在这里插入图片描述

5.2 修改Excel中并重新导入

在导出的Excel表格中我们可以进行增删改查的操作对表格进行管理,这样比直接在Localization Table中管理要轻松的多。

在这里插入图片描述
修改完之后可以在导入Localization Table中,要注意的是修改完之后要改成UTF-8的编码格式再保存文件,不然导入之后中文会显示乱码。

如果不知道怎么直接保存为UTF-8的编码格式,可以使用Notepad++等工具转一下就可以了。
在这里插入图片描述

点击Import -> CSV...选择对应的文件进行导入。
在这里插入图片描述

这样就可以看到从Excel中修改后的内容导入到Localization Table中啦。
在这里插入图片描述

乱码问题:https://blog.csdn.net/shishuijun/article/details/129961436


六、Build

如果需要打包项目的话还需要对Localization Tables进行Build一次,方法也很简单,下面看一下怎样操作。

打开菜单栏 Window -> Asset Management -> Addressables -> Groups
在这里插入图片描述

然后在该窗口中选择Build -> New Build -> Defaul Build Script 进行Build,等待Build完成即可。
在这里插入图片描述


总结

  • Localization 工具的优点在于该插件是Unity引擎原生解决方案,使用时只需要通过Package Manger导入即可。
  • 导入及配置都比较简单,对于一些文本量不是很大的项目来说,该方案非常的合适。
  • 当项目对文本量需求非常大的时候,就需要配合Excel来管理了。
  • 整理来说效果不错,操作简单易上手,基本功能都有,是值得学习的一款多语言本地化解决方案。

🎁🎁🎁 最后给大家推荐一个功能齐全而且很好用的 IP代理网站:IPIDEA

使用这个代理IP,可以很轻松地访问被封锁的网站,避免被追踪和监控,保护自己的隐私和安全。而且这个代理IP还可以帮助我们加速网页的加载速度,提高工作效率。

现在使用这个链接(https://share.ipidea.net/YYYYYY)注册的新用户还可以直接白嫖最少300M的流量,注册认证后最高可以送7.5G流量哦!

加上最近年终也有活动,优惠力度还是蛮大的,有需要的小伙伴可以去搞一下试试,注册 == 白嫖

如果对此非常感兴趣之前没有用过或者不会使用的小伙伴也不用着急,在官网都有详细的教程可以看,后面有时间的话也可以出一期教程帮助大家快速上手使用的哦!


  • 🎬 博客主页:https://xiaoy.blog.csdn.net

  • 🎥 本文由 呆呆敲代码的小Y 原创 🙉

  • 🎄 学习专栏推荐:Unity系统学习专栏

  • 🌲 游戏制作专栏推荐:游戏制作

  • 🌲Unity实战100例专栏推荐:Unity 实战100例 教程

  • 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

  • 📆 未来很长,值得我们全力奔赴更美好的生活✨

  • ------------------❤️分割线❤️-------------------------

请添加图片描述请添加图片描述请添加图片描述

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1315603.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AWS-CDN只能备用域名访问-使用Lambda@Edge(禁止分配的域名访问)

场景&#xff1a;cdn使用备用域名后&#xff0c;希望用户只能从备用域名访问&#xff0c;而不是自动分配的cdn域名&#xff0c;这也将是一个安全漏洞&#xff0c;被扫描到cdn域名访问刷流量等&#xff01; 【建议部署前查看】参考链接&#xff1a; 1.官方cdn返回示例 2.lambdae…

从菜鸟到专业人士:来自真实 PRD 写作经验的 5 个改变游戏规则的产品管理课程

产品管理是一个复杂且具有挑战性的角色。PRD&#xff08;即产品需求文档&#xff09;就像构建产品的蓝图&#xff0c;可将其视为指导开发团队创造令人惊叹的产品的详细路线图。本文除了介绍产品经理如何写好PRD&#xff0c;也将进一步阐述产品经理应该学习哪些技能&#xff1f;…

【C语言】动态内存管理(C语言的难点与精华,数据结构的前置知识,你真的掌握了吗?)

文章目录 引言一、为什么要动态内存分配二、动态内存分配的相关函数2.1 malloc2.2 free2.3 calloc2.4 realloc 三、常见的动态内存的错误3.1 对NULL指针的解引用3.2 对动态内存越界访问3.3 对非动态内存释放3.4 对动态内存部分释放3.5 对动态内存多次释放3.6 未对动态内存释放&…

DevEco Studio自定义代码颜色

这里以ArkTS代码颜色举例 进入设置&#xff08;快捷键CtrlAltS&#xff09; 选择Editor > Color Scheme > JavaScript 由于之前用习惯VsCode了&#xff0c;这里以注释颜色举例&#xff0c;变为绿色。 上面说的不是以ArkTS代码颜色举例吗&#xff1f;为什么选择JavaScr…

使用下载代替物理串口输出-STM32 Debug (printf) Viewer

使用下载代替物理串口输出-STM32 Debug 硬件要求配置方法代码要求打印输出结果 硬件要求 STM32的PB9、PB10引脚的串口1通常用作其他功能使用后&#xff0c;无法通过printf()函数打印输出想要调试输出查看变量或调试信息。现已使用另外一种方法实现printf()函数打印输出。 ST…

BugKu-Web-滑稽

题目环境 持续的动态图片 F12审查元素 拿下flag&#xff1a;flag{595d994a34342417bfc3a3c3a23e0a48}

Java: Random

/*** encoding: utf-8* 版权所有 2023 涂聚文有限公司* 许可信息查看&#xff1a;* 描述&#xff1a; //https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/RandomStringUtils.html* //https://commons.apache.org/pro…

jmeter 如何循环使用接口返回的多值?

有同学在用jmeter做接口测试的时候&#xff0c;经常会遇到这样一种情况&#xff1a; 就是一个接口请求返回了多个值&#xff0c;然后下一个接口想循环使用前一个接口的返回值。 这种要怎么做呢&#xff1f; 有一定基础的人&#xff0c;可能第一反应就是先提取前一个接口返回…

测试用例设计方法之判定表详解!!

理论部分 判定表是分析和表达多种输入条件下系统执行不同动作的工具&#xff0c;它可以把复杂的逻辑关系和多种 条件组合的情况表达得既具体又明确。 条件桩(Condition Stub)动作桩(Action Stub&#xff09;条件项(Condition Entry&#xff09;动作项(Action Entry&#xff0…

Redis常用内存淘汰策略?

从淘汰范围来说可以分为不淘汰任何数据、只从设置了到期时间的键中淘汰和从所有键中淘汰三类。而从淘汰算法来分&#xff0c;又主要分为 random&#xff08;随机&#xff09;&#xff0c;LRU&#xff08;最近最少使用&#xff09;&#xff0c;以及 LFU&#xff08;最近最不常使…

【AI美图】第03期效果图,AI人工智能全自动绘画,二次元美图欣赏

带来一组二次元人工智能自动绘图 对比分析&#xff1a; 标题手画二次元需要技巧&#xff1a; 二次元高清图片的绘制技巧主要包括以下几点&#xff1a; 线条的运用&#xff1a;在二次元风格的绘画中&#xff0c;线条的运用非常重要。要绘制出流畅、细腻的线条&#xff0c;需…

VBA技术资料MF96:单字段多条件高级筛选

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

基于CNN+数据增强+残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)+数据集+模型(六)

系列文章目录 基于CNN数据增强残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)数据集模型&#xff08;一&#xff09; 基于CNN数据增强残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)数据集模型&#xf…

Day10 Liunx高级系统设计11-数据库2

DQL:数据查询语言 查询全表 select * from 表名; 查询指定列 select 列名 1, 列名 2,… from 表名 ; 条件查询 select * from 表名 where 条件 ; 注意&#xff1a; 条件查询就是在查询时给出 WHERE 子句&#xff0c;在 WHERE 子句中可以使用如下运算符及关键 字&#…

学习笔记10——Mysql的DDL语句

学习笔记系列开头惯例发布一些寻亲消息 链接&#xff1a;https://baobeihuijia.com/bbhj/contents/3/197161.html 数据库创建&#xff1a; CREATE DATABASE books&#xff1b; CREATE DATABASE IF NOT EXISTS books;更改字符集 ALTER DATABASE books CHARACTER SET gbk;库的删…

三层交换与DHCP

目录 一、三层交换 &#xff08;一&#xff09;基本概念 &#xff08;二&#xff09;转发原理 &#xff08;三&#xff09;ensp项目实验 二、DHCP &#xff08;一&#xff09;DHCP工作原理 1.DHCP的特点 2.工作原理 &#xff08;二&#xff09;DHCP项目实验 一、三层交…

电商用户运营优化:腾讯文档API无代码集成

腾讯文档API集成&#xff1a;电商平台无代码客服系统 随着数字化时代的到来&#xff0c;电商平台日益求势于高效率和低成本的运营模式。无代码开发正在改变传统业务流程的构建方式&#xff0c;尤其在客户服务领域&#xff0c;这种转变正变得尤为明显。本文将探索腾讯文档API在…

大模型算法工程师的面试题来了(附答案)

自 ChatGPT 在去年 11 月底横空出世&#xff0c;大模型的风刮了整一年。 历经了百模大战、Llama 2 开源、GPTs 发布等一系列里程碑事件&#xff0c;将大模型技术推至无可争议的 C 位。基于大模型的研究与讨论&#xff0c;也让我们愈发接近这波技术浪潮的核心。 最近大模型相关…

【QT】时间日期与定时器

目录 1.时间日期相关的类 2.日期时间数据与字符串之间的转换 2.1 时间、日期编辑器属性设置 2.2 日期时间数据的获取与转换为字符串 2.3 字符串转换为日期时间 3.QCaIendarWidget日历组件 3.1基本属性 3.2 公共函数 3.3 信号 4.实例程序演示时间日期与定时器的使用 …

创建型模式之工厂方法模式

一、概述 1、工厂方法模式&#xff1a;定义一个用于创建对象的接口&#xff0c;让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类 2、工厂方法模式&#xff1a;不再提供一个按钮工厂类来统一负责所有产品的创建&#xff0c;而是将具体的按钮创建过程交…