如何在你的 App 中支持 App 独立语言设置

当你对你的 App 进行本地化时,世界各地的用户都可以用他们最习惯的语言阅读你的内容。而在最新版本的 iOS 和 macOS 中,用户可以为每个 App 单独选择语言,从而获得更多的控制权。例如,有人可能将 iPhone 的语言设置为英语,但却想使用阿拉伯语的社交媒体 App。

好消息:如果你的项目是用 iOS 13 或 macOS Catalina 构建的,并且已本地化为一种以上的语言,你就不需要添加任何额外的代码,只需构建和部署你的 App 进行测试即可。

下面以《AllTrails》为例,展示用户如何对特定 App 单独进行语言切换。

  1. 打开《设置》App。
  2. 前往“AllTrails”>“首选语言”>“语言”
  3. 将首选语言更改为“西班牙语”
  4. 从主屏幕启动《AllTrails》(或从 App 切换器启动,如果该 App 已经打开)。

用户在《设置》中为 App 设置了他们的首选语言后,你的 App 就会进行相应的渲染。

《AllTrails》现在将以西班牙语显示,而设备的其他部分将继续显示系统语言。

更改语言设置后恢复状态

如果用户在中途决定要用不同的语言查看你的 App,你可以在他们切回时恢复之前的状态,让体验更加顺畅。例如,假设你住在国外,正使用外卖 App 寻找食物。默认情况下,你使用的是英语,但在查看某家餐厅的菜单时,可能会想切换 App 的语言来理解本地特色菜。

如果这个 App 支持状态恢复,那么你可以切换到《设置》App 选择语言,然后切回到你正在查看的餐厅——现在菜单就会以新设置的语言显示。如果该 App 不支持状态恢复,你就不得不从 App 的主屏幕开始,重新找到那家餐厅。


如果你的 App 支持基于场景的状态恢复,那么你可以实现 stateRestorationActivity(for scene),并返回一个包含场景状态的 NSUserActivity。(如果你还支持视图控制器状态恢复,你可以在你的 App 委托上启用状态恢复。)


如何以正确的语言加载自定义内容

如果你需要从其他来源(如服务器)加载内容,你可以这样做,并通过一些 Bundle API 来确保匹配 App 的语言。

Bundle.main.preferredLocalizations.first 将按优先级顺序获取系统当前语言。

If you need to check against a custom set of available languages (say, from a server or other source), you can do so with a simple modification to the previous API call. First, find out what available languages there are:

如果你需要检查一个可用语言的自定义组(例如,从服务器或其他来源),你可以通过简单地修改之前的 API 调用来实现。首先,找出有哪些可用的语言:

```swift
let availableLanguages = Server.requestAvailableLanguages()
```

然后,对这些语言使用 preferredLocalization API:

```swift
Bundle.preferredLocalizations(from: availableLanguages).first.
```

如果由于连接异常或其他限制,无法与服务器进行持续的通信,你也可以将 Bundle.main.preferredLocalizations.first 的输出结果发送给服务器;这样,服务器就会知道 App 是以哪种语言启动的,并提供相应的内容。

如何从 App 中的自定义语言选择器过渡到其他模式

随着全系统对 App 内语言选择的支持,如果你支持 iOS 13 或 macOS Catalina 或更高版本,那么你就不再需要提供在 App 内选择语言的方式。如果你目前提供了这样的用户界面,你应该将其删除,以免顾客感到困惑,或触发与系统的潜在冲突。

如果你想引导用户进入系统设置选择语言,你可以在 iOS 上用一个直接跳转到《设置》App 的流程来代替 App 的自定义 UI。

在 iOS 上,添加以下内容:

```swift
UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!)
```

在 macOS 上,引导用户前往“系统偏好设置”>“语言与地区”,为你的 App 添加自定语言设置。


Resources