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

Locale.getDefault()与getResources().getConfiguration().getLocales().get(0)工作机制探究

应用Locale相关问题

基础配置

  • 基于Java 11开发,最低兼容API 29,目标API 30(Android 11)
  • 支持德语(默认)、英语两种语言,app/build.gradle中配置resConfigs("de", "en"),对应语言的strings.xml翻译文件齐全

Locale获取方法测试

根据官方文档,Locale.getDefault()返回JVM实例的默认Locale;getResources().getConfiguration().getLocales()是官方推荐的Locale列表获取方式,论坛有说法称后者也能返回当前应用Locale。为验证,执行测试代码:

Log.d(TAG,"1="+Locale.getDefault()+", 2="+getResources().getConfiguration().getLocales().get(0));

测试结果

  • 模拟器设置为“English (US)”:输出1=en_US, 2=en_US,应用正确加载英语
  • 模拟器设置为“German (CH)”:输出1=de_CH, 2=de_CH,应用正确加载德语
  • 模拟器设置为“German + English (US)”:输出1=de_CH, 2=de_CH,应用正确加载德语
  • 模拟器设置为“Danish + German (CH)”:输出1=de_CH, 2=de_CH,应用正确加载德语
  • 模拟器设置为“Danish + English (US)”:输出1=en_US, 2=en_US,应用正确加载英语
  • 模拟器设置为“Danish + Italian”:输出1=da_DK, 2=da_DK,但应用实际加载德语(默认)
  • 模拟器设置为“Italian + Spanish”:输出1=it_IT, 2=it_IT,但应用实际加载德语(默认)

可见两个方法的返回值要么是系统设置中应用支持的语言,要么是系统首选的第一个语言(即便应用不支持),与应用实际加载的默认语言不符。

语言切换后的异常表现

应用内有语言切换下拉选择器,调用Locale.setDefault(Locale.English)可立即将界面切换为英语,但跳转Activity后出现异常:

  • 初始系统设置为“German + English (US)”:自动选择德语,输出1=de_CH, 2=de_CH→切换为英语后界面变为英文→跳转Activity,在onCreateView中输出1=de_CH, 2=en,但所有界面元素仍为英语
  • 初始系统设置为“Danish + Italian”:切换为英语后跳转Activity,输出1=da_DK, 2=en,界面仍保持英文

核心疑问

  1. 为何Locale.getDefault()会在跳转Activity后被重置?
  2. 为何测试中两个方法的返回值与应用实际使用的Locale不一致?
  3. 如何可靠获取应用实际使用的Locale?
  4. Locale.getDefault()和getResources().getConfiguration().getLocales()的实际工作机制是什么?是否存在Bug?

官方文档仅说明应用启动时的Locale选择逻辑,且Android 13及以上版本的语言偏好变更说明未覆盖上述问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 20:25:31