在许多情况下,多语言用户会将其系统语言设置为某一种语言(例如英语),但又想为特定应用选择其他语言(例如荷兰语、中文或印地语)。为了帮助应用为这些用户提供更好的体验,Android 13 针对支持多种语言的应用引入了以下新功能:
-
使用自定义应用内语言选择器的应用应当使用这些新 API,以确保无论用户通过何种方式选择其语言偏好设置,都能获得一致的用户体验。这些新的 API 还有助于减少样板代码的编写。
为了向后兼容以前的 Android 版本,我们还会从 Appcompat 1.6.0-alpha01 开始在 AndroidX 中提供这些 API。
允许用户为每个应用选择首选语言的系统设置
不支持多种语言的应用不受这些变更的影响。
API 实现
对于当前未使用自定义应用内语言选择器的应用,无需执行任何其他操作。
对于具有或想要使用应用内语言选择器的应用,请使用这些新 API(而非应用的自定义逻辑)来处理相关设置和获取用户对应用的首选语言设置。
使用 AndroidX 支持库来实现
为了向后兼容以前的 Android 版本,建议使用 AndroidX 支持库来实现应用内语言选择器。使用 Appcompat 1.6.0-alpha01 或更高版本中提供的 setApplicationLocales()
方法。
例如,如需设置用户的首选语言,您需要让用户在语言选择器中选择语言区域,然后在系统中设置该值:
Kotlin
val appLocale: LocaleListCompat = LocaleListCompat.forLanguageTags("xx-YY") // Call this on the main thread as it may require Activity.restart() AppCompatDelegate.setApplicationLocales(appLocale)
Java
LocaleListCompat appLocale = LocaleListCompat.forLanguageTags("xx-YY"); // Call this on the main thread as it may require Activity.restart() AppCompatDelegate.setApplicationLocales(appLocale);
使用 Android 框架 API 来实现
您还可以通过 setApplicationLocales()
和 getApplicationLocales()
方法,使用 Android 框架 API 来实现应用内语言选择器。
例如,如需设置用户的首选语言,您需要让用户在语言选择器中选择语言区域,然后在系统中设置该值:
// 1. Inside an activity, in-app language picker gets an input locale "xx-YY"
// 2. App calls the API to set its locale
mContext.getSystemService(LocaleManager.class
).setApplicationLocales(newLocaleList(Locale.forLanguageTag("xx-YY")));
// 3. The system updates the locale and restarts the app, including any configuration updates
// 4. The app is now displayed in "xx-YY" language
如需获取用户当前的首选语言以显示在语言选择器中,您的应用可以从系统中取回该值:
// 1. App calls the API to get the preferred locale
LocaleList currentAppLocales =
mContext.getSystemService(LocaleManager.class).getApplicationLocales();
// 2. App uses the returned LocaleList to display languages to the user
面向用户的系统设置
用户可以通过新的系统设置为每个应用选择首选语言。他们可以通过以下两种方式访问这些设置:
通过系统设置访问
设置 > 系统 > 语言和输入法 > 应用语言 >(选择应用)
通过应用设置访问
设置 > 应用 >(选择一款应用)> 语言
已知问题
在测试应用时,有一些已知问题需要注意。
- 可用语言列表中可能不包含您的应用支持的语言。
- 如果您的应用使用拆分 APK,当应用语言区域发生变化时,系统不会自动下载这些 APK。
- 现在的界面只是一个初步版本,在后续版本中会不断更改。