写点什么

Android 实现 APP 可切换多语言

作者:EquatorCoco
  • 2023-11-29
    福建
  • 本文字数:1522 字

    阅读完需:约 5 分钟

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

用户头像

EquatorCoco

关注

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
Android 实现APP可切换多语言_APP开发_EquatorCoco_InfoQ写作社区