Android带区域多语言资源无法识别,求解决方案
解决Android App加载带区域标识语言资源的问题
问题出在你创建Locale对象的方式:当传入es_ES这类带区域的字符串时,new Locale(language)只会把整个字符串当作语言代码,而不会识别其中的区域部分,导致系统找不到对应的values-es-rES资源文件夹。
修复步骤
1. 拆分语言与区域标识
需要将传入的语言字符串(如es_ES、fr_CA)拆分为语言代码和区域代码两部分,再用支持双参数的Locale构造方法创建对象。
2. 修改Locale设置代码
更新你的updateResources方法,处理带区域的语言格式,同时兼容Android不同版本:
private Context updateResources(Context context, String languageTag) { Locale locale; // 拆分语言标签,处理如"es_ES"、"fr_CA"格式 if (languageTag.contains("_")) { String[] parts = languageTag.split("_"); locale = new Locale(parts[0], parts[1]); } else { // 兼容纯语言代码的情况,如"fr" locale = new Locale(languageTag); } Locale.setDefault(locale); Resources res = context.getResources(); Configuration config = new Configuration(res.getConfiguration()); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // API 24及以上,使用setLocales方法 config.setLocales(new LocaleList(locale)); context = context.createConfigurationContext(config); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { config.setLocale(locale); context = context.createConfigurationContext(config); } else { config.locale = locale; res.updateConfiguration(config, res.getDisplayMetrics()); } return context; }
3. 验证资源文件夹命名
确保你的资源文件夹命名完全符合Android规范:
- 西班牙语(西班牙):
values-es-rES - 西班牙语(墨西哥):
values-es-rMX - 法语(法国):
values-fr-rFR - 法语(加拿大):
values-fr-rCA
关键说明
- 当传入
es_ES时,拆分后创建的Locale对象包含语言es和区域ES,系统会正确匹配对应的资源文件夹。 - API 24及以上推荐使用
setLocales替代setLocale,这是官方推荐的兼容多语言的方式。 - 如果需要支持
es-ES(连字符分隔)的格式,只需将split("_")改为split("-")即可。
内容的提问来源于stack exchange,提问作者stack Learner
相关产品推荐
相关产品推荐

