返回

在 Android 应用中轻松获取可用语言列表

Android

在 Android 应用中动态获取可用语言列表

问题:如何访问由系统生成的语言列表?

Android 13 引入了 android.androidResources.generateLocaleConfig 功能,该功能为应用自动生成可更改的语言列表。然而,此列表仅在系统设置中可用。对于希望在应用内提供语言选择器的开发者来说,直接访问此列表变得至关重要。

解决方案:使用 LocaleManager

val localeManager = context.getSystemService(LocaleManager::class.java)
val localeList = localeManager.overrideLocaleConfig?.supportedLocales

LocaleManager 提供了 supportedLocales 属性,它返回 List<Locale>,其中包含应用可用的语言列表。

创建自定义语言选择器

获取语言列表后,我们可以创建一个自定义选择器来显示这些语言:

val languageSpinner = Spinner(context)
val languageAdapter = ArrayAdapter(context, android.R.layout.simple_spinner_dropdown_item, localeList.map { it.displayName })
languageSpinner.adapter = languageAdapter

languageSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
    override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) {
        val locale = localeList[position]
        LocaleManager.setLocale(context, locale)
        restartActivity()
    }

    override fun onNothingSelected(parent: AdapterView<*>) { /* No action */ }
}

限制

此方法仅适用于 Android 13 及更高版本。对于较早版本的 Android,LocaleManagerCompat 并不提供 supportedLocales 属性。

结论

通过使用 LocaleManager,我们可以轻松地在应用中访问可用的语言列表。此列表可以用于创建自定义语言选择器,为用户提供灵活的语言切换体验。

常见问题解答

1. 此方法是否适用于所有 Android 设备?

否,此方法仅适用于运行 Android 13 及更高版本的设备。

2. 我可以修改系统生成的语言列表吗?

否,supportedLocales 属性返回的是一个不可变列表。

3. 如何处理动态语言更改?

语言更改后,LocaleManager 会发出事件通知。应用可以通过注册 LocaleManager.LocaleChangedListener 监听器来处理这些事件。

4. 我可以在我的应用中创建自定义语言包吗?

是的,你可以通过创建 values-languageCode 目录并在其中提供资源文件来创建自定义语言包。

5. 如何确保我的应用在所有受支持语言中都翻译得很好?

使用专业翻译服务或与本地化专家合作以确保高质量的翻译至关重要。此外,使用 PluralRules API 来处理不同语言中的复数形式变化也很重要。