在海外发行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文件,过程如下:

  1. 右键点击res文件夹,挑选New->Android Resource File。
Android — 应用首选语言
  1. 在弹出的弹窗中,输入文件名strings,在Available qulifiers中挑选Locale,并挑选需要的言语。
Android — 应用首选语言
Android — 应用首选语言
  1. 在创立的strings.xml中,装备对应的多言语字符串(便利演示,运用机翻,纷歧定准)。
Android — 应用首选语言

装备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

经过AppCompatDelegategetApplicationLocales能够获取当时App装备的言语,经过AppCompatDelegatesetApplicationLocales能够修改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()
        }
    }
}

作用如图:

Android — 应用首选语言

保存挑选的言语

在上面的作用图中能够看到,运用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>

作用如图:

Android — 应用首选语言

示例

演示代码已在示例Demo中增加。

ExampleDemo github

ExampleDemo gitee