你的 iOS 应用启动界面支持多语言吗?

swift 发布于 2019年09月16日

启动界面可以说是每个 app 都必备的内容, 也是用户对 app 的第一印象。 启动界面的多语言支持,看起来并不难,但也不是我们直观想象的那么容易,所以大家不妨了解一下,如果今后遇到类似需求,也会少走一些弯路。

关于多语言处理

多语言支持,也被很多人称为本地化,是低成本获取更多受众群体最经典的方法之一。 当然,前提是你的 app 功能适合这个场景。 比如工具类应用,它没有文化差异,只需要提供另外一种语言,即可让更多的群体使用它。

在 iOS 中实现多语言支持也非常容易, 只需要对每种语言提供 Localizable.strings , 然后通过 NSLocalizedString 来引用对应的 key 即可。 相信这个方式大家都已经很熟悉了, 所以不过多介绍。

storyboard 启动界面

下面开始咱们的主题, 苹果从 iOS 8 开始, 就允许开发者使用 storyboard 作为启动界面了。 在这之前我们只能为每个尺寸的屏幕都生成一张启动图。 早期的 iOS 设备屏幕尺寸只有iPhone的 3.5 寸和 4 寸屏,最多再加上一个 iPad 屏幕尺寸,也就完事了。但 iOS 后面的产品屏幕尺寸也变得多种多样, iOS 8 发布的时候,也就是 iPhone 6 系列发布的时候。 苹果在这个版本开放 storyboard 作为启动界面,应该也是考虑到了这个问题。

下面是目前 Xcode 10 所需要用到的启动图尺寸:

这还只是 iPhone,就已经需要将近10张图了, 如果你的应用支持 iPad 那将会更多。 当然,大多数团队还是习惯于以前的方式,由设计师来输出这些图片,作为工程师只需要把拿到的这些图片放进来即可。这也是为什么苹果在引入 storyboard 启动界面的时候, 还保留了原先直接使用图片作为启动界面的机制的原因吧。

两种方式,各有所长,根据你团队的习惯就好。 但有一点是使用图片作为启动界面比较难实现的, 就是多语言支持。

支持多语言的启动界面

我之前的文章中,关于 iOS 如何实现多语言,做过探讨:http://swiftcafe.io/post/nsuserdefaults.

简单来说 NSUserDefaults 库中, 有一个叫做 Languages 的域(Domain), 保存了当前设备的语言信息。 当我们调用 NSLocalizedString 获取对应的 Localizable.strings 中字符串的时候, 其实就是从 Languages 中取出当前设备的语言,然后从这个语言的字符串文件中,取出相应的内容。

但有一个重要的地方,启动界面是在我们应用加载完成之前呈现给用户的,这就代表这时候 NSUserDefaults 中的内容还没有填充好。关于当前设备的语言信息,自然也就无法获取到了。

如果没有这层考虑,你可能很容易的想到直接使用 Xcode 自带的 storyboard 多语言方式:

比如这个 storyboard, 我们在上面放了一个 UILabel:

然后指定了它英语版本的文字:

像上面这样,为这个 storyboard 生成英语的资源文件。 这种方式,对于应用成功加载后的 storyboard 是生效的。 但对于作为启动界面的 storyboard 就是无效的。

我之前在处理这个问题的时候被困惑了很长时间, 明明指定了多语言版本,但就是不能正常识别。 原因就是启动界面呈现出来的时候,当前设备的语言信息还没有获取到,所以导致了这个现象。

如何解决

发现了这个问题, 我们如何解决呢,大家是否还记得 InfoPlist.strings 这个文件。 你的应用在桌面上显示的名称如果需要多语言的话就需要创建它,并在这个文件中指定 CFBundleDisplayName 字段:

"CFBundleDisplayName" = "App Name";

仔细想想,应用的名称也是在应用还未加载的时候显示在桌面的,这时候无法获取到 NSUserDefaults 中的内容。 这个文件正是为了此类多语言情况而用的。我们还可以在它里面指定这个字段:

"UILaunchStoryboardName" = "launch_en";

它表示应用启动时,作为启动界面的 storyboard 名称。 你可以在不同的 InfoPlist.strings 语言设置中, 指定不用的 storyboard 文件, 来实现多语言版本的区分:

通过这种方式,才可以根据当前设备的语言设置,呈现不同的启动界面。

方案考虑

下面给大家做一个整体的梳理。

  1. 首先,iOS 启动界面有两种方式, 一种是直接为不同设备生成图片,另外一种是使用 storyboard。
  2. 如果你的 APP 启动界面只需要简单的图形,不需要多语言处理,那么上面的两种方式都可以使用,根据你的习惯即可。
  3. 如果需要用到多语言支持,以我目前的了解,图片的方式做不到,那么只剩下 storyboard。
  4. storyboard 虽然自身支持多语言,但作为启动界面时,默认的机制无效,需要通过 InfoPlist.strings 的方式来间接实现。

以上就是在现有 iOS 版本提供的能力之下, 启动界面多语言的处理方式。

总结

启动界面多语言支持,这个在实际应用中算不上很频繁。 但如果你的应用需要投放给更多的用户,同时你的启动界面又包含了文字信息,就需要用到这个方案了。你可能会第一时间想到对不同语言直接生成相应的图片就可以了,但当前 iOS 设备一种语言就需要将近10张图片,每支持一个新语言就要整套复制一遍。

并且更重要的是,以我目前的研究,图片的方式是没办法支持多语言的。storyboard 也是通过一个间接的方式达到这个效果的。

总之,这里探讨的方案,也算是给大家提供一个思路。在遇到同类的需求时,给你一个参考。 也欢迎大家一起来讨论自己的方案。


如果你觉得这篇文章有帮助,还可以关注微信公众号 swift-cafe,会有更多我的原创内容分享给你~

本站文章均为原创内容,如需转载请注明出处,谢谢。
关注微信公众号
发现更多精彩
swift-cafe