You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android:如何程序化获取generateLocaleConfig生成的应用可用语言列表?

如何获取generateLocaleConfig生成的应用可用语言列表?

核心思路

当你在Gradle中开启generateLocaleConfig = true后,构建系统会自动在res/xml/目录下生成locale_config.xml文件,里面包含了应用所有支持的语言区域信息。直接解析这个本地XML文件是最通用的方案——无需依赖高版本系统API,也不用手动维护语言列表。

步骤与代码示例

  1. 确保Gradle配置已生效:
android {
  androidResources {
    generateLocaleConfig = true
  }
}

构建项目后,可检查app/build/intermediates/res/merged/[variant]/xml/locale_config.xml,确认文件已生成。

  1. 解析XML获取语言列表(兼容所有Android版本):
import android.content.Context
import android.util.Xml
import java.util.Locale
import org.xmlpull.v1.XmlPullParser

fun getSupportedLocales(context: Context): List<Locale> {
    val locales = mutableListOf<Locale>()
    runCatching {
        val xmlParser = context.resources.getXml(R.xml.locale_config)
        var eventType = xmlParser.eventType
        while (eventType != XmlPullParser.END_DOCUMENT) {
            if (eventType == XmlPullParser.START_TAG && xmlParser.name == "locale") {
                xmlParser.getAttributeValue(null, "name")?.let { localeTag ->
                    locales.add(Locale.forLanguageTag(localeTag))
                }
            }
            eventType = xmlParser.next()
        }
    }.onFailure { it.printStackTrace() }
    return locales
}

关于你之前的LocaleManager代码问题

你之前调用localeManager.overrideLocaleConfig返回空是正常的——overrideLocaleConfig是用于应用手动设置自定义语言配置的对象,默认情况下为空。如果要在Android 13+上通过系统API获取generateLocaleConfig生成的列表,应该调用applicationLocaleConfig:

import android.os.Build
import android.app.LocaleManager

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
    val localeManager = context.getSystemService(LocaleManager::class.java)
    localeManager.applicationLocaleConfig.supportedLocales?.let { localeList ->
        // 处理获取到的LocaleList
    }
}

不过这个方法仅支持Android 13及以上版本,通用性不如解析XML的方案。

内容的提问来源于stack exchange,提问作者user924

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 08:30:16