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

请添加图片描述

      • 前言
  • 【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.rhkb.cn/news/232121.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

el-form点击提交后把验证失败的数据传给了后端

问题&#xff1a;版本号需要根据后端返回的结果查看是否可用&#xff0c;在这里1.0.0是不可用的&#xff0c;如果点击其他地方则会报红&#xff0c;可是直接点击提交&#xff0c;则会把1.0.0这个错误的数据也提交给后端。 解决方案&#xff1a; html代码&#xff1a; <el…

C++上位软件通过LibModbus开源库和西门子S7-1200/S7-1500/S7-200 PLC进行ModbusTcp 和ModbusRTU 通信

前言 一直以来上位软件比如C等和西门子等其他品牌PLC之间的数据交换都是大家比较头疼的问题&#xff0c;尤其是C上位软件程序员。传统的方法一般有OPC、Socket 等&#xff0c;直到LibModbus 开源库出现后这种途径对程序袁来说又有了新的选择。 Modbus简介 Modbus特点 1 &#…

C# Attribute特性实战(1):Swtich判断优化

文章目录 前言简单Switch问题无参Swtich方法声明Swtich Attribute声明带有Swtich特性方法主方法结果 有参Switch修改代码修改运行过程运行结果 总结 前言 在经过前面两章内容的讲解&#xff0c;我们已经简单了解了如何使用特性和反射。我们这里解决一个简单的案例 C#高级语法 …

KVM虚拟化技术

在当今的云计算时代&#xff0c;虚拟化技术已经成为了企业和个人用户的首选。而在众多虚拟化技术中&#xff0c;KVM&#xff08;Kernel-based Virtual Machine&#xff09;虚拟化技术因其高性能、低成本和灵活性而备受青睐。本文将介绍KVM虚拟化技术的原理、特点以及应用场景。…

ClickHouse基础介绍

目录 前言 1、什么是clickhouse 2、OLAP场景的关键特征 3、列式存储更适合于OLAP场景的原因 4、clickhouse的独特功能 5、clickhouse的缺点 6、性能 6.1、单个大查询的吞吐量 6.2、处理短查询的延迟时间 6.3、处理大量短查询的吞吐量 6.4、数据的写入性能 前言 11月…

【Proteus仿真】【Arduino单片机】水箱液位监控系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用LCD1602液晶、按键、蜂鸣器、液位传感器、ADC转换器、水泵等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示当前水位、上下限阈…

XD6500S一款串口SiP模块 射频LoRa芯片 内置sx1262

1.1产品介绍 XD6500S是一款集射频前端和LoRa射频于一体的LoRa SIP模块系列收发器SX1262 senies&#xff0c;支持LoRa⑧和FSK调制。LoRa技术是一种扩频协议优化低数据速率&#xff0c;超长距离和超低功耗用于LPWAN应用的通信。 XD6500S设计具有4.2 mA的有效接收电流消耗&#…

Android studio环境配置

1.搜索android studio下载 Android Studio - Download 2.安装 3.配置环境 配置gradle&#xff0c;gradle参考网络配置。最后根据项目需求选择不同的jdk。

c语言-整型在内存的存储

文章目录 前言一、整型数值在内存中的存储1.1 整型数值的表示形式1.2 二进制的表示形式1.3 整数在内存中存储 二、大端字节序存储和小端字节序存储2.1 大端字节序存储2.2 小端字节序存储2.3 练习 总结 前言 本篇文章叙述c语言中整型数据在内存中的存储方式。 一、整型数值在内…

Java:IO流详解

文章目录 基础流1、IO概述1.1 什么是IO1.2 IO的分类1.3 顶级父类们 2、字节流2.1 一切皆为字节2.2 字节输出流 OutputStream2.3 FileOutputStream类2.3.1 构造方法2.3.2 写出字节数据2.3.3 数据追加续写2.3.4 写出换行 2.4 字节输入流 InputStream2.5 FileInputStream类2.5.1 构…

Unity | NGO网络框架

