【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例 教程

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

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

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

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

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Git 使用教程(超级详细)

目录 一&#xff1a;Git二&#xff1a;SVN与Git的的区别三、安装Git四&#xff1a;常规操作五&#xff1a;远程仓库六&#xff1a;创建与合并分支七&#xff1a;bug分支八&#xff1a;多人协作九&#xff1a;git可视化工具 Git Git 是一种分布式版本控制系统&#xff0c;用于…

Knife4j-的使用(详细教程)

参考文档:Knife4j-的使用(详细教程)_knife4j使用-CSDN博客 前言 之前有写过 swagger 怎么使用的教程&#xff0c;但是现在很多项目用的接口文档其实是 Knife4j&#xff0c;Knife4j 它是对 swagger 在线接口文档的一个增强&#xff0c;按照官网的话说就是给 swagger 做了一个更…

数据结构之----数组、链表、列表

数据结构之----数组、链表、列表 什么是数组&#xff1f; 数组是一种线性数据结构&#xff0c;它将相同类型的元素存储在连续的内存空间中。 我们将元素在数组中的位置称为该元素的索引。 数组常用操作 1. 初始化数组 我们可以根据需求选用数组的两种初始化方式&#xff…

Redis分布式锁存在哪些问题,该如何解决?

假设有这样一个场景&#xff0c;在一个购票软件上买一张票&#xff0c;但是此时剩余票数只有一张或几张&#xff0c;这个时候有几十个人都在同时使用这个软件购票。在不考虑任何影响下&#xff0c;正常的逻辑是首先判断当前是否还有剩余的票&#xff0c;如果有&#xff0c;那么…

《Global illumination with radiance regression functions》

总结一下最近看的这篇结合神经网络的全局光照论文。 论文的主要思想是利用了神经网络的非线性特性去拟合全局光照中的间接光照部分&#xff0c;采用了基础的2层MLP去训练&#xff0c;最终能实现一些点光源、glossy材质的光照渲染。为了更好的理解、其输入输出表示如下。 首先…

如何解决Session共享问题?

解决会话&#xff08;Session&#xff09;共享问题&#xff0c;特别是在分布式或负载均衡环境中&#xff0c;通常涉及一些关键策略。 以下是一些常用的方法来解决会话共享问题&#xff1a; 粘性会话&#xff08;Sticky Sessions&#xff09;&#xff1a; 描述&#xff1a;粘性会…

好用的硬盘分区工具,傲梅分区助手 V10.2

傲梅分区助手软件可以帮助用户在硬盘上创建、调整、合并、删除分区&#xff0c;以及管理磁盘空间等操作。它可以帮助你进行硬盘无损分区操作。 支持系统 目前这款软件支持 Windows 7、Windows 8、Windows 10、Windows 11 等个人系统&#xff0c;还支持 Windows 2012/2016/2019…

PixPin带有截图/贴图/长截图/文字识别/标注的截图工具,很好用

官网地址&#xff1a;PixPin 截图/贴图/长截图/文字识别/标注 | PixPin 截图/贴图/长截图/文字识别/标注 确实挺好用的&#xff0c;推荐一下

camera卷帘快门(Rolling Shutter)与全局快门(Global Shutter)

首先来看一下什么叫快门&#xff1a; 快门是照相机用来控制感光元件有效曝光时间的装置。可以理解为光线要想打到相机传感器上必经的一道门。如果快门关着&#xff0c;那么光线进不去&#xff0c;感光元件就无法曝光&#xff1b;门开了&#xff0c;光线进来了&#xff0c;感光元…

世微 DW01 锂电池保护IC 充电器检测过充保护

一、 描述 DW01A 是一个锂电池保护电路&#xff0c;为避免锂电池因过充电、过放电、电流过大导致电池寿命缩短或电池被损坏而设计的。它具有高精确度的电压检测与时间延迟电路。 二、 主要特点 工作电流低 过充检测 4.3V&#xff0c;过充释放 4.05V&#xff1b; 过放检测 2.4…

从零开始的开发教学:搭建企业内训APP

随着企业内训需求的不断增加&#xff0c;搭建一款高效、灵活的企业内训APP成为许多公司的迫切需求。本文将带领读者一步步从零开始&#xff0c;通过简明扼要的教学&#xff0c;构建一款符合企业需求的内训应用程序。 第一步&#xff1a;明确需求和目标 在着手开发之前&#x…

clickhouse函数记录

日期函数 SELECT formatDateTime(create_time,%Y-%m-%d) AS time FROM xx.xx;

Next.js 学习笔记(一)——安装

安装 系统要求&#xff1a; Node.js 18.17 或更高版本支持 macOS、Windows&#xff08;包括 WSL&#xff09;和 Linux 自动安装 我们建议使用 create-next-app 启动一个新的 Next.js 应用程序&#xff0c;该应用程序会自动为你设置所有内容。要创建项目&#xff0c;请运行&…

浅析LDPC软解码对SSD延迟的影响-part1

此前&#xff0c;存储随笔有发布一篇关于SSD QoS相关问题&#xff0c;文章中有从以下方面做了全景的分析&#xff1a; 扩展阅读&#xff1a; 全景解析SSD IO QoS性能优化 SSD基础架构与NAND IO并发问题探讨 本文主要在之前文章的基础上&#xff0c;再做个补充&#xff0c;本…

移动端适配rem(Vant)

需要注意 该插件不能转换行内样式中的px 利用vant提供的 首先安装 可以看到 第二步配置 1.安装 npm install postcss-pxtorem -D 2.在项目根目录创建.postcssrc.js文件 配置完毕&#xff0c;重新启动服务&#xff08;红色是警告&#xff0c;是因为vue-cli已经配置过了&am…

生产环境_Apache Spark技术大牛的实践:使用DataFrame API计算唯一值数量并展示技术(属性报告)

业务背景 给前端提供算法集成好的数据&#xff0c;对算法处理后的数据进行进一步删选展示 可以使用下面代码运行一下看看结果&#xff0c;听有趣的&#xff0c;我写的代码中计算了不同字段的值的数量&#xff0c;并生成了一个显示字符串来描述这些数据的分布情况然后使用"…

Buck电源设计常见的一些问题(二)MOS管炸机问题

MOS管炸机问题 1.概述2.MOS管的相关参数3.过电压失效4.过电流失效5.静电放电和热失效1.概述 在我们做电源产品或者电机控制器时候,经常会坏MOS管。我相信90%以上的硬件工程师在职场生涯中都会遇到这类问题。然而这类问题也总是让人防不胜防。经常我们都会开玩笑的说,没烧过管…

Spring AOP 和 Spring Boot 统一功能处理

文章目录 Spring AOP 是什么什么是 AOPAOP 组成切面&#xff08;Aspect&#xff09;连接点&#xff08;Join Point&#xff09;切点&#xff08;Pointcut&#xff09;通知&#xff08;Advice&#xff09; 实现 Spring AOP添加 Spring AOP 框架支持execution表达式定义切面、切点…

初识SpringSecurity

目录 前言 特点 快速开始 导入依赖 运行项目 访问服务 权限控制 实现UserDetails接口 添加SecurityConfig配置类 测试接口DemoController 设置权限控制authorizeHttpRequests 结果分析 总结 前言 Spring Security是一个强大且高度可定制的身份验证和访问控制框架…

labelme标注json文件检查标注标签(修改imageWidth,imagePath,imageHeight)

# !/usr/bin/env python # -*- encoding: utf-8 -*- #---wzhimport os import json# 这里写你自己的存放照片和json文件的路径 json_dir =rC:\Users\Lenovo\Desktop\json3 json_files = os.listdir(json_dir