Xcode14.2导出本地化时SwiftUI嵌套NSLocalizedString异常
Xcode 14.2嵌套NSLocalizedString进Text导出XLIFF的键值冲突问题
问题重现
在Xcode 14.2中,直接在Text构造器里嵌套NSLocalizedString时:
Text(NSLocalizedString("[feature] string key", value: "string value", comment: "string comment"))
不管是通过Xcode UI导出本地化,还是执行命令:
xcodebuild --exportLocalizations
都会触发以下警告:
WARNING: Key "[feature] string key" used with multiple values. Value "[feature] string key" kept. Value "string value" ignored
导出的XLIFF文件里,对应条目的source和target会被错误设置为键名,而非传入的value参数:
<trans-unit ... id="[feature] string key" ...> <source>[feature] string key</source> <target>[feature] string key</target> <note>string comment</note> </trans-unit>
将NSLocalizedString先赋值给变量再传入Text,则能生成正确的XLIFF条目:
let x = NSLocalizedString("[feature] string key", value: "string value", comment: "string comment") Text(x)
问题成因
这是Xcode 14.2本地化解析逻辑的bug,结合你的构建设置(LOCALIZED_STRING_SWIFTUI_SUPPORT=YES)产生冲突:
- 开启
LOCALIZED_STRING_SWIFTUI_SUPPORT后,Xcode会自动把Text的字符串字面量参数识别为本地化键,生成键值相同的本地化条目 - 同时,Xcode会独立解析
NSLocalizedString调用,提取键、值、注释生成另一条本地化条目 - 当
NSLocalizedString直接嵌套在Text中时,Xcode会将同一个键关联到两个不同的值(一个是Text自动识别的键名,另一个是NSLocalizedString的value参数),最终保留前者,忽略后者 - 你的推测是正确的:Xcode确实把嵌套写法拆成了两个独立的本地化来源,导致键值冲突
修复方案
1. 临时规避写法
将NSLocalizedString结果先赋值给局部变量,再传入Text,避免Xcode同时触发两种解析逻辑:
let localizedText = NSLocalizedString("[feature] string key", value: "string value", comment: "string comment") Text(localizedText)
2. 项目级根治方案
关闭SwiftUI自动本地化
将构建设置中的LOCALIZED_STRING_SWIFTUI_SUPPORT设为NO,这样Xcode只会解析显式的NSLocalizedString调用,不会自动识别Text的字符串参数。
注意:关闭后所有需要本地化的
Text必须显式包裹本地化API,不能直接写字符串字面量。
使用SwiftUI原生本地化语法
改用Text的本地化构造器,既符合SwiftUI规范,又能避免解析冲突:
// 基础写法,键即默认英文值 Text("[feature] string key", comment: "string comment") // 自定义默认值的写法 Text(LocalizedStringKey("[feature] string key"), tableName: nil, bundle: .main, value: "string value", comment: "string comment")
这种写法下,Xcode导出XLIFF时会正确提取键、默认值和注释。
3. 升级Xcode版本
该bug在Xcode 14.3及后续版本中已被修复,升级后无需修改代码,直接使用嵌套写法即可正常导出XLIFF。
内容的提问来源于stack exchange,提问作者dahpgjgamgan
相关产品推荐
相关产品推荐

