如何创建支持多方言的应用?设置语言代码遇过时Locale报错求助
解决“过时区域设置”错误,实现App多方言支持
嘿,我来帮你搞定这个问题!你遇到的config.locale = locale被标记为过时的情况,是因为从Android 7.0(API 24)开始,Google就弃用这个字段了,转而推荐用新的API来处理区域设置。咱们先把代码修复好,再一步步聊怎么实现多方言支持。
一、先修复过时的区域设置代码
我们需要做版本兼容处理,同时用上新的API替代弃用的方法,而且为了支持方言,还得扩展Locale的创建参数:
public static void setLanguage(Context context, String languageCode, String countryCode, String variant) { Locale locale; // 根据方言需求创建Locale,很多方言需要指定国家码或变体来区分 if (TextUtils.isEmpty(countryCode) && TextUtils.isEmpty(variant)) { locale = new Locale(languageCode); } else if (TextUtils.isEmpty(variant)) { locale = new Locale(languageCode, countryCode); } else { locale = new Locale(languageCode, countryCode, variant); } Locale.setDefault(locale); Resources resources = context.getApplicationContext().getResources(); Configuration config = resources.getConfiguration(); DisplayMetrics metrics = resources.getDisplayMetrics(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // API 24及以上用新方法设置Locale config.setLocale(locale); // Android 12及以上还可以用setLocales,更灵活支持多Locale场景 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { config.setLocales(new LocaleList(locale)); } } else { // 兼容旧版本系统 config.locale = locale; } resources.updateConfiguration(config, metrics); }
代码小说明:
- 扩展了参数,支持传入国家码和变体,这对区分方言特别重要——比如粤语可以用
new Locale("zh", "HK"),台湾闽南语用new Locale("zh", "TW"),更细分的方言还能加变体(比如赣语用new Locale("zh", "CN", "GAN"))。 - 做了版本分支,高版本用新API,旧版本保留兼容写法,避免警告和错误。
二、实现多方言支持的完整步骤
光改设置代码还不够,要让App真的能加载方言资源,还得做这几件事:
给每个方言建资源目录:
在res文件夹下创建对应方言的values目录,比如:- 简体中文:
values-zh-rCN - 香港粤语:
values-zh-rHK - 台湾闽南语:
values-zh-rTW - 吴语:
values-zh-rCN-wu
每个目录里放strings.xml,把对应方言的翻译文本写进去就行。
- 简体中文:
给用户提供方言选择入口:
在App里加个设置页面,列出支持的方言选项,用户选择后,把对应的语言码、国家码、变体传给上面的setLanguage方法。比如选粤语就传"zh", "HK", ""。记住用户的选择:
把用户选的方言信息存到SharedPreferences里,在App启动的时候(比如Application的onCreate或者主Activity的onCreate)调用setLanguage方法,自动恢复用户的方言设置。
三、额外小提示
如果你用的是AndroidX/Jetpack,推荐用AppCompatDelegate.setApplicationLocales()这个更现代的方法,它会自动处理配置变更、系统语言切换等场景,更省心:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { // 传入方言对应的语言标签,比如粤语是"zh-HK" AppCompatDelegate.setApplicationLocales(LocaleList.forLanguageTags("zh-HK")); } else { // 这里放旧版本的兼容处理逻辑 }
另外,切换方言后最好重启一下Activity或者App,确保所有资源都能正确加载生效。
内容的提问来源于stack exchange,提问作者Rasool Fazeli
相关产品推荐
相关产品推荐

