Ios 如何动态更改本地化SwiftUI

Ios 如何动态更改本地化SwiftUI,ios,swift,swiftui,Ios,Swift,Swiftui,如何在SwiftUI中动态更改应用程序的本地化 我认为我们可以使用下面的代码,但我们应该找到快捷的方法 func localized(_ lang:String) -> String { let path = Bundle.main.path(forResource: lang, ofType: "lproj") let bundle = Bundle(path: path!) return NSLocalizedString(self, tableName:

如何在SwiftUI中动态更改应用程序的本地化

我认为我们可以使用下面的代码,但我们应该找到快捷的方法

func localized(_ lang:String) -> String {

    let path = Bundle.main.path(forResource: lang, ofType: "lproj")
    let bundle = Bundle(path: path!)

    return NSLocalizedString(self, tableName: nil, bundle: bundle!, value: "", comment: "")
}}

首先,我们应该创建2个
Localizable.strings
文件,在我的例子中是enru

我们应该存储当前的语言对象,我在
UserSettings
中选择storeit属性,就像
observeObject

class UserSettings: ObservableObject {

    @Published var lang: String = "ru"

    var bundle: Bundle? {
        let b = Bundle.main.path(forResource: lang, ofType: "lproj")!
        return Bundle(path: b)
    }
}
我们可以在
SceneDelegate.swift
中使用类似
.environmentObject()
的设置对象,这样层次结构中的每个视图都将更新

var settings = UserSettings()
// ...
= UIHostingController(rootView: contentView.environmentObject(settings))
视图中
我们可以获得理想的行为,注意我们应该在
文本
初始化中指定
捆绑

struct ContentView: View {

    @EnvironmentObject var settings: UserSettings

    var body: some View {
        VStack {
            Text("App", bundle: settings.bundle)
        }
    }
}
现在我可以在应用程序中的某个地方更改语言,下面是一个示例循环示例,您可以在
场景中调用此函数
changeLanguage()
(\uscene:,willConnectTo:,options connectionOptions:)
,并且每3秒更改一次语言

func changeLanguage() {
    print(#function)
    DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
        self.settings.lang = self.settings.lang == "ru" ? "en" : "ru"
        self.changeLanguage()
    }
} 

@Tikhonov Alexander这是否意味着必须在每个文本元素中指定包标识符?是否有一种简单的方法可以为所有文本元素设置此值,或者是否有另一种方法可以动态更改区域设置标识符?目前,我正在通过更改区域设置,使用预览测试其他语言

    static var previews: some View {
        TestView()
            .environment(\.locale, Locale(identifier: "ru"))
    }

我无法在Text()视图中使用“bundle:”命令,我get=>无法将“String”类型的值转换为我需要的参数类型“LocalizedStringKey”。最终在SwiftUI上下文中找到了解决方案。