花了一下午捣鼓安卓的多语言适配,踩了点坑,在此记录一下,供各位一起学习交流
首先要创建每种语言的资源文件夹:常规的就是在res目录下创建values-en-US,values-zh-CN,values-jp或者无后缀的回退默认语言values这样的文件夹。命名格式和资源回退机制这些官方文档都写清楚了,在此不多做解释
我踩到的第一个坑点:如果你要添加的语言是虚构的语言(如雷神二中的黑暗精灵语),没有对应的ISO 639-1语言地区代码,你当然可以按照命名格式values-<language>-[country]创建文件夹。因为是虚构语言,所以我个人是把国家地区部分省略了的,但对于语言代号这一块,要注意遵守ISO 639-1的格式,长度为2-3个字母(我一开始因为输入了8个字母的values-fujaowee在构建时被ide无情打回Invalid resource directory name,改成values-fjw后构建通过)
然后是Android 13+应用特定语言功能的适配:在res/xml下创建locale_config.xml,编写内容:
<locale-config xmlns:android="http://schemas.android.com/apk/res/android">
<locale android:name="en" />
<locale android:name="zh" />
...
</locale-config>
然后在清单文件AndroidManifest.xml
中,为application
标签添加属性android:localeConfig
,如下:
<application
...
android:localeConfig="@xml/locale_config">
完成这两步操作,正常来说你就能在Android 13及以上的设备上,在应用设置中
看到你的应用单独语言设置了

当然,前面提到的虚构语言是不会展示在这个列表中的,用户的系统语言设置也基本上不可能设置成我们定义的虚构语言,所以说虚构语言是需要我们使用代码切换的。如下,这是我的代码:
open class BaseActivity : ComponentActivity() {
override fun attachBaseContext(newBase: Context?) {
val langCode = AppSettings.locale ?: "zh"
val config = Configuration(newBase!!.resources.configuration)
config.setLocales(LocaleList(Locale(langCode)))
super.attachBaseContext(newBase.createConfigurationContext(config))
}
}
这段代码的作用就是在每个活动启动前都设置好我们应用设置存储中的Locale。但是吧,直接updateConfiguration()
这个函数已经被标记为弃用了,我以我才在此使用createConfigurationContext
并在活动启动时进行配置。也就是说,比如我要切换语言为英文,我需要:
AppSettins.locale = "en"
(这个按照你自己的设置信息持久化逻辑改)
重启活动,或者直接重启应用
需要重启一次才能生效的静态冷重载。不知道有没有人知道如何能做到不重启应用就生效的热重载效果?有的话请务必@我