官方说明:提供本地化功能,也就是我们平时所说的多语言。Game Framework 在本地化方面,不但支持文本的本地化,还支持任意资源的本地化,比如游戏中释放烟花特效也可以做出几个多国语言的版本,使得中文版里是“新年好”字样的特效,而英文版里是“Happy New Year”字样的特效。
语言表xml
Demo中有四种语言,路径及内容如下。首先需要把对应的语言写为Xml文件,格式按照Demo的提供的格式来,一个key对应一个value。(格式可以改,后续解析语言表时会说到,解析方式需与语言表的格式对应,否则无法解析成功)本专栏后续会写一个扩展组件,将配置语言表的表格拆分转换为多种语言对应的Xml文件。这里先熟悉语言表怎么使用。
语言设置
启动流程ProcedureLaunch的OnEnter方法进行了语言的设置
public override void OnEnter(ProcedureOwner procedureOwner)
{
base.OnEnter(procedureOwner);
// 语言配置:设置当前使用的语言,如果不设置,则默认使用操作系统语言
InitLanguageSettings();
// 变体配置:根据使用的语言,通知底层加载对应的资源变体
InitCurrentVariant();
// 默认字典:加载默认字典文件 Assets/GameMain/Configs/DefaultDictionary.xml
// 此字典文件记录了资源更新前使用的各种语言的字符串,会随 App 一起发布,故不可更新
GameEntry.BuiltinData.InitDefaultDictionary();
}
语言的设置是从SettingComponent设置组件获取数据,首次进入游戏,这个值没有设置,会使用系统默认语言。编辑器模式下,直接使用编辑器配置的语言。
游戏内部更改并保存语言调用SettingForm里的OnSubmitButtonClick方法,可以看到在设置组件设置完成后,停止播放音乐,并重启了游戏框架。代码如下
public void OnSubmitButtonClick()
{
if (m_SelectedLanguage == GameEntry.Localization.Language)
{
Close();
return;
}
GameEntry.Setting.SetString(Constant.Setting.Language, m_SelectedLanguage.ToString());
GameEntry.Setting.Save();
GameEntry.Sound.StopMusic();
UnityGameFramework.Runtime.GameEntry.Shutdown(ShutdownType.Restart);
}
语言加载
语言表加载在预加载流程ProcedurePreload里完成,通过语言名称获取加载路径,并读取其中的key-value键值对,写入本地化组件。
语言加载完成后,如下图在UI父类UGuiForm里,获取了UI所有的text组件。并将text当前值作为key去获取对应value,并将value写入text。这里有一个不方便的地方,只有游戏运行时,才能够看到页面适配效果,调试也不方便,只能在运行模式下调试效果。后续本地化扩展会改一下这个地方。
文本需要动态赋值也可以使用同样的方式
text.text = GameEntry.Localization.GetString(key);
资源本地化
官方有提到资源的本地化,可以作为实体或UI去调用
先看一下实体,是通过路径获取预制件,并加载预制件,那么只要语言不一样,设置的路径也不一样就可以实现该功能。
可以在AssetUtility里找到预制件获取路径,类似于语言表,每个语言的资源的路径不同,即可实现获取不同的预制件,从而实现不同的新年好高特效。
再看下UI,不用质疑,UI也是通过路径获取的,同样的操作。