缘起公司项目国际化与本地化的需求,本篇文章将从 语言翻译 、 UI设计 、 代码规范 ,这三个方面来进行阐述,其中不免包含本人的主观偏见,如果有任何宝贵的意见,欢迎指正。
1、翻译注意事项
由于我们现在使用的是 腾讯文档 协同处理的翻译文本,而腾讯文档导出后的Excel文件会有些奇怪的小问题,比如说标红文字前后的空格导出后空格会丢失,导致英语等其他语言显示异常。
同时,这么多的文字,加上多达十几种语言的处理,靠人工来转换成App所需资源实在是效率低下,所以脚本工程请参见:http://192.168.1.28:8888/dragon/ExcelProcessor。该工程会根据Excel文件转换为Android和iOS所需的多语言资源,具体使用方式如有需要请参阅项目README文档及源码注释。
在项目中有些文字是不确定的,需要根据情况动态改变。例如说:“几小时之前”,这个几,是会根据你当前时间自动计算的,现在看是“1小时之前”,那么1小时后再看就是“2小时之前”了,所以我们需要一个占位符来表示这个几,Android中会选择使用 %s ,或者 %d ,也就是 %d小时之前 。那么翻译的时候这个%d就要留出来不翻译了,我们可以考虑提供该段文字的语境,这样让翻译人员也不会一头雾水到底要怎么翻译“小时之前”了。
还有一些特殊的字符,例如英文单引号(’)、And符号(&)、英文双引号("),这些在资源文件中都有特殊含义,所以建议尽量少使用这些符号来进行翻译,如果使用了也无伤大雅,上述脚本工程会自动转义掉这些特殊符号。
一份合格、标准的多语言文档真的相当重要,所以概述注意事项如下。
1.1、尽量避免使用简写!
例如:距离通话结束还剩30秒。
错误示例:距离通话结束还剩30s。
1.2、严禁回车、换行等!
例如:1、这是第1条内容。\n\n2、这是第2条内容。
错误翻译:
- This is the first content. \n\n
- This is the second content.(iOS上会使用原格式,导致多换行)
正确翻译:1. This is the first content. \n\n2. This is the second content.
1.3、尽量避免使用&、’、”等特殊符号!
例如:建议和反馈
错误翻译:suggestions & feedback(单引号、双引号、And符号都有特殊含义)
正确翻译:suggestions and feedback
1.4、注意空格的使用!
例如:%s天之前
错误翻译:%sdays ago(英语、俄罗斯语、阿拉伯语等需要有空格)
正确翻译:%s days ago(中文、日语等不需要空格)
2、设计探讨事项
此处的设计包括了需求设计和UI设计两方面,直接来看几个实例吧!
2.1、标题栏
关于标题栏,如下图这种设计,左边返回按钮,中间标题区域,右侧子标题。这种设计有个问题就是当换用其他语言,例如俄罗斯语、马来语等,这种语言长度会很长,容易导致标题栏和子标题栏遮挡或者显示不全等问题。
当把右侧的文字标题设计为能明确表示意义的图标后,右侧区域长度完全可控了,至于标题换成其他语言后长度过长的问题,可能还是需要使用省略号等来进行处理。或者根据文字长度设置动态改变其大小。
下面的这种设计标题靠近返回按钮,也可采用,具体看App的设计了。但是第一种的设计建议千万不要采用。
2.2、输入框
关于输入框,一般在设计的时候可能会有如下第一种设计,文字类似这样:【群组名:请输入群组的名称】。中文情况下没有问题,因为文字大部分情况下都不会很长,UI基本无需适配。而换用俄罗斯语后,上述文字翻译后的长度会将UI完全挤变形,或者根本无法完全展示其提示信息。
我们可以考虑输入框中直接展示【群组名】,这样就表明这个输入框输入的是一个群组名了,省去“请输入群组的名称”这样的提示信息,这样的处理多了,还能省下一笔翻译费用。
实在需要提示语,那么建议采用上下的设计,如下图,这样保证上下两行文字不会互相影响,以免造成横向上排列不开的问题,这种情况下就算翻译后提示语过长,也可以换行处理,不会特别影响UI的显示效果(目前Google的Material设计输入框的默认效果就类似这样)。
2.3、标签栏
如下标签栏,一般我们可能会展示用户的排行榜,日榜、周榜、月榜,然后就这样居中均分设计了三个Tab标签,但是在翻译成其他语言后,可能【日榜】的翻译可能就占了大半屏幕,这样的话UI效果就大打折扣了。
我们可以考虑从左到右进行设计布局,如果需求之后添加【年榜】,那么我们可以直接布局到最右侧,当tab标签长度过长的时候,甚至可以让Tab横向滚动展示,这样可以最佳的去适配任何语言。
2.4、状态视图
如下,例如我们经常可能需要展示一些用户的状态信息,例如设计了如下在线状态,将状态信息展示在了用户昵称后。由于用户昵称本身长短不一,多语言情况下翻译后的状态信息文字也长短不一,虽然状态信息很详细的展示了出来,这样的显示效果其实很差,昵称和状态信息肯定会比较拥挤。
所以我们是否可以考虑使用表示状态的各色的点,来代替“在线”、“online”这种具体的文字呢?采用下图的设计显示效果就完全可控了,唯一的缺点就是颜色点无法让用户准确的理解到底是什么状态,可能需要培养一段时间的用户习惯。
还有的情况下,用户离线了我们可能会展示离线时间,这种翻译出来后也是长短不一,所以是否可以考虑如下的纵向设计,而不是将其显示在屏幕的最右侧。
2.5、其他
总之目前就一条:慎用横向排列的组件设计,横向空间有限,竖向可以无限的滚动。如果一个普通用户信息列表页面,既要用户横向滚动,又需要纵向滚动才能展示完全信息,那这个页面的用户使用率肯定大打折扣了!
3、代码设计规范
3.0、支持国际化和本地化
首先android支持切换多种语言,只需在资源文件夹中新建对应语言的values-xx文件夹,然后保证strings.xml中的字符串资源一一对应即可。
Android Studio为我们提供了很方便的方式,新建资源文件夹,然后在可选的限定符内选择相关内容即可,如上图所示,可以创建支持阿拉伯语的values-ar资源文件夹。
然后还需要注意的一点就是,阿拉伯语是从右向左的,也就是RTL。如果要适配阿拉伯语,在app的清单文件中声明支持RTL即可,剩下的就是布局中的适配了,请继续重点阅读下文:
android:supportsRtl="true"
如果我们需要进行app内手动更换语言,那么直接配置相关的Local即可,注意7.0前后版本的适配问题即可,如下,直接定义了切换为阿拉伯语(ar)。
public static Context attachBaseContext(Context context) {
String language = getCurrentLanguage();
Resources resources = context.getResources();
Configuration configuration = resources.getConfiguration();
Locale locale = new Locale(language);
mLocale = locale;
Locale.setDefault(locale);
//注意7.0以上的处理方式
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N) {
configuratio