假如是单独给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

*原文链接: *https://www.cnblogs.com/stars-one/p/17862389.html