Unity多国语言支持

Unity多国语言支持

 项目在我的课程 ”淘金城堡“ 中应用

项目的地址:http://t.csdnimg.cn/m0hFd

一、基本概念

在Unity中加入多国语言的支持可以让我们发布的游戏或应用上线在拥有不同语言的国家或地区。

下面介绍一款Unity官方提供的插件“Localization package”,使用这款插件可以为应用程序配置本地化设置。

“Localization package”包增加了对多种语言和地区变体的支持,包括:

(1)字符串本地化:根据区域设置要显示的不同字符串。使用智能字符串功能可以添加逻辑以自动替换特定字符串,如占位符和复数。

(2)资源本地化:根据区域设置使用不同的资源(如纹理、模型或音频文件)。

(3)伪本地化:在添加翻译之前,测试您的项目如何在早期阶段适应不同的本地化。

将本地化数据导入并导出到XLIFF、CSV和Google Sheets。

使用本地化包将本地化添加到您的项目中,以帮助更广泛的受众更容易访问您的应用程序。

二、Unity下安装和配置

1、安装

通过菜单 Window -> Package Manager打开包管理器

在 Packages:In Project下拉框选择 Unity Registry,

在右上角搜索框中输入“Localization”即出现我们需要的包,然后点击右侧的“Install”按钮进行安装

2、配置

通过菜单 Edit -> Project Settings ,左边点击条目Localization,然后右边面版点击按钮“Create”,然后在对话框中起名并保存我们的多语言设置文件,如下

如上,如果我们的设置文件已经存在,则可以通过上图“Active Settings”右边的搜索按钮在项目中寻找我们的已经有的设置文件。

完成后如下

在Localization面版,点击按钮“Local Generator”,然后在对话框中勾选“Chinese(Simplifield)”和”English”,选择两种语言支持,然后再点击面版最下面的按钮“Generate Locales”,然后保存到合适的位置。

然后会生成两种语言的Unity资源文件,如下

后期如果我们想再增加其它语言支持,可以再次执行以上步骤;或想删除某种语言的支持时,选择一条语言,然后点击“删除”按钮,如下图

设置默认语言即首先项,我选的是Chinese,如下

 建立Unity的表资源-名称为“LanguageConfigTable”,用于管理我们的语言,以方面在Unity的UI控件和代码的调用,如下

在面版“Localization Tables”里,保证“New Table Collection”标签页选中,默认勾选我们的两个语言资源,然后Type选择String Table Collection(文本表方式),在“Name”字段 输入我们的表名,然后再点击右边的“Create”按钮

3、UI控件及代码的调用

(1)填写测试内容

打开面版“Localization Tables”,并切换到标签页“Edit Table Collection”,然后选择我们刚才建立的表资源 - “LanguageConfigTable”,在下面列表添加我们的测试内容,如下

(2)UI控件中的使用

建立我们的测试UI

如下,Text控件NichengLabel的组件Text,点击它的右侧竖向的三个点,弹出对话框,选择“Localize”

上面的操作会给Text控件增加一个”Localize String Event”组件,然后选择我们的资源表及资源表的条目,如下

注意:当我们在组件“Localize String Event”中选择好”String Reference”的项目后UI部分就会自动显示我们的本地化的首先项,如上面的 Text控件的内容为默认首先为中文“昵称”。

设置完成后,运行我们的程序,则会自动切换到我们的本地化设置项,并且通过”Game”面版的右上角切换我们的语言,如下

同理,设置我们的下面两个Button,如下

(3)应用运行时动态切换我们的语言

新建两个按钮,一个是“切换中文”,一个是“切换英文”

然后新建以下脚本

public class LocalizationManager : MonoBehaviour

{

    /// <summary>

    /// 当前选择的locale;

    /// </summary>

    public Locale CurSelectedLocale;

    private Locale m_ChineseLocale;

    private Locale m_EnglishLocale;

    private AsyncOperationHandle m_LocalizationInitialize;

    // Start is called before the first frame update

    void Start()

