所以基于https://developer.android.com/guide/topics/resources/app-languages#kotlin
我们可以使用
android {
androidResources {
generateLocaleConfig = true
}
}
它会自动生成可供用户更改特定应用程序的语言列表:
(所有语言列表)
此列表适用于 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
没有这样的方法
我能够通过解析原始生成的 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,因此必须以这种方式检索它。