Code-along: Explore localization with Xcode
2025年6月9日
一句话判断
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” 在两种工作流之间切换。
值得深挖的点
-
两种工作流各有优势:字符串提取(string extraction)适合早期开发,代码即文档,配合自动注释生成效率最高。符号生成(generated symbols)适合成熟项目,分离 key 和 value,跨表引用更方便,框架/包中避免 boilerplate。
-
#bundle宏是小而美的改进。以前在 framework 或 Swift Package 中写本地化代码必须手动传bundle参数,现在#bundle自动解析,且向后兼容旧 OS 版本。 -
自动注释生成使用的是端侧模型,不需要联网。它分析的是字符串在代码中的使用上下文(是 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
}
}
最佳实践
-
开启自动注释生成。Xcode Settings -> Editing -> “automatically generate string catalog comments”。这会让翻译人员获得足够上下文,减少来回沟通。
-
早期项目用字符串提取,成熟项目切符号生成。两者之间的 Refactor 菜单可以一键转换,不必一开始就做决定。
-
使用 plural form 处理数量相关字符串。不要用简单的 “item(s)” 占位,让系统根据语言规则选择正确形式。
-
给翻译人员导出时选择性导出语言。Product -> Export Localizations -> 只选需要的语言,减少翻译文件体积。
-
大型项目的字符串按功能模块分 table。比如 “Settings”、“Discover”、“Profile” 各一个 String Catalog,避免单个文件过大。
还有什么值得关注
- Session 222(多语言体验增强)提供了
Locale.preferredLocales和 Natural Selection 的 API 更新,与本地化工作流直接相关。 - String Catalog 支持 Usage Description Comments 自动生成,提供翻译所需的上下文信息。
- 如果你的 app 支持多语言,优先处理长字符串语言(如德语)和 RTL 语言(如阿拉伯语、希伯来语)的布局适配。