认识 String Catalogs
Discover String Catalogs
2023年6月5日
一句话判断
告别 .strings 和 .stringsdict 文件的手动维护噩梦——Xcode 15 的 String Catalogs 自动从代码中提取可本地化字符串,一个文件管理所有语言的翻译,还能按设备类型(Mac/iPhone)定制文案。
这场 Session 讲了什么
Apple 本地化团队的 Marina 和 Matt 介绍了 Xcode 15 中全新的 String Catalogs 功能。这是一个将取代 .strings 和 .stringsdict 文件的新格式。
过去本地化的痛点是:你必须手动维护 strings 文件,确保它们与代码中的字符串同步。经常出现遗漏——用户看到未翻译的英文文案。String Catalogs 解决了这个问题:Xcode 自动从源代码中提取可本地化字符串,并持续保持同步。
String Catalog 把一个字符串表(string table)的所有语言翻译和元数据集中在一个文件中。过去一个 string table 需要在每种语言的 lproj 目录下各维护一个 .strings 文件,现在一个 .xcstrings 文件搞定一切。
Xcode 从多种来源提取字符串:SwiftUI 视图中的字符串字面量、Swift 代码中的 String(localized:) 调用、Objective-C 的 NSLocalizedString 宏、Interface Builder 文件、Info.plist 等。
编辑器功能也很强大:可以直接在 Catalog 中翻译、按设备类型变体定制文案(如 Mac 用”点击”,iPhone 用”轻触”)、添加翻译注释、查看翻译进度。
值得深挖的点
Swift 编译器集成:String Catalogs 利用了 Swift 编译器的字符串提取能力。需要开启 “Use Compiler to Extract Swift Strings” 构建设置。这意味着提取不是简单的文本搜索,而是真正的语义分析——更准确,更少误报。
LocalizedStringResource 类型:这是新的推荐类型,用于表示和传递可本地化字符串。它支持自定义注释、表名、默认值等。当你需要在模型层定义将在 UI 中显示的字符串时,用这个类型而不是普通 String。
设备类型变体:同一个字符串可以为不同设备定制不同版本。右键点击字符串,选择 “Vary by Device” -> Mac,就能为 Mac 用户定制专用文案。这对跨平台应用非常实用。
自动同步机制:代码中新增字符串后 build 一次,String Catalog 自动出现新条目。删除字符串后对应的条目也会标记为未使用。不再需要手动保持同步。
代码片段
// SwiftUI - 字符串字面量自动被识别为可本地化
Text("Welcome to WWDC!") // 自动提取到 Localizable.xcstrings
Button("Tap to learn more") { ... } // 同上
// 带注释和自定义表名的字符串
Text("Hello, World!")
.comment("Greeting shown on app launch")
.table("Greetings")
// 在模型代码中使用可本地化字符串
struct Bird: Identifiable {
let name: String
var displayName: LocalizedStringResource {
LocalizedStringResource(
"Bird: \(name)",
comment: "Display name for the bird species"
)
}
}
// Swift 中的显式本地化
let title = String(localized: "Recent Visits",
comment: "Title for the recent visits section")
let attributed = AttributedString(localized: "Welcome, \(userName)!")
// 使用 LocalizedStringResource
let message = LocalizedStringResource(
"tap to learn more",
defaultValue: "Tap to learn more",
table: "Onboarding"
)
// Objective-C - NSLocalizedString 自动识别
NSString *title = NSLocalizedString(@"Recent Visits",
@"Title for the recent visits section");
最佳实践
- 为字符串添加注释:帮助翻译者理解字符串的使用上下文,减少歧义。特别是在同一个词在不同场景有不同含义时(如 “match” 可以是比赛也可以是匹配)。
- 开启编译器字符串提取:确保 “Use Compiler to Extract Swift Strings” 构建设置已启用,否则 Swift 代码中的字符串不会被自动提取。
- 用 LocalizedStringResource 传递可本地化字符串:在模型层和业务逻辑中,用这个类型而不是普通 String 来标记需要翻译的文本。
- 利用设备变体优化跨平台体验:跨平台应用(Mac + iOS)应该为每个平台定制操作相关的文案(点击/轻触、右键点击/长按等)。
- 定期检查翻译进度:String Catalog 的编辑器会显示整体翻译进度,确保发布前所有语言都达到 100%。
还有什么值得关注
- String Catalog 最终会完全取代 .strings 和 .stringsdict 文件,但 Xcode 提供了迁移路径——现有项目可以平滑过渡。
- Xcode 14.3 已经支持修改项目的默认本地化语言。如果你的源代码字符串不是英文,可以在项目设置中更改默认语言。
- 自定义宏也可以被识别为可本地化——如果你的项目有自己的本地化宏,Xcode 能检测到其中的字符串字面量。
- String Catalog 支持复数形式和性别变化(pluralization and grammar agreement),这些之前需要 .stringsdict 文件,现在统一在 Catalog 中处理。
- 导出和导入本地化的工作流仍然存在,只是底层文件格式变成了 .xcstrings。