【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.mzph.cn/news/222160.shtml

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

相关文章

字符处理 C语言xdoj52

问题描述 从键盘输入一个字符&#xff0c;若为小写字母&#xff0c;则输出其对应的大写字母&#xff1b;若为大写字母&#xff0c;则输出对应的小写字母&#xff1b;其他字符原样输出。 输入说明 输入一个字符 输出说明 输出一个字符 输入样例 样例1输入 a 样例…

分布式块存储 ZBS 的自主研发之旅|元数据管理

重点内容 元数据管理十分重要&#xff0c;犹如整个存储系统的“大黄页”&#xff0c;如果元数据操作出现性能瓶颈&#xff0c;将严重影响存储系统的整体性能。如何提升元数据处理速度与高可用是元数据管理的挑战之一。SmartX 分布式存储 ZBS 采用 Log Replication 的机制&…

论文修改润色平台 PaperBERT

大家好&#xff0c;今天来聊聊论文修改润色平台&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; 标题&#xff1a;论文修改润色平台――助力学术研究&#xff0c;提升论文质量 一、引言 在学术研究中&am…

复制粘贴——QT实现原理

复制粘贴——QT实现原理 QT 剪贴板相关类 QClipboard 对外通用的剪贴板类&#xff0c;一般通过QGuiApplication::clipboard() 来获取对应的剪贴板实例。 // qtbase/src/gui/kernel/qclipboard.h class Q_GUI_EXPORT QClipboard : public QObject {Q_OBJECT private:explici…

单片机——通信协议(FPGA+c语言应用之spi协议解析篇)

引言 串行外设接口(SPI)是微控制器和外围IC&#xff08;如传感器、ADC、DAC、移位寄存器、SRAM等&#xff09;之间使用最广泛的接口之一。本文先简要说明SPI接口&#xff0c;然后介绍ADI公司支持SPI的模拟开关与多路转换器&#xff0c;以及它们如何帮助减少系统电路板设计中的数…

ChatGLM大模型推理加速之Speculative Decoding

目录 一、推测解码speculative decoding 1、自回归解码 2、speculative decoding 3、细节理解 二、核心逻辑代码 1、算法流程代码 2、模型自回归代码 a、带缓存的模型自回归实现代码 b、优化版本带缓存的模型自回归实现代码 c、ChatGLM的past_key_values的回滚 三、…

EM的理论基础

1 EM定义​ 电迁移(Electro-Migration)是指在外加电场下,电子和金属原子之间的动量转移导致材料的运动。这种动量传递导致金属原子(比如Cu原子)从其原始位置移位,如图7-1。这种效应随着导线中电流密度的增加而增加,并且在更高的温度下,动量传递变得更加严重。因此,在先…

[WMCTF2020]Make PHP Great Again require_once 特性

php源码分析 require_once 绕过不能重复包含文件的限制-安全客 - 安全资讯平台 这里是特性 我们首先来解释一下 <?php highlight_file(__FILE__); require_once flag.php; if(isset($_GET[file])) {require_once $_GET[file]; }这个是我们的源代码 PHP包含的格式是将 已…

考验的是技术!如何绕过微软设计的安装Windows 11的硬件要求

这篇文章解释了绕过微软设计的硬件要求的三种方法,允许你在几乎任何电脑上安装Windows 11。 注意:绕过Windows 11要求所涉及的一些过程需要更深入的技术知识。请不要编辑计算机的注册表,除非你对此乐此不疲,因为它可能会损坏你的设备。 绕过Windows 11要求 虽然绕过Wind…

AUTO.js连接电脑时,握手失败

使用模拟器上的autox.js连接vscode。ipv4正确&#xff0c;但总是握手失败。 检查了一下vscode安装的插件&#xff0c;最开始安装的是这个&#xff1a; 将之前安装的插件禁用。 更换这个插件&#xff1a; 然后启动服务后就可以连接成功了。

Nginx服务器配置SSL证书

