Android — 应用首选语言

在海外发行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。
image.png
  1. 在弹出的弹窗中,输入文件名strings,在Available qulifiers中选择Locale,并选择需要的语言。
image.png image.png
  1. 在创建的strings.xml中,配置对应的多语言字符串(方便演示,使用机翻,不一定准)。
image.png

配置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以上,完成此步骤后,用户已经可以在应用的系统设置中配置首选语言。

效果如图:

device-2023-07-08-14 -original-original.gif

首选语言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()
        }
    }
}

效果如图:

device-2023-07-07-18 -middle-original.gif

保存选择的语言

在上面的效果图中可以看到,使用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>

效果如图:

device-2023-07-07-18 -middle-original.gif

示例

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

ExampleDemo github

ExampleDemo gitee

猜你喜欢

转载自juejin.im/post/7253102401451049015