Localize your SwiftUI app
Media & Web 进阶 20m

本地化你的 SwiftUI App

Localize your SwiftUI app

2021年6月9日

在 Apple 官方观看视频

一句话判断

SwiftUI 的本地化在 iOS 15 中终于做到了”零配置”——字符串字面量自动进入 String Catalog, plurals 和设备变体一站式管理。

这场 Session 讲了什么

Session 展示了 SwiftUI 中本地化的完整工作流。iOS 15 带来的最大变化是:SwiftUI 视图中的字符串字面量(如 Text("Hello"))会被编译器自动提取为本地化 key,你不需要手动维护 Localizable.strings 文件。Xcode 13 的 String Catalog 更是把 .strings、.stringsdict、.xcstrings 统一成一个文件格式,自动管理复数形式、设备类型变体和语言变体。

还讲解了 SwiftUI 中本地化的最佳实践:如何用 Text 的字符串插值处理带变量的本地化字符串、如何处理复数形式(pluralization)的不同规则(阿拉伯语有6种复数形式)、如何为不同设备提供不同的翻译(iPhone 上”添加”vs Apple Watch 上”+”)。

Session 最后演示了导出翻译文件给翻译团队、导入翻译结果的完整流程。

值得深挖的点

字符串字面量的自动提取

之前本地化的最大痛点是手动维护 Localizable.strings 文件——加一个字符串忘了加 key、改了 UI 文字忘了更新翻译。SwiftUI 在 iOS 15 中改变了这个流程:编译器在编译时扫描所有 Text("...") 中的字符串字面量,自动生成对应的本地化 key。你只管写 Text("Welcome"),Xcode 会确保”Welcome”这个 key 出现在 String Catalog 中。

String Catalog 统一格式

新的 .xcstrings 格式把之前的 .strings(简单键值对)、.stringsdict(复数形式)和设备变体合并成一个 JSON 文件。在这个文件中,每个 key 下面可以有:不同语言的翻译、不同复数形式的变体、不同设备类型的变体、不同语言区域的变体。翻译团队只需要处理一个文件,而不是在多个 .strings 文件之间跳来跳去。

代码片段

SwiftUI 中自动本地化的字符串

// 字符串字面量自动本地化
Text("Welcome")  // 自动查找 "Welcome" 的本地化翻译

// 字符串插值自动处理变量
Text("Hello, \(userName)")  // 自动查找 "Hello, %@" 的本地化翻译

// 显式指定 key
Text("greeting.morning", defaultValue: "Good Morning")

// 复数形式(自动处理 plurals)
Text("^[\(count) item](inflect: true)")
// 英文:1 item / 2 items
// 阿拉伯语:有不同的复数规则

使用 String Catalog 管理翻译

// Xcode 13 中:
// File > New > File > String Catalog
// 创建 Localizable.xcstrings

// String Catalog 的 JSON 结构:
// {
//   "Welcome": {
//     "localizations": {
//       "zh-Hans": { "stringUnit": { "state": "translated", "value": "欢迎" } },
//       "ja": { "stringUnit": { "state": "translated", "value": "ようこそ" } }
//     }
//   }
// }

// 导出翻译:
// Product > Export Localizations...
// 生成 .xcloc 文件给翻译团队

// 导入翻译:
// Product > Import Localizations...

设备类型变体

// String Catalog 中可以为不同设备设置不同翻译
// Key: "add.item"
// iPhone: "添加项目"
// Apple Watch: "+"(节省屏幕空间)
// Apple TV: "添加"

// 在代码中正常使用,系统自动选择合适的变体
Text("add.item")

最佳实践

新项目: 使用 Xcode 13 的 String Catalog 作为唯一的本地化管理文件。所有面向用户的字符串都通过 Text() 的字符串字面量或 LocalizedStringKey 引用,不要硬编码用户可见的文字。

已有项目: 迁移到 String Catalog 格式——Xcode 提供了自动迁移工具。迁移后用 Export/Import 流程替代手动编辑 .strings 文件。逐步把硬编码的字符串改成 Text() 字面量。

还有什么值得关注

  • AttributedString 支持本地化,可以在一个属性字符串中混合多种语言的排版规则。
  • Xcode 13 的编译器会在 build 时报告未翻译的字符串,不再需要手动检查。
  • SwiftUI 的 DatePickerLabel 自动根据用户的区域设置显示本地化格式。
WWDC 2021