    {

        // SelectedLocaleAsync will ensure that the locales have been initialized and a locale has been selected.

        m_LocalizationInitialize = LocalizationSettings.SelectedLocaleAsync;

        if (m_LocalizationInitialize.IsDone)

        {

            LocalizationInitializeCompleted(m_LocalizationInitialize);

        }

        else

        {

            m_LocalizationInitialize.Completed += LocalizationInitializeCompleted;

        }

    }

    private void LocalizationInitializeCompleted(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-Hans)")

            {

                m_ChineseLocale = locale;

            }

            else if (locale.LocaleName == "English (en)")

            {

                m_EnglishLocale = locale;

            }

        }

        

        CurSelectedLocale = LocalizationSettings.SelectedLocale;

    }

    public void SetLocaleChinese()

    {

        LocalizationSettings.Instance.SetSelectedLocale(m_ChineseLocale);

    }

    public void SetLocaleEnglish()

    {

        LocalizationSettings.Instance.SetSelectedLocale(m_EnglishLocale);

    }

    // Update is called once per frame

    void Update()

    {

        

    }

将脚本绑定到Canvas上,让两个按钮分别调用SetLocaleChinese()和SetLocaleEnglish()就可以了。

(4)应用运行时动态设置本地化的文本

这种情况适合于,用户自己通过应用的设置面版自由切换自己喜欢的语言。

打开我们的“Localization Tables”本地化面版,增加一个key:DynamicText,内容为中文“我相信这是一个动态文本。”,英文“I believe this is a dynamic text.”,如下

然后建立如下脚本:

using System.Collections;

using UnityEngine.ResourceManagement.AsyncOperations;

using UnityEngine;

using UnityEngine.Localization.Settings;

using UnityEngine.UI;

using UnityEngine.Localization;

using UnityEngine.Localization.Tables;

public class LocalizationDynamic : MonoBehaviour

{

    [SerializeField]

    public Text m_DynamicText;

    private LocalizedStringTable m_LocalizedTable =

           new LocalizedStringTable { TableReference = "LanguageConfigTable" };

    private void OnEnable()

    {

        m_LocalizedTable.TableChanged += OnTableChaned;

    }

    private void OnDisable()

    {

        m_LocalizedTable.TableChanged -= OnTableChaned;

    }

    void Start()

    {

        StartCoroutine(OnDynamicText());

    }

    IEnumerator OnDynamicText()

    {

        var asyncOperation = LocalizationSettings.StringDatabase.GetTableAsync("LanguageConfigTable");

        yield return asyncOperation;

        if (asyncOperation.Status == AsyncOperationStatus.Succeeded)

        {

            var stringTable = asyncOperation.Result;

            m_DynamicText.text = stringTable.GetEntry("DynamicText").GetLocalizedString();

        }

        else

        {

            Debug.LogError("Could not load String Table\n" + asyncOperation.OperationException.ToString());

        }

    }

    private void OnTableChaned(StringTable stringTable)

    {

        m_DynamicText.text = GetLocalizedString(stringTable, "DynamicText");

    }

    private string GetLocalizedString(StringTable table, string entryName)

    {

        return table.GetEntry(entryName).GetLocalizedString();

    }

}

上面代码当切换语言时,“OnTableChaned”会回调到,文本内容也会改变。

将脚本附着到“Canvas”上,然后将运行后,如下图

(5)资源多语言的本地化

上面(4)(5)我们做的是针对“Text”控件的多语言本地化,除了文本以外,我们还有很多的资源类需要本地化如图片,下面我们继续

我们在增加两个图片资源,如下

打开我们的“Localization Tables”面版,切换到标签“New Table Collection”,Type选择“Asset Table Collection”,Name设置为“LanguageConfigTable”,这是表名,然后点击右边的按钮”Create”,并保存位置,如下

完成后会切换到”Edit Table Collection”面版,并显示我们刚才建立的资源,如下

然后增加一个条目,并将后面中文和英文资源设置成我们刚才的两个图片,如下

好,我们开始在场景中使用它,在场景中建立一个“Image”对象,“Inspector”面版右侧点击按钮弹出菜单,选择命令“Localize”,如下

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

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

