关于Android语言本地化适配的问题和记录

最近在项目中接触到了应用多语言适配的一些问题。海外市场这几年大概率也会是国内企业的进军方向。既然遇到了这方面的问题那就记录一下好了。

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.参考资料及扩展文章

本地化建议-安卓开发者文档
Android阿拉伯语适配

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在开发 Android 应用程序时,需要考虑 WebSocket 兼容性问题,主要有以下几个方面: 1. WebSocket API 兼容性:Android 平台在不同版本中可能存在 WebSocket API 的差异,需要根据目标用户的 Android 系统版本选择当的 API。 2. 网络环境兼容性:在某些网络环境下,WebSocket 可能会受到限制或阻塞,需要通过其他方式实现实时通信,例如使用长轮询或 SSE。 3. 安全性兼容性:WebSocket 是一种明文协议,可能会存在安全漏洞,需要注意避免使用不安全的 WebSocket 实现,或者加密 WebSocket 数据以确保数据安全。 为了解决这些兼容性问题,可以采取以下几个方法: 1. 选择当的 WebSocket 实现库:根据目标用户的 Android 系统版本选择当的 WebSocket 实现库,例如在 Android 5.0 及以上版本中可以使用 android.net.http.WebSocket 类来实现 WebSocket 功能,而在 Android 4.4 及以下版本,则需要使用第三方库来实现 WebSocket。 2. 处理网络环境问题:在某些网络环境下,WebSocket 可能会受到限制或阻塞,需要通过其他方式实现实时通信。例如,可以使用长轮询或 SSE,或者使用反向Ajax等技术来实现实时通信。 3. 处理安全问题:可以使用 SSL/TLS 等方式加密 WebSocket 数据,确保数据安全。 4. 处理 WebSocket 连接管理问题:需要合理管理 WebSocket 连接,例如在应用程序进入后台或网络状态发生变化时,需要关闭 WebSocket 连接以避免网络带宽占用过多,或者重新建立 WebSocket 连接以确保通信正常。 综上所述,为了确保 Android 应用程序的 WebSocket 功能兼容性,需要根据不同版本的 Android 平台选择当的 WebSocket 实现库,并合理处理网络环境、安全性和连接管理等问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值