如何在Swift Packages间共享String Catalog翻译内容?
我正在使用两个Swift包,并通过字符串目录.xcstrings管理本地化内容。每个包都有自己的特定本地化键,但我还需要复用一些通用键(如ok_button_title)。
我希望避免在每个包中重复相同的翻译条目,理想状态下这些共享翻译有单一可信源。我尝试了以下代码引用主应用bundle中的翻译键:
String( localized: "ok_button_title", table: "Localizable", bundle: .main, comment: "Ok button title" )
这能从主bundle获取翻译,但不会自动在Swift包的字符串目录中创建对应键。
请问:
- 能否在Swift包中直接复用主bundle的翻译?
- 有没有办法自动在Swift包的字符串目录中生成键?
- 抑或此行为是预期而非bug?
可以直接复用主bundle的翻译:你当前的代码写法就是有效的实现方式。通过明确指定
bundle: .main,Swift包可以直接读取主应用bundle内的通用翻译内容,无需在包自身的.xcstrings中重复添加这些键的翻译条目。需要注意的是,主应用bundle必须包含这些通用键的对应翻译,否则会 fallback 到键名本身作为默认显示内容。无法自动生成包内的对应键:目前Xcode的
.xcstrings自动提取功能仅扫描当前包范围内的代码,不会识别引用外部bundle的本地化键并自动在包的.xcstrings中生成条目。如果需要包的.xcstrings中存在这些键,只能手动添加,或者自行编写脚本遍历代码中引用外部bundle的键,批量导入到包的.xcstrings文件中。此行为是预期设计,而非bug:Xcode的本地化提取逻辑是基于当前模块(Swift包)的独立可控性设计的,每个包的本地化资源默认只关联自身代码中定义的键。引用外部bundle的键不属于当前包的本地化范畴,因此不会自动生成对应条目。
内容的提问来源于stack exchange,提问作者Daniel Pustotin

