我在目前所在的公司负责一个app项目的维护,最近需要对这个项目进行国际化,适配10多个国家的语言,在实现国际化过程中,遇到了很多问题,最麻烦的就是翻译了,得一个个将翻译从excel复制到资源文件中,还得保证key和value一一对应,稍不注意就容易出错,当然也有一些自动化的工具可以替代手工复制,但需要excel满足一定的规范,不然会出现一些差错。还有就是其他语言下的ui适配,有些文字翻译成其他语言,就会变得很长,设计的时候也没考虑这些,所有语言都使用同一套设计,导致很多文字显示不全,或者出现重叠的问题。另外一个就是app内的语言切换功能,其实这个功能实现很简单,系统有相应的api,但是需要注意这里面有几个坑,不要向我一样踩到了。

切换语言有两个方法可以实现,分别是

1、Resources
public void updateConfiguration(Configuration config, DisplayMetrics metrics)
2、Context
Context createConfigurationContext(Configuration overrideConfiguration)

方法1属于Resources的,已经被弃用了。代码:

Resources resources = context.getResources();
Configuration config = resources.getConfiguration();
DisplayMetrics dm = resources.getDisplayMetrics();
Locale locale = new Locale("vi", "vn");
config.setLocale(locale);
resources.updateConfiguration(config, dm);

使用该方法,在不同手机上有不同的表现,
魅族手机在 application 的 onCreate 方法中设置即可生效,
但华为手机需要在 activity 的 onCreate 方法中设置才生效。
所以稳妥的方法是,

在Launcher activity 中判断如果有设置语言,使用该方法设置语言。
如果用户在设置中更改了语言,调用主 Activity 的 recreate 方法重建,不重建不会生效,因此还要在主 Activity 的 onCreate 判断 savedInstanceState 不为空时使用该方法切换语言。
若设置了语言,同时也要监听系统语言发生改变的广播,收到这个广播后,使用该方法切换语言。

既然这个被弃用了,那可能是有问题的。在测试过程中确实发现了不少问题:

问题1、Android 9 上失效:

在设置中更改语言后,回到主 Activity ,语言确实更改成功了,但是打开其他页面,语言还是上次设置的语言。关闭app重新打开,每个页面的语言又都是对的。解决方法是必须在每个页面都设置。

问题2、华为手机中失效:

在app某一页面切换了导航栏显示状态后,进入其他页面或返回页面时,因为配置(屏幕高度)改变了,会导致语言变成系统默认的语言。此时注册的配置改变的广播并不会收到广播,但会调用 MyApplication 中的onConfigurationCahnged 方法(会在Activity onCreate方法之前调用)。所以需要在导航栏显示状态发生改变后切换语言,但是不能直接在 Application 中来切换,这样切换对于 Activity 没有作用(Application 和Activity 的 Context 不一样)。也不能在 Application 中发送一个自定义的 Action 的广播来通知广播接收器修改,这样的修改对于 Activity 也是没有作用的(必须是自定义的 Action,如果使用系统的配置改变的 Action 会报错,只有系统权限才能发送该广播)。解决方法是在 Application 中注册 registerActivityLifecycleCallbacks,监听 Activity 的生命周期,当导航栏显示状态发生变化时,如果是进入新页面就在 onActivityCreated 里面使用该方法设置语言,如果是返回上一级页面,在 onActivityResumed 里面使用该方法设置语言。

基于上面的问题,我们应该使用方法二,代码:

override fun attachBaseContext(newBase: Context) {val configuration = newBase.resources.configurationconfiguration.setLocale(Locale.ENGLISH)val createContext = newBase.createConfigurationContext(configuration)super.attachBaseContext(createContext)
}
没错需要在 attachBaseContext 方法中修改,把修改后的Context 设置给 Activity 或 Appcalition 。
该方法需要在每个页面中都设置,所以可以写一个 BaseActivity ,在里面统一设置。
这样就完了吗?不可能的! 这两种方法都会遇到一个问题,若你的 app 加载了 WebView 你会发现语言又变回了系统默认的默认语言!!!

在 Android 7 之前WebView的渲染是通过Android System webView来实现的。但是在Android7之后WebView会被作为一个应用程序的方式服务于各个三方APP。由于WebView这里是作为一个单独的应用程序,所以他不会被绑定到你自己APP设置的Local上。不仅如此,WebView还会把语言变成设备的Local设置。然后相应的资源文件也会被变成设备语言下的资源文件这样就导致了只要打开了含有WebView的页面,应用内语言设置就失效的问题。

上面是网上搜到的解释。

