每个应用程序语言首选项 - 以编程方式获取应用程序的可用语言列表?

问题描述 投票:0回答:1

所以基于https://developer.android.com/guide/topics/resources/app-languages#kotlin

我们可以使用

android {
  androidResources {
    generateLocaleConfig = true
  }
}

它会自动生成可供用户更改特定应用程序的语言列表:

enter image description here

(所有语言列表)

此列表适用于 Android 13+,并且仅在应用程序的系统设置中可用。

我想在应用程序内实现一个选择器。

如何在不手动实现的情况下获得相同的语言列表?

如何访问

android.androidResources.generateLocaleConfig
功能生成的列表?

更新

我试过了

val localeManager = context
    .getSystemService(LocaleManager::class.java)
localeManager.overrideLocaleConfig?.supportedLocales?.let { localeList ->
    Timber.d("localeList ${localeList.size()}")
}

但它是空的并且仅适用于 Android 13+

LocaleManagerCompat
没有这样的方法

android android-gradle-plugin android-xml android-resources
1个回答
0
投票

我能够通过解析原始生成的 XML 来做到这一点。它并不漂亮,也不是完全安全(例如,如果格式发生变化 - 尽管我认为它应该保持稳定),但它确实可以工作,无需手动复制您支持的语言。

@SuppressLint("DiscouragedApi")
fun Context.getSupportedLocales(): List<Locale> {
    val id = resources.getIdentifier(
        "_generated_res_locale_config",
        "xml",
        packageName
    )
    val localeXml = resources.getXml(id)
    val locales = ArrayList<String>()
    var event = localeXml.next()
    while(event != XmlResourceParser.END_DOCUMENT) {
        if(event == XmlResourceParser.START_TAG && localeXml.name == "locale") {
            locales.add(localeXml.getAttributeValue(0))
        }
        event = localeXml.next()
    }
    return locales.map {
        Locale.forLanguageTag(it)
    }
}

需要 lint 抑制,因为不鼓励使用

getIdentifier
,但由于资源是在编译时生成的,我们无法访问其 ID,因此必须以这种方式检索它。

© www.soinside.com 2019 - 2024. All rights reserved.