本地化你的 SwiftUI App
Localize your SwiftUI app
2021年6月9日
一句话判断
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 的
DatePicker和Label自动根据用户的区域设置显示本地化格式。