跳到主要内容

String Catalog(xcstrings)多语言本地化:添加语言、翻译和复数

在 VS Code 里用快蝎插件编辑 String Catalog(.xcstrings):添加语言并登记到工程,从源码同步新字符串,逐条翻译和标记复核,设置复数与按设备变化,保存格式与 Xcode 一致。

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:用国际化编辑器打开」。

添加语言

  1. 打开 .xcstrings,点编辑器标题栏上的「kxapp:添加语言…」或左侧语言栏底部的「+ 添加语言…」(也可以在资源管理器里右键 .xcstrings 文件)。
  2. 选要添加的语言。列表里显示语言的英文名,旁边的小字是代码和本地名,例如 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 个文件”这类文本,英文要区分单复数,俄语、阿拉伯语等更多。做法:

  1. 右键这条字符串,选「按复数变化」。字符串里要有数字占位符(如 %lld),否则会报错。
  2. 每种语言按自己的复数规则出现对应的行(例如英文的「单数 (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」。

中文要不要设置复数?

中文不区分单复数,一般不用设置。只有源语言(例如英文)需要区分时,在源语言上按复数变化,中文填「其它」一行即可。