SwiftUI动态切换locale时插值LocalizedStringResource不更新问题
SwiftUI动态切换Locale时带插值的LocalizedStringResource不更新的问题解决
问题原因
你当前的写法中,String(localized: Constants.items)默认使用系统Locale,而非SwiftUI环境中设置的.locale,导致动态切换环境Locale时,插值后的本地化字符串不会重新计算。另外,静态常量Constants.items的初始化逻辑不会随环境Locale变化而重新获取对应语言的翻译文本。
解决办法
方法1:利用Text原生的插值与本地化支持
SwiftUI的Text直接支持结合LocalizedStringResource和变量的本地化渲染,且会自动响应环境Locale变化。同时建议在General.xcstrings中配置复数形式(比如item对应复数items),让系统自动处理单复数逻辑:
struct Constants { static let download = LocalizedStringResource("Download", table: "General") // 确保xcstrings中配置了复数翻译规则 static let items = LocalizedStringResource("%lld item", table: "General", comment: "Items count") } struct ContentView: View { @State private var language: String = "uk" var body: some View { ZStack { Rectangle().foregroundStyle(.white) VStack { Text(Constants.download) // 直接用Text的value参数处理插值与本地化 Text(Constants.items, value: 13) } .padding() } .onTapGesture { language = (language == "en") ? "uk" : "en" } .environment(\.locale, .init(identifier: language)) } }
方法2:手动绑定环境Locale进行格式化
如果必须使用String(format:)的方式,可通过环境变量获取当前Locale,手动调用LocalizedStringResource的本地化方法,再进行格式化。将逻辑封装为依赖环境Locale的计算属性,确保Locale变化时自动重新计算:
struct Constants { static let download = LocalizedStringResource("Download", table: "General") static let items = LocalizedStringResource("%lld item", table: "General") } struct ContentView: View { @State private var language: String = "uk" @Environment(\.locale) private var locale private var formattedItems: String { // 根据当前环境Locale获取本地化字符串 let localizedStr = Constants.items.localizedString(locale: locale) return String(format: localizedStr, 13) } var body: some View { ZStack { Rectangle().foregroundStyle(.white) VStack { Text(Constants.download) Text(formattedItems) } .padding() } .onTapGesture { language = (language == "en") ? "uk" : "en" } .environment(\.locale, .init(identifier: language)) } }
补充说明
原写法中String(localized: Constants.items)未指定locale参数,默认使用Locale.current(系统全局Locale),而非SwiftUI环境中的Locale,因此环境Locale变化时不会触发重新计算。而Text(LocalizedStringResource)会自动读取环境Locale,所以能正常更新。
内容的提问来源于stack exchange,提问作者KAMIKAZE
相关产品推荐
相关产品推荐

