You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 22:36:05