原文: Android 实现APP可切换多语言 - Stars-One的杂货小窝

如果是单独给app加上国际化,其实很容易,创建对应的国家资源文件夹即可,如values-en,values-pt,app会根据当前系统语言去使用对应语言资源文件,如果找不到,则使用values文件夹里的资源

但本文讲得是另外一种情况,就是app内置一个切换多语言的页面,可以给用户切换

步骤

1.添加服务声明

此步骤主要是让我们的app可记录当前应用语言,使用的Service是android系统给我们提供的

<!--    国际化多语言    -->
<service
android:name="androidx.appcompat.app.AppLocalesMetadataHolderService"
android:enabled="false"
android:exported="false">
<meta-data
android:name="autoStoreLocales"
android:value="true" />
</service>

2.在xml文件夹增加文件locale_config.xml

声明支持的几个语言

<locale-config xmlns:android="http://schemas.android.com/apk/res/android">
<locale android:name="en" />
<locale android:name="pt" />
<locale android:name="es" />
<locale android:name="de" />
<locale android:name="fr" />
</locale-config>

3.调用方法切换多语言

// 切换语言
val langua="en"
AppCompatDelegate.setApplicationLocales(LocaleListCompat.forLanguageTags(langua))

补充下其他方法:

//获取当前应用使用语言
val locale = AppCompatDelegate.getApplicationLocales()[0] //语言短标转为locale对象
val langua="en"
val locale = Locale.forLanguageTag(langua)

一些坑点

1.上架谷歌市场无法切换语言

上架到谷歌市场,用户下载只会下载其系统语言包,会导致app内置的语言切换功能无效

原因是打包为aab的时候,gradle的配置,默认是开启了语言分包设置,我们取消这个设置就可以解决此问题

gradle配置如下

buildTypes {
release { bundle{
//设置多语言不分包处理
language {
// Specifies that the app bundle should not support
// configuration APKs for language resources. These
// resources are instead packaged with each base and
// feature APK.
enableSplit = false
}
density {
// This property is set to true by default.
enableSplit = true
}
abi {
// This property is set to true by default.
enableSplit = true
} }
}
}

2.使用StringUtil导致语言切换功能失效

我使用到了Blankj/AndroidUtilCode里面的StringUtil获取数据,到时切换多语言后会存在问题

原因是里面StringUtil里面使用的是application而不是Activity

最终还是更换为使用Activity对象来获取string文本(activity.getString(R.string.hello))

也看到了issue有人说到这个问题,说要是更新application的资源文件,但我测试的时候发现更新application的语言资源后,会触发应用闪屏的效果,然后就没有使用此方法

由于项目进度赶,就没去细究了

3.使用静态数据导致后续没有文本没有更新

因为页面有几个使用相同布局的样式,比如说常见的菜单项,我是这样的做法:

抽取出来的一个静态类来存储对应数据(图标,文本之类),之后写一个xml文件,页面则是使用include来引用多份相同样式的item,最终在Activity里给这些item赋值

由于item比较少,又不想用recyclerview,就是采用了上面的这个方法

但是如果涉及到多语言切换的话,就会导致没有数据及时更新

原因是更换语言后,是Activity进行的重新创建,但我们存储数据的类还是存在的,里面文本数据并没有更新,所以就是导致了这个问题

解决方法简单粗暴,就每次Activity的onCreate方法里创建对应的数据对象即可,这样,Activity重建之后我们的文本数据就会重新调用activity.getString(R.string.hello)获取了

参考

