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

Android获取Locale时有时返回'en'有时返回'en_US',二者有什么区别?

返回值区别

  • en 是仅携带语言代码的Locale标识,仅代表语言为英语,不包含任何地区相关的规则配置
  • en_US 是携带语言代码+地区代码的完整Locale标识,代表美国地区使用的英语,附带对应地区的格式规则(包括日期格式、货币符号、数字标点、排序规则等)

输出不稳定的原因

你当前的使用方式存在两处问题,导致返回结果不固定:

  1. 直接调用Locale.toString()的输出规则本身不固定:当系统当前匹配到的Locale仅配置了语言维度、没有关联对应地区信息时,就只会输出语言代码;当同时有匹配的地区配置时,才会输出语言_地区的格式。
  2. 直接取locales.get(0)的行为不可靠:从Android 7.0开始系统支持多Locale优先级列表,当应用的资源适配配置、系统语言列表首位的Locale配置发生变动,或是应用未适配对应地区的资源时,系统会自动回退到仅匹配语言的Locale,就会出现只有en的返回结果。

稳定获取Locale的写法

如果需要格式稳定的、包含完整语言+地区信息的Locale标识,不要直接调用toString(),建议单独取出对应字段手动拼接:

val currentLocale = context.resources.configuration.locales.get(0)
// 手动拼接保证输出格式固定
val localeStr = "${currentLocale.language}_${currentLocale.country}"
Log.i("locale" , localeStr)

需要兼容Android 7.0以下版本可以使用兼容写法:

val currentLocale = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    context.resources.configuration.locales.get(0)
} else {
    @Suppress("DEPRECATION")
    context.resources.configuration.locale
}
val localeStr = "${currentLocale.language}_${currentLocale.country}"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 03:45:06