如何在使用String Catalog时禁用自动提取功能?
禁用String Catalog自动提取的全局解决方案
针对你遇到的问题——String Catalog自动提取使用LocalizedStringKey初始化的字符串,且Button、TextField等组件没有类似Text的init(verbatim:)方法,以下是几种简洁的全局解决方案:
方案1:给String添加全局后缀,强制使用非本地化初始化器
通过扩展String添加一个轻量后缀,让字符串字面量显式以String类型传入UI组件,避免编译器自动匹配LocalizedStringKey的初始化器:
extension String { var raw: String { self } }
使用方式非常简洁,所有UI组件都能通用:
// Button不再自动提取字符串 Button("Hello World!".raw) { // 点击动作 } // TextField的占位符也不会被提取 TextField("Enter text here".raw, text: $inputText)
方案2:为无verbatim方法的UI组件扩展初始化器
模仿Text的init(verbatim:),给Button、TextField等组件添加专属的非本地化初始化器,语义更明确:
// 扩展Button(Label为Text的情况) extension Button where Label == Text { init(verbatim title: String, action: @escaping () -> Void) { self.init(title, action: action) } } // 扩展TextField extension TextField { init(verbatim placeholder: String, text: Binding<String>) { self.init(placeholder, text: text) } }
使用时直接调用verbatim参数:
Button(verbatim: "Submit") { // 动作 } TextField(verbatim: "Username", text: $username)
方案3:全局关闭自动提取(不推荐)
如果需要彻底禁用项目中所有字符串的自动提取,可在项目Build Settings中找到Extract Localizable Strings相关选项,关闭该编译阶段;或在Info.plist中添加NSLocalizationAutomaticExtractEnabled并设置为NO。但此方法会影响所有本地化流程,仅适合完全不需要自动提取的场景。
内容的提问来源于stack exchange,提问作者Vakho
相关产品推荐
相关产品推荐

