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”,如下