背景:项目在开发过程中都完全使用的中文开发环境,在代码、配表、ui里面有非常多的地方都直接使用了中文字符串。项目需要上海外,而且支持多个语言版本,切支持个语言版本之间切换,预计会上六七种语言的版本。
思路:使用脚本提取所有含有中文的字符串,根据字符串内容生成唯一的id,然后生成一份id和内容的映射表,将生成的映射表作为原始文件去翻译,格式如图:
id | 中文 | 繁体 | 英文 | 俄语 | 阿拉伯语 | 土耳其语 |
---|---|---|---|---|---|---|
中文生成的id | 提取的中文 | 翻译的繁体 | … | … | … | … |
然后使用生成的id替换掉代码和配置表中的字符串,在显示时在根据id和语言环境去读取对应的字符串。
代码
代码中的不少用+号拼接的字符串,如:"血量 " + 1000
,在中文中UI显示为:
血量 1000
但在其他语言的语序可能是不一样的,需要显示成:
1000 血量
所以直接提取"血量"进行翻译语序就不对了;需要处理成格式化字符串的形式:StrUtils.format("血量 %s", 1000)
,这样给到翻译,翻译可以动态的调整参数的位置,保证语序的正确性。
然后使用 python 脚本或其他工具,提取所有代码文件中的字符串,即单引号和双引号之间的内容,然后将有中文的部分保存,去重,生成上述格式的翻译文件。
通过搜索:+ ", + ', " + 和 ’ + 以快速找出用+好拼接的字符串
配置表
原始配置表不做处理,处理的是由配置表导出到代码中配置文件,比如js或者lua等,这样流程就跟代码一样,直接提取其中的带有中文的字符串即可。
配置表需要注意的是,尽量将配置表中重复的部分,通过参数传入,这样可以减少需要文本的数量,比如描述列:
编号 | 描述 | 其他 |
---|---|---|
10010 | Lv10大宝剑,增加10点攻击 | … |
10020 | Lv20大宝剑,增加20点攻击 | … |
20010 | Lv10铠甲,增加10点攻击 | … |
20020 | Lv20铠甲,增加20点攻击 | … |
直接提取出来就会有4个字符串以下4个字符串需要翻译:
- Lv10大宝剑,增加10点攻击
- Lv20大宝剑,增加20点攻击
- Lv10铠甲,增加10点攻击
- Lv20铠甲,增加20点攻击
可以抽离成两列, 不同部分通过参数传入:
编号 | 描述 | 描述参数 | 其他 |
---|---|---|---|
10010 | Lv%s%s,增加%s点%s | 10;10 | … |
10020 | Lv%s%s,增加%s点%s | 20;20 | … |
20010 | Lv%s%s,增加%s点%s | 10;10 | … |
20020 | Lv%s%s,增加%s点%s | 20;20 | … |
这样就只有一个虽然配表里面有四个字符串 “Lv%s%s,增加%s点%s”,导出的时候可以将其定义为一个变量,在其他导出文件后,就只有一个字符串了。
const s1 = "Lv%s%s,增加%s点%s";
const a1 = [10, 10]
const a2 = [20, 20]
let config = {
10010: [10010, s1, a1],
10020: [10020, s1, a2],
20010: [20010, s1, a1],
20020: [20020, s1, a2],
};
在其他这个文件的字符串时,就只会有一个 “Lv%s%s,增加%s点%s”, 去掉了很多重复的内容,可以直接减少翻译量,同事语言包和配置表大小也能得到减少,从而包体大小和占用的内存大小。
UI
静态文本-删除
在做ui时,界面中有很多的静态文本,是写在在界面上的,不能根据语言版本,动态切换;需要删除ui中的静态文本,在代码中去设置,后续过重就跟代码中的文本一样处理就可以了。
多文本-改单文本
有一点需要注意的是,界面中有可能有多个文本拼接的文字,如 “血量 100”,可能因为对齐方式,或者字体颜色不一样,使用了两个文本“血量”和“100”,为了保证语序和对齐方式的正确性,需要将两个文本合并到一个文本中,变成“血量 100”,如果需要不同颜色,可以使用富文本。
协议
前后端交互的协议中有很多字符串,需要处理掉。
上行的字符串很少,基本上都是不需要翻译的,如果有,建议前后端约定好一个数字id,用于交互。
下行的字符串应该是很多,这一部分需要后端出来:
- 对于不含翻译内容的字符串直接下发
- 如果含有翻译内容,就需要下发对应字符串的 id
- 如果还有参数,就讲这个字符串参数改为数组
客户端在收到协议之后,针对需要处理的协议,在其响应函数中对参数分别进行处理。