本文将全面介绍如何在Nginx或Tengine服务器配置SSL证书&#xff0c;具体包括下载和上传证书文件&#xff0c;在Nginx上配置证书文件、证书链和证书密钥等参数&#xff0c;以及安装证书后结果的验证。成功配置SSL证书后&#xff0c;您将能够通过HTTPS加密通道安全访问Nginx服务器…

成分党品牌

现在越来越多的成分党品牌崛起&#xff0c;主打成分护肤&#xff0c;不添加任何成分&#xff0c;其中有Timeless、The Ordinary、John Jeff、欧邦琪&#xff08;Obagi&#xff09;、修丽可&#xff08;SkinCeuticals&#xff09;、HFP 。 参考文章&#xff1a;成分党都会良心推…

试以单链表为存储结构实现简单选择排序的算法

简单选择排序&#xff0c;就是每趟把剩余元素最小或者最大的选出来排到前面 这道题值得推敲的是&#xff0c;p作为一个链表结点也是可以作为for循环的初始条件和判断条件的&#xff0c;至于查找到最小值之后&#xff0c;可以把两者的数值进行一个交换&#xff0c;就不用删结点…

怎么抠图换背景?这三个方法让你轻松抠图

怎么抠图换背景&#xff1f;抠图是每个独立站商家每天必不可少的工作&#xff0c;简单一张图用PS进行抠图还好&#xff0c;但如何多张图&#xff0c;用PS就效率非常低&#xff0c;且需要专业的PS技能才能上手实现精准抠图的目的&#xff0c;那么怎么快速抠图换背景呢&#xff0…

risc-v system instruction

ECALL ecall 指令以前叫做 scall&#xff0c;用于执行环境的变更&#xff0c;它会根据当前所处模式触发不同的执行环境切换异常, 用来执行需要更高权限才能执行的功能; 简单来说&#xff0c;ecall 指令将权限提升到内核模式并将程序跳转到指定的地址。操作系统内核和应用程序…

检测车牌的SIFT特征并匹配

# 代码5-14 检测车牌的SIFT特征并匹配 import cv2img1 cv2.imread(../data/plate.jpg) img2 cv2.imread(../data/car.jpg)sift cv2.SIFT_create() # 利用sift.detectAndCompute()函数找到特征点&#xff0c;计算描述符&#xff1b; kp1, des1 sift.detectAndCompute(img1, …

web279(s2-001)

目前java小白一个&#xff0c;主要是学学别人的思路 进入题目&#xff0c;登录框一个 抓包也没发现什么东西 网上说是struts2框架 Struts2是用Java语言编写的一个基于MVC设计模式的Web应用框架 判断是不是基于struts2的一些方法&#xff1a; 1.通过页面回显的错误消息来判断…

6.5.编解码器信息的收集

那在上节课中呢&#xff1f;我向你介绍了add track相关的内容&#xff0c;那今天呢&#xff1f;我们来看看编解码器信息的收集。那在这里呢&#xff0c;我们需要问几个重要的问题&#xff0c;那首先呢&#xff0c;就是我们上节课通过&#xff0c;可以让web rtc知道我们都要传输…

孩子都能学会的FPGA:第三十一课——用FPGA实现SPI主机发送数据

&#xff08;原创声明&#xff1a;该文是作者的原创&#xff0c;面向对象是FPGA入门者&#xff0c;后续会有进阶的高级教程。宗旨是让每个想做FPGA的人轻松入门&#xff0c;作者不光让大家知其然&#xff0c;还要让大家知其所以然&#xff01;每个工程作者都搭建了全自动化的仿…

安装spaCy及语言包下载安装

文章目录 1. spaCy的安装1.1 安装spaCy包方式1 : 通过pip / conda命令安装方式2 : 通过离线导入 1.2 安装语言模型方式1 : 通过pip / conda命令安装方式2 : 通过离线导入 2. 常见问题a. 版本问题 3. 参考文档 关注公众号&#xff1a;『AI学习星球』 回复&#xff1a;遥感图像语…