天天飞车国际化方案

发表于2015-05-05
评论0 7.6k浏览

1概述

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

2编码方案

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

3、文字

3.1  硬编码文字国际化方案

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

实现步骤如下:

 

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

/common/getfile?fileurl=server2/doc/65b6f7c2-a7cc-4632-81c4-200f7ecf079e.002.png /common/getfile?fileurl=server2/doc/65b6f7c2-a7cc-4632-81c4-200f7ecf079e.003.png

 

 

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文件中插入不通语言对应的字段,如上图。

/common/getfile?fileurl=server2/doc/65b6f7c2-a7cc-4632-81c4-200f7ecf079e.004.png

改造前xsl文件内容

 

/common/getfile?fileurl=server2/doc/65b6f7c2-a7cc-4632-81c4-200f7ecf079e.005.png

改造后xsl文件内容

 

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

中文:

/common/getfile?fileurl=server2/doc/65b6f7c2-a7cc-4632-81c4-200f7ecf079e.006.png

印尼:/common/getfile?fileurl=server2/doc/65b6f7c2-a7cc-4632-81c4-200f7ecf079e.007.png

 

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

/common/getfile?fileurl=server2/doc/65b6f7c2-a7cc-4632-81c4-200f7ecf079e.008.png

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

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

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

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

/common/getfile?fileurl=server2/doc/65b6f7c2-a7cc-4632-81c4-200f7ecf079e.009.png    /common/getfile?fileurl=server2/doc/65b6f7c2-a7cc-4632-81c4-200f7ecf079e.010.png

              改造方案如下:

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

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

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

4UI图片国际化方案

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

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

/common/getfile?fileurl=server2/doc/65b6f7c2-a7cc-4632-81c4-200f7ecf079e.011.png

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

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

/common/getfile?fileurl=server2/doc/65b6f7c2-a7cc-4632-81c4-200f7ecf079e.012.png

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

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

 

/common/getfile?fileurl=server2/doc/65b6f7c2-a7cc-4632-81c4-200f7ecf079e.013.png

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

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

/common/getfile?fileurl=server2/doc/65b6f7c2-a7cc-4632-81c4-200f7ecf079e.014.png

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

/common/getfile?fileurl=server2/doc/65b6f7c2-a7cc-4632-81c4-200f7ecf079e.015.png

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

6、声音文件国际化方案

/common/getfile?fileurl=server2/doc/65b6f7c2-a7cc-4632-81c4-200f7ecf079e.016.png

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

 

7、字符串操作际化

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

国际化前:

/common/getfile?fileurl=server2/doc/65b6f7c2-a7cc-4632-81c4-200f7ecf079e.017.png

国际化后:

/common/getfile?fileurl=server2/doc/65b6f7c2-a7cc-4632-81c4-200f7ecf079e.018.png

 

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引