相关文章

FinLex An effective use of word embeddings for financial lexicon generation

FinLex: An effective use of word embeddings for financial lexicon generation 论文阅读 文章目录 FinLex: An effective use of word embeddings for financial lexicon generation 论文阅读 AbstractMethodology具体词表例子LM 词列表与 FinLex 词列表 词列表在分类任务中…

EMT-DAVT--基于子空间分布对齐和决策变量转移的多目标多任务优化

EMT-DAVT–基于子空间分布对齐和决策变量转移的多目标多任务优化 title&#xff1a; Multiobjective Multitasking Optimization With Subspace Distribution Alignment and Decision Variable Transfer author&#xff1a; Weifeng Gao, Jiangli Cheng, Maoguo Gong, Hong L…

FreeRTOS实战指南 — 3.1 C语言链表

目录 1 单向链表 1.1 单链表的概念 1.2 链表增加头结点的作用 1.3 单链表的实现 2 循环链表 3 双向链表 为什么学习链表&#xff1f;FreeRTOS使用链表来管理任务调度&#xff0c;来维护不同优先级的就绪任务&#xff1b;许多内部数据结构&#xff0c;如任务控制块&#x…

机器学习 vs 深度学习:深入浅出解析两者的区别

在当今科技飞速发展的时代&#xff0c;**机器学习&#xff08;Machine Learning&#xff09;和深度学习&#xff08;Deep Learning&#xff09;**成为了人工智能&#xff08;AI&#xff09;领域的热门话题。无论你是技术专家、学生&#xff0c;还是对AI感兴趣的普通读者&#x…

Pointnet++改进57:全网首发SCSA(2024最新注意力机制)|即插即用,提升特征提取模块性能

简介:1.该教程提供大量的首发改进的方式,降低上手难度,多种结构改进,助力寻找创新点!2.本篇文章对Pointnet++特征提取模块进行改进,加入SCSA注意力机制,提升性能。3.专栏持续更新,紧随最新的研究内容。 目录 1.理论介绍 2.修改步骤 2.1 步骤一 2.2 步骤二 2.3 步骤…

搭子app有哪些?找搭子用什么软件?8款找搭子平台清单分享

在这个快节奏的现代社会&#xff0c;人们常常渴望找到志同道合的伙伴&#xff0c;一同分享生活中的喜怒哀乐、探索未知的领域。而找搭子软件的出现&#xff0c;如同璀璨星辰照亮了我们的社交天空。下面就为你带来一份精心整理的找搭子软件清单。 1. 咕哇找搭子小程序&#xff1…

2----手机维修工具 集合解锁 修复参数 刷机支持高通 MTK 展讯等芯片 支持一些PDA设备

这款工具在早些年使用较普遍. 。支持的机型非常多。不但支持国内品牌机型还支持很多国外机。总计多达几百种型号。功能选项较多。唯一的缺点是英文版。需要一定的英文基础的友友使用。支持各类机型修复系统 修复参数 读取信息 备份分区等等。以及一些小品牌机型的root 备份基带…

RT-DETR改进策略:BackBone改进|Swin Transformer,最强主干改进RT-DETR

摘要 在深度学习与计算机视觉领域,Swin Transformer作为一种强大的视觉Transformer架构,以其卓越的特征提取能力和自注意力机制,正逐步引领着图像识别与检测技术的革新。近期,我们成功地将Swin Transformer引入并深度整合至RT-DERT(一种高效的实时目标检测与识别框架)中…

解决iframe嵌套第三方页面被拒绝

背景 很多时候&#xff0c;出于安全考虑&#xff0c;没有第三方页面的允许&#xff0c;我们是无法直接通过iframe去打开别人的第三方页面的&#xff0c;通常他们会通过在页面请求的响应头增加X-Frame-Options (去了解)和Content-Security-Policy (去了解)。 目的 可是有些时…

尚品汇-秒杀商品存入缓存、Redis发布订阅实现状态位(五十一)