目录 一、相关属性及变量 1.ServerRpc属性 2.ClientRpc属性 3.NetworkVariable变量 二、相关组件 1.NetworkManager 2.Unity Transport 3.Network Object 4.NetworkBehaviour&#xff1a; 5.NetworkTransform Syncing(Synchronizing) Thresholds Interpolation 三…

fastadmin学习02-修改后台管理员账号密码

问题 如果是别人部署好的fastadmin网站不知道后台登录地址和账号密码怎么办 后台登录地址 public目录下有一个很奇怪的php就是后台登录地址啦 忘记账号密码 找到fa_admin&#xff0c;fa_是前缀&#xff0c;肯能每个项目不太一样 UPDATE fa_admin set password1d020dee8ec…

【LMM 011】MiniGPT-5:通过 Generative Vokens 进行交错视觉语言生成的多模态大模型

论文标题&#xff1a;MiniGPT-5: Interleaved Vision-and-Language Generation via Generative Vokens 论文作者&#xff1a;Kaizhi Zheng* , Xuehai He* , Xin Eric Wang 作者单位&#xff1a;University of California, Santa Cruz 论文原文&#xff1a;https://arxiv.org/ab…

TypeScript 从入门到进阶之基础篇(三) 元组类型篇

系列文章目录 TypeScript 从入门到进阶系列 TypeScript 从入门到进阶之基础篇(一) ts基础类型篇TypeScript 从入门到进阶之基础篇(二) ts进阶类型篇TypeScript 从入门到进阶之基础篇(三) 元组类型篇TypeScript 从入门到进阶之基础篇(四) symbol类型篇 持续更新中… 文章目录 …

JDBC数据库访问——数据库操作

与指定的数据库建立连接后&#xff0c;就可以使用JDBC提供的API对数据库进行操作&#xff0c;包括查询、新增、更新、删除等。 1.查询操作 和数据库建立连接后&#xff0c;对数据库表进行查询操作的步骤如下&#xff1a; ①创建statement对象 由已创建的Connection对象con调…

【MySQL】事务Transaction

1. 事务的概念 事务是什么 在业务逻辑中使用sql&#xff0c;面对一些较复杂的场景&#xff0c;是需要多个sql语句组合起来实现的。如&#xff1a;银行的转账业务&#xff0c;若客户A要转账100元给客户B&#xff0c;就要两条sql&#xff1a;A余额减100&#xff0c;B余额加100&a…

深度学习(学习记录)

题型&#xff1a;填空题判断题30分、简答题20分、计算题20分、综合题&#xff08;30分&#xff09; 综合题&#xff08;解决实际工程问题&#xff0c;不考实验、不考代码、考思想&#xff09; 一、深度学习绪论&#xff08;非重点不做考察&#xff09; 1、传统机器学习&…

Android学习(一):Android Studio安装与配置

Android学习&#xff08;一&#xff09;&#xff1a;Android Studio安装与配置 一、安装 下载地址 下载zip文件&#xff0c;免安装。 二、下载资源 启动后&#xff0c;出现该弹框&#xff0c;点击Cancel。 点击Next 默认&#xff0c;点击Next。 点击Next。 点击Finish 开始…

鸿蒙应用中的通知

目录 1、通知流程 2、发布通知 2.1、发布基础类型通知 2.1.1、接口说明 2.1.2、普通文本类型通知 2.1.3、长文本类型通知 2.1.4、多行文本类型通知 2.1.5、图片类型通知 2.2、发布进度条类型通知 2.2.1、接口说明 2.2.2、示例 2.3、为通知添加行为意图 2.3.1、接…

Vue小练习--任务列表

这是一个非常实用的例子&#xff0c;主要实用的是v-model、v-on、v-for指令&#xff0c;javaScript的数组也会涉及一些&#xff0c;javaScript数组方法有很多&#xff0c;本文使用的添加元素和删除元素非常实用&#xff0c;可以记下来。 设计思路 很多例子看起来很难&#xf…