所以在 WebView 加载后还需要设置一遍语言。
或者在 app 启动时就加载一次 WebView ,然后在设置语言,只要 WebView 第一次加载后修改了语言,后面再加载便不会重置为系统语言。
需要注意的地方:
1、部分手机需要给Local设置语言还有国家才成效,所以最好都设置国家或地区。
2、只在 Application 和 Activity 中的某一个修改了语言,它们的 Local 中的语言是不同的。
3、某些手机中,弹出Toast时如果使用的是getApplicationContext(),弹出的语言是系统默认的语言,所以最好都传 Activity 的 Context .

~~这下子就完美了。

Android实现app内的语言切换功能相关推荐

  1. android locale app内设置,Android app应用多语言切换功能实现

    本文实例为大家分享了Android app应用实现多语言切换功能,供大家参考,具体内容如下 1.添加多语言文件在不同的 value 文件夹下(例如 value .value-en.values-zh- ...

  2. Android app应用多语言切换功能实现

    最近在做一个多语言切换的功能,类似于微信的语言切换,搜了下资料基本上都是以下这种: 1. 实现的效果 和微信类似,在设置界面打开切换语言的界面,选择语言后重启 HomeActivity,语言切换完成, ...

  3. Android实现应用内多语言切换

    本文地址:https://blog.csdn.net/qq_40785165/article/details/113901406,转载需附上此地址 大家好,我是小黑,一个还没秃头的程序员~~~ 只要以 ...

  4. iOS App的国际化,以及App内的语言切换

    一.国际化文件 其实国际化跟我们的NSDictionary差不多,我们要支持中文和英文,就会生成两个国际化文件(.string为后缀名),然后在两个国际化文件中,设置一个Key,在中文的国际化文件中这 ...

  5. android 7.0 兼容多语言切换总结

    我们手机升级到android 7.0或购买到最新的android(大于7.0)机后,我们突然发现在系统设置语言切换的方式上有了很大的区别.这还好,只要我们按部就班设置好第一第二第N语言,使用上还是无二 ...

  6. uni-app项目使用多语言切换功能

    1.下载安装(vue-i18n模块) npm install vue-i18n --save 2.如果项目中没有package.json文件,在根目录下新建package.json文件,并把以下代码加 ...

  7. Android通过代码实现多语言切换、createConfigurationContext、attachBaseContext、getResources、updateConfiguration

    updateConfiguration 过时兼容处理 @Override public Resources getResources() {//此方法会 多次 调用Configuration conf ...

  8. Android直播APP源码中排行榜功能如何实现

    刚进公司的时候,听技术人员说起直播APP源码中的"排行榜"功能,小编最先想到的是学生时期的成绩排行,上榜的沾沾自喜到下次考试,下榜的哭哭啼啼,其实就算上榜也并没有什么实质性的奖励, ...

  9. html怎么实现多语言图片切换,JavaScript实现--中英语言切换功能

    最近弄的项目是面向国际的,所以老总说要有语言切换功能.第一感觉好像不难吧 网上查了下,感觉实现方法就2种: 一:2个版本的HTML.至于怎么切换,方法也很多. 不过这种方法,除了笨,我实在不知道用什么 ...

最新文章

  1. 基于手势识别的鼠标控制实现
  2. JVM---StringTable(字符串常量池)
  3. (5) DSP28335--SCI
  4. 谈谈重要的TCP、UDP
  5. mysql中主从复制包括什么意思_Mysql主从复制作用和工作原理
  6. Java设计模式之迭代子模式
  7. 数据分析训练营还有这些内容(Spark)
  8. 获取android手机基本信息
  9. C++ Memory_order的理解
  10. 转行做调度,你准备好了吗
  11. Android RecyclerView之PagerSnapHelper原理解析(二)
  12. Servlet和Tomcat底层分析
  13. 【数据结构 严蔚敏版】 链式栈基本操作
  14. java正则表达式常用语法
  15. 极化SAR图像特征提取与分类方法研究
  16. 论文研读 —— 7. Very Deep Convolutional Networks for Large-Scale Image Recognition (3/3)
  17. 操作系统——进程管理思维导图(一)
  18. Function与函数
  19. 用爬虫玩转石墨文档API
  20. Github 爆火!5000张表情包收藏了!!

热门文章

  1. 晶体塑性有限元 Abaqus 三维泰森多边形(voronoi模型)插件 V6.0
  2. 微博文摘——如何改善繁琐的运维工作
  3. Salient Object Detection: A Benchmark (显著性目标检测的一个基准)
  4. 简单介绍一下常用的几种无位置传感器的控制方式
  5. 挨踢部落直播课堂第十期:亿级数据量高并发下数据库水平切分的结构设计
  6. python13 之线性回归(WLS加权最小二乘法)
  7. 视频教程-MVC5+EF6之巧租房系统-.NET
  8. Rstudio下载太慢安装报错???
  9. 【调剂】中国科学院深圳先进技术研究院 脑科学与神经技术团队 招收调剂硕士生...
  10. 一文看懂阿里云端数据库配置+Navicat premium安装