分享一下Unity多语言插件I2 Localization的简单使用方法,以多语言文字为例,图片功能demo中也实现了。
提前解释一下该插件中最重要的一个概念:Term。本质其实就是一个资源的ID,一个Term管理不同语言的相同资源。比如:一个Term名称为Test,它可以设置不同的资源类型,文字、图片、字体之类,Test可以依据你添加的语言设置不同语言下的资源。
一、首先导入插件包,目录是 子
其中最主要的是Resources下面的那个预制体,它是项目的“语言管理器”,可以管理项目中的Term。
注意:如果直接点击然后编辑预制体,则表示全局设置,即整个游戏的设置;如果把预制体I2Languages拖到场景中,则表示该场景的设置。它的Inspector面板中有个LanguageSouce组件,在这个组件上添加项目需要使用的语言:选择Language 页,填写语言名称,选择语言代码,如下图:
二、添加Term
1、步骤一中添加了语言,现在添加资源。选择Term页,点击 + ,填写Term的名称,点击CreateKey,如下(本人已经添加过4个):
2、点击刚才添加的Term名称,展开编辑选项,如下图。需要设置该Term对应的资源类型,可以有Text、Font、AudioClip、Sprite等等。下面会依据刚才添加的语言种类让你绑定 不同语言的对应资源,这样,一个Term就完成了。一个Term就是不同语言对应不同资源的同一个ID。
三、场景添加UI,并且本地化
在场景中新建一个Text,在该Text上添加Localize脚本。注意一下三个箭头处:1、Target:指当前UI的类型,一般插件会自动选中;2、Term:这个UI需要的那个资源对应的Term,选中之后下面的资源随之改变;3、OpenSource:选择步骤一中拖的那个 I2Languages预制体。
四、静态改变语言
称为静态改变,意思是UI上的文字、图片都是游戏启动前设置好的。
1、在一个GameObject上添加SetLanguage脚本,为了方便,我直接将其加到I2Language预制体上。然后把预制体拖到LanguageSource上,如下
2、写测试脚本,为了方便,本人又把测试脚本添加到 I2Language预制体上了。。。写一个方法,传入的参数是步骤一中添加的语言名称的字符串,如下:
public void SetLanguage(string language)
{
setLanguage._Language = language;
setLanguage.ApplyLanguage();
}
将该方法绑定到按钮点击事件,并传入语言名称即可,效果如下(但愿能动):
五:动态更改语言
假如在代码中我们将上面的文字改变了,并且再次切换语言,怎么保持同步?如下
1、添加新文字的Term,如下:
2、在代码中更改Text的文字时,不能去Text组件Text.text = “XXX”这么写了,不然不能动态转换语言,转换之后会Text会变为初始值。这么写:
[SerializeField]
private Localize textLocalize;
textLocalize.SetItem("BehindTheMountain");
关联需要修改的Text的Localize组件,然后SetItem(),参数是Term名称。效果如下:
六、总结
以上是多语言文字的基本使用例子,demo中有图片的多语言例子,其他资源的方法类似,详细文档参考 http://www.inter-illusion.com/assets/I2LocalizationManual/I2LocalizationManual.html
【补充】【2017-1-11】
我们刚才创建了很多Term,但是有时候我们需要得到那个Term对应的本地化之后的字符串,该怎么办。
开发过Android的同学应该都知道,Android中对于string资源的使用采用一个ID对应一个的String,这个ID会生成在R文件中,编写代码是直接使用R.string.xxx
来得到资源。而I2这个插件也使用这个思路。
在LanguageSource的预制体上,找到Tool-Script,选中你需要生成ID的Term,一般就点All全选吧,然后点击底部的”Build Script with Selected Terms”,生成ID,生成的ID名和你的Term名称一样。
打开ScriptLocalization脚本,你会发现里面都是一些静态字段,其实每个ID的Get最终都是调用前面的三个方法中的一个。如下图:
之后我们就可以在代码中这样得到需要的本地化之后的字符串了:
ScriptLocalization.XXX;//XXX是你Term的ID
本人没有试在代码中将语言改变前后,这样得到的是不是对应语言下的字符串。有需要的可以试试。还有,这种通过ID得到资源,似乎只适用字符串资源(因为本人写了Image的Term,但返回的都是String类型)。