您的位置:首页 > 移动开发 > Unity3D

Unity 本地化比较实用的实现方案

2017-10-23 16:06 417 查看
本篇笔记是在I2Localization插件的基础上针对项目需求,制定的一套本地化技术解决方案,目的是实现一个语言配置文件统一来管理整个游戏的语言本地化,个人认为是非常实用的,有兴趣的同学可以简单看下这个方案的解决思路。

游戏中的本地化考虑两种资源形式:

一、图片本地化
二、文字本地化


图片本地化

图片本地化分为两种情况:

1、用Unity编辑器制作的静态界面图片本地化,如图



这个UI图片不需要程序动态加载,属于静态UI,我们借助本地化工具I2 Localization插件,即可实现这个UI的本地化,使用方法下面再说。

2、代码控制的动态添加的图片资源本地化,如图



这种UI变化涉及到的逻辑比较复杂,我们可能想要程序动态创建和更换这些UI的显示,本地化插件不够灵活,这时候我们把资源放入相应的语言路径下,动态加载即可(动态的资源放入Resoucres)

动态加载方法:

iconImg.sprite = Resources.Load(string.Format("UI/XXUI/{0}/{1}",GameTools.getInstance().getCurrentLanguageDict(),"Button"),typeof(Sprite)) as Sprite;



文字本地化

文字本地化也分为两种情况:

1、用Unity编辑器制作的静态文字界面本地化,如图



这种系统文字也使用本地化插件I2 Localization制作也很方便。

2、代码控制添加的系统文字,如图



在Resouces/Doc目录下编辑如下格式txt文件

#根据";"来截取字符串,所以本地语言文字中不要存在“;”作为值,各个字段之间不能存在空格和换行
Key;Type;Desc;english [bs];Chinese (Simplified);Chinese (Traditional)
reveive;Text;;;领取;

写一个解析脚本,这样可以根据key值读取不同语言的文字,至于为什么是这种格式,下面介绍I2Localization插件的时候再介绍

解析脚本

public class _LocalizationManager : _Instance<_LocalizationManager> {
//存储语言字典
private Dictionary<string,string> __languageDict;

//ctor
public _LocalizationManager(){
__languageDict = new Dictionary<string,string>();
//根据系统语言读取文本
if(Application.isEditor) {
//设置默认语言为中文
GlobalConfig.LANGUAGE = "1";
}
LoadLanguageDictByTxt();
}

/// <summary>
/// 通过txt文件加载游戏文字语言,路径 地址:Resources/Doc/doc.txt
/// </summary>
private void LoadLanguageDictByTxt(){
if(__languageDict.Count > 0){
__languageDict.Clear ();
}
//根据语言,将text格式的行录入语言字典中
string p = "Doc/doc";
TextAsset asseet = Resources.Load<TextAsset>(p);
string l = asseet.ToString();

//解析字符串
string[] firstSplit = l.Split('\n');
for(int i = 0; i< firstSplit.Length; i++){
if(!string.IsNullOrEmpty(firstSplit[i])){
string[] secondSplit = firstSplit[i].Split(';');
if("Text" == secondSplit[1]){
string value = secondSplit[int.Parse(GlobalConfig.LANGUAGE) + 2];
if(string.IsNullOrEmpty(value)){
//如果当前语言没有设置,默认读取中文
value = secondSplit[4];
}
__languageDict.Add(secondSplit[0],value);
} else
continue;
}
}
}

/// <summary>
/// 根据key值,读取文字
/// </summary>
/// <returns>The dic string.</returns>
/// <param name="varKey">Variable key.</param>
public string getDicStr(string varKey){
if(string.IsNullOrEmpty(varKey))
return null;
string text;
if(__languageDict.TryGetValue(varKey,out text)){
return text;
}
return null;
}
}

获取字符串直接调用接口即可: _LocalizationManager.getInstance().getDicStr("xxx");







I2Localization插件使用说明

1、导入I2Localization插件到Unity工程中。



2、关键看这个I2Languages组件(这个预设体是全局的哦,如果不想要全局,拖拽到场景中也可以,但是暂不推荐这样做,后面的封装需要全局),添加默认语言,注意下面勾选Store
Integration IOS和android



3、添加terms,就是添加key-value



4、添加的terms类型要选择正确,区分图片类型和文字类型
5、在项目中创建一个UI(Text),拖拽I2Localization插件中的Localize脚本,然后选择要绑定的key,本地化图片操作相同,至此,本地化制作结束



6、将I2Localization配置的key-value打包(合并)成一个txt文件,方便后期统一翻译,而且用
_LocalizationManager.getInstance().getDicStr("xxx")接口也可以代码动态访问



7、如果手动修改了doc.txt,也可以import进来,点击import面板中的merge即可


优缺点分析:

优点:

1、配置多语言有可视化的界面,更方便。

2、只需要一个文件就能支持n种语言,后期翻译一键搞定。

3、扩展了I2Localization插件的文件解析方法,并且支持程序动态控制语言文字,更加灵活。
缺点:

1、所有的资源和文字都配在一个txt文件中,当游戏本地化数据足够大的时候,解析时间会增加

2、所有的语言配置都在一个文件中,容易造成多人开发冲突
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息