Unity多国语言支持

news2024/11/14 13:35:03

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.coloradmin.cn/o/2142277.html

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

相关文章

USB中的传输和事务

文章目录 一、USB中的四种事务1. **控制事务&#xff08;Control Transaction&#xff09;**2. **批量事务&#xff08;Bulk Transaction&#xff09;**3. **中断事务&#xff08;Interrupt Transaction&#xff09;**4. **等时事务&#xff08;Isochronous Transaction&#x…

C++第五十弹---类型转换全解析:从静态到动态,一网打尽

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1. C语言中的类型转换 2. 为什么C需要四种类型转换 2.1、内置类型 -> 自定义类型 2.2、自定义类型 -> 内置类型 2.3、自定义类型 -&…

Suno新上线Covers翻唱新 - 实现音频风格任意转换

历史文章 Suno AI如何解决中文多音字的问题&#xff1f;耗费500积分&#xff0c;亲测有效 &#xff0c;V4版本会不会直接支持呢&#xff1f; 上传音频&#xff0c;打造贴合您喜好的风格歌曲创作&#xff0c;这一波新玩法我打8分 Suno AI Noisee AI 做抖音冥想账号实操 音乐…

网络安全-利用 Apache Mod CGI

一、环境 蚁剑官网拉取 二、开始操作 蚁剑连接 一样终端命令不能执行 可以看到putenv已经禁用 我们开始一下&#xff0c;跳入一个新终端且可以执行命令 我们具体看一下干了什么事情 上传了一个htaccess这个文件的作用是让以后所有ant文件都以cgi去执行 三、总结 cgi文件可以…

【C++】C++的多态

目录 多态的使用 多态的概念 多态的定义和实现 虚函数 构成多态的条件 特殊情况&#xff1a;协变 析构函数的重写 怎么实现 为什么实现 override和final关键字 override final 重载/重写/隐藏的对比 纯虚函数和抽象类 纯虚函数 抽象类 多态的实现 虚函数表指针…

魔方财务安装指南

本文将详细介绍魔方财务的安装、升级和迁移过程&#xff0c;确保您能够顺利地部署和使用魔方财务系统。 服务器配置一览表 以下是魔方财务1.0.0及更高版本的最低和推荐系统要求&#xff1a; 需求名称推荐配置最低要求OSCentOS/Debian/UbuntuLinux&#xff08;不要使用window…

IP协议及相关特性

IP协议负责地址管理和路由选择。它的组成为&#xff1a; 接下来我们将对其中较重要的部分进行介绍。 4位版本&#xff1a;这里的四位版本只有两个取值 分别为IPv4和IPv6&#xff0c;这两个额分别为不同的IP协议&#xff0c;但是现在主流的还是IPv4但是近年来IPv6在中国的普及率…

2022高教社杯全国大学生数学建模竞赛C题 问题一(1) Python代码演示

目录 问题 11.1 对这些玻璃文物的表面风化与其玻璃类型、纹饰和颜色的关系进行分析数据探索 -- 单个分类变量的绘图树形图条形图扇形图雷达图Cramer’s V 相关分析统计检验列联表分析卡方检验Fisher检验绘图堆积条形图分组条形图分类模型Logistic回归随机森林import matplotlib…

中秋之际,唱响工体!玛丽亚·凯莉2024演唱会北京站璀璨上演

续写传奇华章 启幕音乐盛典 中秋之际&#xff0c;全国数万乐迷翘首以待的音乐盛典如约而至。时隔多年&#xff0c;传奇天后玛丽亚凯莉惊艳开唱工体&#xff01; 夜幕降临&#xff0c;圆月高悬&#xff0c;在不绝于耳的欢呼声中&#xff0c;玛丽亚凯莉以一袭流光溢彩的礼服优雅…

【LIO】FAST-LIO论文详解

FAST-LIO论文详解 1. 摘要2. 简介1. 相关工作A. LiDAR 里程计和地图绘制 2. 实现方法A. 基础知识1. 连续模型在这里插入图片描述 B. 激光雷达测量的预处理C. 状态估计1) 前向传播&#xff1a;2) 反向传播与运动补偿&#xff1a;3) 残差计算&#xff1a; 1. 摘要 提出了一种计算…

简单题21 - 合并两个有序链表(Java)20240917

问题描述&#xff1a; java代码&#xff1a; /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val…

Java 技巧 如何在IDEA2024 中快速打出System.out.println();

1.基本用法 键入sout回车 回车后变成&#xff1a; 2.打印变量 快速打印变量,以打印变量名为set为例&#xff0c;set.sout回车&#xff0c; 回车后变成

简单题26 - 删除有序数组中的重复项(Java)20240917

问题描述&#xff1a; java代码&#xff1a; class Solution {public int removeDuplicates(int[] nums) {if (nums.length 0) return 0; // 处理空数组情况int i 0; // 指向新数组中的最后一个不重复元素for (int j 1; j < nums.length; j) {if (nums[j] ! nums[i]) { …

室内灯具检测系统源码分享

室内灯具检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

从kaggle竞赛零基础上手CV实战(Deepfake检测)

关注B站可以观看更多实战教学视频&#xff1a;hallo128的个人空间 从kaggle竞赛零基础上手CV实战 从kaggle竞赛零基础上手CV实战&#xff08;Deepfake检测&#xff09; 目录 从kaggle竞赛零基础上手CV实战&#xff08;Deepfake检测&#xff09;背景介绍学习地址课程大纲课程特色…

方法引用(Java)

把已经有的方法拿过来用&#xff0c;当做函数式接口中抽象方法的方法体 1.引用处必须是函数式接口 2.被引用的方法必须已经存在 3.被引用的方法形参的返回值需要跟抽象方法保持一致 4.被引用方法的功能要满足当前需求 package function;import java.util.Arrays;public cl…

网络高级项目( 基于webserver的工业数据采集和控制项目)

目录 一、项目要求&#xff1a; 二、演示效果&#xff1a; 设备端&#xff1a; Modbus用户控制端&#xff1a; 服务器端&#xff1a; 网页端&#xff1a; 三、 项目代码&#xff1a; Modbus用户控制端代码&#xff1a; 服务器端代码&#xff1a; 网页端代码&#xff1…

C++3D迷宫

目录 开头程序程序的流程图程序游玩的效果下一篇博客要说的东西 开头 大家好&#xff0c;我叫这是我58。 程序 #include <iostream> using namespace std; void printmaze(char strmaze[5][5][5]) {cout << "-----" << endl;int i 0;int ia 0…

pdf去水印怎么去掉免费?6个pdf去除水印的方法快码住,超级好用!

pdf去水印怎么去掉免费&#xff1f;您是否有一些带有水印的pdf文档&#xff0c;让您感觉到头疼&#xff1f;您又是否希望能够去除这些水印&#xff0c;或者想用其他水印来替换现有的水印&#xff1f;如果是这样的话&#xff0c;我非常推荐您继续阅读本篇文章。本文将为您提供一…

如何在Linux下升级R版本和RStudio

一、升级R版本 在Linux上&#xff0c;R的安装通常通过包管理器完成。不同的Linux发行版&#xff08;如Ubuntu、Debian、Fedora等&#xff09;可能略有不同。下面以Ubuntu为例&#xff0c;介绍如何升级R版本。如果你使用其他发行版&#xff0c;步骤可能类似。 二.更新步骤 2.…