Android 实现APP可切换多语言的更多相关文章

  1. App内切换语言

    前几天客户提需求,对App增加一个功能,这个功能目前市面上已经很常见,那就是应用内切换语言.啥意思,就是 英.中.法.德.日...语言随意切换. (本案例采用Data-Bingding模式,麻麻再也不 ...

  2. [Android实例] app引导页(背景图片切换加各个页面动画效果)(申明:来源于网络)

    [Android实例] app引导页(背景图片切换加各个页面动画效果)(申明:来源于网络) 地址: http://www.eoeandroid.com/thread-918356-1-1.html h ...

  3. APP定制开发:APP软件开发的语言和开发环境

    APP软件开发是移动互联网开发公司常开发的一种手机应用系统,对于刚刚进入APP软件开发领域的新手来说,选择什么编程语言和需要什么开发环境来开发APP软件是常遇到的问题.下面亿合科技小编来为大家分享下: ...

  4. android表白app

    一.前言 马上就要520和521了,是不是还有像我一样的单身狗啊.我就知道有,所以这两天简单写了这个小程序(其实是替别人写的),虽然我并不会用去骗女孩子(因为最近太忙了,实习完之后要搞毕设,要搞论文啊 ...

  5. 【Android端 APP GPU过度绘制】GPU过度绘制及优化

    一.Android端的卡顿 Android端APP在具体使用的过程中容易出现卡顿的情况,比如查看页面时出现一顿一顿的感受,切换tab之后响应很慢,或者具体滑动操作的时候也很慢. 二.卡顿的原因 卡顿的 ...

  6. android文件存储位置切换

    最近有个需求,助手的google卫星地图和OpenCycleMap下载的离线地图数据,要能够在内置存储和外置存储空间之间切换,因为离线瓦片数据非常大,很多户外用户希望将这些文件存储在外置TF卡上,不占 ...

  7. Android实现app长时间未操作时自动退出app

    这里要考虑3个问题,第一个是锁屏问题,第二个是app被切换至后台的问题,第三个是屏幕锁定和解除时app在后台时的问题 一,监听屏幕解锁,锁定 ? 1 2 3 4 5 6 7 8 9 10 11 12 ...

  8. Android——例子:屏幕切换

    效果图如下:                          Xml文件代码: <?xml version="1.0" encoding="utf-8" ...

  9. Android 中Activity生命周期分析:Android中横竖屏切换时的生命周期过程

    最近在面试Android,今天出了一个这样的题目,即如题: 我当时以为生命周期是这样的: onCreate --> onStart -- ---> onResume ---> onP ...

  10. 实现了在android实现左右滑动切换界面的效果

    这是实现了在android实现左右滑动切换界面的效果,该效果的源码下载,请到源码天堂下载吧,喜欢的朋友可以研究一下. 布局文件 <?xml version="1.0" enc ...

随机推荐

  1. sqli笔记

    MySQL数据库自带的数据库information_schema 里面有三个比较重要的表  SCHEMATA .TABLES . COLUMNS  保存数据库所有的数据库名 表名  字段名 SCHEM ...

  2. CentOS7更新OpenSSH

    前言 整个过程不要断开ssh链接,如有必要可使用telnet远程操作. 系统版本:centos 7.9 OpenSSL版本:1.0.2k -> 1.1.1q OpenSSH版本:7.4p1 -& ...

  3. [nginx]编译安装openresty

    前言 OpenResty是一个基于Nginx和Lua的高性能Web平台,其内部集成了大量精良的Lua库.第三方模块以及大多数的依赖项.用于方便地搭建能够处理超高并发.扩展性极高的动态 Web 应用.W ...

  4. java file I/O流

    一.File的简介:(java.io包) 生活中的文件: (1)文件的作用:持久化(瞬时状态的对立面状态) (1)文件的定义:一堆数据的集合 (2)文件存储的位置:磁盘,硬盘,软盘,U盘等等 计算机中 ...

  5. Linux下发现一个高安全性的系统管理工具

    软件 AnySetup 主要功能 主要功能是对Linux操作系统下的基本配置进行管理.多种服务配置进行管理.安全配置进行管理等.如:操作系统的升级管理,软件包的安装.更新和卸载管理,软件仓库源的管理, ...

  6. [glibc2.23源码]阅读源码&调试,找出free_hook-0x13分配失败的原因

    0x00 写在前面 发freebuf了:https://www.freebuf.com/articles/endpoint/373258.html 本次阅读源码是本人第一次,算是一个全新的开始.本次看 ...

  7. API接口的设计思路

    ​ API接口设计是软件开发中非常重要的一环,良好的设计规范能够提高开发效率.减少问题和错误,并增强系统的可维护性和可扩展性.本文从程序员的视角,讨论一些常见的API接口设计规范. 一.遵循RESTf ...

  8. Solution -「洛谷 P6287」「COCI 2016-2017」Mag

    Description Link. 定义一条链的价值为链上点权乘积除以节链上点数,求一条价值最小的链. Solution 结论:答案链上最多包含一个 \(2\)(其余全为 \(1\)),并且不在链的两 ...

  9. mpi转以太网连接300PLC无需编程与1200PLC数据交换

    300PLC转以太网无需编程300PLC通过 NetDevice与1200PLC数据交换 应用概述: 兴达易控MPI转以太网模块MPI-ETH-XD1.0PLUS 通讯模块实现PLC无需编程通过简单的 ...

  10. MPI转以太网Plus模块Modbus连接两台变频器通信案例

    MPI转以太网Plus模块Modbus主站连接两台变频器通信案例 MPI转以太网Plus模块连接200PLC无需编程实现Modbus主从站功能与2台变频器modbus通信:以下就是MPI转以太网模块作 ...