赞
踩
我在目前所在的公司负责一个app项目的维护,最近需要对这个项目进行国际化,适配10多个国家的语言,在实现国际化过程中,遇到了很多问题,最麻烦的就是翻译了,得一个个将翻译从excel复制到资源文件中,还得保证key和value一一对应,稍不注意就容易出错,当然也有一些自动化的工具可以替代手工复制,但需要excel满足一定的规范,不然会出现一些差错。还有就是其他语言下的ui适配,有些文字翻译成其他语言,就会变得很长,设计的时候也没考虑这些,所有语言都使用同一套设计,导致很多文字显示不全,或者出现重叠的问题。另外一个就是app内的语言切换功能,其实这个功能实现很简单,系统有相应的api,但是需要注意这里面有几个坑,不要向我一样踩到了。
1、Resources
public void updateConfiguration(Configuration config, DisplayMetrics metrics)
2、Context
Context createConfigurationContext(Configuration overrideConfiguration)
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 方法中设置才生效。
所以稳妥的方法是,
既然这个被弃用了,那可能是有问题的。在测试过程中确实发现了不少问题:
在设置中更改语言后,回到主 Activity ,语言确实更改成功了,但是打开其他页面,语言还是上次设置的语言。关闭app重新打开,每个页面的语言又都是对的。解决方法是必须在每个页面都设置。
在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.configuration
configuration.setLocale(Locale.ENGLISH)
val createContext = newBase.createConfigurationContext(configuration)
super.attachBaseContext(createContext)
}
在 Android 7 之前WebView的渲染是通过Android System webView来实现的。但是在Android7之后WebView会被作为一个应用程序的方式服务于各个三方APP。由于WebView这里是作为一个单独的应用程序,所以他不会被绑定到你自己APP设置的Local上。不仅如此,WebView还会把语言变成设备的Local设置。然后相应的资源文件也会被变成设备语言下的资源文件这样就导致了只要打开了含有WebView的页面,应用内语言设置就失效的问题。
上面是网上搜到的解释。
~~这下子就完美了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。