在海外发行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中增加。
ExampleDemo github
ExampleDemo gitee