您的位置:首页 > 其它

天天飞车国际化方案

2015-07-22 20:31 316 查看
1、概述

天天飞车基于Unity3D引擎开发,UI插件使用的是NGUI,所以此方案适用范围为Unity3D+NGUI开发的项目,其他项目国际化也可以作为参考。

2、编码方案

由于是unity项目,统一采用c#的string类对字符串进行处理,string就是Unicode编码。外部文本统一采用UTF-8编码存储。

3、文字

3.1 硬编码文字国际化方案

对于项目中有硬编码字符的地方,进行改造。提供统一的存储、加载、索引方式。

实现步骤如下:

1、所有的硬编码字符抽取到文本文件中,并赋予唯一标识,天天飞车的字符唯一标识使用字符串。文本文件采用UTF-8格式存储。示例如下:





2、实现工具类Localization,该类负责加载对应语言的文本文件,并提供查询接口。

public string Get (string key)
{
string val;
return (mDictionary.TryGetValue(key, out val)) ? val : key;
}


3、之前硬编码的代码修改为用Localization通过唯一标识来获得对应字符。

void OnUserProtocol()
{
string strUrl = Localization.instance.Get("UserProtocol");
Application.OpenURL(strUrl);
}


3.2、数据表国际化方案

天天飞车对于数据表的读取方案是用TDR组件中的ResConvert工具把xsl转换为二进制文件然后加载的。所以我们需要从源头即xsl开始做改造:

1、要在xsl文件中插入不通语言对应的字段,如上图。



改造前xsl文件内容



改造后xsl文件内容

2、在不同描述文件中转换对应语言的字段。

中文:



印尼:



3、修改转换文件列表,使之生成多个语言的二进制文件,如下图:



4、运行转换工具,数据表被转换到对应的语言目录。

5、程序只需要修改加载数据表的代码,根据语言版本加载对应的数据表即可,所有使用数据的代码均不需要修改。

3.3、编辑器内嵌文字国际化方案

对于编辑器内嵌文字,改造前如左下图字符是写死的。改造后给文本控件对象增加了一个本地化组件,之前写死的字符无效。





改造方案如下:

1、把字符抽取出来放入前面方案3.1所对应的文本中,不同语言放入对应的文本,并定义好唯一标识。

2、实现UILocalize组件,该组件在有个public的属性key,开发人员需要在编辑器里填写第一步定义的唯一标识。

3、UILocalize组件的功能是:调用方案3.1中的工具类Localization,根据key查询对应的字符,将Label组件中的字符替换掉。

4、UI图片国际化方案

UI图片的国际化稍微麻烦点,具体步骤举例如下:

1、将NGUIAtlas”EndGame”所包含的有文字的图片提取并生成新的NGUIAtlas“EndGameChinese”和”EndGameEnglish”,如下图。后二者包含了原本”EndGame”所有相应语言的图片。



2、新建引用类型的NGUIAtlas “EndGameLocal”,将它指向“EndGameChinese”和”EndGameEnglish”中任何一个。

3、修改UISprite组件,将NGUIAtlas指向引用类型的EndGameLocal。



4、给拥有UISprite的对象添加本地化组件UIAtlasLocalize,并填写对应的key(EndGame)。该组件的功能就是程序运行时动态的根据key和语言,对引用类型的NGUIAtlas对象赋值为对应的NGUIAtlas (EndGameChinese还是EndGameEnglish)。

5、如何根据key和语言找到对应的NGUIAtlas文件呢,该组件的实现仍然依赖3.1方案的文本文件。把key和对应语言的NGUIAtlas文件名给对应起来即可,如下图。该组件就可以用Localization类通过key加载到对应的NGUIAtlas文件,并把他赋值给UISprite。



5、场景对象图片国际化方案

项目中有极少量场景中对象的纹理,也会涉及到语言,需要做国际化改造。比如下面这辆卡车,使用了一个带有文字的纹理。



这种情况我们只需要给该对象添加一个材质的本地化组件MaterialLocalize,如下图。



我们只需要把对应语言的图片指定给对应的纹理对象即可。该组件根据语言将纹理设置给对象的材质。

6、声音文件国际化方案



声音国际化最简单,将语言相关音频放在不同的目录下,程序通过语言类型加载播放对应的音频文件即可。

7、字符串操作际化

字符串拼接在本地化中是一个很大的不确定性,各种语言的语法不尽相同,在运行时刻动态拼接要显示的文字,就相当于把语言的语法逻辑内嵌在代码里面,造成本地化的数据内容和代码逻辑强绑定。改造方法就是把原来拼接的句子事前拼接成完整的句子,而不是动态拼接, 其实就是体力活L 举个例子吧:

国际化前:



国际化后:



文章转载自天天飞车国际化方案,感谢作者:程序媛提供好文章
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: