在海外发行App,对App进行多语言适配是必不可少的。从Android 13开始,新增了应用首选语言功能,即用户可以针对每个应用选择不同的语言。本文简单介绍下如何集成应用首选语言API。
在系统设置中使用首选语言
创建配置文件
创建locale_config.xml
在res/xml目录下创建locale_config.xml
文件,如下:
<locale-config xmlns:android="http://schemas.android.com/apk/res/android">
<locale android:name="zh" />
<locale android:name="en" />
<locale android:name="ru" />
<locale android:name="ko" />
<locale android:name="ja" />
</locale-config>
这边简单用几个语言做演示,更多语言参考官方文档。需要注意的是,语言配置需遵循BCP47语法,通常是{language subtag}–{script subtag}–{country subtag}
。
创建strings.xml
在res/values目录下创建所选语言对应的strings.xml
文件,步骤如下:
- 右键点击res文件夹,选择New->Android Resource File。
- 在弹出的弹窗中,输入文件名strings,在Available qulifiers中选择Locale,并选择需要的语言。
- 在创建的
strings.xml
中,配置对应的多语言字符串(方便演示,使用机翻,不一定准)。
配置Manifest
在AndroidManifest
中配置locale_config.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application android:localeConfig="@xml/locale_config">
...
</application>
</manifest>
如果设备版本在Android 13以上,完成此步骤后,用户已经可以在应用的系统设置中配置首选语言。
效果如图:
首选语言API
在版本低于Android 13的设备上,可以通过首选语言API来实现单独配置应用的语言。
添加依赖
在app module下的build.gradle中添加代码,如下:
dependencies {
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'androidx.appcompat:appcompat-resources:1.6.1'
}
使用API
通过AppCompatDelegate
的getApplicationLocales
可以获取当前App配置的语言,通过AppCompatDelegate
的setApplicationLocales
可以修改App使用的语言,代码如下:
class ChangeLanguageActivity : AppCompatActivity() {
private val availableLanguage = arrayOf("zh", "en", "ru", "ko", "ja")
private val availableLanguageDisplayName = arrayOf("Chinese", "English", "Russian", "korean", "Japanese")
private var currentLanguage = "zh"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = LayoutChangeLanguageActivityBinding.inflate(layoutInflater)
setContentView(binding.root)
// 获取当前的语言
currentLanguage = if (AppCompatDelegate.getApplicationLocales().isEmpty) {
Locale.getDefault().toLanguageTag()
} else {
AppCompatDelegate.getApplicationLocales()[0]?.toLanguageTag() ?: ""
}
binding.includeTitle.tvTitle.text = "Change Language Example"
binding.btnChangeLanguage.setOnClickListener {
AlertDialog.Builder(this)
.setTitle("Chose Language")
.setSingleChoiceItems(availableLanguageDisplayName, availableLanguageDisplayName.indexOf(currentLanguage)) { _, which ->
currentLanguage = availableLanguage[which]
}
.setPositiveButton("ok") { dialog, _ ->
// 切换语言
AppCompatDelegate.setApplicationLocales(LocaleListCompat.forLanguageTags(currentLanguage))
dialog?.dismiss()
}
.setNegativeButton("cancel") { dialog, _ ->
dialog?.dismiss()
}
.create()
.show()
}
}
}
效果如图:
保存选择的语言
在上面的效果图中可以看到,使用API更改了应用语言后,如果关掉App再打开就失效了。可以在Manifest
中配置AppLocalesMetadataHolderService
自动保存当前选择的语言,这样之后每次App打开时都会默认使用之前配置的语言,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
<application>
<service
android:name="androidx.appcompat.app.AppLocalesMetadataHolderService"
android:enabled="false"
android:exported="false">
<meta-data
android:name="autoStoreLocales"
android:value="true" />
</service>
</application>
</manifest>
效果如图:
示例
演示代码已在示例Demo中添加。
© 版权声明
文章版权归作者所有,未经允许请勿转载,侵权请联系 admin@trc20.tw 删除。
THE END