Discover String Catalogs
System & Services 进阶 20m

认识 String Catalogs

Discover String Catalogs

2023年6月5日

在 Apple 官方观看视频

一句话判断

告别 .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。
WWDC 2023