假如是单独给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)
获取了
*文章转载自: *Stars-one