目录&#xff1a; &#xff08;1&#xff09;秒杀业务分析 &#xff08;2&#xff09;搭建秒杀模块 &#xff08;3&#xff09;秒杀商品导入缓存 &#xff08;4&#xff09;redis发布与订阅实现 &#xff08;1&#xff09;秒杀业务分析 需求分析 所谓“秒杀”&#xff0…

I2C/IIC学习笔记

I2C/IIC 有些同学I2C和IIC分不清&#xff0c;I2C和IIC实际上是指同一种通信协议。I2C是Inter-Integrated Circuit的缩写&#xff0c;而IIC是它的另一种表述方式&#xff0c;代表的是同一个意思&#xff0c;即“集成电路间总线”。I2C是一种由飞利浦公司&#xff08;现恩智浦半…

【题解】【枚举】—— [USACO1.5] 回文质数 Prime Palindromes

【题解】【枚举】—— [USACO1.5] 回文质数 Prime Palindromes [USACO1.5] 回文质数 Prime Palindromes题目描述输入格式输出格式输入输出样例输入 #1输出 #1 提示 思路1.素数筛法1.1.思路解析1.2.参考代码 解法1.打表1.1.思路解析1.2.AC代码 解法2.构造回文数2.1.思路解析2.2.…

Matlab Simulink 主时间步(major time step)、子时间步(minor time step)

高亮颜色说明&#xff1a;突出重点 个人觉得&#xff0c;&#xff1a;待核准个人观点是否有误 高亮颜色超链接 文章目录 对Simulink 时间步的理解Simulink 采样时间的类型Discrete Sample Times(离散采样时间)Controllable Sample Time(可控采样时间) Continuous Sample Times(…

基于springboot大学生就业招聘系统的设计与实现

大学生就业招聘系统的设计与实现 摘要 随着信息互联网信息的飞速发展&#xff0c;大学生就业成为一个难题&#xff0c;好多公司都舍不得培养人才&#xff0c;只想要一专多能之人才&#xff0c;不愿是承担社会的责任&#xff0c;针对这个问题开发一个专门适应大学生就业招聘的…

HTML+CSS - 网页布局之多列布局定位

1. 多列布局 CSS中多列布局处理文本内容&#xff0c;特别适合对于长段落或者大量文本进行自动分栏显示 类似于grid分布&#xff0c;但相较之下更加简洁明了 基本语法 <div class"container"><p>这是一些示例文本&#xff0c;当我们使用 column-count…

CGAL GIS 应用 - 从点云到DTM

CGAL GIS 应用 - 从点云到DTM GIS应用中使用的许多传感器(例如激光雷达)都会生成密集的点云。此类应用通常利用更高级的数据结构:例如&#xff0c;不规则三角网(TIN)&#xff0c;它可以作为数字高程模型(DEM)的基础&#xff0c;特别是用于生成数字地形模型(DTM)。 点云也可以通…

SOMEIP_ETS_111: SD_Empty_Entries_Array

测试目的&#xff1a; 验证DUT能够忽略声明了条目数组长度为零的SubscribeEventgroup消息。 描述 本测试用例旨在确保DUT在接收到一个Entries数组长度为零的SubscribeEventgroup消息时&#xff0c;能够正确地忽略该消息&#xff0c;不对其进行解释或响应。 测试拓扑&#x…

移动UI案例:工具类app整套案例

工具类App是指提供各种实用工具和功能的手机应用程序。这些工具可以包括但不限于日历、闹钟、备忘录、翻译、计算器、单位转换、天气预报、地图导航、音乐播放器、相机、视频编辑等。这些工具类App能够帮助用户解决日常生活和工作中的各种问题&#xff0c;提高效率和便利性。 …

基于是springboot小区物业管理系统

小区物业管理系统 摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于小区物业管理系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了小区物业管理系统&#x…

Redis的存储原理和数据模型

一、Redis是单线程还是多线程呢&#xff1f; 我们通过跑redis的代码&#xff0c;查看运行的程序可以得知&#xff0c;Redis本身其实是个多线程&#xff0c;其中包括redis-server&#xff0c;bio_close_file&#xff0c;bio_aof_fsync&#xff0c;bio_lazy_free&#xff0c;io_t…