WWDC19 - Xcode 11 对多语言开发的增强支持

swift 发布于 2019年11月14日

这个文章系列旨在给大家介绍 WWDC 2019 苹果发布的最新技术细节. 在这个时间资源稀缺的时代, 对很多开发者来说, 花费整块时间, 把所有的视频都看一遍, 是一件很耗时间的事情. 所以这个系列,我帮大家把这些新内容中最重要的部分整理出来,你可以在任何碎片时间翻出来看一看, 拿出手机, 即可了解苹果最新的技术内容.


虽然多语言支持不一定所有的项目都需要. 但是如果你的产品场景可以适用于其他语言的用户, 那么多支持一个语言, 就会增加应用的受众群体, 对于提升用户量是很有帮助的.

这篇文章是对 WWDC19 演讲: Creating Great Localized Experiences with Xcode 11 的解读. 演讲视频地址 https://developer.apple.com/videos/play/wwdc2019/403/.

可以单独设置每个应用的语言

以往的 iOS 系统中, 所有应用都是根据系统的全局语言设置来进行多语言处理的. 在新的 iOS 13 中,用户可以针对每一个应用单独的设置语言选项:

苹果现在也考虑到这个问题了, 还举了几个场景, 比如在香港, 人们会用中文 APP 看新闻, 同时还会用英文 APP 来处理银行账户.

通过系统设置来修改语言信息

演讲中还提到了, 开发者应该通过跳转到系统设置的方式设置自己应用当前的语言, 而不是自行设置, 给出了一个代码示例:

这算是苹果对于多语言设置方面给我们的一个最佳实践指导.

确定当前应用的语言设置

对于应用中静态的字符串, 我们可以通过 Localizable.strings 然后分别为每个语言指定内容即可, 相信大家对这个方式都很熟悉了. 但在有些情况下, 我们需要自行来获取当前的语言设置, 这里苹果给我们提供了一个明确的解释, 获取语言信息有三种方式:

Locale.preferredLanguages
Bundle.main.preferredLocalizations.first
Bundle.preferredLocalizations(from: serverLanguages).first

我们分别介绍一下:

首先 Locale.preferredLanguages 会返回当前用户在系统设置中的语言偏好列表, 但这个设置不会把我们的 APP 计算在内. 比如你的 APP 在 Xcode 中设置的支持中文和英文 , 但当前用户将法语作为首选偏好, 如果你调用这个方法, 它只会返回用户当前的偏好设置, 也就是法语.

如果你需要更加符合你自己应用的语言信息, 就可以调用 Bundle.main.preferredLocalizations.first, 这个方法会将你应用设置的支持语言考虑进来. 比如你的应用支持中文和英文, 而当前用户设备语言偏好是法语和英文, 首选偏好是法语. 那么调用这个方法不会返回用户首选的法语, 而是和你应用匹配的英语.

最后 Bundle.preferredLocalizations(from: serverLanguages).first 这个方法是针对于第三方语言设置的, 比如你的 APP 除了本地文本之外, 还会调用第三方服务器的信息, 那么可以让第三方服务提供支持的语言信息, 然后调用这个方法获得一个最佳匹配, 再用这个语言来调用第三方接口.

对于开发国内 APP 的朋友, 这些选项可能用的不多, 但是知道一下总是有帮助的.

Xcode 对多语言的支持

Xcode 11 也提供了对多语言更多的支持.

语言文件导出速度提升 15倍

如果不是做多语言 APP 的开发者, 可能对这个特性不太熟悉. 在 Xcode 中, 我们可以把当前项目的所有字符串文件导出成单独的资源包, 像下图这样:

选中项目文件, 然后点击 Editor -> Export For Localization... , 这样就可以吧整个项目需要进行多语言处理的文字或者图片资源导出成独立的语言包. 这样做的好处是, 如果你的项目需要经常处理多语言适配, 并且有专门的人或者团队来做这件事, 就可以把这个独立的语言包交给他, 然后就可以由专人只处理多语言资源这一部分事情了.

导出后的文件结构如下, 可以由相关人员进行编辑, 编辑好之后, 再按照刚才的流程把这个语言包导入回 Xcode 即可:

