String Catalog(字符串目录,文件后缀 .xcstrings)是 Xcode 15 起推荐的多语言方案:一个文件里放所有语言的翻译,每种语言显示翻译进度,复数和按设备变化的文本也在同一处编辑。在 VS Code 里装上免费插件快蝎(KXApp)后,双击 .xcstrings 就是可视化表格:可以添加语言、从源码同步新字符串、逐条翻译、设置复数,保存的文件和 Xcode 写出的一致。下面按实际顺序讲一遍,截至 2026 年 10 月,适用 Xcode 16 及以上。
开始前准备:Mac 上已安装 Xcode,VS Code 里装好插件(见安装页),并打开含 .xcodeproj 或 .xcworkspace 的文件夹。
String Catalog 是什么
| String Catalog(.xcstrings) | 传统 .strings / .stringsdict | |
|---|---|---|
| 文件数量 | 整个模块一个文件,所有语言都在里面 | 每种语言一个 .lproj 目录,各放一份 |
| 新字符串怎么进来 | 构建时从代码里的本地化调用自动收集 | 手动添加 key |
| 复数 | 同一条字符串里按复数变化 | 另写 .stringsdict |
| 翻译进度 | 每种语言显示完成比例和每条的状态 | 没有 |
| 支持版本 | Xcode 15 及以上 | 所有版本 |
代码里写 String(localized: "Welcome")、SwiftUI 的 Text("Welcome")、Objective-C 的 NSLocalizedString(@"Welcome", nil),这些字符串都会被收集进 String Catalog。Apple 的完整说明见 Localizing and varying text with a string catalog。
还没有 String Catalog 的工程,在 Xcode 里用「File › New › File from Template… › String Catalog」新建一个 Localizable.xcstrings,之后的编辑都可以在 VS Code 里完成。
打开 String Catalog
在资源管理器里双击 Localizable.xcstrings,会用「kxapp 国际化编辑器」打开:左侧是「语言」栏,每种语言一行,带进度条和百分比(例如 English en 源 100%),底部是「+ 添加语言…」;右侧表格的列是「键 / 源语言(如 English)/ 注释 / 状态」,在左侧选中某种语言后,表格会出现这种语言的译文列。顶部有「筛选键和值」框、状态下拉(全部 / 未翻译 / 需复核 / 已过期)和「+ 添加 Key」「从源码同步」按钮,右上角显示 key 的数量。.lproj 目录下的 .strings / .stringsdict 也用同一个编辑器打开。

想看原始 JSON 时,点编辑器标题栏的「kxapp:以文本方式打开国际化文件」(<> 图标),也可以在命令面板运行;要切回表格,用「kxapp:用国际化编辑器打开」。
添加语言
- 打开
.xcstrings,点编辑器标题栏上的「kxapp:添加语言…」或左侧语言栏底部的「+ 添加语言…」(也可以在资源管理器里右键.xcstrings文件)。 - 选要添加的语言。列表里显示语言的英文名,旁边的小字是代码和本地名,例如 Chinese, Simplified(zh-Hans · 简体中文);输入 zh、简体 等可以搜索。
新语言会出现在左侧语言栏里,同时登记到工程的已知语言(Project › Info › Localizations),和在 Xcode 里添加语言的效果一样,不用再回 Xcode 设置。写入工程文件需要 xcodeproj 组件,第一次用到时插件会提示一键安装。
不要的语言在左侧语言栏里右键这种语言,选「移除语言…」删除;同一个菜单里的「设为源语言」可以更换开发语言。
从源码同步新字符串
在代码里新写了本地化字符串后,点标题栏上的「kxapp:从源码同步字符串」:
- 代码里新出现的 key 加进来,等待翻译。
- 代码里已经不用的 key 标为「已过期」,不会被删掉,确认没用后再手动删除。
- 手动添加的 key 不受影响。
同步完成后右下角会弹出结果,例如「Localizable.xcstrings:新增 2、过期 0、恢复 0、注释更新 0(扫描了 N 个文件)」。
带插值的字符串要多看一眼。例如 Text("Tapped \(count) times"),同步后的 key 是 Tapped %arg times:插件只做语法扫描,不知道插值的类型;Xcode 用编译器提取,key 是 Tapped %lld times,运行时也按这个 key 查表。所以同步后要把 %arg 改成 Xcode 用的占位符(%lld、%@ 等),插件同步时也会提示这一点。
项目里用了自己封装的本地化函数或宏(第一个参数是 key),把名字加进设置 kxapp.l10n.extraMacros,同步时一并扫描,相当于 Xcode 的 Localized String Macro Names。
在 Xcode 里构建时,Xcode 也会自动把新字符串收进 String Catalog,两种方式可以混用;用 kxapp 或命令行(xcodebuild)构建不会更新 String Catalog。
翻译与审核状态
在左侧选中语言,在表格的译文列里直接输入译文,保存即可。每条字符串还可以:
| 操作 | 什么时候用 |
|---|---|
| 标记为需复核 | 译文不确定,留给他人检查 |
| 标记为已复核 | 检查过,确认译文没问题 |
| 切换「不翻译」 | 品牌名、产品名等不需要翻译的字符串 |
| 添加 / 删除 / 重命名 / 复制 Key | 整理 key |
| 筛选 | 用顶部的「筛选键和值」框和状态下拉只看某些 key,例如找未翻译的 |
修改源语言的文本后,这条字符串已有的各语言翻译会自动标为「需复核」,提醒译者重新确认,和 Xcode 的做法一致。不想要这个行为时,关掉设置 kxapp.l10n.markSourceEditsForReview。
复数和按设备变化
“1 个文件 / 3 个文件”这类文本,英文要区分单复数,俄语、阿拉伯语等更多。做法:
- 右键这条字符串,选「按复数变化」。字符串里要有数字占位符(如
%lld),否则会报错。 - 每种语言按自己的复数规则出现对应的行(例如英文的「单数 (one)」「其它」),分别填写。
中文没有单复数之分,通常只需填「其它」一行。
同一条文本在 iPhone、iPad、Mac 上要显示不同内容时,可以直接编辑 Xcode 里已经建好的按设备变化;在插件里选「按设备变化」只会生成一行「其它」,不能再添加 iPhone、iPad、Mac 的行。
一条字符串里有多个数量(例如“3 个文件,共 2 个文件夹”)时,用「添加替换变量」给每个数量单独设置复数。不再需要变体时,用「移除变体」还原成普通字符串。
常见问题
在 VS Code 里改的翻译,Xcode 能正常读吗?
能。保存的是标准的 .xcstrings 文件,用 Xcode 打开或构建都一样,提交代码时也只看到你改过的部分。
代码里新写的字符串没有出现在 String Catalog 里?
点编辑器标题栏的「kxapp:从源码同步字符串」,或者在 Xcode 里构建一次。用了自定义的本地化函数时,要先把函数名加进设置 kxapp.l10n.extraMacros。
添加语言后,工程设置里的语言列表也会变吗?
会。添加语言时会同时登记到工程的已知语言里,不需要再回 Xcode 添加。
老项目用的是 .strings 文件,也能编辑吗?
能。.lproj 目录下的 .strings / .stringsdict 和 String Catalog 用同一个表格编辑,每种语言同样显示进度。想迁移到 String Catalog,在 Xcode 里右键 .strings 文件选「Migrate to String Catalog」。
中文要不要设置复数?
中文不区分单复数,一般不用设置。只有源语言(例如英文)需要区分时,在源语言上按复数变化,中文填「其它」一行即可。