如何在Xcode中用自定义名称自动生成String Catalog并兼容旧本地化文件
问题背景
我计划逐步把项目迁移到Xcode的全新String Catalog,但目前还保留着Localizable.strings文件,不想一次性全量迁移,希望两者能并行使用。根据WWDC 2023的视频内容,苹果说String Catalog可以和旧格式共存,但添加默认名称的Localizable.xcstrings时,Xcode会抛出编译错误:
Localizable.xcstrings cannot co-exist with other .strings or .stringsdict tables with the same name
这和官方说明矛盾。把String Catalog重命名为WidgetLocalizable.xcstrings后项目能正常构建,但Xcode没法自动生成条目。手动加条目有三个麻烦:
- 工作量大
- Xcode没法追踪翻译进度
- 每次创建
LocalizedStringResource都得额外加table名称
想咨询两个问题:
- 用自定义名称的String Catalog时,能不能让Xcode自动生成条目?怎么操作?
- 能不能指定Xcode里整个文件或文件夹用特定的非标准String Catalog,不用每次给字符串加table名称?
问题1:自定义名称String Catalog自动生成条目
可以实现,操作步骤如下:
- 打开项目的Build Settings,找到Localization分类下的String Catalog Compiler Options
- 添加新的编译选项:
--auto-generate-table WidgetLocalizable(把WidgetLocalizable换成你的自定义Catalog名称) - 确认你的自定义
WidgetLocalizable.xcstrings已经添加到项目的本地化目标里 - 重新编译项目,Xcode会自动识别代码里指定了该table的
LocalizedStringResource或NSLocalizedString,并把对应条目生成到自定义Catalog中
如果用的是SwiftUI的LocalizedStringResource,先在代码里统一指定table为自定义名称,比如:
LocalizedStringResource("greeting", table: "WidgetLocalizable")
编译后Xcode就会自动把这些字符串抓取到对应的Catalog里。
问题2:指定文件/文件夹默认使用自定义String Catalog
可以通过Xcode的文件级别配置实现,不用每次手动写table参数:
- 在项目导航器里选中目标文件或文件夹
- 打开右侧的File Inspector(文件检查器)
- 在Localization区域,找到Default String Catalog选项,选择你的自定义
WidgetLocalizable.xcstrings - 如果是文件夹,勾选Apply to all contents,让文件夹下的所有文件都继承这个设置
配置完成后,该文件/文件夹里的LocalizedStringResource会默认用指定的自定义Catalog,不用每次加table:参数。如果有个别字符串需要用旧的Localizable.strings,再手动指定table就行。
注意:这个功能需要Xcode 15及以上版本支持,确保你的Xcode版本达标。
内容的提问来源于stack exchange,提问作者Mischa

