Code-along: Explore localization with Xcode
Developer Tools 进阶 0m

Code-along: Explore localization with Xcode

2025年6月9日

在 Apple 官方观看视频

一句话判断

Xcode 26 的 String Catalog 自动注释生成和符号生成功能,让本地化从”维护负担”变成了”开发工作流的自然延伸” — 你写代码,Xcode 帮你准备翻译上下文。

这场 Session 讲了什么

Andreas 以 Landmarks 示例项目为载体,从零开始演示了 Xcode 本地化的完整流程:

基础设置:添加 String Catalog -> build -> Xcode 自动发现并提取所有可本地化字符串(SwiftUI 的 Text、Button 等默认可本地化,其他代码用 String(localized:))。支持 plural form(“Vary by Plural”),添加德语翻译,导出 XLIFF 文件给翻译人员,导入翻译结果。

翻译上下文:翻译人员看不到代码和运行中的 app,需要注释提供上下文。Xcode 26 新增自动注释生成 — 使用端侧模型分析代码,为每个字符串生成描述性注释。可在 Settings 中开启 “automatically generate string catalog comments”,所有新提取的字符串自动获得注释。导出的 XLIFF 文件会标注 auto-generated

复杂项目管理:多个 target(framework、Swift Package)各有自己的 String Catalog 时,使用 #bundle 宏自动定位当前 target 的 bundle。使用 tableName 参数将字符串分组到不同的表中(如 “Discover.xcstrings”)。

符号生成:Xcode 26 支持从 String Catalog 生成类型安全的 Swift 符号。手动添加字符串后,Xcode 自动生成 LocalizedStringResource 的静态属性/函数。支持自动补全、编译时检查。可通过 “Refactor > Convert Strings to Symbols” 在两种工作流之间切换。

值得深挖的点

  1. 两种工作流各有优势:字符串提取(string extraction)适合早期开发,代码即文档,配合自动注释生成效率最高。符号生成(generated symbols)适合成熟项目,分离 key 和 value,跨表引用更方便,框架/包中避免 boilerplate。

  2. #bundle 宏是小而美的改进。以前在 framework 或 Swift Package 中写本地化代码必须手动传 bundle 参数,现在 #bundle 自动解析,且向后兼容旧 OS 版本。

  3. 自动注释生成使用的是端侧模型,不需要联网。它分析的是字符串在代码中的使用上下文(是 button title、navigation title 还是 confirmation dialog),生成的注释质量相当好。

代码片段

使用 tableName 分组字符串

// 字符串自动归入 Discover.xcstrings
Text(String(localized: "Feed Title", tableName: "Discover"))

// 使用生成的符号(更简洁)
Text(.Discover.feedTitle)

在 framework 中使用 #bundle

// 不再需要手动指定 bundle
enum FeedSource: String {
    case friends, curated

    var title: String {
        String(localized: self.rawValue,
               table: "Discover",
               bundle: #bundle) // 自动定位当前 target
    }
}

最佳实践

  1. 开启自动注释生成。Xcode Settings -> Editing -> “automatically generate string catalog comments”。这会让翻译人员获得足够上下文,减少来回沟通。

  2. 早期项目用字符串提取,成熟项目切符号生成。两者之间的 Refactor 菜单可以一键转换,不必一开始就做决定。

  3. 使用 plural form 处理数量相关字符串。不要用简单的 “item(s)” 占位,让系统根据语言规则选择正确形式。

  4. 给翻译人员导出时选择性导出语言。Product -> Export Localizations -> 只选需要的语言,减少翻译文件体积。

  5. 大型项目的字符串按功能模块分 table。比如 “Settings”、“Discover”、“Profile” 各一个 String Catalog,避免单个文件过大。

还有什么值得关注

  • Session 222(多语言体验增强)提供了 Locale.preferredLocales 和 Natural Selection 的 API 更新,与本地化工作流直接相关。
  • String Catalog 支持 Usage Description Comments 自动生成,提供翻译所需的上下文信息。
  • 如果你的 app 支持多语言,优先处理长字符串语言(如德语)和 RTL 语言(如阿拉伯语、希伯来语)的布局适配。
开发工具 应用服务