如何处理视图的String输入参数以实现本地化翻译
解决SwiftUI中传递String参数实现本地化翻译的问题
问题根源
你当前的写法(比如LocalizedStringKey("\(label)"))会把插值后的完整字符串当作本地化键,而不是用label变量里的内容去匹配Localizable.strings中的键,所以才会显示键名而非翻译内容。
解决方案
方案1:直接将参数类型改为LocalizedStringKey
这是最符合SwiftUI本地化设计的方式,适合静态传递键名的场景:
// 修改TextFieldView的参数定义 struct TextFieldView: View { let label: LocalizedStringKey // 把String换成LocalizedStringKey let exampleInput: String let paddingLeading: CGFloat let paddingTrailing: CGFloat let secure: Bool let widthLabel: CGFloat @Binding var binding: String var body: some View { Rectangle() .frame(width: widthLabel, height: 25) .offset(x: -110, y: -10) .foregroundColor(.white) .overlay( Text(label) // 直接使用LocalizedStringKey类型的label .foregroundColor(.black) .frame(height: 25) .padding(.bottom) .background(Rectangle().fill(.white).padding(.vertical, 10)) .offset(x: -110, y: -4) ) // 其他TextField相关代码... } } // 调用时直接传字符串字面量(Swift会自动转成LocalizedStringKey) TextFieldView( label: "email", exampleInput: "beispielemail@web.de", paddingLeading: 30, paddingTrailing: 30, secure: false, widthLabel: 60, binding: $id )
方案2:如果必须保持参数为String类型(比如动态获取键名)
用NSLocalizedString手动获取翻译内容,适合从后端或其他动态来源获取键名的场景:
// 直接在Text中使用 Text(NSLocalizedString(label, comment: "")) // 或者给String加扩展,方便复用 extension String { var localized: String { NSLocalizedString(self, comment: "") } } // 使用扩展简化写法 Text(label.localized)
额外检查项
- 确认
Localizable.strings文件格式正确,键值对无语法错误:"email" = "邮箱"; // 替换为你的目标语言翻译 - 确保文件已添加对应语言的本地化版本,且项目设置中启用了该语言
- 检查文件编码为UTF-8,避免乱码或读取失败
内容的提问来源于stack exchange,提问作者DoMaxBa
相关产品推荐
相关产品推荐

