最近在项目中接触到了应用多语言适配的一些问题。海外市场这几年大概率也会是国内企业的进军方向。既然遇到了这方面的问题那就记录一下好了。
1.本地化设置
本地化的设置有很多,但最重要的应该是语言了适配。一般,我们会在res目录下创建多个values文件夹,再根据后缀来区别不同的国家。可以看看下面这个例子。
AndroidStudio友好的提供了快捷方式,来帮我们创建这些文件。右键点击res目录,new ->Android Resource Directory->Locale,这样就能进入到我们可以选择创建相应的语言的目录了。
可以看到命名规则是values-语言代码-国家缩写。这里放两个链接,以方便查找相应的语言。
语言代码表国家英文缩写表
2.RTL布局
谈到语言适配,就不得不提到RTL了。什么是RTL呢?RTL即“Right to left”。我们可能平时没有仔细察觉过,像中文,英文都是从左往右读的。但是有些语言,可能是从右往左书写和阅读的。
例如阿拉伯语,维吾尔语,,波斯语等,由于语言书写习惯的不同,这部分的用户也就更喜欢从右往左的界面和布局,好在Android也提供了相应的适配的方法。
只要我们做好一些适配工作,那么Android系统会在切换语言的时候,自动帮我们的应用布局做镜像反转,包括文字的反转。
2.1适配准备
首先,sdk不能小于17,也就是说不支持大概是Android5以下的用户继续使用,其次就是必须在Application中声明支持RTL。
<manifest ... >
...
<application ...
android:supportsRtl="true">
</application>
</manifest>
接下来,我们就需要将各个控件和布局中的"left"和"right"字段,切换成“start”和“end”。
例如:
android:gravity="left" -> android:gravity="start"
android:paddingright=10dp -> android:paddingend=10dp
...................................
除开这些,还有一些其他工作要做。例如,如果项目中使用了自定义控件,那么一些测量法则可能要发生改变。
又比如在TextView控件上,如果我们需要文字的方向自适应RTL,可能还需要添加
android:textDirection="locale"
如果嫌每个TextView都加跳过麻烦,我们也可以在全局配置。(详细看下面的引用文章)
2.2 适配注意(避坑)
下面才是最想要记录的一点,也是我在项目中遇到的一个Bug。先来看一个场景,我们要在TextView上显示 应用名 + 应用的上次打开时间。所以我们有如下代码
textView = findViewById(R.id.testing_text);
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("我的应用 ");//模拟获取应用名
stringBuilder.append(2 + getApplicationContext().getString(R.string.differ_minute));
//设置描述,2可以代表计算出来的时间,后面的即为分钟前。
textView.setText(stringBuilder);
我们在根据不同的语言,在Values包下定义了 differ_minutes 这个字符来适配不同语言的用户的使用,并且也加入了布局的适配。
在中文LTR语言下,是没什么问题的
而当我们切换成RTL语言时,显示就会错误了
这里可以看到本来要在分钟前的2跑到屏幕最边缘去了。这是什么原因呢?
其实,这主要还是安卓系统帮我们做语言和布局适配时,出现了问题。
本来,我们期望 “我的应用”作为应用程序名可以移到最左端,和数字应该跟紧 “分钟前”。但是布局在做翻转时,由于数字和应用名都属于LTR语言,并且被我们和“分钟前”拼接在同一字符串下,自然就识别为同一组字符,转换过去了。
3.总结
本地化或者说国际化的适配还需要很多坑要踩。我个人觉得要想做好这些工作,耐心和细心是必不可少的,最近在处理这个bug的时候,发现其实公司很多应用在这方面都做的很不好。很多地方都是有很大问题的,RTL,仅仅是布局镜像移动,文字顺序都还是错乱的,可能也没人在乎吧。
由于我的水平不够高,文章记录的东西也只是本地化适配的冰山一角,希望以后还能有机会丰富一下这部分的内容。
4.参考资料及扩展文章