并且 Xcode 11, 对于语言包导出的性能做了彻底的优化, 这也是苹果团队在开始时候说的, 15倍的提速于之前的版本. 看文章的同学,我相信大多数,你们在的团队很少会有这种需求, 不过作为一个技术储备,了解一下这个也是有用的.

根据设备类型区分字符串

现在, 除了可以像之前通过语言设置区分要显示的内容之外, 苹果现在给我们提供了一个新的维度, 就是设备类型. 还举了几个例子, 比如一个按钮提示文字, 如果是在 iPad 上面, 应该显示为 Tap Here, 如果是在 Mac 电脑上, 应该显示为 Click Here. 当然, 如果换到中文语境, 都可以写成点击, 但在英文语境中 Tap 和 Click 的含义还是不太一样.

同样, 在中文语境上也有类似的差异, 对于多语言处理, 苹果做的更加细致了. 如下图所示, 通过一个新的字段,区分了不同设备显示的内容:

支持图片本地化

Xcode 11 现在支持直接本地化图片资源了, 和字符串一样, 现在我们可以在 Xcode 中为不同的语言指定不同的图片了:

如上图这样, 很方便的为不同语言设置单独的图片资源.

Test Plan 帮助更好的编辑多语言资源

我们还可以通过 Xcode 11 新引入的 Test Plan 功能, 为我们 APP 的每一种语言生成截图. 这个有什么用呢? 可以试想一下这个例子, 某些词语在不同的环境下会有多重含义, 如果不考虑当前的上下文, 很可能会翻译的有偏差. 大家如果使用过翻译软件肯定明白这个, 经常翻译出来的东西很别扭.

所以 Xcode 11 为我们提供了一种新的方法, 前面我们讲到, 可以把项目的所有字符串信息导出成语言包, 供处理多语言的人去翻译. 但这还是有瑕疵, 从 Xcode 导出的语言包仅有字符串内容, 也就是说处理多语言翻译的人, 无法知道每个字符串所处的上下文环境. 就可能造成我们说的翻译会有偏差的情况.

鉴于这个问题, Xcode 11 提供了更好的方案, 就是预先为每一个语言生成 UI 界面的截图, 并且还生成了每个字符串在截图中位置的 plist 文件, 如果你用查看工具的话, 可以精确的看到, 每个字符串对应在 UI 截图上面的位置.

在 Xcode 11 中, 新建文件的时候, 会有一个 Test Plan 类型:

创建完成之后, 可以对 Test Plan 进行配置, 比如这里设置了三种语言:

我们这里除了添加了三个语言配置之外, 还在每一个语言配置上打开了 Localization Screenshots 选项, 这样在运行测试的时候, Xcode 会帮我们保存截屏信息, 之后导出语言包的时候, 就可以用到这些资源了.

Test Plan 设置完成之后, 运行测试会对 Test Plan 的每一个设置都跑一遍, 比如上图中的三个语言, 每个语言设置都会单独运行一次, 如下图, 同时我们还可以看到保存下来的屏幕截图:

生成完屏幕截图后, 还是按照我们文章前面介绍的流程, 点击 Editor -> Export For Localization... 导出项目的语言资源:

这里我们可以注意一下, 弹出的对话框下方多了一个选项, Include screenshots, 是否在导出的语言包中包含屏幕截图. 并且后面列出了可选的截图数量. 这些截图是我们之前用 Test Plan 进行测试跑出来的.

导出资源包后, 你会看到 Xcode 11 会为导出的屏幕截图创建相应的文件夹:

如果你用 xcloc 编辑器来查看语言包的话, 你可以通过 Xcode 11 提供的上下文信息, 清晰的看到每一个字符串资源, 在屏幕截图上的具体位置:

总之呢, 又是一个小小的黑科技.

总结

Xcode 11 多语言支持这个主题呢, 可能未必所有同学都感兴趣. 我相信大多数开发者所在的团队, 会比较少的用到多语言, 更会比较少的是有专门的人来处理这件事情. 可能最好的情况就是程序员自己来干这件事.

但是, 如果你的项目需要多语言支持, 比如开发海外产品的团队, 并且这个产品会经常更新的话, 了解一下这个应该还是能够对效率有所帮助的. 篇幅原因,关于这个主题,就和大家介绍这么多, 如果对某个分支感兴趣的话, 也可以留言, 再帮大家定向的分享.


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

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